При автоматизации загрузки данных из внешних систем, таких как Excel, программисты часто сталкиваются с задачей создания не просто элементов справочника Номенклатура, но и сложной структуры её характеристик. В современных конфигурациях 1С (УНФ, УТ 11, ERP, КА 2), построенных на базе Библиотеки стандартных подсистем (БСП), механизм характеристик тесно завязан на дополнительные реквизиты и сведения. Разберем подробно, как правильно реализовать эту задачу программно, чтобы данные не просто «лежали в базе», но и корректно отображались в интерфейсе пользователя.
Прежде чем переходить к написанию кода, проанализируем, из каких кирпичиков строится механизм характеристик. Нам предстоит работать с четырьмя основными объектами:
Рассмотрим пошагово процесс создания всей цепочки объектов.
Первым делом нам нужно создать само свойство. Важно понимать, что в ПВХ ДополнительныеРеквизитыИСведения хранится описание того, что это за поле и какой тип данных оно принимает. Разберем пример создания свойства «Объем» с типом значения «Дополнительное значение» (выбор из списка).
НовоеСвойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.СоздатьЭлемент();
НовоеСвойство.Наименование = "Объем (мл)";
НовоеСвойство.Заголовок = "Объем (мл)";
НовоеСвойство.ЭтоДополнительныйРеквизит = Истина;
НовоеСвойство.НаборСвойств = СсылкаНаНаборКатегории; // Набор свойств категории номенклатуры
// Формируем уникальное имя для разработчика
УникальныйХвост = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
НовоеСвойство.Имя = "ОбъемМл_" + УникальныйХвост;
// Устанавливаем тип значения - ссылка на справочник дополнительных значений
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("СправочникСсылка.ЗначенияСвойствОбъектов"));
НовоеСвойство.ТипЗначения = Новый ОписаниеТипов(МассивТипов);
// Важные флаги для БСП
НовоеСвойство.Виден = Истина;
НовоеСвойство.Доступен = Истина;
НовоеСвойство.Записать();
Обратим внимание на реквизит Имя. В сообщениях форума упоминалось странное именование вида ОбъемВМл_075e9.... Это стандарт платформы: добавление GUID к имени позволяет избежать конфликтов, если в базе появятся два свойства с одинаковым заголовком, и упрощает обращение к свойству в запросах.
Создать свойство в ПВХ недостаточно. Чтобы оно появилось в карточке характеристики, его нужно включить в соответствующий «Набор». У каждой категории номенклатуры в УНФ есть связанный элемент в справочнике НаборыДополнительныхРеквизитовИСведений. Проанализируем, как добавить туда наше новое свойство.
НаборОбъект = СсылкаНаНаборКатегории.ПолучитьОбъект();
// Проверяем, нет ли уже такого свойства в наборе
СтрокаРеквизита = НаборОбъект.ДополнительныеРеквизиты.Найти(НовоеСвойство.Ссылка, "Свойство");
Если СтрокаРеквизита = Неопределено Тогда
НоваяСтрока = НаборОбъект.ДополнительныеРеквизиты.Добавить();
НоваяСтрока.Свойство = НовоеСвойство.Ссылка;
КонецЕсли;
НаборОбъект.Записать();
Без этого шага программа «не узнает», что созданное вами свойство «Объем» должно относиться именно к этой категории товаров. Набор свойств является владельцем контекста отображения реквизитов.
Если наше свойство имеет тип СправочникСсылка.ЗначенияСвойствОбъектов, нам нужно наполнить его элементами (например, «500 мл», «1000 мл»). Выясним, как это сделать правильно, учитывая подчинение.
ЗначениеОбъект = Справочники.ЗначенияСвойствОбъектов.СоздатьЭлемент();
ЗначениеОбъект.Наименование = "500 мл";
ЗначениеОбъект.Владелец = НовоеСвойство.Ссылка; // Обязательно указываем ссылку на ПВХ
ЗначениеОбъект.Записать();
СсылкаНаЗначение = ЗначениеОбъект.Ссылка;
Важно помнить: справочник ЗначенияСвойствОбъектов — это иерархический справочник, где владельцем выступает элемент ПВХ. Если не указать Владелец, значение будет «сиротой» и не попадет в выпадающий список при выборе реквизита в интерфейсе.
Теперь, когда инфраструктура готова, мы можем создать саму характеристику для конкретного товара. В конфигурации УНФ значения дополнительных реквизитов для характеристики хранятся в её табличной части ДополнительныеРеквизиты.
ХарактеристикаОбъект = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент();
ХарактеристикаОбъект.Владелец = СсылкаНаНоменклатуру;
ХарактеристикаОбъект.Наименование = "500 мл"; // Можно сформировать автоматически
// Заполняем значение свойства в табличной части
НоваяСтрокаТЧ = ХарактеристикаОбъект.ДополнительныеРеквизиты.Добавить();
НоваяСтрокаТЧ.Свойство = НовоеСвойство.Ссылка;
НоваяСтрокаТЧ.Значение = СсылкаНаЗначение;
ХарактеристикаОбъект.Записать();
Проанализируем важный нюанс: если в вашей конфигурации настроено автоматическое формирование наименований характеристик по шаблону, то после программного заполнения ТЧ рекомендуется вызвать метод, обновляющий представление. В БСП это часто делается через вызов процедур общего модуля УправлениеСвойствами.
Рассмотрим несколько профессиональных хитростей, которые помогут избежать ошибок:
УправлениеСвойствами. Там есть методы для получения наборов свойств по объекту и проверки заполнения.ВерсияДанных. Это системное поле платформы для контроля конкурентной записи (Optimistic Locking). Его никогда не нужно заполнять вручную при создании объектов.ОписаниеТипов нужно передавать соответствующие типы, а не ссылку на справочник значений.ЭтоДополнительныйРеквизит, Виден, Доступен). Если их не проставить в Истина, реквизит может быть создан, но пользователь не увидит его в форме документа или карточке товара.Таким образом, программное создание характеристик — это не просто запись в один справочник, а последовательное выстраивание связей между определением свойства, его доступностью в наборе и конкретными значениями. Следуя этой структуре, вы обеспечите целостность данных в вашей базе 1С.