При программном создании элементов справочника ХарактеристикиНоменклатуры разработчики часто сталкиваются с ситуацией, когда сама запись характеристики создается, но её ключевые параметры — например, цвет, размер или материал — остаются незаполненными. Разберем по шагам, как устроено хранение дополнительных свойств в типовых конфигурациях 1С и как правильно наполнять их значениями через программный код.
В типовых конфигурациях на базе Библиотеки стандартных подсистем (таких как 1С:ERP, 1С:Комплексная автоматизация, 1С:Управление торговлей, 1С:УНФ) механизм дополнительных свойств опирается на следующую структуру метаданных:
ДополнительныеРеквизитыИСведения: содержит сами виды свойств (например, «Цвет», «Размер обуви»).ЗначенияСвойствОбъектов: хранит конкретные значения (например, «Красный», «42», «XL»). Этот справочник подчинен плану видов характеристик, то есть каждое значение жестко привязано к своему владельцу-свойству.ДополнительныеРеквизиты справочника ХарактеристикиНоменклатуры: хранит список назначенных характеристике свойств и выбранных значений. Каждая строка содержит как минимум реквизиты Свойство и Значение.Рассмотрим подробнее типовой алгоритм программного создания характеристики с заполнением ее дополнительных реквизитов. Выясним причину частых ошибок: если искать значение в справочнике ЗначенияСвойствОбъектов без указания владельца, метод вернет либо пустое значение, либо элемент с совпадающим названием от совершенно другого свойства (например, размер «40» вместо цвета «40»).
Посмотрим на практический пример кода для конфигураций на управляемых формах:
// 1. Находим свойство в Плане видов характеристик
СвойствоРазмер = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Размер");
СвойствоЦвет = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Цвет");
// 2. Находим конкретные значения с обязательным указанием владельца свойства
ЗначениеРазмер = Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию("42", Истина, , СвойствоРазмер);
ЗначениеЦвет = Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию("Черный", Истина, , СвойствоЦвет);
// 3. Создаем характеристику номенклатуры
НовХаракт = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент();
НовХаракт.Владелец = Справочники.КатегорииНоменклатуры.НайтиПоНаименованию("Обувь");
НовХаракт.Наименование = "Черный, 42";
НовХаракт.НаименованиеДляПечати = "Черный, 42";
// 4. Заполняем табличную часть ДополнительныеРеквизиты
Если ЗначениеЗаполнено(СвойствоРазмер) И ЗначениеЗаполнено(ЗначениеРазмер) Тогда
СтрокаТЧ = НовХаракт.ДополнительныеРеквизиты.Добавить();
СтрокаТЧ.Свойство = СвойствоРазмер;
СтрокаТЧ.Значение = ЗначениеРазмер;
КонецЕсли;
Если ЗначениеЗаполнено(СвойствоЦвет) И ЗначениеЗаполнено(ЗначениеЦвет) Тогда
СтрокаТЧ = НовХаракт.ДополнительныеРеквизиты.Добавить();
СтрокаТЧ.Свойство = СвойствоЦвет;
СтрокаТЧ.Значение = ЗначениеЦвет;
КонецЕсли;
// 5. Записываем готовую характеристику
НовХаракт.Записать();
Проанализируем ситуацию, если разработка ведется в конфигурациях прошлых поколений (например, Управление торговлей 10.3 или УПП 1.3). В этих системах у справочника ХарактеристикиНоменклатуры отсутствует табличная часть ДополнительныеРеквизиты.
Связь между характеристикой и её параметрами реализуется через независимый регистр сведений ЗначенияСвойствОбъектов. В этом случае алгоритм действий меняется:
ХарактеристикиНоменклатуры, чтобы получить ссылку.ЗначенияСвойствОбъектов с отбором по объекту (нашей записанной характеристике).Объект — ссылка на характеристику, Свойство — элемент ПВХ СвойстваОбъектов, а ресурс Значение — выбранное значение свойства.При внедрении автоматического создания характеристик обратим внимание на следующие технические аспекты:
УправлениеСвойствамиКлиентСервер или УправлениеСвойствами), чтобы наименование соответствовало общим правилам базы.ДополнительныеРеквизиты, чтобы убедиться, что характеристика с такой комбинацией цвета и размера у данного владельца еще не создана.ОбработкаЗаполнения модуля объекта ХарактеристикиНоменклатуры.