При интеграции 1С с веб-сайтами на платформе 1С-Битрикс часто возникает необходимость передавать нестандартные объекты, отсутствующие в базовом протоколе CommerceML. Это могут быть заявки на регистрацию пользователей личного кабинета, новости, бренды с логотипами или производственные документы. Разберем подробнее, как устроена архитектура штатного модуля обмена, как реализовать загрузку/выгрузку произвольных данных и как устранить типовые ошибки, возникающие в процессе разработки.
При проектировании интеграции с сайтом существует два основных подхода в зависимости от требований к скорости обработки данных:
Штатный модуль обмена от 1С-Битрикс встраивается в конфигурацию 1С через механизм объединения конфигураций (или путем добавления отдельного CF-файла расширения). Проанализируем ключевые объекты платформы 1С, отвечающие за функционирование обмена:
Б_ОбменССайтом. Хранит узлы обмена, настройки авторизации, расписание и реквизиты интеграции (например, флаг ОбменЗаказами).Б_ПроцедурыОбменаССайтом. Содержит всю логику формирования XML-пакетов и их обработки. Главной точкой входа является процедура:
Процедура ВыполнитьОбмен(Настройка, ПринудительнаяПолноеОбновлениеДанныхТовара = Ложь)
СхемаXSDОбмена. Располагается внутри плана обмена Б_ОбменССайтом и служит для строгой валидации входящих и исходящих XML-файлов через XDTO.Для создания собственной выгрузки или загрузки новых документов (например, заявок на модерацию пользователей) создается новый документ в 1С, который привязывается к узлам плана обмена Б_ОбменССайтом. Обработка входящих данных на стороне 1С проектируется по аналогии с загрузкой заказов покупателей.
При передаче сложных данных, таких как медиафайлы или логотипы в формате Base64, разработчики сталкиваются с ошибкой проверки XML-файла:
Ошибка: Не соответствует простому типу: {urn:1C.ru:commerceml_2}ЗначениеТип Несоответствие фасету MaxLength = '10000'
Данная ошибка означает, что длина строки Base64 превышает ограничение, заложенное в схеме валидации XSD. Для решения проблемы выполним следующие шаги:
Б_ОбменССайтом.СхемаXSDОбмена.10000 для фасета maxLength элемента текстовых значений.10000 на 100000 или более, в зависимости от объема передаваемых файлов).В коде модуля валидация по данной схеме инициализируется следующим образом:
СхемаXSD = ПланыОбмена.Б_ОбменССайтом.ПолучитьМакет("СхемаXSDОбмена");
При оптимизации повторных выгрузок важно обратить внимание на корректность вычисления флага выгрузки только изменившихся объектов. В типовых версиях модулей встречается логика, где обнуление счетчика пакетов приводит к принудительной установке признака порционной выгрузки:
Если (ПараметрыОбмена.ВыгружатьТолькоИзменения И НЕ ПараметрыОбмена.ВыполнятьПолнуюВыгрузкуПринудительно)
ИЛИ (ПараметрыОбмена.КоличествоЭлементовСправочникаВПакете <> 0) Тогда
XDTOПользовательскиеСправочники.СодержитТолькоИзменения = XMLСтрока(Истина);
Иначе
XDTOПользовательскиеСправочники.СодержитТолькоИзменения = XMLСтрока(Ложь);
КонецЕсли;
Если параметр КоличествоЭлементовСправочникаВПакете программно переопределяется и не равен нулю, флаг СодержитТолькоИзменения будет принимать значение Истина даже при явной попытке сбросить выборку. Проанализируйте этот участок кода при доработке процедур порционного обмена.
При внесении изменений в модуль обмена важно помнить о последующих обновлениях системы:
&Перед, &После или &Вместо), избегая прямой правки основного модуля./local/php_interface/ с подключением через обработчики событий сайта, чтобы обновлять ядро CMS без риска сброса интеграционных компонентов.