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