Полный цикл в digital

Процесс обмена Битрикс и 1С

Инициатором любого обмена является , сайт не загружает ничего в 1С, сайт только принимает запросы и отдаёт результат. По умолчанию, 1С обращается к скрипту http://site.ru/bitrix/admin/1c_exchange.php. Этот путь указывается в настройках обмена в самой 1С. Из коробки в этом файле включается файл http://site.ru/bitrix/modules/sale/admin/1c_exchange.php. Если открыть файл, то видим там подключение нескольких компонентов в зависимости от $_GET["type"]. В общем случае интересуют два из них:

  • bitrix:catalog.import.1c импорт каталога
  • bitrix:sale.export.1c экспорт заказов

Импорт товаров из 1С

Импорт начинается с авторизации, посылается запрос на http://site.ru/bitrix/admin/1c_exchange.php?type=catalog&mode=checkauth с передачей логина и пароля пользователя сайта, которые указали в настройках обмена. После авторизации сайт выдает ID сессии.

Далее идёт инициализация обмена, URL http://site.ru/bitrix/admin/1c_exchange.php?type=catalog&mode=init&sessid=ID_СЕССИИ. На этом этапе в сессии инициализируется массив данных обмена $_SESSION["BX_CML2_IMPORT"] и сайт отдаёт параметры обмена:

  • Возможность использования zip
  • Лимит размера файла

Также на этом этапе очищается папка для файлов выгрузки - /upload/1c_catalog/. Для отладки можно включить сохранение старых файлов обмена, тогда при новом обмене старые данные будут перемещаться в отдельные папки, увеличивая номер 1c_catalog0, 1c_catalog1. Для сохранения данных нужно объявить константу в /bitrix/php_interface/dbconn.php:

define("BX_CATALOG_IMPORT_1C_PRESERVE", true);

После этого начинает подготовку данных и далее посылает их POST-запросом на сайт частями, http://site.ru/bitrix/admin/1c_exchange.php?type=catalog&mode=file&filename=ИМЯ_ФАЙЛА.zip&sessid=ID_СЕССИИ. Запрос продолжается, пока файлы не будут переданы полностью.

передает на сайт xml-файлы с данными товаров и предложений, а также картинки. В случае если сайт разрешил использовать zip, то передает все файлы одним архивом, следующий шаг начинается с его распаковки.

В выгрузке могут участвовать xml-файлы:

  • import.xml товары, разделы, типы цен, склады, свойства товаров и единицы измерения
  • offers.xml торговые предложения товаров и их свойства
  • prices.xml цены торговых предложений
  • rests.xml остатки торговых предложений
  • references.xml пользовательские справочники (highload-инфоблоки)

Картинки загружаются в папку - /upload/1c_catalog/import_files/

Далее начинаются обработка файла и сам импорт данных, 1С раз за разом обращается к /bitrix/admin/1c_exchange.php?type=catalog&mode=import&filename=ИМЯ_ФАЙЛА_ВЫГРУЗКИ.xml, где ИМЯ_ФАЙЛА_ВЫГРУЗКИ - import.xml, offers.xml, prices.xml, rests.xml, references.xml.

Импорт завершается, когда сайт отдаёт слово success. За обработку файла выгрузки отвечают классы CIBlockXMLFile (/bitrix/modules/iblock/classes/mysql/cml2.php) и CIBlockCMLImport (/bitrix/modules/iblock/classes/general/cml2.php).

Шаги импорта

Импорт состоит из нескольких шагов:

  1. Очистка временной таблицы b_xml_tree метод CIBlockXMLFile::DropTemporaryTables(), обычный drop таблицы b_xml_tree
  2. Создание временной таблицы метод CIBlockXMLFile::CreateTemporaryTables(). Здесь создается таблица b_xml_tree. Можно задать storage engine этой таблицы, равно как и всех создаваемые битриксом, с помощью определения константы MYSQL_TABLE_TYPE
  3. Чтение файла во временную таблицу метод CIBlockXMLFile::ReadXMLToDatabase()
  4. Индексация временной таблицы метод CIBlockXMLFile::IndexTemporaryTables()
  5. Импорт метаданных метод CIBlockCMLImport::ImportMetaData
  6. Импорт разделов метод CIBlockCMLImport::ImportSections
  7. Деактивация разделов и пересчёт левой и правой границ для разделов методы CIBlockCMLImport::DeactivateSections и CIBlockCMLImport::SectionsResort
  8. Импорт элементов самый длительный процесс, на этом этапе добавляются и обновляются новые товары (если загружается import.xml) или обновляются цены и остатки (если загружаетс offers.xml). Здесь задействован метод CIBlockCMLImport::ImportElements, который вызывает CIBlockCMLImport::ImportElement для товаров или CIBlockCMLImport::ImportElementPrices для остатков/цен
  9. Деактивация элементов методы CIBlockCMLImport::DeactivateSections и CIBlockCMLImport::SectionsResort
  10. Завершение импорта файла импорт файла завершен, сайт отвечат словом success, считает обмен успешным, при необходимости начинается импорт следующего файла

