admin / 24.10.2018

Интеграция 1с и битрикс

.

.

Прошлый пост вдохновил меня написать более подробную заметку про обмен Битрикса с 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 -импорт каталога.

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

Обмен заказами начинается с авторизации с помощью логина и пароля, который указали в настройках обмена. После авторизации сайт выдает 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, то можно отключить проверку источника запроса, для этого нужно выполнить:

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

Импорт начинается с авторизации, посылается запрос на с передачей логина и пароля, который указали в настройках обмена. После авторизации сайт выдает ID сессии.

Далее идёт инициализация обмена, URL .

Интеграция 1С:Предприятие УТ 11.1.2 и 1С Битрикс. Настройка обмена товарами

На этом этапе в сессии инициализируется массив данных обмена $_SESSION["BX_CML2_IMPORT"] и сайт отдаёт параметры обмена: возможность использования zip, лимит размера файла и т.д. Также на этом этапе очищается папка для файлов выгрузки. Скорее всего, это будет папка /upload/1c_catalog/. Для отладки можно включить сохранение старых файлов обмена, тогда при новом обмене старые данные будут перемещаться в отдельные папки: 1c_catalog0, 1c_catalog1 и т.д.. Для сохранения данных нужно объявить константу в dbconn.php:

После этого 1С начинает подготовку данных и далее посылает их POST-запросом на сайт частями, URL: . Запрос продолжается, пока файлы не будут переданы полностью.

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

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

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

Узнать подробнее о файлах обмена

Картинки загружаются в папку import_files.

Далее начинаются шаги импорта, URL: , где ИМЯ_ФАЙЛА_ВЫГРУЗКИ — import.xml, offers.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. Индексация временной таблицы;
  5. Импорт метаданных;
  6. Импорт разделов;
  7. Деактивация разделов и пересчёт левой и правой границ для разделов;
  8. Импорт элементов;
  9. Деактивация элементов;
  10. success.

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

Модификация

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

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

Ну и, если ничего нельзя решить событиями, всегда можно полностью изменить процесс обмена, скопировав и изменив файл , компонент и класс .

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

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


Статья будет дополняться по мере появления новой информации и вдохновения.


Также полезно почитать:

.

.

FILED UNDER : IT

Submit a Comment

Must be required * marked fields.

:*
:*