Как программно найти и получить значение дополнительного сведения в 1С

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

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

Различие между сведениями и реквизитами

Прежде чем переходить к коду, проанализируем, где именно хранятся данные. В системе 1С существует два принципиально разных механизма:

  1. Дополнительные реквизиты — они логически являются частью объекта (например, документа или справочника). Технически они хранятся в табличной части ДополнительныеРеквизиты самого объекта.
  2. Дополнительные сведения — они хранятся отдельно от объекта. Для этого используется специализированный регистр сведений ДополнительныеСведения. Это позволяет добавлять информацию к объектам, которые уже записаны и закрыты для редактирования (например, в закрытых периодах).

В рассматриваемой ситуации автор пытается найти данные в регистре сведений, что однозначно указывает на работу с дополнительными сведениями.

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

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


Запрос.Текст = "
|ВЫБРАТЬ
|    ДополнительныеСведения.Значение КАК Значение
|ИЗ
|    РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения
|ГДЕ
|    ДополнительныеСведения.Объект = &Объект
|    И ДополнительныеСведения.Свойство = &Свойство";

Запрос.УстановитьПараметр("Объект", ПереданныйОбъект);
Запрос.УстановитьПараметр("Свойство", "ХХХ_РеестрЛимитовПДО"); // Ошибка здесь!

Выясним причину, по которой такой запрос не вернет результат. В регистре ДополнительныеСведения измерение Свойство имеет тип ссылки на план видов характеристик ДополнительныеРеквизитыИСведения. Передача строки вместо ссылки приведет к тому, что условие ГДЕ никогда не выполнится. Следовательно, первым делом нам нужно получить ссылку на само свойство.

Поиск свойства: Наименование против Имени для разработчиков

Рассмотрим, как правильно найти ссылку на свойство в плане видов характеристик. Существует два основных подхода:

1. Поиск по наименованию. Это самый простой путь, но он крайне ненадежен. Пользователь может в любой момент изменить наименование свойства в режиме "Предприятие", и ваш код перестанет работать.


СвойствоСсылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("ХХХ_РеестрЛимитовПДО");

2. Поиск по имени для разработчиков. Это более правильный метод. В современных конфигурациях на базе БСП у свойств есть поле "Имя" (в интерфейсе оно скрыто в группе "Для разработчиков"). Это уникальный идентификатор, предназначенный специально для обращения из кода.


СвойствоСсылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "ХХХ_РеестрЛимитовПДО");

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

Вместо написания собственных запросов к регистру, проанализируем возможности модуля УправлениеСвойствами. Это "золотой стандарт" разработки в среде 1С. Использование программного интерфейса БСП позволяет избежать ошибок с типами данных и значительно упрощает код.

Разберем пример получения значения свойства одной строкой:


Значение = УправлениеСвойствами.ЗначениеСвойства(ТвойОбъект, "ИмяСвойстваДляРазработчика");

Рассмотрим преимущества этого метода:

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

Представим, что нам нужно проверить, установлен ли флаг (булево значение) в дополнительном сведении пользователя. Посмотрим, как это реализовать максимально корректно:

  1. Выясним, какой объект является "владельцем" свойства. Если мы проверяем права или настройки пользователя, это может быть либо ссылка на справочник Пользователи, либо ФизическиеЛица.
  2. Найдем объект-владелец. Например: ТекущийПользователь = Пользователи.АвторизованныйПользователь();
  3. Вызовем функцию получения значения, проверив результат на соответствие типу Булево.

// Пример получения флага лимитов для пользователя
ОбъектВладелец = Пользователи.АвторизованныйПользователь();
ИмяСвойства = "ХХХ_РеестрЛимитовПДО";

ЗначениеФлага = УправлениеСвойствами.ЗначениеСвойства(ОбъектВладелец, ИмяСвойства);

Если ЗначениеФлага = Истина Тогда
    // Выполняем логику, если флаг установлен
КонецЕсли;

Оптимизация: работа с группами свойств

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

Для таких случаев в БСП предусмотрен метод ЗначенияСвойств, который возвращает структуру всех заполненных свойств объекта:


ВсеСвойства = УправлениеСвойствами.ЗначенияСвойств(ОбъектВладелец);

// Теперь мы можем обращаться к свойствам как к полям структуры
Если ВсеСвойства.Свойство("ХХХ_РеестрЛимитовПДО") Тогда
    Результат = ВсеСвойства.ХХХ_РеестрЛимитовПДО;
КонецЕсли;

Важный нюанс: при использовании этого метода ключами структуры будут являться ссылки на элементы плана видов характеристик (если не указано иное). Если вам нужны именно строковые имена в ключах, убедитесь, что вы используете подходящую версию метода или подготовьте соответствие имен заранее.

Заключение

Мы рассмотрели основные способы поиска и получения дополнительных сведений. Подведем итоги: для надежной работы системы всегда старайтесь использовать Имя для разработчика вместо обычного наименования и отдавайте предпочтение методам общего модуля УправлениеСвойствами. Это избавит вас от необходимости писать громоздкие запросы и сделает ваш код устойчивым к изменениям, которые пользователи могут внести в режиме "Предприятие".

← На главную