Как программно добавить существующий дополнительный реквизит в набор свойств вида номенклатуры в 1С:УТ 11.4

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

При работе с конфигурациями на базе Библиотеки стандартных подсистем (БСП), такими как «1С:Управление торговлей 11.4», программисты часто сталкиваются с задачей автоматизации создания нормативно-справочной информации. Одной из наиболее востребованных задач является программное управление дополнительными реквизитами. Рассмотрим ситуацию, когда нам необходимо не просто создать новый реквизит, а добавить уже существующий «общий» реквизит в конкретный набор свойств, соответствующий определенному виду номенклатуры.

Анализ проблемы и структуры данных

Разберем типичную ошибку начинающих разработчиков. Часто попытки программного добавления ограничиваются созданием нового элемента в плане видов характеристик ДополнительныеРеквизитыИСведения и заполнением в нем поля НаборСвойств. Однако в архитектуре БСП связь между реквизитами и наборами реализована по принципу «многие ко многим». Это означает, что один и тот же элемент плана видов характеристик может входить в состав множества различных наборов (например, реквизит «Материал» может быть актуален как для одежды, так и для мебели).

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

Пошаговый алгоритм решения задачи

Для того чтобы программно включить существующий реквизит в новый набор, мы должны выполнить следующую последовательность действий:

  1. Получить ссылку на нужный нам дополнительный реквизит из плана видов характеристик ДополнительныеРеквизитыИСведения.
  2. Найти или создать соответствующий элемент в справочнике НаборыДополнительныхРеквизитовИСведений (для видов номенклатуры это обычно набор, имя которого совпадает с наименованием вида номенклатуры).
  3. Обратиться к объекту справочника НаборыДополнительныхРеквизитовИСведений для редактирования его табличной части.
  4. Добавить новую строку в табличную часть ДополнительныеРеквизиты и заполнить обязательные поля.

Программная реализация добавления реквизита в набор

Рассмотрим пример кода, который выполняет поиск существующего набора и добавляет в него ссылку на реквизит. Предположим, что у нас уже есть ссылка на вид номенклатуры и ссылка на сам реквизит.


// 1. Получаем ссылку на набор свойств для конкретного вида номенклатуры
// В УТ 11 ссылка на набор свойств обычно хранится в самом виде номенклатуры
НаборСвойствСсылка = СпрВидыНом.НаборСвойств;

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

// 2. Получаем объект набора для изменения состава реквизитов
ОбъектНабора = НаборСвойствСсылка.ПолучитьОбъект();

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

Если НайденныеСтроки.Количество() = 0 Тогда
    // 4. Добавляем новый реквизит в табличную часть
    НоваяСтрока = ОбъектНабора.ДополнительныеРеквизиты.Добавить();
    НоваяСтрока.Свойство = СсылкаНаНужныйРеквизит;
    
    // Важно заполнить служебные реквизиты, чтобы реквизит корректно отображался в форме
    НоваяСтрока.ПометкаУдаления = Ложь;
    // В зависимости от версии БСП могут потребоваться дополнительные поля, 
    // такие как Видимость, Доступность и т.д.
    
    ОбъектНабора.Записать();
    Сообщить("Реквизит успешно добавлен в набор свойств.");
Иначе
    Сообщить("Данный реквизит уже присутствует в наборе.");
КонецЕсли;

Нюансы работы с «Общими» реквизитами

Выясним причину, почему иногда реквизит отображается в списке как «Общий». В БСП существует понятие «Общего списка значений» и «Общего реквизита».

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

Обратите внимание на важные поля в табличной части ДополнительныеРеквизиты:

Использование методов БСП

Проанализируем ситуацию, когда необходимо выполнить обновление интерфейса после программных правок. Конфигурации на БСП активно используют кэширование параметров дополнительных реквизитов. После внесения изменений в справочник НаборыДополнительныхРеквизитовИСведений может потребоваться обновление параметров работы. Хотя чаще всего система подхватывает изменения при переоткрытии формы объекта, в некоторых случаях полезно вызвать методы обновления кэша, если они предусмотрены в текущей версии вашей библиотеки.

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

← На главную