К статье
Практический материал

Разработка и Конфигурация · 9 мин

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

Как программно получить значение дополнительного реквизита справочника в 1С: запрос к табличной части, БСП, типовые функции, ошибки и примеры кода.

Дополнительные реквизиты в 1С хранятся не в основной таблице справочника, а в отдельной табличной части «ДополнительныеРеквизиты». Поэтому обычное обращение через точку вида СправочникОбъект.МойРеквизит не сработает — платформа вернёт ошибку о несуществующем поле. Чтобы получить значение, нужно обратиться к табличной части объекта или выполнить запрос к ней напрямую.

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

Где физически хранятся дополнительные реквизиты

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

Это важно понимать при написании запросов: в конструкторе запросов табличная часть доступна как отдельная таблица вида Справочник.Номенклатура.ДополнительныеРеквизиты. Связь с владельцем выполняется по полю «Ссылка».

Способ 1. Перебор табличной части объекта

Если у вас уже есть объект справочника (например, полученный через ПолучитьОбъект()), самый простой способ — перебрать строки табличной части и найти нужное свойство. Свойство удобно искать по имени или по заранее сохранённой ссылке.

Функция ПолучитьДопРеквизит(СсылкаНаОбъект, ИмяСвойства)

ОбъектСправочника = СсылкаНаОбъект.ПолучитьОбъект();

Для Каждого Строка Из ОбъектСправочника.ДополнительныеРеквизиты Цикл

Если Строка.Свойство.Имя = ИмяСвойства Тогда

Возврат Строка.Значение;

КонецЕсли;

КонецЦикла;

Возврат Неопределено;

КонецФункции

Обратите внимание: Свойство.Имя — это программное имя, автоматически формируемое платформой (обычно совпадает с заголовком без пробелов, но может отличаться). Надёжнее сравнивать по ссылке на элемент плана видов характеристик, найденному по заголовку:

Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения

.НайтиПоНаименованию("Цвет товара");

Способ 2. Получение значения запросом

Для чтения без блокировки объекта и при обработке списков используйте запрос к табличной части. Это основной рабочий вариант для отчётов, обменов и массовых операций.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ДопРеквизиты.Значение КАК Значение

|ИЗ

| Справочник.Номенклатура.ДополнительныеРеквизиты КАК ДопРеквизиты

|ГДЕ

| ДопРеквизиты.Ссылка = &Ссылка

| И ДопРеквизиты.Свойство = &Свойство";

Запрос.УстановитьПараметр("Ссылка", СсылкаНаНоменклатуру);

Запрос.УстановитьПараметр("Свойство", Свойство);

Результат = Запрос.Выполнить().Выбрать();

Если Результат.Следующий() Тогда

ЗначениеРеквизита = Результат.Значение;

КонецЕсли;

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

bsl
ВЫБРАТЬ
	Товары.Ссылка КАК Товар,
	ДопРеквизиты.Значение КАК Цвет
ИЗ
	Справочник.Номенклатура КАК Товары
		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК ДопРеквизиты
		ПО Товары.Ссылка = ДопРеквизиты.Ссылка
			И ДопРеквизиты.Свойство = &Свойство

Способ 3. Штатные функции БСП

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

МассивСвойств = Новый Массив;

МассивСвойств.Добавить(Свойство);

ЗначенияСвойств = УправлениеСвойствами.ЗначенияСвойств(

СсылкаНаОбъект, Истина, Ложь, МассивСвойств);

Функция возвращает таблицу значений со строками по запрошенным свойствам. Параметры «Истина, Ложь» означают: получать дополнительные реквизиты, не получать дополнительные сведения. Проверьте сигнатуру функции в вашей версии БСП — в разных редакциях библиотеки набор параметров может отличаться.

Сравнение способов

Перебор табличной части

Подходит для одного объекта в интерактивном коде. Минусы: блокировка объекта, медленно в циклах.

Запрос к табличной части

Оптимален для списков, отчётов и обменов. Не блокирует объект, работает быстро.

Функции БСП

Универсально и устойчиво к особенностям хранения, но требует наличия БСП и знания сигнатуры конкретной версии.

Как найти ссылку на свойство

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

Поиск по наименованию хрупок: администратор может переименовать реквизит, и код перестанет работать. Надёжнее хранить ссылку в константе, параметре обмена или искать по уникальному идентификатору, полученному через Свойство.УникальныйИдентификатор() и восстановленному через ПолучитьСсылку(Новый УникальныйИдентификатор(...)).

Типичные ошибки
01
Поиск свойства по наименованию — ломается при переименовании реквизита пользователем.
02
Обращение СправочникОбъект.ИмяРеквизита — дополнительный реквизит не является полем объекта, будет ошибка «Поле не обнаружено».
03
Использование ПолучитьОбъект() внутри цикла по тысячам элементов — блокировки и падение производительности.
04
Игнорирование пустого результата запроса — если реквизит не заполнен, строка в табличной части может отсутствовать вовсе.

Отличие дополнительных реквизитов от дополнительных сведений

Не путайте два похожих механизма. Дополнительные реквизиты хранятся в табличной части самого объекта и редактируются на его форме. Дополнительные сведения хранятся в отдельном регистре сведений «ДополнительныеСведения» и к объекту отношения структурно не имеют — связь через измерение «Объект».

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

ВЫБРАТЬ

ДопСведения.Значение

ИЗ

РегистрСведений.ДополнительныеСведения КАК ДопСведения

ГДЕ

ДопСведения.Объект = &Ссылка

И ДопСведения.Свойство = &Свойство

Проверка результата и границы безопасной работы

После внедрения кода проверьте три вещи: реквизит заполнен у тестового объекта, запрос возвращает строку, а тип значения соответствует ожиданиям (строка, булево, ссылка на справочник значений свойств). Если реквизит не заполнен, строки в табличной части может не быть — обрабатывайте ситуацию «значение не найдено» без ошибки.

Все перечисленные операции чтения безопасны и не меняют данные. Риск появляется только при записи через ПолучитьОбъект() и Записать(): не записывайте объект, если задача — только прочитать значение.

Контрольные точки

Как проверить результат

Строка в табличной части
Норма

Запрос возвращает одну строку со значением

Тревожный признак

Пустой результат — реквизит не заполнен или свойство найдено неверно

Тип значения
Норма

Тип совпадает с типом свойства (строка, булево, ссылка)

Тревожный признак

Неопределено или значение другого типа

Поиск свойства
Норма

Ссылка на свойство получена по уникальному идентификатору или предопределённому имени

Тревожный признак

Поиск только по наименованию — код хрупкий

Итог

Что важно запомнить

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

Частые вопросы

Почему запрос к табличной части возвращает пустой результат?

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

Можно ли получить дополнительный реквизит через точку, как обычный?

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

Как получить сразу все дополнительные реквизиты объекта?

Выполните запрос к табличной части без отбора по свойству, только по ссылке на объект — получите пары «Свойство — Значение» для всех заполненных реквизитов. В БСП для этого есть функция УправлениеСвойствами.ЗначенияСвойств() без фильтра по массиву свойств.

Чем дополнительный реквизит отличается от дополнительного сведения при чтении?

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

Будет ли работать код, если реквизит переименуют?

Если свойство ищется по наименованию — нет, поиск перестанет находить элемент. Чтобы код был устойчив, ищите свойство по уникальному идентификатору, предопределённому имени или храните ссылку в настройках, которые можно обновить без изменения кода.