Как правильно выгрузить дополнительный реквизит и список значений из 1С:УТ 11 на сайт 1С-Битрикс

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

Интеграция 1С:Управление торговлей 11 и сайта на платформе 1С-Битрикс (или Битрикс24) по стандартному протоколу CommerceML часто подталкивает разработчиков к идее «быстрого» изменения схемы обмена. Однако попытка добавить новый реквизит непосредственно в структуру XML-пакета через редактирование XDTO-пакетов конфигурации неизбежно приводит к трудностям. Рассмотрим подробнее, почему возникает популярная ошибка проверки схемы XDTO, разберем по шагам причины этого поведения и выясним, как решить задачу передачи кастомных данных и списков значений правильными методами.

Анализ проблемы: почему возникает ошибка проверки XDTO

При попытке передать новый реквизит «НаименованиеДляСайта» напрямую внутри узла товара, разработчик сталкивается со следующей ошибкой системы валидации 1С:


{ОбщийМодуль.ОбменССайтом.Модуль(1461)}: Ошибка при вызове метода контекста (Проверить)
        КаталогXDTO.Проверить();
по причине:
Ошибка проверки данных XDTO:
Структура объекта '/Товары/Товар[1]' не соответствует типу: {urn:1C.ru:commerceml_2}Товар
Проверка свойства 'НаименованиеДляСайта':
    форма: Элемент
    имя: {urn:1C.ru:commerceml_2}НаименованиеДляСайта
    тип: {http://www.w3.org/2001/XMLSchema}anyType Отсутствует обязательное свойство

Проанализируем ситуацию. Данная ошибка возникает по двум основным причинам:

  1. Нарушение жесткой структуры схемы CommerceML. Метод КаталогXDTO.Проверить() сопоставляет сформированный XML-документ с метаданными XDTO-пакета {urn:1C.ru:commerceml_2}. Если вы добавили свойство непосредственно в тип Товар, но в коде выгрузки для некоторых товаров это свойство оказалось незаполненным, либо у него не задан корректный тип данных (например, остался неопределенный тип anyType вместо строкового), валидатор 1С заблокирует выгрузку.
  2. Бесполезность модификации схемы XDTO. Даже если вы полностью победите валидацию на стороне 1С, стандартный обработчик импорта на стороне 1С-Битрикс (скрипт 1c_exchange.php) просто проигнорирует ваш кастомный тег <НаименованиеДляСайта>. Логика импорта Битрикса жестко настроена на разбор строго определенных стандартом CML2 тегов. Все нетиповые данные должны передаваться внутри специально предназначенных для этого контейнеров — <ЗначенияРеквизитов> или <ЗначенияСвойств>.

Способ №1: Использование стандартных дополнительных реквизитов (рекомендуемый)

Самый надежный и быстрый способ передать произвольное поле на сайт без изменения кода конфигурации и XML-схем — это использование типового механизма дополнительных реквизитов 1С.

Выполним следующие шаги для настройки:

  1. Перейдем в раздел Администрирование — Общие настройки — Дополнительные реквизиты и сведения и включим данную опцию.
  2. Добавим новый дополнительный реквизит для справочника «Номенклатура» с наименованием «Наименование для сайта» (тип значения — Строка). Заполним его у необходимых позиций.
  3. В настройках узла обмена с сайтом в 1С перейдем на вкладку настроек выгрузки номенклатуры и убедимся, что включена опция «Выгружать дополнительные реквизиты».
  4. При выгрузке 1С автоматически поместит этот реквизит в XML-файл import.xml в блок <ЗначенияСвойств>. Каждому доп. реквизиту будет присвоен уникальный идентификатор (GUID).
  5. На стороне 1С-Битрикс при первом импорте система автоматически создаст новое свойство в инфоблоке каталога товаров с внешним кодом, соответствующим GUID этого свойства из 1С.

Способ №2: Передача данных через «Значения реквизитов» (Requisites) программно

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

Рассмотрим пример кода, который внедряется в модуль обмена (например, в процедуру заполнения реквизитов товара перед отправкой в XML):


// Программное добавление кастомного реквизита в XML-структуру CML2
НовыйРеквизит = СвойстваТовара.Добавить();
НовыйРеквизит.Наименование = "НаименованиеДляСайта";
НовыйРеквизит.Значение     = СокрЛП(ВыборкаНоменклатуры.НаименованиеДляСайта);

В результирующем XML-файле этот блок примет абсолютно валидный вид, который не вызовет ошибок у метода Проверить():


<ЗначенияРеквизитов>
    <ЗначениеРеквизита>
        <Наименование>НаименованиеДляСайта</Наименование>
        <Значение>Красивое название товара для каталога</Значение>
    </ЗначениеРеквизита>
</ЗначенияРеквизитов>

На стороне 1С-Битрикс этот реквизит можно легко перехватить в обработчике события OnSuccessCatalogImport1C в файле local/php_interface/init.php и записать его значение в стандартное поле NAME элемента инфоблока.

Способ №3: Передача списка значений (множественного свойства)

Часто возникает задача передать на сайт множественное свойство (например, список тегов, поддерживаемые интерфейсы, или совместимые модели). Стандартные дополнительные реквизиты 1С:УТ 11 по умолчанию хранят только одно значение. Для выгрузки списка значений нам потребуется сформировать правильную XML-структуру множественного свойства.

Проанализируем структуру XML, которую понимает парсер Битрикса для множественных свойств:

  1. В описании типов свойств (блок <Свойства> в начале файла) необходимо объявить свойство как множественное, указав тег <Множественное>true</Множественное>.
  2. В блоке значений свойств конкретного товара (<ЗначенияСвойств>) передать несколько тегов <Значение> в рамках одного свойства.

Посмотрим на пример структуры XML для множественного свойства:


<Свойства>
    <Свойство>
        <Ид>СВОЙСТВО_СОВМЕСТИМОСТЬ</Ид>
        <Наименование>Совместимые устройства</Наименование>
        <ТипЗначений>Строка</ТипЗначений>
        <Множественное>true</Множественное>
    </Свойство>
</Свойства>

...

<Товары>
    <Товар>
        ...
        <ЗначенияСвойств>
            <ЗначенияСвойства>
                <Ид>СВОЙСТВО_СОВМЕСТИМОСТЬ</Ид>
                <Значение>Телефон Apple iPhone 13</Значение>
                <Значение>Телефон Apple iPhone 14</Значение>
                <Значение>Телефон Apple iPhone 15</Значение>
            </ЗначенияСвойства>
        </ЗначенияСвойств>
    </Товар>
</Товары>

При получении такого XML-файла Битрикс автоматически создаст (или обновит) свойство инфоблока, установит ему признак «Множественное» и запишет все переданные значения в карточку товара.

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

Чтобы избежать ручной модификации сложных общих модулей выгрузки (таких как ОбменССайтом), настоятельно рекомендуется отказаться от использования стандартного механизма обмена, встроенного в коробку 1С:УТ 11. Вместо этого установите официальный бесплатный Модуль интеграции 1С-Битрикс, поставляемый в виде расширения конфигурации (файла .cfe).

Этот модуль предоставляет мощный и удобный визуальный интерфейс, в котором вы сможете:

← На главную