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