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