Интеграция корпоративной учетной системы 1С:ERP Управление предприятием (или 1С:Управление торговлей) с интернет-магазином на платформе 1С-Битрикс — одна из самых частых и в то же время материалоемких задач в сфере электронной коммерции. На начальном этапе внедрения перед разработчиком и руководителем проекта неизбежно встает ряд вопросов: насколько стабильно работает штатный модуль, как сопоставлять версии релизов 1С и Битрикса, и что делать, если стандартная скорость выгрузки не удовлетворяет требованиям бизнеса. Рассмотрим эти проблемы подробно и разберем по шагам оптимальные пути их решения.
При переходе по официальной ссылке для скачивания модулей интеграции разработчики видят жесткую привязку модуля к определенным релизам конфигураций 1С. Выясним, как интерпретировать эти требования.
Указанный на сайте «1С-Битрикс» релиз прикладного решения является минимальным, на котором гарантируется работоспособность конкретной версии модуля обмена. Это означает, что если ваша конфигурация 1С старше (имеет более высокий номер релиза), модуль обмена с высокой долей вероятности будет работать корректно. Однако если ваша конфигурация сильно отстает от указанного релиза, при установке модуля возникнут критические ошибки компиляции из-за отсутствия необходимых общих модулей, реквизитов или типов данных в самой 1С.
Важная эволюция технологии: переход на расширения. Ранее интеграционный модуль от Битрикса поставлялся исключительно в виде инсталлятора, который вносил изменения непосредственно в основную конфигурацию 1С (линейка модулей 7.x). Это существенно усложняло процесс последующего обновления 1С:ERP или 1С:УТ, заставляя вручную сопоставлять измененные объекты при каждом обновлении базы.
Современным и наиболее безопасным решением является использование новой линейки модулей (версии 8.x), которые выполнены в формате расширений конфигурации 1С. Рассмотрим преимущества этого подхода:
Среди разработчиков на форумах часто звучит мнение, что штатный модуль обмена работает медленно и «из коробки» мало на что способен. Проанализируем ситуацию объективно.
Выбор архитектуры обмена напрямую зависит от масштаба вашего интернет-магазина:
CommerceML (пакетная выгрузка XML-файлов через веб-сервис) начинает проявлять свои слабые стороны. Полная выгрузка десятков тысяч товаров с картинками и свойствами может занимать от 3 до 8 часов. В таких реалиях требуется оптимизация штатного механизма или переход на комбинированные схемы обмена.Если бизнес требует, чтобы при появлении товара на складе в течение дня остаток на сайте обновлялся мгновенно (событийный обмен), классический сессионный обмен по расписанию не подойдет. Разберем, как ускорить обмен и настроить оперативную синхронизацию.
Для реализации быстрой выгрузки изменений («real-time» остатки и цены) настроим гибридный обмен:
РеализацияТоваровУслуг или ПоступлениеТоваровУслуг), в 1С срабатывает подписка на событие, отправляющая быстрый JSON-запрос на сайт.Посмотрим на пример кода подписки на событие в 1С для мгновенной отправки остатка измененного товара на сайт:
Процедура ПриЗаписиНоменклатурыОтправитьНаСайт(Источник, Отказ) Экспорт
Если Отказ Или Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Получаем текущий свободный остаток по складу
ОстатокТовара = ПолучитьСвободныйОстаток(Источник.Ссылка);
// Формируем структуру JSON для отправки на REST API Битрикса
ДанныеДляОтправки = Новый Структура;
ДанныеДляОтправки.Вставить("product_id", Источник.Код);
ДанныеДляОтправки.Вставить("quantity", ОстатокТовара);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеДляОтправки);
СтрокаJSON = ЗаписьJSON.Закрыть();
// Отправляем HTTP-запрос на сайт asynchronously или через фоновое задание
ПараметрыФонового = Новый Массив;
ПараметрыФонового.Добавить(СтрокаJSON);
ФоновыеЗадания.Выполнить("ИнтеграцияБитрикс.ОтправитьДанныеНаСайтФоново", ПараметрыФонового);
КонецПроцедуры
В оптовой торговле (B2B) часто возникает ситуация, когда каждый контрагент имеет свои индивидуальные цены, зафиксированные в Индивидуальных соглашениях в 1С:ERP. Попытка выгрузить сотни видов цен для тысяч контрагентов стандартным способом приведет к краху базы данных сайта, так как Битрикс не рассчитан на хранение миллионов уникальных торговых предложений в стандартном инфоблоке каталога.
Рассмотрим два правильных сценария реализации B2B-цен на сайте:
Вместо создания тысяч типов цен в инфоблоке каталога Битрикса, индивидуальные скидки и соглашения выгружаются в специализированные плоские таблицы — Highload-блоки. При авторизации оптового клиента на сайте, PHP-код корзины и карточки товара обращается к этой таблице, на лету вычисляя персональную стоимость товара на основании его базовой цены и индивидуальной скидки контрагента.
Сайт вообще не хранит оптовые цены. В момент, когда авторизованный клиент заходит в карточку товара или переходит в корзину, сайт отправляет быстрый 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-событий на сайте во время сессии импорта. Такие события, как автоматический ресайз картинок, пересчет скидок каталога или генерация водяных знаков при добавлении каждого товара, могут замедлить импорт в десятки раз. Их блокировка на время выполнения обмена позволит штатному модулю работать на максимальной скорости.