При интеграции 1С с интернет-магазинами (например, на платформе 1С-Битрикс, OpenCart или других CMS) часто возникает задача разделения описания товара на несколько логических блоков. Стандартного поля "Описание" в карточке номенклатуры становится недостаточно, когда на сайте требуется вывести отдельно "Краткое описание", "Подробные технические характеристики", "Инструкцию по применению" или "Особенности эксплуатации".
В этой статье мы подробно разберем, как решить эту задачу двумя способами: без программирования (используя лучшие практики и типовой функционал БСП) и через доработку конфигурации 1С. Также мы выясним причину, почему созданные вручную поля не попадают в XML-файл обмена, и как это исправить.
---
Рассмотрим ситуацию: разработчик добавил новые реквизиты Описание1 и Описание2 напрямую в справочник Номенклатура через конфигуратор, вывел их на форму, заполнил данные, но при запуске обмена с сайтом текстовые блоки не появились в XML-файле (обычно это import.xml).
Выясним причину этого поведения. Обмен данными между 1С и CMS-системами происходит по строго регламентированному стандарту CommerceML. Структура XML-файла описывается схемой XDTO, в которой тег <Товар> имеет строго фиксированный набор базовых дочерних элементов (таких как Наименование, Артикул, Описание, Штрихкод).
Если алгоритм выгрузки встречает незарегистрированный реквизит в справочнике:
Для корректной передачи дополнительных сведений стандарт CommerceML предусматривает использование специального блока <ЗначенияСвойств>. Именно туда должны помещаться все пользовательские текстовые поля.
---
Самый простой, быстрый и правильный способ добавить несколько описаний — это использование встроенного механизма Дополнительных реквизитов и сведений (компонент Библиотеки стандартных подсистем — БСП). Он позволяет решать задачу полностью в пользовательском режиме, не снимая конфигурацию с поддержки.
Разберем этот процесс по шагам на примере конфигурации 1С:Управление торговлей 11 (аналогично для ERP, Комплексной автоматизации и УНФ):
Шаг 1. Включение функциональной опции
Шаг 2. Создание дополнительных полей для Номенклатуры
Дополнительное значение или просто Строка. Если текст планируется длинный и с абзацами, выберем тип Строка и установим флаг Многострочное поле ввода.Шаг 3. Заполнение данных в карточке товара
Теперь откроем любую позицию номенклатуры. В карточке товара появится вкладка (или группа полей) Дополнительные реквизиты. Заполним созданные поля уникальными текстовыми блоками.
Почему это решает проблему с выгрузкой в XML?
При использовании дополнительных реквизитов стандартный модуль обмена 1С автоматически считывает их и помещает в XML-файл внутри тега <ЗначенияСвойств> для каждого товара. На выходе в XML это выглядит структурировано:
<ЗначенияСвойств>
<ЗначенияСвойства>
<Ид>GUID_вашего_доп_реквизита_1</Ид>
<Наименование>Дополнительное описание 1</Наименование>
<Значение>Текст первого детального блока описания товара...</Значение>
</ЗначенияСвойства>
<ЗначенияСвойства>
<Ид>GUID_вашего_доп_реквизита_2</Ид>
<Наименование>Дополнительное описание 2</Наименование>
<Значение>Текст второго блока описания товара с характеристиками...</Значение>
</ЗначенияСвойства>
</ЗначенияСвойств>
На стороне сайта (например, 1С-Битрикс) эти данные автоматически создадутся как свойства инфоблока, и контент-менеджер сможет легко вывести их в шаблоне карточки товара в разные вкладки.
---
Если реквизиты Описание1 и Описание2 уже были созданы непосредственно в метаданных справочника Номенклатура в конфигураторе, и база данных уже заполнена информацией, мы можем пойти по пути программной доработки механизма обмена.
Рассмотрим, как модифицировать код выгрузки, чтобы не нарушить структуру CommerceML.
Шаг 1. Локализация кода обмена
Логика формирования XML-пакета находится в общем модуле ОбменССайтом (или в модуле менеджера плана обмена ОбменУправлениеТорговлейСайт в зависимости от редакции конфигурации). Нам необходимо найти процедуру, которая отвечает за выгрузку свойств товара. Обычно она называется ЗаполнитьДанныеТовара, ВыгрузитьТовары или ЗаписатьСвойстваТовараXML.
Шаг 2. Программное внедрение реквизитов в XML
Чтобы не ломать валидацию файла, мы запишем наши новые реквизиты конфигурации как "виртуальные" свойства CommerceML. Проанализируем пример кода, который считывает реквизиты карточки товара и записывает их в XML-структуру:
// Функция дописывает кастомные реквизиты номенклатуры в блок значений свойств XML
Процедура ДобавитьКастомныеОписанияВXML(ЗаписьXML, НоменклатураСсылка) Экспорт
// Выгружаем "Описание1"
Если ЗначениеЗаполнено(НоменклатураСсылка.Описание1) Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента("ЗначенияСвойства");
// Записываем фиксированный или генерируемый GUID свойства
ЗаписьXML.ЗаписатьНачалоЭлемента("Ид");
ЗаписьXML.ЗаписатьТекст("CUSTOM_PROPERTY_OPISANIE_1");
ЗаписьXML.ЗаписатьКонецЭлемента(); // Ид
ЗаписьXML.ЗаписатьНачалоЭлемента("Наименование");
ЗаписьXML.ЗаписатьТекст("Дополнительное описание 1");
ЗаписьXML.ЗаписатьКонецЭлемента(); // Наименование
ЗаписьXML.ЗаписатьНачалоЭлемента("Значение");
ЗаписьXML.ЗаписатьТекст(НоменклатураСсылка.Описание1);
ЗаписьXML.ЗаписатьКонецЭлемента(); // Значение
ЗаписьXML.ЗаписатьКонецЭлемента(); // ЗначенияСвойства
КонецЕсли;
// Выгружаем "Описание2"
Если ЗначениеЗаполнено(НоменклатураСсылка.Описание2) Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента("ЗначенияСвойства");
ЗаписьXML.ЗаписатьНачалоЭлемента("Ид");
ЗаписьXML.ЗаписатьТекст("CUSTOM_PROPERTY_OPISANIE_2");
ЗаписьXML.ЗаписатьКонецЭлемента(); // Ид
ЗаписьXML.ЗаписатьНачалоЭлемента("Наименование");
ЗаписьXML.ЗаписатьТекст("Дополнительное описание 2");
ЗаписьXML.ЗаписатьКонецЭлемента(); // Наименование
ЗаписьXML.ЗаписатьНачалоЭлемента("Значение");
ЗаписьXML.ЗаписатьТекст(НоменклатураСсылка.Описание2);
ЗаписьXML.ЗаписатьКонецЭлемента(); // Значение
ЗаписьXML.ЗаписатьКонецЭлемента(); // ЗначенияСвойства
КонецЕсли;
КонецПроцедуры
Вызов этой процедуры необходимо встроить в общий цикл выгрузки свойств товара, непосредственно перед закрытием XML-тега </ЗначенияСвойств>.
---
Если вы уже создали реквизиты в конфигураторе, но поняли, что поддержка кастомного кода обмена требует постоянных трудозатрат при обновлениях 1С, лучшим решением будет перенос данных в стандартный механизм дополнительных реквизитов БСП с последующим удалением доработок из метаданных.
Рассмотрим алгоритм перехода:
Номенклатура. При необходимости настроим фильтр по нужной группе или виду номенклатуры.Описание1 и Описание2 в табличную часть дополнительных реквизитов. Для этого можно написать простую внешнюю обработку в несколько строк кода:
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
Если ЗначениеЗаполнено(Выборка.Описание1) Тогда
ОбъектНоменклатуры = Выборка.ПолучитьОбъект();
// Поиск или добавление строки в табличную часть ДополнительныеРеквизиты
НоваяСтрока = ОбъектНоменклатуры.ДополнительныеРеквизиты.Добавить();
НоваяСтрока.Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Дополнительное описание 1");
НоваяСтрока.Значение = Выборка.Описание1;
ОбъектНоменклатуры.Записать();
КонецЕсли;
КонецЦикла;
Описание1 и Описание2 со всех форм и из дерева метаданных справочника Номенклатура. Наша база снова вернется на стандартную поддержку, а выгрузка на сайт начнет работать в штатном режиме.---
Мы проанализировали проблему невыгрузки новых полей на сайт и рассмотрели два метода ее решения. Использование Дополнительных реквизитов является наиболее технологичным и безопасным решением, которое сохраняет конфигурацию типовой и гарантирует стабильную интеграцию с веб-ресурсами без необходимости регулярной правки программного кода обмена.