admin / 24.10.2018
.
.
Прошлый пост вдохновил меня написать более подробную заметку про обмен Битрикса с 1С. С первого взгляда кажется, что это очень сложный процесс, но с многолетним опытом понимаешь, что это не просто сложно: это еще и вообще полное г(кхе-кхе). Попробую описать словами этот процесс. Добро пожаловать в описание обмена с 1с.
Инициатором любого обмена является 1С, сайт не загружает ничего в 1С, сайт только принимает запросы и отдаёт результат. По умолчанию, 1С обращается к скрипту /bitrix/admin/1c_exchange.php. Этот путь указывается в настройках обмена в самой 1С. Из коробки в этом файле включается файл /bitrix/modules/sale/admin/1c_exchange.php. Если открыть файл, то видим там подключение нескольких компонентов в зависимости от $_GET["type"]. В общем случае интересуют два из них:
bitrix:sale.export.1c — экспорт заказов.
bitrix:catalog.import.1c -импорт каталога.
Содержание
Обмен заказами начинается с авторизации с помощью логина и пароля, который указали в настройках обмена. После авторизации сайт выдает ID сессии, URL: .
После получения ID сессии идёт инициализация обмена, URL: . На этом этапе сайт отдаёт настройки обмена со стороны сайта.
Для получения списка заказов запрашивается URL . Выгружаются заказы с полями EXTERNAL_ORDER = "N", UPDATED_1C = "N" и обновившиеся после последней успешной выгрузки в 1С (это проверяется по времени из свойства "last_export_time_committed_/bitrix/admin/1c_excha" модуля sale).
Флаг EXTERNAL_ORDER указывает, что заказ создан в 1С и его выгрузка в 1С не требуется.
Флаг UPDATED_1C после успешного импорта из 1С на сайте устанавливается в "Y" и такие заказы не участвуют в дальнейших экспортах до их обновления на сайте. Во время обновлений заказов на сайте UPDATED_1C устанавливается в "N".
После обработки заказов 1С для завершения обмена запрашивает URL . При этом в свойство "last_export_time_committed_/bitrix/admin/1c_excha" модуля sale записывается время запроса списка заказов (НЕ текущее время, т.к. с момента запроса заказов до их обработки могли добавиться заказы и они попадут в следующую выгрузку с сайта).
В экспорте заказов участвуют файл , компонент и класс . Какие-либо события здесь отсутствуют, поэтому для модификации этого процесса нужно заменить компонент на свой, создать класс-наследник CSaleExport и заменить вызовы в компоненте на него. В последних версиях Битрикс этот класс стал относительно читабельным, в старых там была просто простыня из php и "xml".
С версии 15.5 добавлена дополнительная проверка и если вызвать просто , то получим ошибку "failure Ошибка проверки источника запроса. Обновите модуль обмена". Если нет желания возиться с sessid, то можно отключить проверку источника запроса, для этого нужно выполнить:
Импорт начинается с авторизации, посылается запрос на с передачей логина и пароля, который указали в настройках обмена. После авторизации сайт выдает ID сессии.
Далее идёт инициализация обмена, URL .
На этом этапе в сессии инициализируется массив данных обмена $_SESSION["BX_CML2_IMPORT"] и сайт отдаёт параметры обмена: возможность использования zip, лимит размера файла и т.д. Также на этом этапе очищается папка для файлов выгрузки. Скорее всего, это будет папка /upload/1c_catalog/. Для отладки можно включить сохранение старых файлов обмена, тогда при новом обмене старые данные будут перемещаться в отдельные папки: 1c_catalog0, 1c_catalog1 и т.д.. Для сохранения данных нужно объявить константу в dbconn.php:
После этого 1С начинает подготовку данных и далее посылает их POST-запросом на сайт частями, URL: . Запрос продолжается, пока файлы не будут переданы полностью.
1С передает на сайт xml-файлы с данными товаров и предложений, а также картинки. В случае если сайт разрешил использовать zip, то 1С передает все файлы одним архивом. Тогда следующий шаг начинается с его распаковки.
В выгрузке могут участвовать xml-файлы:
Узнать подробнее о файлах обмена
Картинки загружаются в папку import_files.
Далее начинаются шаги импорта, URL: , где ИМЯ_ФАЙЛА_ВЫГРУЗКИ — import.xml, offers.xml и т.д.
Обработка файла завершается, когда сайт отдаёт слово "success". За обработку файла выгрузки отвечают классы CIBlockXMLFile (/bitrix/modules/iblock/classes/mysql/cml2.php) и CIBlockCMLImport (/bitrix/modules/iblock/classes/general/cml2.php).
Обработка файла состоит из нескольких шагов (информация будет дополняться):
Очистка временной таблицы (таблица b_xml_tree);
Метод CIBlockXMLFile::DropTemporaryTables(). Обычный drop таблицы b_xml_tree.
Создание временной таблицы;
Метод CIBlockXMLFile::CreateTemporaryTables(). Здесь создается таблица b_xml_tree. Можно, кстати, задать storage engine этой таблицы, равно как и всех создаваемые битриксом, с помощью определения константы MYSQL_TABLE_TYPE.
Чтение файла во временную таблицу;
Метод CIBlockXMLFile::ReadXMLToDatabase().
Некоторые шаги могут выполняться за несколько запросов, порциями по несколько секунд (это время настраивается параметров "Интервал одного шага в секундах" в настройках интеграции с 1С в админке Битрикса).
На шаге 10, т.е. по окончании обработки файла выгрузки (NB: одного файла, например, товаров или предложений) вызывается событие OnSuccessCatalogImport1C модуля catalog. Аргументы обработчика — параметры компонента обмена и путь к файлу выгрузки.
Также для изменения процесса обмена можно использовать обычные события, например, OnBeforeIBlockElementUpdate или OnBeforeProductAdd. В обработчике, чтобы определить, что событие вызвано именно во время обмена с 1С, я использую такое костыльное условие:
Ну и, если ничего нельзя решить событиями, всегда можно полностью изменить процесс обмена, скопировав и изменив файл , компонент и класс .
Как и в случае с выгрузкой товаров, при импорте товаров есть проверка источника запроса. Можно отключить её следующим кодом:
Статья будет дополняться по мере появления новой информации и вдохновения.
Также полезно почитать:
.
.
FILED UNDER : IT