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