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