Как добавить дополнительные текстовые описания номенклатуры в 1С и настроить их выгрузку на сайт?

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

При интеграции 1С с интернет-магазинами (например, на платформе 1С-Битрикс, OpenCart или других CMS) часто возникает задача разделения описания товара на несколько логических блоков. Стандартного поля "Описание" в карточке номенклатуры становится недостаточно, когда на сайте требуется вывести отдельно "Краткое описание", "Подробные технические характеристики", "Инструкцию по применению" или "Особенности эксплуатации".

В этой статье мы подробно разберем, как решить эту задачу двумя способами: без программирования (используя лучшие практики и типовой функционал БСП) и через доработку конфигурации 1С. Также мы выясним причину, почему созданные вручную поля не попадают в XML-файл обмена, и как это исправить.

---

Почему новые реквизиты, созданные в Конфигураторе, не выгружаются на сайт по умолчанию?

Рассмотрим ситуацию: разработчик добавил новые реквизиты Описание1 и Описание2 напрямую в справочник Номенклатура через конфигуратор, вывел их на форму, заполнил данные, но при запуске обмена с сайтом текстовые блоки не появились в XML-файле (обычно это import.xml).

Выясним причину этого поведения. Обмен данными между 1С и CMS-системами происходит по строго регламентированному стандарту CommerceML. Структура XML-файла описывается схемой XDTO, в которой тег <Товар> имеет строго фиксированный набор базовых дочерних элементов (таких как Наименование, Артикул, Описание, Штрихкод).

Если алгоритм выгрузки встречает незарегистрированный реквизит в справочнике:

  1. Стандартный программный код модуля обмена просто игнорирует его, так как в нем жестко прописан сбор только базовых полей.
  2. Если попытаться принудительно записать произвольный XML-тег внутрь структуры товара, файл не пройдет валидацию XDTO-схемы на стороне принимающей системы, и выгрузка завершится ошибкой.

Для корректной передачи дополнительных сведений стандарт CommerceML предусматривает использование специального блока <ЗначенияСвойств>. Именно туда должны помещаться все пользовательские текстовые поля.

---

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

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

Разберем этот процесс по шагам на примере конфигурации 1С:Управление торговлей 11 (аналогично для ERP, Комплексной автоматизации и УНФ):

Шаг 1. Включение функциональной опции

  1. Перейдем в раздел НСИ и администрирование -> Настройка НСИ и разделов -> Общие настройки.
  2. Развернем группу Дополнительные реквизиты и сведения.
  3. Установим флаг напротив пункта Дополнительные реквизиты и сведения.

Шаг 2. Создание дополнительных полей для Номенклатуры

  1. В этом же окне перейдем по ссылке Дополнительные реквизиты.
  2. В левой части окна выберем справочник Номенклатура (или конкретный вид номенклатуры, для которого нужны эти описания).
  3. Нажмем кнопку Добавить -> Новый.
  4. В открывшейся карточке заполним следующие поля:
    • Наименование: "Дополнительное описание 1" (или "Описание на сайте 1").
    • Тип значения: выберем Дополнительное значение или просто Строка. Если текст планируется длинный и с абзацами, выберем тип Строка и установим флаг Многострочное поле ввода.
  5. Нажмем Записать и закрыть. Повторим процедуру для создания поля "Дополнительное описание 2".

Шаг 3. Заполнение данных в карточке товара

Теперь откроем любую позицию номенклатуры. В карточке товара появится вкладка (или группа полей) Дополнительные реквизиты. Заполним созданные поля уникальными текстовыми блоками.

Почему это решает проблему с выгрузкой в XML?

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


<ЗначенияСвойств>
    <ЗначенияСвойства>
        <Ид>GUID_вашего_доп_реквизита_1</Ид>
        <Наименование>Дополнительное описание 1</Наименование>
        <Значение>Текст первого детального блока описания товара...</Значение>
    </ЗначенияСвойства>
    <ЗначенияСвойства>
        <Ид>GUID_вашего_доп_реквизита_2</Ид>
        <Наименование>Дополнительное описание 2</Наименование>
        <Значение>Текст второго блока описания товара с характеристиками...</Значение>
    </ЗначенияСвойства>
</ЗначенияСвойств>

На стороне сайта (например, 1С-Битрикс) эти данные автоматически создадутся как свойства инфоблока, и контент-менеджер сможет легко вывести их в шаблоне карточки товара в разные вкладки.

---

Решение 2. Доработка выгрузки, если реквизиты уже созданы в Конфигураторе

Если реквизиты Описание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. Создадим новые "Дополнительные реквизиты" через пользовательский интерфейс 1С (как описано в Решении 1).
  2. Воспользуемся стандартной обработкой Групповое изменение реквизитов (ее можно найти в разделе НСИ и администрирование -> Обслуживание -> Корректировка данных).
  3. В обработке выберем объект Номенклатура. При необходимости настроим фильтр по нужной группе или виду номенклатуры.
  4. В списке реквизитов найдем наши новые созданные дополнительные реквизиты (они будут отображаться в списке доступных для изменения).
  5. В качестве нового значения для них пропишем формулу или программно перенесем данные из старых полей конфигурации Описание1 и Описание2 в табличную часть дополнительных реквизитов. Для этого можно написать простую внешнюю обработку в несколько строк кода:

Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
    Если ЗначениеЗаполнено(Выборка.Описание1) Тогда
        ОбъектНоменклатуры = Выборка.ПолучитьОбъект();
        
        // Поиск или добавление строки в табличную часть ДополнительныеРеквизиты
        НоваяСтрока = ОбъектНоменклатуры.ДополнительныеРеквизиты.Добавить();
        НоваяСтрока.Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Дополнительное описание 1");
        НоваяСтрока.Значение = Выборка.Описание1;
        
        ОбъектНоменклатуры.Записать();
    КонецЕсли;
КонецЦикла;
  1. После успешного переноса данных откроем конфигуратор, удалим самописные реквизиты Описание1 и Описание2 со всех форм и из дерева метаданных справочника Номенклатура. Наша база снова вернется на стандартную поддержку, а выгрузка на сайт начнет работать в штатном режиме.

---

Резюме

Мы проанализировали проблему невыгрузки новых полей на сайт и рассмотрели два метода ее решения. Использование Дополнительных реквизитов является наиболее технологичным и безопасным решением, которое сохраняет конфигурацию типовой и гарантирует стабильную интеграцию с веб-ресурсами без необходимости регулярной правки программного кода обмена.

← На главную