При настройке интеграции между 1С и «Битрикс» разработчики часто сталкиваются с необходимостью передачи больших объемов данных. Для оптимизации трафика логично использовать упаковку файлов в zip-архив. Однако на этапе распаковки на стороне сайта может возникнуть проблема: процесс зацикливается, возвращая статус «Временные таблицы созданы» или «progress», но так и не доходит до финального завершения. В этой статье мы подробно разберем, почему это происходит и как правильно настроить передачу данных через 1c_exchange.php.
Для начала проанализируем, как работает штатный скрипт обмена 1c_exchange.php. Протокол обмена предполагает пошаговость. Когда 1С отправляет запрос на импорт, сервер обрабатывает часть данных и, если лимит времени выполнения скрипта (max_execution_time) подходит к концу, возвращает ответ progress. 1С, получив такой ответ, должна повторить запрос с теми же параметрами.
Если же мы наблюдаем бесконечный цикл, это означает, что скрипт на стороне Bitrix при каждом новом обращении не «узнает» предыдущую итерацию и начинает процесс заново. Выясним основные причины такого поведения:
sessid, он создает новую сессию для каждого запроса, и состояние обработки файла сбрасывается./upload/1c_exchange/.ZipArchive.Рассмотрим пример кода, который часто становится источником проблемы. Проанализируем фрагмент, где формируется запрос к сайту:
// Некорректный вариант, приводящий к ошибке
ИмяФайлаОтветаРаспаковка = ПолучитьИмяВременногоФайла();
Соединение.Получить(СокрЛП(НоваяСтрокаАрхивРаспаковка + "NAME.zip" + СтрокаОтвет_4Токен), ИмяФайлаОтветаРаспаковка);
В данном случае важно обратить внимание на переменную СтрокаОтвет_4Токен. Часто в ней допускается опечатка. Например, вместо параметра sessid (именно так он должен называться в Bitrix) передается sessied или иное искаженное имя. Критически важно, чтобы URL-запрос выглядел следующим образом:
bitrix/admin/1c_exchange.php?type=catalog&mode=import&filename=NAME.zip&sessid=ваш_номер_сессии
Если вы ошибетесь хотя бы в одной букве имени параметра sessid, Bitrix проигнорирует его, и механизм пошаговости сломается, возвращая вас к началу создания временных таблиц. Рассмотрим исправленный вариант вызова:
// Исправленный вариант передачи заголовков и параметров
Заголовки = Новый Соответствие();
// Убедитесь, что sessid получен из предыдущего ответа сервера (авторизации)
URL_Запроса = "bitrix/admin/1c_exchange.php?type=catalog&mode=import&filename=NAME.zip&sessid=" + ЗначениеSessid;
Соединение.Получить(URL_Запроса, ИмяФайлаОтветаРаспаковка, Заголовки);
Если параметры передаются верно, но распаковка все равно не завершается, нам необходимо заглянуть «под капот» системы. Выясним причину через лог ошибок Bitrix. По умолчанию error.log может быть пуст или недоступен. Настроим детальное логирование через файл .settings.php.
Найдите в корне сайта папку bitrix, в ней .settings.php и добавьте (или измените) секцию exception_handling. Это позволит записывать все ошибки PHP в отдельный файл, что крайне полезно для отладки интеграции:
'exception_handling' => array (
'value' => array (
'debug' => false,
'handled_errors_types' => E_ALL & ~E_NOTICE & ~E_STRICT & ~E_USER_NOTICE,
'exception_errors_types' => E_ALL & ~E_NOTICE & ~E_WARNING & ~E_STRICT & ~E_USER_WARNING & ~E_USER_NOTICE & ~E_COMPILE_WARNING & ~E_DEPRECATED,
'ignore_silence' => false,
'assertion_throws_exception' => true,
'assertion_error_type' => 256,
'log' => array (
'settings' => array (
'file' => 'bitrix/modules/error.log',
'log_size' => 1000000,
),
),
),
'readonly' => false,
),
Важно: Убедитесь, что у веб-сервера есть права на запись файла bitrix/modules/error.log. После этого повторите попытку обмена из 1С и проверьте содержимое лога. Если проблема в нехватке памяти или поврежденных таблицах БД, это сразу отобразится в записях.
Иногда процесс зацикливается из-за того, что временные таблицы в MySQL (которые имеют префикс b_xml_tree) оказались «испорченными» или заблокированными после предыдущего неудачного обмена. Посмотрим, как это исправить:
/upload/1c_exchange/, удалив старые файлы .zip и .xml, которые могут мешать новому циклу обмена.Проанализируем настройки самого модуля интеграции в Bitrix. Перейдите в настройки модуля «Торговый каталог» или «Интеграция с 1С». Убедитесь, что:
/upload/ и доступ к управлению каталогом.Подводя итог, если вы столкнулись с бесконечным прогрессом при распаковке:
Во-первых, проверьте написание параметров URL. Опечатка в sessid — самая частая причина потери состояния сессии между шагами обмена.
Во-вторых, используйте инструменты отладки, такие как Fiddler или Журнал событий в самом Bitrix, чтобы увидеть реальный текст ответа сервера. Ответ «Временные таблицы удалены» вместо «Распаковка завершена» часто намекает на то, что скрипт завершился аварийно, не успев выполнить основную задачу.
В-третьих, если вы работаете с большими файлами, увеличьте лимиты memory_limit и max_execution_time в php.ini, чтобы скрипт успевал обработать архив за меньшее количество итераций.