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

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

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

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

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

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

Способ 1: Получение дополнительных сведений через запрос

Если нам необходимо получить значение «Дополнительного сведения» для конкретного документа или сформировать отчет, мы используем запрос к соответствующему регистру. Рассмотрим пример запроса, который выбирает значение свойства для конкретной ссылки — есть обработка выгрузки дополнительных реквизитов из 1С:


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

В данном примере параметр &СсылкаНаОбъект — это ссылка на ваш документ, а &Свойство — это ссылка на элемент плана видов характеристик ДополнительныеРеквизитыИСведения.

Важный нюанс: Не рекомендуется искать свойство по наименованию (например, РегСведения.Свойство.Наименование = "Цвет"), так как пользователь может изменить название в интерфейсе, и код перестанет работать. Правильнее передавать ссылку на свойство через параметры или использовать поиск по уникальному идентификатору (GUID).

Способ 2: Работа с дополнительными реквизитами через табличную часть

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


ВЫБРАТЬ
    ДокТЧ.Значение КАК ЗначениеРеквизита
ИЗ
    Документ.РеализацияТоваровУслуг.ДополнительныеРеквизиты КАК ДокТЧ
ГДЕ
    ДокТЧ.Ссылка = &СсылкаНаДокумент
    И ДокТЧ.Свойство = &Свойство

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

Способ 3: Использование функций общего модуля БСП

В современных конфигурациях (ЕРП, УТ 11, БП 3.0) наиболее правильным и безопасным методом является использование стандартных функций общего модуля УправлениеСвойствами. Проанализируем самый простой способ получения значения:


// Получаем значение одного конкретного свойства
Значение = УправлениеСвойствами.ЗначениеСвойства(СсылкаНаОбъект, Свойство);

Этот метод хорош тем, что он автоматически определяет, где искать данные — в табличной части или в регистре сведений. Система сама выполнит все необходимые проверки и вернет результат.

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


// Получаем структуру всех заполненных свойств объекта
ВсеСвойства = УправлениеСвойствами.СвойстваОбъекта(СсылкаНаОбъект);

Для Каждого СвойствоИзСписка Из ВсеСвойства Цикл
    Сообщить("Свойство: " + СвойствоИзСписка.Свойство + " - Значение: " + СвойствоИзСписка.Значение);
КонецЦикла;

Технические нюансы и производительность

Рассмотрим несколько важных аспектов, которые помогут избежать ошибок при разработке:

  1. Типизация значений: Поле Значение в регистре и в табличных частях имеет составной тип. В сложных запросах рекомендуется использовать оператор ВЫРАЗИТЬ, чтобы платформа понимала, с каким типом данных идет работа. Это ускоряет выполнение запроса.
  2. Запись данных: Если вам нужно не только прочитать, но и записать дополнительное сведение, используйте метод УправлениеСвойствами.ЗаписатьЗаписиРегистраСведений(Объект, ТаблицаСвойств). Прямая запись в регистр через менеджер записи может привести к нарушению логики БСП (например, не обновятся кэши или проигнорируются права доступа).
  3. Оптимизация в списках: Вывод дополнительных сведений в динамические списки может существенно замедлить работу интерфейса. В таких случаях выясним причину торможения: скорее всего, это избыточные соединения в запросе. Для высоконагруженных систем лучше использовать механизмы расширения состава реквизитов, которые позволяют выносить доп. сведения в отдельные колонки на уровне СУБД.

Таким образом, мы выяснили, что для разового получения значения в коде лучше всего подходит функция УправлениеСвойствами.ЗначениеСвойства, а для массовой выборки данных в отчетах следует использовать прямой запрос к регистру ДополнительныеСведения или табличной части ДополнительныеРеквизиты с обязательной фильтрацией по ссылке на объект и свойство.

← На главную