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

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

1С: как получить дополнительные реквизиты объекта

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

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

На практике задача «получить дополнительные реквизиты» возникает в трёх ситуациях: при написании запроса для отчёта, при программной обработке данных в модуле и при выгрузке данных во внешние системы. В каждом случае подход отличается, и выбор неправильного способа приводит либо к пустым значениям, либо к ошибкам вида «Поле не найдено».

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

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

Когда администратор добавляет дополнительный реквизит через «Администрирование → Общие настройки → Дополнительные реквизиты и сведения», конфигурация не меняется. Вместо этого в плане видов характеристик «ДополнительныеРеквизитыИСведения» создаётся элемент-описание свойства: его наименование, тип значения, заголовок.

Сами значения записываются в табличную часть объекта, которая присутствует у всех сущностей, к которым подключён механизм свойств. У справочника «Номенклатура», например, это табличная часть «ДополнительныеРеквизиты» с двумя ключевыми колонками: «Свойство» (ссылка на план видов характеристик) и «Значение» (произвольный тип).

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

Получение значений в коде через табличную часть

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

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

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

Если Строка.Свойство = СвойствоЦвет Тогда

ЗначениеЦвета = Строка.Значение;

КонецЕсли;

КонецЦикла;

Поиск нужного свойства удобнее выполнять не по наименованию (пользователь может его переименовать), а по предопределённому имени или по заранее сохранённой ссылке. Найти ссылку на свойство можно запросом к плану видов характеристик с отбором по наименованию или заголовку.

Если нужно получить значение одного конкретного реквизита, вместо цикла используйте метод Найти() табличной части: СтрокаРеквизита = Объект.ДополнительныеРеквизиты.Найти(СвойствоСсылка, "Свойство");. Метод вернёт строку или Неопределено, если реквизит у объекта не заполнен.

Получение дополнительных реквизитов запросом

В отчётах и выборках больших объёмов данных обращаться к каждому объекту через ПолучитьОбъект() недопустимо — это вызовет резкое падение производительности. Правильный путь — запрос с левым соединением к табличной части.

ВЫБРАТЬ

Номенклатура.Ссылка КАК Товар,

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

ИЗ

Справочник.Номенклатура КАК Номенклатура

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

ПО Номенклатура.Ссылка = ДопРеквизиты.Ссылка

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

Обратите внимание: условие по свойству выносится в секцию соединения (ПО), а не в ГДЕ. Если поместить его в ГДЕ, левое соединение фактически превратится во внутреннее, и объекты без заполненного реквизита выпадут из выборки.

Когда нужно вытащить сразу несколько реквизитов, добавляют несколько соединений к одной и той же табличной части с разными псевдонимами и разными свойствами в условии. Альтернатива — соединение с планом видов характеристик и группировка, но для отчётов на СКД вариант с несколькими соединениями обычно читается проще.

Порядок действий при написании запроса
  1. 1
    Найдите ссылку на свойство в плане видов характеристик «ДополнительныеРеквизитыИСведения»
  2. 2
    Передайте её в запрос параметром
  3. 3
    Добавьте левое соединение к табличной части ДополнительныеРеквизиты
  4. 4
    Условие по свойству укажите в секции ПО, а не ГДЕ
  5. 5
    Выполните запрос в консоли и проверьте, что объекты без значения тоже попали в выборку

Использование функций БСП

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

МассивСвойств = УправлениеСвойствами.СвойстваОбъекта(СсылкаНоменклатура);

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

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

Сравнение способов получения значений

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

Подходит для разовой обработки одного объекта. Требует ПолучитьОбъект(), медленно на больших объёмах.

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

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

Функции БСП УправлениеСвойствами

Удобно для универсального кода, но зависит от версии библиотеки и скрывает детали хранения.

Получение реквизитов в СКД и отчётах

В схеме компоновки данных дополнительные реквизиты доступны напрямую: конструктор запроса показывает табличную часть «ДополнительныеРеквизиты» как виртуальную таблицу объекта. Достаточно добавить соединение и отбор по свойству, как описано выше.

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

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

Типичные ошибки и как их избежать

Самая частая проблема — попытка обратиться к дополнительному реквизиту как к обычному полю: Номенклатура.Цвет. Такое обращение либо возвращает Неопределено (если обращение идёт через данные формы), либо вызывает ошибку «Поле объекта не обнаружено». Дополнительные реквизиты не существуют как колонки таблицы объекта.

Вторая ошибка — поиск свойства по наименованию без учёта регистра и пробелов. Пользователи переименовывают реквизиты, и код, завязанный на точное наименование, ломается. Надёжнее хранить ссылку на свойство в константе, параметре сеанса или искать по предопределённому имени, если свойство создано программно.

Третья группа проблем связана с типом значения. Колонка «Значение» имеет составной тип, и при сравнении в запросе или при выгрузке в Excel значение может прийти не в том типе, который ожидается. Перед сравнением приводите значение функциями типа Строка() или Число(), а в запросах используйте ВЫРАЗИТЬ.

Типичные ошибки
01
Обращение к реквизиту через точку как к штатному полю — ошибка «Поле не обнаружено»
02
Условие по свойству в секции ГДЕ вместо ПО — из выборки пропадают объекты без значения
03
Поиск свойства по наименованию — код ломается после переименования реквизита пользователем
04
Получение объекта через ПолучитьОбъект() в цикле по тысячам ссылок — резкое падение производительности
05
Смешение дополнительных реквизитов и дополнительных сведений — запрос возвращает пустой результат

Проверка результата и ограничения

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

Учитывайте ограничения прав. Для чтения дополнительных реквизитов пользователю нужны права на чтение самого объекта и на план видов характеристик «ДополнительныеРеквизитыИСведения». В безопасном режиме внешних обработок обращение к этим данным может быть заблокировано.

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

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

Значение реквизита в выборке
Норма

Возвращается то же значение, что видно на форме объекта

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

NULL или пустая строка при заполненном поле на форме — проверьте свойство в отборе

Полнота выборки
Норма

Объекты без заполненного реквизита присутствуют с пустым значением

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

Объекты без значения пропали — условие перенесено из ПО в ГДЕ

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

Тип совпадает с типом, заданным в настройках свойства

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

Строка вместо числа или даты — требуется приведение типа

Часто задаваемые вопросы

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

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

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

Да, для просмотра достаточно открыть карточку объекта — заполненные реквизиты отображаются на форме. Для массового просмотра настройте список: в форме списка через «Ещё → Изменить форму» или настройку списка можно вывести дополнительные реквизиты как колонки, если это предусмотрено конфигурацией.

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

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

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

Точно так же, как у справочника: у документов, к которым подключён механизм свойств, есть табличная часть «ДополнительныеРеквизиты». В запросе используйте таблицу вида Документ.РеализацияТоваровУслуг.ДополнительныеРеквизиты. Проверить наличие механизма можно в настройках «Дополнительные реквизиты и сведения» — там перечислены все подключённые типы объектов.

Влияет ли большое количество дополнительных реквизитов на производительность?

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

Работает ли этот механизм в самописной конфигурации?

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

Итог

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

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