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

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

При автоматизации загрузки данных из внешних систем, таких как Excel, программисты часто сталкиваются с задачей создания не просто элементов справочника Номенклатура, но и сложной структуры её характеристик. В современных конфигурациях 1С (УНФ, УТ 11, ERP, КА 2), построенных на базе Библиотеки стандартных подсистем (БСП), механизм характеристик тесно завязан на дополнительные реквизиты и сведения. Разберем подробно, как правильно реализовать эту задачу программно, чтобы данные не просто «лежали в базе», но и корректно отображались в интерфейсе пользователя.

Понимание архитектуры хранения данных

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

  1. План видов характеристик (ПВХ) «Дополнительные реквизиты и сведения»: здесь хранятся сами определения свойств (например, «Цвет», «Размер», «Материал»).
  2. Справочник «Значения свойств объектов»: здесь хранятся конкретные варианты значений (например, «Красный», «42 размер», «Хлопок»). Этот справочник подчинен ПВХ.
  3. Справочник «Наборы дополнительных реквизитов и сведений»: это связующее звено. Именно здесь определяется, какие свойства из ПВХ будут доступны для конкретной категории (вида) номенклатуры или её характеристик.
  4. Справочник «Характеристики номенклатуры»: конечный объект, который привязан к номенклатуре и содержит в себе выбранные значения дополнительных реквизитов.

Рассмотрим пошагово процесс создания всей цепочки объектов.

Шаг 1. Создание свойства в Плане видов характеристик

Первым делом нам нужно создать само свойство. Важно понимать, что в ПВХ ДополнительныеРеквизитыИСведения хранится описание того, что это за поле и какой тип данных оно принимает. Разберем пример создания свойства «Объем» с типом значения «Дополнительное значение» (выбор из списка).


НовоеСвойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.СоздатьЭлемент();
НовоеСвойство.Наименование = "Объем (мл)";
НовоеСвойство.Заголовок = "Объем (мл)";
НовоеСвойство.ЭтоДополнительныйРеквизит = Истина;
НовоеСвойство.НаборСвойств = СсылкаНаНаборКатегории; // Набор свойств категории номенклатуры

// Формируем уникальное имя для разработчика
УникальныйХвост = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
НовоеСвойство.Имя = "ОбъемМл_" + УникальныйХвост;

// Устанавливаем тип значения - ссылка на справочник дополнительных значений
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("СправочникСсылка.ЗначенияСвойствОбъектов"));
НовоеСвойство.ТипЗначения = Новый ОписаниеТипов(МассивТипов);

// Важные флаги для БСП
НовоеСвойство.Виден = Истина;
НовоеСвойство.Доступен = Истина;

НовоеСвойство.Записать();

Обратим внимание на реквизит Имя. В сообщениях форума упоминалось странное именование вида ОбъемВМл_075e9.... Это стандарт платформы: добавление GUID к имени позволяет избежать конфликтов, если в базе появятся два свойства с одинаковым заголовком, и упрощает обращение к свойству в запросах.

Шаг 2. Привязка свойства к набору свойств категории

Создать свойство в ПВХ недостаточно. Чтобы оно появилось в карточке характеристики, его нужно включить в соответствующий «Набор». У каждой категории номенклатуры в УНФ есть связанный элемент в справочнике НаборыДополнительныхРеквизитовИСведений. Проанализируем, как добавить туда наше новое свойство.


НаборОбъект = СсылкаНаНаборКатегории.ПолучитьОбъект();

// Проверяем, нет ли уже такого свойства в наборе
СтрокаРеквизита = НаборОбъект.ДополнительныеРеквизиты.Найти(НовоеСвойство.Ссылка, "Свойство");

Если СтрокаРеквизита = Неопределено Тогда
    НоваяСтрока = НаборОбъект.ДополнительныеРеквизиты.Добавить();
    НоваяСтрока.Свойство = НовоеСвойство.Ссылка;
КонецЕсли;

НаборОбъект.Записать();

Без этого шага программа «не узнает», что созданное вами свойство «Объем» должно относиться именно к этой категории товаров. Набор свойств является владельцем контекста отображения реквизитов.

Шаг 3. Создание конкретных значений свойства

Если наше свойство имеет тип СправочникСсылка.ЗначенияСвойствОбъектов, нам нужно наполнить его элементами (например, «500 мл», «1000 мл»). Выясним, как это сделать правильно, учитывая подчинение.


ЗначениеОбъект = Справочники.ЗначенияСвойствОбъектов.СоздатьЭлемент();
ЗначениеОбъект.Наименование = "500 мл";
ЗначениеОбъект.Владелец = НовоеСвойство.Ссылка; // Обязательно указываем ссылку на ПВХ
ЗначениеОбъект.Записать();
СсылкаНаЗначение = ЗначениеОбъект.Ссылка;

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

Шаг 4. Создание характеристики номенклатуры и заполнение её реквизитов

Теперь, когда инфраструктура готова, мы можем создать саму характеристику для конкретного товара. В конфигурации УНФ значения дополнительных реквизитов для характеристики хранятся в её табличной части ДополнительныеРеквизиты.


ХарактеристикаОбъект = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент();
ХарактеристикаОбъект.Владелец = СсылкаНаНоменклатуру;
ХарактеристикаОбъект.Наименование = "500 мл"; // Можно сформировать автоматически

// Заполняем значение свойства в табличной части
НоваяСтрокаТЧ = ХарактеристикаОбъект.ДополнительныеРеквизиты.Добавить();
НоваяСтрокаТЧ.Свойство = НовоеСвойство.Ссылка;
НоваяСтрокаТЧ.Значение = СсылкаНаЗначение;

ХарактеристикаОбъект.Записать();

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

Советы по программной реализации

Рассмотрим несколько профессиональных хитростей, которые помогут избежать ошибок:

Таким образом, программное создание характеристик — это не просто запись в один справочник, а последовательное выстраивание связей между определением свойства, его доступностью в наборе и конкретными значениями. Следуя этой структуре, вы обеспечите целостность данных в вашей базе 1С.

← На главную