Как программно добавить дополнительный реквизит к Виду номенклатуры в 1С?

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

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

Анализ проблемы и частые ошибки

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

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

Пошаговое решение: как привязать реквизит

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

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

Пример программного поиска самого реквизита в ПВХ (как это делал автор вопроса):


Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|    ДополнительныеРеквизитыИСведения.Ссылка КАК РеквизитСсылка
|ИЗ
|    ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения
|ГДЕ
|    ДополнительныеРеквизитыИСведения.Наименование ПОДОБНО ""%"" + &Строка + ""%""
|    И ДополнительныеРеквизитыИСведения.ПометкаУдаления = ЛОЖЬ";
Запрос.УстановитьПараметр("Строка", "Аукцион");
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
Если РезультатЗапроса.Количество() > 0 Тогда
    Реквизит = РезультатЗапроса[0].РеквизитСсылка;
    // Далее переходим к добавлению в табличную часть набора свойств
КонецЕсли;

Ограничения платформы, о которых нужно знать

Посмотрим на эту задачу с точки зрения производительности и удобства. Использование механизма дополнительных реквизитов БСП имеет свои ограничения:

Альтернативные варианты решения

Проанализируем альтернативные способы добавления свойств, если механизм БСП не подходит по требованиям производительности или функциональности:

1. Механизм расширений конфигурации. Если реквизит критически важен для отборов, либо требуется нестандартная логика при вводе данных пользователем (например, сложные проверки при изменении значения), настоятельно рекомендуется создать обычный реквизит справочника Номенклатура через механизм Расширений (доступно в версиях ПРОФ и КОРП). Это позволит добавить физическое поле в таблицу СУБД, обеспечит высочайшую скорость поиска и возможность комфортно писать код на формах, не снимая основную конфигурацию с поддержки.

2. Общие реквизиты. Если какое-либо свойство должно быть присуще абсолютно всем видам номенклатуры (и, возможно, другим справочникам и документам) без исключения, иногда целесообразнее добавить его в виде общего реквизита конфигурации. Это также можно реализовать с помощью расширений, что обеспечит единообразие данных и упростит сквозную аналитику в системе.

← На главную