Некоторые шаги могут выполняться за несколько запросов, порциями по несколько секунд (это время настраивается параметров "Интервал одного шага в секундах" в настройках интеграции с 1С в админке Битрикса).

Модификация импорта

На последнем шаге, по окончании обработки файла выгрузки (NB: одного файла, например, товаров или предложений) вызывается событие OnSuccessCatalogImport1C модуля catalog. Аргументы обработчика - параметры компонента обмена и путь к файлу выгрузки.

Для изменения процесса обмена можно использовать обычные события, например, OnBeforeIBlockElementUpdate или OnBeforeProductAdd. В обработчике, чтобы определить, что событие вызвано именно во время обмена с 1С, я использую такое костыльное условие:

if (isset($_GET['type'], $_GET['mode']) && $_GET['type'] === 'catalog' && $_GET['mode'] === 'import') {
    
}

Если ничего нельзя решить событиями, всегда можно полностью изменить процесс обмена, скопировав и изменив файл /bitrix/admin/1c_exchange.php, компонент bitrix:catalog.import.1c и класс CIBlockCMLImport.

Отключение проверки источника запроса импорта

Как и в случае с выгрузкой товаров, при импорте товаров есть проверка источника запроса. Можно отключить её следующим кодом:

// old school:
COption::SetOptionString("catalog", "DEFAULT_SKIP_SOURCE_CHECK", "Y"); 
// d7 style:
\Bitrix\Main\Config\Option::set("catalog", "DEFAULT_SKIP_SOURCE_CHECK", "Y");

Экспорт заказов в 1С

Обмен заказами начинается с авторизации с помощью логина и пароля, который указали в настройках обмена. После авторизации сайт выдает ID сессии, /bitrix/admin/1c_exchange.php?type=sale&mode=checkauth.

После получения ID сессии идёт инициализация обмена, /bitrix/admin/1c_exchange.php?type=sale&mode=init&sessid=ID_СЕССИИ. На этом этапе сайт отдаёт настройки обмена со стороны сайта.

Для получения списка заказов запрашивается /bitrix/admin/1c_exchange.php?type=sale&mode=query&sessid=ID_СЕССИИ. Выгружаются заказы с полями EXTERNAL_ORDER = "N", UPDATED_1C = "N" и обновившиеся после последней успешной выгрузки в (это проверяется по времени из свойства last_export_time_committed_/bitrix/admin/1c_excha модуля sale).

Флаг EXTERNAL_ORDER указывает, что заказ создан в и его выгрузка в не требуется.

Флаг UPDATED_1C после успешного импорта из на сайте устанавливается в Y и такие заказы не участвуют в дальнейших экспортах до их обновления на сайте. Во время обновлений заказов на сайте UPDATED_1C устанавливается в N.

После обработки заказов для завершения обмена запрашивает /bitrix/admin/1c_exchange.php?type=sale&mode=success&sessid=ID_СЕССИИ. При этом в свойство last_export_time_committed_/bitrix/admin/1c_excha модуля sale записывается время запроса списка заказов (НЕ текущее время, т.к. с момента запроса заказов до их обработки могли добавиться заказы и они попадут в следующую выгрузку с сайта).

Модификация экспорта

В экспорте заказов участвуют файл /bitrix/admin/1c_exchange.php, компонент bitrix:sale.export.1c и класс CSaleExport. Какие-либо события здесь отсутствуют, поэтому для модификации этого процесса нужно заменить компонент на свой, создать класс-наследник CSaleExport и заменить вызовы в компоненте на него.

Отключение проверки источника запроса экспорта

С версии 15.5 добавлена дополнительная проверка и если вызвать просто /bitrix/admin/1c_exchange.php?type=sale&mode=query, то получим ошибку failure Ошибка проверки источника запроса. Обновите модуль обмена. Если нет желания возиться с sessid, то можно отключить проверку источника запроса, для этого нужно выполнить:

// old school:
COption::SetOptionString("sale", "secure_1c_exchange", "N");
// d7 style:
\Bitrix\Main\Config\Option::set("sale", "secure_1c_exchange", "N");
Заполните форму уже сегодня!
Для начала сотрудничества необходимо заполнить заявку или заказать обратный звонок. В ответ получите коммерческое предложение, которое будет содержать индивидуальную стратегию с учетом требований и поставленных задач
Работаем по будням с 9:00 до 18:00. Заявки, отправленные в выходные, обрабатываем в первый рабочий день до 12:00.
Спасибо, ваш запрос принят и будет обработан!
Эйч Маркетинг