Как организовать обмен между 1С:ERP и 1С-Битрикс: совместимость версий, оптимизация скорости и решение сложных B2B-задач

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет Торговля и дистрибуция
← На главную

Интеграция корпоративной учетной системы 1С:ERP Управление предприятием (или 1С:Управление торговлей) с интернет-магазином на платформе 1С-Битрикс — одна из самых частых и в то же время материалоемких задач в сфере электронной коммерции. На начальном этапе внедрения перед разработчиком и руководителем проекта неизбежно встает ряд вопросов: насколько стабильно работает штатный модуль, как сопоставлять версии релизов 1С и Битрикса, и что делать, если стандартная скорость выгрузки не удовлетворяет требованиям бизнеса. Рассмотрим эти проблемы подробно и разберем по шагам оптимальные пути их решения.

Совместимость версий: как правильно выбрать и обновлять модуль обмена

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

Указанный на сайте «1С-Битрикс» релиз прикладного решения является минимальным, на котором гарантируется работоспособность конкретной версии модуля обмена. Это означает, что если ваша конфигурация 1С старше (имеет более высокий номер релиза), модуль обмена с высокой долей вероятности будет работать корректно. Однако если ваша конфигурация сильно отстает от указанного релиза, при установке модуля возникнут критические ошибки компиляции из-за отсутствия необходимых общих модулей, реквизитов или типов данных в самой 1С.

Важная эволюция технологии: переход на расширения. Ранее интеграционный модуль от Битрикса поставлялся исключительно в виде инсталлятора, который вносил изменения непосредственно в основную конфигурацию 1С (линейка модулей 7.x). Это существенно усложняло процесс последующего обновления 1С:ERP или 1С:УТ, заставляя вручную сопоставлять измененные объекты при каждом обновлении базы.

Современным и наиболее безопасным решением является использование новой линейки модулей (версии 8.x), которые выполнены в формате расширений конфигурации 1С. Рассмотрим преимущества этого подхода:

  1. Основная конфигурация 1С остается полностью типовой, что позволяет обновлять ее в автоматическом режиме.
  2. Модуль обмена подключается отдельно через механизм расширений за несколько кликов.
  3. При выходе критических обновлений 1С разработчики «1С-Битрикс» оперативно выпускают новые версии расширения, которые заменяются без болезненного слияния кода.

Типовой обмен против кастомного: когда стоит использовать штатный модуль

Среди разработчиков на форумах часто звучит мнение, что штатный модуль обмена работает медленно и «из коробки» мало на что способен. Проанализируем ситуацию объективно.

Выбор архитектуры обмена напрямую зависит от масштаба вашего интернет-магазина:

Оптимизация производительности и настройка real-time обновлений

Если бизнес требует, чтобы при появлении товара на складе в течение дня остаток на сайте обновлялся мгновенно (событийный обмен), классический сессионный обмен по расписанию не подойдет. Разберем, как ускорить обмен и настроить оперативную синхронизацию.

Для реализации быстрой выгрузки изменений («real-time» остатки и цены) настроим гибридный обмен:

  1. Тяжелые данные (описания товаров, иерархия каталога, картинки, технические характеристики) выгружаются раз в сутки ночью по стандартному каналу CommerceML. Для этого в настройках узла обмена в 1С устанавливается режим выгрузки «Только изменения» с отключенной опцией передачи картинок в ежедневных пакетах.
  2. Оперативные данные (актуальные остатки на складах и динамические цены) передаются точечно в момент их изменения в 1С. Для этого задействуется механизм вебхуков или REST API Битрикса. Как только в 1С проводится документ, влияющий на остатки (например, РеализацияТоваровУслуг или ПоступлениеТоваровУслуг), в 1С срабатывает подписка на событие, отправляющая быстрый JSON-запрос на сайт.

Посмотрим на пример кода подписки на событие в 1С для мгновенной отправки остатка измененного товара на сайт:


