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