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