Синхронизация данных между конфигурациями «1С:Бухгалтерия предприятия» (БП) и «1С:Розница» — стандартная задача для автоматизации розничной торговли. Однако при попытке расширить свойства товаров и перенести дополнительные реквизиты (свойства) из БП в Розницу разработчики часто сталкиваются с неочевидной проблемой: данные успешно переносятся в базу-приемник, заполняют табличные части, но категорически отказываются отображаться на форме карточки номенклатуры.
В этой статье мы подробно разберем, почему возникает этот конфликт отображения, как устроена подсистема «Свойства» Библиотеки стандартных подсистем (БСП) в различных конфигурациях, и по шагам настроим правила обмена в программе «Конвертация данных 2.0» (КД 2.0) для решения этой задачи.
Прежде чем приступать к написанию кода и настройке правил обмена, давайте проанализируем, почему стандартный перенос «в лоб» не работает. Причина кроется в разной логике использования номенклатуры в бухгалтерском и торговом контурах:
НаборыДополнительныхРеквизитовИСведений с именем Справочник_Номенклатура.НаборыДополнительныхРеквизитовИСведений и связывает их через реквизит НаборСвойств.Когда мы переносим данные, свойства (ПВХ ДополнительныеРеквизитыИСведения) и их значения успешно записываются в базу-приемник. Более того, табличная часть ДополнительныеРеквизиты у конкретного товара в Рознице оказывается заполненной. Но на форме элемента мы видим пустоту.
Выясним причину: Отображением дополнительных реквизитов на управляемой форме управляет программный код БСП. При открытии карточки товара система анализирует, к какому Виду номенклатуры относится данный товар, находит связанный с этим видом Набор свойств и выводит на форму исключительно те свойства, которые зарегистрированы в табличной части этого Набора. Поскольку перенесенные из БП свойства не были добавлены в табличную часть конкретного набора свойств Розницы, БСП считает их «чужими» для данного товара и скрывает от пользователя.
---
Если добавленные 5 дополнительных реквизитов должны отображаться у абсолютно всех товаров в Рознице (независимо от того, одежда это, обувь или продукты питания), мы можем привязать их к общему набору свойств номенклатуры.
В Рознице для этих целей существует предопределенный элемент справочника НаборыДополнительныхРеквизитовИСведений с именем предопределенного значения Справочник_Номенклатура_Общие. Нам нужно перенаправить поиск правил обмена.
Рассмотрим по шагам настройку в КД 2.0:
НаборыДополнительныхРеквизитовИСведений.
Если СвойстваПоиска.Получить("ИмяПредопределенногоНабора") = "Справочник_Номенклатура" Тогда
СсылкаНаОбъект = Справочники.НаборыДополнительныхРеквизитовИСведений.Справочник_Номенклатура_Общие;
ПрекратитьПоиск = Истина;
КонецЕсли;
После такой настройки все новые свойства, перенесенные из БП, запишутся внутрь общего набора свойств номенклатуры Розницы и станут доступны для отображения у каждого товара.
---
Что делать, если в Рознице товары четко разделены по видам, и переносимые реквизиты должны отображаться только у товаров определенного вида? Поскольку в БП видов номенклатуры нет, нам придется распределять свойства динамически при загрузке самого товара.
Рассмотрим алгоритм реализации этой задачи:
Номенклатура в Розницу система сопоставляет или назначает ему определенный ВидНоменклатуры (например, по родителю, группе или значению по умолчанию).Номенклатура в обработчике события «После загрузки» мы пишем код, который обращается к набору свойств назначенного вида номенклатуры и программно добавляет перенесенные свойства в этот набор (если их там еще нет).Проанализируем пример кода для обработчика «После загрузки» в ПКО номенклатуры:
ВидНоменклатуры = Объект.ВидНоменклатуры;
Если ЗначениеЗаполнено(ВидНоменклатуры) Тогда
НаборСвойств = ВидНоменклатуры.НаборСвойств;
Если ЗначениеЗаполнено(НаборСвойств) Тогда
НаборОбъект = НаборСвойств.ПолучитьОбъект();
Модифицирован = Ложь;
// Пробегаем по перенесенным в ТЧ товара свойствам
Для Каждого СтрокаТЧ Из Объект.ДополнительныеРеквизиты Цикл
Свойство = СтрокаТЧ.Свойство;
// Проверяем, зарегистрировано ли уже это свойство в наборе свойств данного вида номенклатуры
НайденнаяСтрока = НаборОбъект.ДополнительныеРеквизиты.Найти(Свойство, "Свойство");
Если НайденнаяСтрока = Неопределено Тогда
// Если свойства нет в наборе, добавляем его туда программно
НоваяСтрока = НаборОбъект.ДополнительныеРеквизиты.Добавить();
НоваяСтрока.Свойство = Свойство;
Модифицирован = Истина;
КонецЕсли;
КонецЦикла;
// Сохраняем набор свойств только в случае изменений
Если Модифицирован Тогда
НаборОбъект.Записать();
КонецЕсли;
КонецЕсли;
КонецЕсли;
Благодаря этому коду, как только в Розницу загрузится товар с новыми свойствами, эти свойства автоматически пропишутся в его Вид номенклатуры. БСП мгновенно «увидит» их связь и начнет корректно отображать поля на форме карточки товара.
---
Помимо чисто технического решения проблемы переноса свойств из БП в Розницу, важно затронуть методологический аспект. С точки зрения архитектуры ERP-систем и стандартов ведения учета 1С, ввод детальных характеристик номенклатуры в Бухгалтерии предприятия является методологической ошибкой.
Давайте разберем, почему ведение Master Data (номенклатурного справочника) лучше организовать в Рознице:
Рекомендуемый бизнес-процесс:
Всю новую номенклатуру со всеми её свойствами и дополнительными реквизитами вы заводите изначально в «1С:Розница». Из Розницы товары выгружаются на сайт. В Рознице же вы оформляете документы «Поступление товаров». Затем, при регулярной синхронизации, документы движения и новые карточки товаров перегружаются в «1С:Бухгалтерия». Поскольку дополнительные реквизиты в БП не нужны, при переносе в БП они просто игнорируются, переносится только базовая карточка товара. Это полностью избавит вас от необходимости дорабатывать и поддерживать сложные правила обмена свойствами.