Часто при разработке и доработке конфигураций на базе Библиотеки стандартных подсистем (БСП) возникает задача программно привязать существующий дополнительный реквизит к определенному виду номенклатуры. Разберем типичную ситуацию: разработчик находит нужный реквизит в плане видов характеристик ДополнительныеРеквизитыИСведения, получает ссылку на вид номенклатуры и пытается прикрепить его с помощью методов УправлениеСвойствами.ЗаписатьСвойстваУОбъекта или УправлениеСвойствами.УстановитьСвойстваУОбъекта. Однако результат оказывается нулевым, либо система выдает ошибку. Выясним причину такого поведения и рассмотрим правильный алгоритм решения этой задачи.
Проанализируем ситуацию детально. Методы ЗаписатьСвойстваУОбъекта и УстановитьСвойстваУОбъекта предназначены исключительно для записи значений уже привязанных свойств для конкретного элемента справочника (например, чтобы установить значение «Деревянный» для конкретного стола). Они не используются для изменения структуры и привязки самого свойства (реквизита) к Виду номенклатуры.
Некоторые разработчики полагают, что структурную привязку нельзя сделать программно, однако это заблуждение. Привязка доступных дополнительных реквизитов в конфигурациях на базе БСП осуществляется через табличные части, с которыми можно полноценно работать из встроенного языка.
Рассмотрим подробнее, как правильно добавить дополнительный реквизит. В зависимости от архитектуры конкретной конфигурации (УТ, ERP, УНФ и т.д.), табличная часть ДополнительныеРеквизиты может располагаться непосредственно в справочнике ВидыНоменклатуры или в связанном с ним техническом справочнике НаборыДополнительныхРеквизитовИСведений. Разберем по шагам универсальный алгоритм:
ПолучитьОбъект()).ДополнительныеРеквизиты на наличие уже привязанной ссылки из ПВХ ДополнительныеРеквизитыИСведения. Для этого используем метод НайтиСтроки() или Найти(). Это убережет от дублирования строк при повторном выполнении кода.ДополнительныеРеквизиты. В колонку Свойство передаем ссылку на наш найденный доп. реквизит.Записать().Пример программного поиска самого реквизита в ПВХ (как это делал автор вопроса):
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДополнительныеРеквизитыИСведения.Ссылка КАК РеквизитСсылка
|ИЗ
| ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения
|ГДЕ
| ДополнительныеРеквизитыИСведения.Наименование ПОДОБНО ""%"" + &Строка + ""%""
| И ДополнительныеРеквизитыИСведения.ПометкаУдаления = ЛОЖЬ";
Запрос.УстановитьПараметр("Строка", "Аукцион");
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
Если РезультатЗапроса.Количество() > 0 Тогда
Реквизит = РезультатЗапроса[0].РеквизитСсылка;
// Далее переходим к добавлению в табличную часть набора свойств
КонецЕсли;
Посмотрим на эту задачу с точки зрения производительности и удобства. Использование механизма дополнительных реквизитов БСП имеет свои ограничения:
Проанализируем альтернативные способы добавления свойств, если механизм БСП не подходит по требованиям производительности или функциональности:
1. Механизм расширений конфигурации. Если реквизит критически важен для отборов, либо требуется нестандартная логика при вводе данных пользователем (например, сложные проверки при изменении значения), настоятельно рекомендуется создать обычный реквизит справочника Номенклатура через механизм Расширений (доступно в версиях ПРОФ и КОРП). Это позволит добавить физическое поле в таблицу СУБД, обеспечит высочайшую скорость поиска и возможность комфортно писать код на формах, не снимая основную конфигурацию с поддержки.
2. Общие реквизиты. Если какое-либо свойство должно быть присуще абсолютно всем видам номенклатуры (и, возможно, другим справочникам и документам) без исключения, иногда целесообразнее добавить его в виде общего реквизита конфигурации. Это также можно реализовать с помощью расширений, что обеспечит единообразие данных и упростит сквозную аналитику в системе.