Процедура ПриЗаписиНоменклатурыОтправитьНаСайт(Источник, Отказ) Экспорт
    Если Отказ Или Источник.ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;
    
    // Получаем текущий свободный остаток по складу
    ОстатокТовара = ПолучитьСвободныйОстаток(Источник.Ссылка);
    
    // Формируем структуру JSON для отправки на REST API Битрикса
    ДанныеДляОтправки = Новый Структура;
    ДанныеДляОтправки.Вставить("product_id", Источник.Код);
    ДанныеДляОтправки.Вставить("quantity", ОстатокТовара);
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, ДанныеДляОтправки);
    СтрокаJSON = ЗаписьJSON.Закрыть();
    
    // Отправляем HTTP-запрос на сайт asynchronously или через фоновое задание
    ПараметрыФонового = Новый Массив;
    ПараметрыФонового.Добавить(СтрокаJSON);
    ФоновыеЗадания.Выполнить("ИнтеграцияБитрикс.ОтправитьДанныеНаСайтФоново", ПараметрыФонового);
КонецПроцедуры

Решение сложных B2B-задач: индивидуальные соглашения и цены

В оптовой торговле (B2B) часто возникает ситуация, когда каждый контрагент имеет свои индивидуальные цены, зафиксированные в Индивидуальных соглашениях в 1С:ERP. Попытка выгрузить сотни видов цен для тысяч контрагентов стандартным способом приведет к краху базы данных сайта, так как Битрикс не рассчитан на хранение миллионов уникальных торговых предложений в стандартном инфоблоке каталога.

Рассмотрим два правильных сценария реализации B2B-цен на сайте:

Вариант 1. Использование Highload-блоков на стороне Битрикса

Вместо создания тысяч типов цен в инфоблоке каталога Битрикса, индивидуальные скидки и соглашения выгружаются в специализированные плоские таблицы — Highload-блоки. При авторизации оптового клиента на сайте, PHP-код корзины и карточки товара обращается к этой таблице, на лету вычисляя персональную стоимость товара на основании его базовой цены и индивидуальной скидки контрагента.

Вариант 2. Запросы в реальном времени (Real-time API)

Сайт вообще не хранит оптовые цены. В момент, когда авторизованный клиент заходит в карточку товара или переходит в корзину, сайт отправляет быстрый HTTP-запрос в 1С:ERP, передавая код клиента и код товара. 1С мгновенно рассчитывает точную цену со всеми скидками по соглашению и возвращает ее сайту. Разберем пример реализации простейшего HTTP-сервиса на стороне 1С для этой задачи:


Функция ПолучитьИндивидуальнуюЦену(Запрос)
    ИдентификаторТовара = Запрос.ПараметрыURL.Получить("product_id");
    ИдентификаторПартнера = Запрос.ПараметрыURL.Получить("partner_id");
    
    СсылкаНоменклатура = Справочники.Номенклатура.НайтиПоКоду(ИдентификаторТовара);
    СсылкаПартнер = Справочники.Партнеры.НайтиПоКоду(ИдентификаторПартнера);
    
    Если СсылкаНоменклатура.Пустая() Или СсылкаПартнер.Пустая() Тогда
        Ответ = Новый HTTPСервисОтвет(404);
        Возврат Ответ;
    КонецЕсли;
    
    // Вызов типового механизма ERP для расчета цены по соглашениям
    АктуальнаяЦена = ЦенообразованиеВызовСервера.ПолучитьЦенуДляПартнера(СсылкаНоменклатура, СсылкаПартнер);
    
    СтруктураОтвета = Новый Структура("price", АктуальнаяЦена);
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, СтруктураОтвета);
    
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.УстановитьТелоИзСтроки(ЗаписьJSON.Закрыть(), КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
    Возврат Ответ;
КонецФункции

Полезные лайфхаки для отладки обмена

Когда выгрузка работает некорректно или данные на сайте не обновляются, стандартных логов в административной панели Битрикса часто не хватает для локализации проблемы. Выясним, как упростить процесс отладки.

По умолчанию Битрикс удаляет временные XML-файлы, присланные из 1С, сразу после завершения импорта пакета. Чтобы детально изучить структуру присланного CommerceML-файла, запретим сайту удалять эти файлы. Для этого откроем конфигурационный файл сайта /bitrix/php_interface/dbconn.php и добавим следующую строку:

define("BX_CATALOG_IMPORT_1C_PRESERVE", true);

После активации этой константы все присылаемые из 1С файлы импорта будут сохраняться в директории сайта /upload/1c_catalog/. Вы сможете вручную открыть их, проанализировать XML-структуру и понять, на чьей стороне ошибка — некорректно сформирован файл в 1С или произошел сбой разбора XML-парсером на стороне Битрикса.

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

← На главную