При разработке в конфигурации 1С:Управление нашей фирмой (УНФ) версии 1.6 программисты часто сталкиваются с задачей автоматизации создания справочников. Одной из самых трудоемких операций является программное создание категорий номенклатуры и связанных с ними характеристик (например, "Размер" и "Цвет" для обуви). Трудность заключается в том, что в современных конфигурациях на базе БСП (Библиотеки стандартных подсистем) характеристики жестко завязаны на механизм дополнительных реквизитов и наборов свойств.
В этой статье мы подробно разберем, как правильно выстроить иерархию объектов, чтобы избежать ошибок записи и добиться корректного отображения характеристик в интерфейсе программы.
Прежде чем писать код, проанализируем, как связаны объекты в системе. Обычного создания элемента в справочнике ХарактеристикиНоменклатуры недостаточно. Нам необходимо пройти через следующую цепочку:
Рассмотрим ситуацию: вы пытаетесь записать новое значение свойства и указываете в качестве владельца КатегорииНоменклатуры.Ссылка. Система выдаст ошибку, так как поле Владелец у справочника ЗначенияСвойствОбъектов имеет тип ссылки на План видов характеристик. Еще одна частая ошибка — отсутствие связи между созданным свойством и набором свойств категории. Если не добавить свойство в табличную часть ДополнительныеРеквизиты соответствующего набора, программа "не увидит" это свойство в карточке характеристики.
Рассмотрим правильный подход к реализации задачи. Сначала создадим категорию и подготовим для нее инфраструктуру свойств.
Шаг 1. Создание категории и инициализация набора свойств
// Создаем категорию
ОбКатегория = Справочники.КатегорииНоменклатуры.СоздатьЭлемент();
ОбКатегория.Наименование = "Обувь Тест";
ОбКатегория.ТипНоменклатурыПоУмолчанию = Перечисления.ТипыНоменклатуры.Запас;
ОбКатегория.ИспользоватьХарактеристики = Истина;
// В УНФ набор свойств часто создается автоматически при записи категории,
// если настроены соответствующие подписки на события.
ОбКатегория.Записать();
Шаг 2. Создание свойства в Плане видов характеристик
Теперь создадим само свойство "Размер". Выясним причину, почему важно правильно заполнить НаборСвойств. Это связывает ПВХ с конкретной группой объектов.
ОбСвойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.СоздатьЭлемент();
ОбСвойство.Наименование = "Размер (Тест)";
ОбСвойство.Заголовок = "Размер";
// Указываем тип значения. Обычно это СправочникСсылка.ЗначенияСвойствОбъектов
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("СправочникСсылка.ЗначенияСвойствОбъектов"));
ОбСвойство.ТипЗначения = Новый ОписаниеТипов(МассивТипов);
// Указываем набор свойств, к которому относится ПВХ
ОбСвойство.НаборСвойств = ОбКатегория.НаборСвойствХарактеристики;
ОбСвойство.Записать();
Шаг 3. Регистрация свойства в наборе
Проанализируем ситуацию: свойство создано, но оно еще не "включено" в состав реквизитов категории. Нам нужно обновить справочник НаборыДополнительныхРеквизитовИСведений.
ОбНабор = ОбКатегория.НаборСвойствХарактеристики.ПолучитьОбъект();
Если ОбНабор <> Неопределено Тогда
НоваяСтрока = ОбНабор.ДополнительныеРеквизиты.Добавить();
НоваяСтрока.Свойство = ОбСвойство.Ссылка;
ОбНабор.Записать();
КонецЕсли;
После того как каркас категории готов, мы можем переходить к созданию самих элементов — конкретных размеров (например, "42") и характеристик номенклатуры.
Создание значения свойства:
ОбЗначение = Справочники.ЗначенияСвойствОбъектов.СоздатьЭлемент();
ОбЗначение.Наименование = "42";
ОбЗначение.Владелец = ОбСвойство.Ссылка; // Владелец - ПВХ!
ОбЗначение.Записать();
СсылкаНаЗначение42 = ОбЗначение.Ссылка;
Создание итоговой характеристики:
Рассмотрим пример создания характеристики, которая будет видна в списке товаров. Нам нужно заполнить не только наименование, но и табличную часть ДополнительныеРеквизиты у самой характеристики, чтобы система понимала, из чего она состоит.
ОбХарактеристика = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент();
ОбХарактеристика.Владелец = ОбКатегория.Ссылка; // Для общих характеристик владелец - категория
ОбХарактеристика.Наименование = "Размер: 42";
// Заполняем состав характеристики
НовоеСвойствоХар = ОбХарактеристика.ДополнительныеРеквизиты.Добавить();
НовоеСвойствоХар.Свойство = ОбСвойство.Ссылка;
НовоеСвойствоХар.Значение = СсылкаНаЗначение42;
ОбХарактеристика.Записать();
Проанализируем еще несколько важных моментов, которые помогут сделать код надежным:
ДополнительныеРеквизиты рекомендуется вызывать процедуру обновления наименования, если она предусмотрена в модуле менеджера справочника.ЗначенияСвойствОбъектов.ОповеститьОбИзменении(Тип("СправочникСсылка.ХарактеристикиНоменклатуры")) для обновления интерфейса.Таким образом, мы разобрали полный цикл программного управления характеристиками в УНФ 1.6. Главный секрет успеха здесь — строгое соблюдение иерархии БСП и правильное указание владельцев для каждого типа объектов.