Новогодняя акция: Стандартное продление 1С-Битрикс по цене льготного! Скидки на 1С-Битрикс до 24%!

Телефон в Москве:

(495) 788-77-16

в Санкт-Петербурге:

(812) 313-28-51

по России (бесплатно):

8-800-555-11-32

Опыт  говорит  сам  за  себя:

• более 130 реализованных проектов за все время существования компании

• успешное сотрудничество с крупнейшими компаниями российского бизнеса

Проблема с выгрузкой большой многопараметрической номенклатуры из 1С

Проблема с выгрузкой большой многопараметрической номенклатуры из 1С

В процессе технической поддержки наших хостинг-клиентов (не создавших у нас свои сайты) мы столкнулись с такой проблемой:

При выгрузке из 1С базы объёмом более 40 000 многопараметрических позиций запросы в базу "повисают", из-за чего скрипт поглощает большое количество ресурсов и "умирает".

При этом запросы "повисают" как при полной, так и измененной выгрузке из 1С.

Анализируя и решая проблему своими силами, мы также передали её на анализ непосредственно в техподдержку 1С-Битрикс.

Техподдержка 1С-Битрикс 1 месяц пыталась найти проблему (так и не решила).

Мы же обнаружили, что "повисает" запрос именно на процессе работы с таблицой b_xml_tree. До этого случая мы уже общались с техподдержкой 1С-Битрикс и выяснили, что данная таблица временная и создаётся автоматически, когда в ней есть необходимость (т.е. ее можно удалять без ущерба работе сайта).

Провели эксперимент, в котором мы сперва удалили таблицу b_xml_tree, а после чего запустили полный импорт. Эксперимент завершился успешно. Т.е. если таблица пуста и заполняется в процессе импорта, то запросы на ней не "повисают" и выгрузки проходят успешно.

В связи с этим достаточно удалять таблицу b_xml_tree, например, через PHPMyAdmin или в компоненте импорта сделать в начале (до импорта) 1 запрос в базу:
DROP TABLE `b_xml_tree`;
P.S. Если у Вас есть в базе другие инфо-блоки, то сумму их элементов надо прибавлять к сумме позиций базы товаров, т.к. они также обрабатываются при импорте (например, у Вас 30 000 позиций в базе и при этом есть лента новостей с 10 000 новостей. Для системы это 40 000 элементов в обработке при импорте).
0
Виктор Николаевич Бурдин
15.10.2011 11:30:06
В принципе можно не удалять полностью таблицу. Зачастую достаточно её очистить запросом:
TRUNCATE TABLE `b_xml_tree`; 


Ссылка 0
0
Alex
11.10.2013 16:44:22
Сегодня столкнулся с такой же проблемой. Выгружали большой XML фаил. Сервер благополучно падал. Очистка таблицы `b_xml_tree` не помогла.

Запрос во время импорта:
sel ect * fr om b_xml_tree wh ere id=(select max(id) fr om b_xml_tree);
показал интересные результаты. Сначала все нормально, а потом в таблицу сыпется неотпарсеный кусок XML дерева.
Причем строки добавляются, а кусок один и тот же.
Суть проблемы оказалась намного прозаичней.
Кусок кода импорта:

         if(file_exists($ABS_FILE_NAME) && is_file($ABS_FILE_NAME) && ($fp = fopen($ABS_FILE_NAME, "rb"))
         {
            if($obXMLFile->ReadXMLToDat abase($fp, $NS, $INTERVAL))
               $NS["STEP"]++;
            fclose($fp);
         }
И мануал по ReadXMLToDatabase:

CIBlockXMLFile::ReadXMLToDat abase( resource fp, array &NS,
 int time_limit = 0,
 int read_size = 1024,
);
time_limitОграничение работы функции по времени. В секундах. Если не задан или равен нулю, то функция будет работать без ограничений.
А теперь угадайте, откуда идет $INTERVAL - правильно, со страницы настроик импорта.

Длительность шага в секундах (0 - выполнять импорт за один шаг):
То есть, вы думаете, с какой частотой он будет обновлять информацию об импорте, а на самом деле
ставите лимит на выполнение импорта XML файла. 0 для данного поля - решение проблемы.
Ссылка 0
0
Виктор Николаевич Бурдин
14.10.2013 15:19:47
Спасибо за комментарий. Но в последних версиях 1С-Битрикс с этой проблемой больше не сталкивались ни мы, ни наши клиенты. Если проблема повторится - мы воспользуемся Вашей информацией.
Родитель Ссылка 0