Как получить значение дополнительного реквизита в 1С:Управление торговлей 11

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

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

Различие в хранении данных: ТЧ против Регистра

Перед тем как писать код, проанализируем, где именно хранятся нужные нам данные. Это критически важно для правильного построения алгоритма.

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

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

Способ 1: Получение значения через запрос к табличной части

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

Рассмотрим пример кода запроса:


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

Обратите внимание на параметр &Свойство. Это не строка с названием, а ссылка на элемент Плана видов характеристик ДополнительныеРеквизитыИСведения. Если мы хотим избежать поиска ссылки ПВХ и использовать строковое имя, проанализируем более гибкий вариант условия:


ГДЕ
    ТаблицаДопРеквизитов.Ссылка = &Ссылка
    И ТаблицаДопРеквизитов.Свойство.Имя = &ИмяРеквизита

В данном случае &ИмяРеквизита — это уникальный идентификатор, который система БСП присваивает свойству при создании (например, ДокументыПолучены_6f5a...).

Способ 2: Использование программного интерфейса БСП (модуль УправлениеСвойствами)

Для разработчика наиболее правильным и надежным методом является использование функций общего модуля УправлениеСвойствами. Рассмотрим подробнее функцию ЗначениеСвойства(). Для быстрого уточнения синтаксиса и параметров процедур подсистемы можно использовать справочник описания методов программного интерфейса БСП.

Частая ошибка — передача в качестве второго параметра заголовка реквизита, который видит пользователь. На самом деле, система ожидает либо ссылку на свойство (ПВХ), либо Идентификатор для формул. Посмотрим на правильный пример вызова:


// Получаем значение по идентификатору для формул
ИмяСвойства = "ДокументыПолучены_284ae3df774a456a9fc295b63a9d85d7"; 
Результат = УправлениеСвойствами.ЗначениеСвойства(ОбъектСсылка, ИмяСвойства);

Если ТипЗнч(Результат) = Тип("Булево") Тогда
    // Работаем с результатом
КонецЕсли;

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


// Получаем сразу все доп. реквизиты объекта
ВсеСвойства = УправлениеСвойствами.ЗначенияСвойств(ОбъектСсылка);
Если ВсеСвойства.Свойство("ДокументыПолучены") Тогда
    Значение = ВсеСвойства.ДокументыПолучены;
КонецЕсли;

Способ 3: Получение значения Дополнительного сведения

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


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

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

Важные нюансы и рекомендации

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

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

← На главную