Как перенести номенклатуру с дополнительными реквизитами из БП 3.0 в Розницу 2.2/3.0 и заставить их отображаться в карточке товара?

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

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

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

В чем кроется причина проблемы: разница архитектур БП и Розницы

Прежде чем приступать к написанию кода и настройке правил обмена, давайте проанализируем, почему стандартный перенос «в лоб» не работает. Причина кроется в разной логике использования номенклатуры в бухгалтерском и торговом контурах:

  1. В конфигурации «Бухгалтерия предприятия 3.0»: Учет номенклатуры максимально упрощен. Здесь нет жесткого деления на виды номенклатуры со своими уникальными наборами свойств. Дополнительные реквизиты чаще всего создаются общим списком для всей номенклатуры и привязываются к предопределенному элементу справочника НаборыДополнительныхРеквизитовИСведений с именем Справочник_Номенклатура.
  2. В конфигурации «Розница 2.2 / 3.0» (а также в УТ и ERP): Архитектура гораздо сложнее. Дополнительные реквизиты жестко привязаны к конкретным Видам номенклатуры. Для каждого созданного вида номенклатуры система автоматически генерирует собственный уникальный элемент в справочнике НаборыДополнительныхРеквизитовИСведений и связывает их через реквизит НаборСвойств.

Когда мы переносим данные, свойства (ПВХ ДополнительныеРеквизитыИСведения) и их значения успешно записываются в базу-приемник. Более того, табличная часть ДополнительныеРеквизиты у конкретного товара в Рознице оказывается заполненной. Но на форме элемента мы видим пустоту.

Выясним причину: Отображением дополнительных реквизитов на управляемой форме управляет программный код БСП. При открытии карточки товара система анализирует, к какому Виду номенклатуры относится данный товар, находит связанный с этим видом Набор свойств и выводит на форму исключительно те свойства, которые зарегистрированы в табличной части этого Набора. Поскольку перенесенные из БП свойства не были добавлены в табличную часть конкретного набора свойств Розницы, БСП считает их «чужими» для данного товара и скрывает от пользователя.

---

Решение 1. Перенос свойств как «Общих» для всей номенклатуры

Если добавленные 5 дополнительных реквизитов должны отображаться у абсолютно всех товаров в Рознице (независимо от того, одежда это, обувь или продукты питания), мы можем привязать их к общему набору свойств номенклатуры.

В Рознице для этих целей существует предопределенный элемент справочника НаборыДополнительныхРеквизитовИСведений с именем предопределенного значения Справочник_Номенклатура_Общие. Нам нужно перенаправить поиск правил обмена.

Рассмотрим по шагам настройку в КД 2.0:

  1. Найдем или создадим ПКО (Правило конвертации объектов) для справочника НаборыДополнительныхРеквизитовИСведений.
  2. В обработчике события «Поля поиска» напишем код, переопределяющий поиск предопределенного элемента. Если источник пытается передать общий набор свойств номенклатуры из БП, мы принудительно сопоставим его с общим набором Розницы:

Если СвойстваПоиска.Получить("ИмяПредопределенногоНабора") = "Справочник_Номенклатура" Тогда
    СсылкаНаОбъект = Справочники.НаборыДополнительныхРеквизитовИСведений.Справочник_Номенклатура_Общие;
    ПрекратитьПоиск = Истина;
КонецЕсли;

После такой настройки все новые свойства, перенесенные из БП, запишутся внутрь общего набора свойств номенклатуры Розницы и станут доступны для отображения у каждого товара.

---

Решение 2. Динамическое распределение свойств по индивидуальным Видам номенклатуры

Что делать, если в Рознице товары четко разделены по видам, и переносимые реквизиты должны отображаться только у товаров определенного вида? Поскольку в БП видов номенклатуры нет, нам придется распределять свойства динамически при загрузке самого товара.

Рассмотрим алгоритм реализации этой задачи:

  1. При импорте элемента справочника Номенклатура в Розницу система сопоставляет или назначает ему определенный ВидНоменклатуры (например, по родителю, группе или значению по умолчанию).
  2. В ПКО Номенклатура в обработчике события «После загрузки» мы пишем код, который обращается к набору свойств назначенного вида номенклатуры и программно добавляет перенесенные свойства в этот набор (если их там еще нет).

Проанализируем пример кода для обработчика «После загрузки» в ПКО номенклатуры:


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

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

---

Рекомендация по архитектуре данных: как поступить правильнее?

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

Давайте разберем, почему ведение Master Data (номенклатурного справочника) лучше организовать в Рознице:

Рекомендуемый бизнес-процесс:

Всю новую номенклатуру со всеми её свойствами и дополнительными реквизитами вы заводите изначально в «1С:Розница». Из Розницы товары выгружаются на сайт. В Рознице же вы оформляете документы «Поступление товаров». Затем, при регулярной синхронизации, документы движения и новые карточки товаров перегружаются в «1С:Бухгалтерия». Поскольку дополнительные реквизиты в БП не нужны, при переносе в БП они просто игнорируются, переносится только базовая карточка товара. Это полностью избавит вас от необходимости дорабатывать и поддерживать сложные правила обмена свойствами.

← На главную