Как передать вес и дополнительные поля номенклатуры из 1С в 1С-Битрикс без изменения пакета XDTO

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

При настройке обмена между «1С:Управление торговлей» и сайтом под управлением «1С-Битрикс» часто возникает задача выгрузить дополнительные данные товара, например, вес или коэффициент пересчета в погонные метры. Начинающие разработчики пытаются найти наименования полей базы данных сайта (такие как CATALOG_PRICE_1 или CATALOG_WEIGHT) внутри пакетов XDTO конфигурации 1С и внести туда изменения. Разберем, почему этот подход не работает и как решить задачу штатными и безопасными способами.

Выясним причину: почему идентификаторов полей сайта нет в 1С

Идентификаторы вида CATALOG_PRICE_1 и CATALOG_WEIGHT — это наименования столбцов в таблицах базы данных сайта на Битриксе. В формате обмена CommerceML (CML) и схемах XDTO 1С таких наименований нет и быть не может.

Сопоставление данных при выгрузке происходит на стороне интернет-магазина:

  1. Цены: В XML-файле передается идентификатор типа цены (тег <ИдТипаЦены>). Модуль импорта Битрикса при первичном обмене сопоставляет этот идентификатор с типом цены на сайте и записывает значение в колонку CATALOG_PRICE_1.
  2. Вес: Стандартный протокол CommerceML передает вес в блоке <ЗначенияРеквизитов> или в виде атрибута базовой единицы. Парсер сайта автоматически считывает это значение и помещает его в системную колонку веса каталога (CATALOG_WEIGHT).

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

Способ 1. Использование специализированного модуля обмена от Битрикс

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

В этом модуле реквизиты веса и габаритов уже заложены в штатный функционал. Выгрузка веса происходит автоматически при соблюдении следующих условий:

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

Способ 2. Выгрузка коэффициентов и произвольных данных через дополнительные реквизиты

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

Разберем по шагам, как выгрузить произвольное поле:

  1. Откроем в 1С состав дополнительных реквизитов для справочника Номенклатура.
  2. Создадим новый дополнительный реквизит, например, «Коэффициент погонных метров» с типом данных Число.
  3. Заполним значение этого реквизита у необходимых товаров.

При стандартном обмене платформа 1С автоматически поместит все дополнительные реквизиты в XML-блок <ЗначенияСвойств>. На стороне сайта эти данные автоматически создадутся как свойства инфоблока, и их можно будет использовать в карточке товара или в калькуляциях на PHP.

Способ 3. Передача данных в системные поля сайта через PHP-обработчики

Если коэффициент или вес необходимо записать строго в системное поле Битрикса, а не просто сохранить в свойствах элемента инфоблока, лучшим решением будет сочетение выгрузки дополнительного реквизита из 1С и обработка его на стороне сайта.

Схема работы выглядит следующим образом:

  1. 1С передает данные в узел <ЗначенияСвойств> (Способ 2).
  2. На стороне сайта в файле init.php регистрируется обработчик события обмена (например, OnSuccessCatalogImport1C или событие обновления элемента инфоблока).
  3. Обработчик берет значение из переданного свойства номенклатуры и записать его напрямую в поле торгового каталога (например, через методы API Битрикса CCatalogProduct::Update).

Способ 4. Программное добавление реквизита в 1С через расширение (без изменения XDTO)

Если реквизит не является дополнительным свойством номенклатуры, а рассчитывается динамически в коде 1С, его можно добавить в структуру выгрузки программно, не меняя схему XDTO.

Для этого создадим расширение конфигурации и перехватим процедуру заполнения структуры свойств выгружаемого номенклатурного позиционирования до момента формирования XML. Посмотрим на логику такого решения:


&АнаЛизИнициализации
Процедура Расш1_ЗаполнитьСвойстваВыгрузкиНоменклатуры(СтруктураДанных, НоменклатураСсылка)
    
    // Вычисляем значение нужного коэффициента
    ЗначениеКоэффициента = ПолучитьКоэффициентПересчета(НоменклатураСсылка);
    
    // Добавляем значение в структуру дополнительных реквизитов, 
    // которая штатно сериализуется в блок ЗначенияСвойств
    НовоеСвойство = Новый Структура;
    НовоеСвойство.Вставить("Имя", "КоэффициентПогонныхМетров");
    НовоеСвойство.Вставить("Значение", ЗначениеКоэффициента);
    
    СтруктураДанных.Свойства.Добавить(НовоеСвойство);

КонецПроцедуры

Таким образом, использование штатного модуля обмена и механизма дополнительных реквизитов позволяет полностью решить задачу передачи любых пользовательских данных из 1С на сайт без рисков поломки структуры XML и проблем при обновлении системы.

← На главную