Интеграция 1С:Управление торговлей 11 и сайта на платформе 1С-Битрикс (или Битрикс24) по стандартному протоколу CommerceML часто подталкивает разработчиков к идее «быстрого» изменения схемы обмена. Однако попытка добавить новый реквизит непосредственно в структуру XML-пакета через редактирование XDTO-пакетов конфигурации неизбежно приводит к трудностям. Рассмотрим подробнее, почему возникает популярная ошибка проверки схемы XDTO, разберем по шагам причины этого поведения и выясним, как решить задачу передачи кастомных данных и списков значений правильными методами.
При попытке передать новый реквизит «НаименованиеДляСайта» напрямую внутри узла товара, разработчик сталкивается со следующей ошибкой системы валидации 1С:
{ОбщийМодуль.ОбменССайтом.Модуль(1461)}: Ошибка при вызове метода контекста (Проверить)
КаталогXDTO.Проверить();
по причине:
Ошибка проверки данных XDTO:
Структура объекта '/Товары/Товар[1]' не соответствует типу: {urn:1C.ru:commerceml_2}Товар
Проверка свойства 'НаименованиеДляСайта':
форма: Элемент
имя: {urn:1C.ru:commerceml_2}НаименованиеДляСайта
тип: {http://www.w3.org/2001/XMLSchema}anyType Отсутствует обязательное свойство
Проанализируем ситуацию. Данная ошибка возникает по двум основным причинам:
КаталогXDTO.Проверить() сопоставляет сформированный XML-документ с метаданными XDTO-пакета {urn:1C.ru:commerceml_2}. Если вы добавили свойство непосредственно в тип Товар, но в коде выгрузки для некоторых товаров это свойство оказалось незаполненным, либо у него не задан корректный тип данных (например, остался неопределенный тип anyType вместо строкового), валидатор 1С заблокирует выгрузку.1c_exchange.php) просто проигнорирует ваш кастомный тег <НаименованиеДляСайта>. Логика импорта Битрикса жестко настроена на разбор строго определенных стандартом CML2 тегов. Все нетиповые данные должны передаваться внутри специально предназначенных для этого контейнеров — <ЗначенияРеквизитов> или <ЗначенияСвойств>.Самый надежный и быстрый способ передать произвольное поле на сайт без изменения кода конфигурации и XML-схем — это использование типового механизма дополнительных реквизитов 1С.
Выполним следующие шаги для настройки:
import.xml в блок <ЗначенияСвойств>. Каждому доп. реквизиту будет присвоен уникальный идентификатор (GUID).Если вам требуется передать кастомный строковый реквизит без создания интерактивных доп. реквизитов для пользователей в 1С, мы можем записать его в стандартную секцию <ЗначенияРеквизитов> товара программным путем.
Рассмотрим пример кода, который внедряется в модуль обмена (например, в процедуру заполнения реквизитов товара перед отправкой в XML):
// Программное добавление кастомного реквизита в XML-структуру CML2
НовыйРеквизит = СвойстваТовара.Добавить();
НовыйРеквизит.Наименование = "НаименованиеДляСайта";
НовыйРеквизит.Значение = СокрЛП(ВыборкаНоменклатуры.НаименованиеДляСайта);
В результирующем XML-файле этот блок примет абсолютно валидный вид, который не вызовет ошибок у метода Проверить():
<ЗначенияРеквизитов>
<ЗначениеРеквизита>
<Наименование>НаименованиеДляСайта</Наименование>
<Значение>Красивое название товара для каталога</Значение>
</ЗначениеРеквизита>
</ЗначенияРеквизитов>
На стороне 1С-Битрикс этот реквизит можно легко перехватить в обработчике события OnSuccessCatalogImport1C в файле local/php_interface/init.php и записать его значение в стандартное поле NAME элемента инфоблока.
Часто возникает задача передать на сайт множественное свойство (например, список тегов, поддерживаемые интерфейсы, или совместимые модели). Стандартные дополнительные реквизиты 1С:УТ 11 по умолчанию хранят только одно значение. Для выгрузки списка значений нам потребуется сформировать правильную XML-структуру множественного свойства.
Проанализируем структуру XML, которую понимает парсер Битрикса для множественных свойств:
<Свойства> в начале файла) необходимо объявить свойство как множественное, указав тег <Множественное>true</Множественное>.<ЗначенияСвойств>) передать несколько тегов <Значение> в рамках одного свойства.Посмотрим на пример структуры XML для множественного свойства:
<Свойства>
<Свойство>
<Ид>СВОЙСТВО_СОВМЕСТИМОСТЬ</Ид>
<Наименование>Совместимые устройства</Наименование>
<ТипЗначений>Строка</ТипЗначений>
<Множественное>true</Множественное>
</Свойство>
</Свойства>
...
<Товары>
<Товар>
...
<ЗначенияСвойств>
<ЗначенияСвойства>
<Ид>СВОЙСТВО_СОВМЕСТИМОСТЬ</Ид>
<Значение>Телефон Apple iPhone 13</Значение>
<Значение>Телефон Apple iPhone 14</Значение>
<Значение>Телефон Apple iPhone 15</Значение>
</ЗначенияСвойства>
</ЗначенияСвойств>
</Товар>
</Товары>
При получении такого XML-файла Битрикс автоматически создаст (или обновит) свойство инфоблока, установит ему признак «Множественное» и запишет все переданные значения в карточку товара.
Чтобы избежать ручной модификации сложных общих модулей выгрузки (таких как ОбменССайтом), настоятельно рекомендуется отказаться от использования стандартного механизма обмена, встроенного в коробку 1С:УТ 11. Вместо этого установите официальный бесплатный Модуль интеграции 1С-Битрикс, поставляемый в виде расширения конфигурации (файла .cfe).
Этот модуль предоставляет мощный и удобный визуальный интерфейс, в котором вы сможете: