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

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

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

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

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

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

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

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

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

Как добавить дополнительный реквизит в пользовательском режиме

Откройте «Администрирование → Общие настройки» и включите флажок «Дополнительные реквизиты и сведения». После этого станут доступны ссылки «Дополнительные реквизиты» и «Дополнительные сведения». Перейдите в список реквизитов, выберите нужный вид объектов (например, «Номенклатура» или «Контрагенты») и нажмите «Добавить → Новый».

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

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

Порядок добавления реквизита
  1. 1
    Администрирование → Общие настройки → включить «Дополнительные реквизиты и сведения»
  2. 2
    Открыть «Дополнительные реквизиты», выбрать вид объектов
  3. 3
    Нажать «Добавить → Новый», задать заголовок и тип значения
  4. 4
    Заполнить список значений, если тип — дополнительное значение
  5. 5
    Записать и открыть объект: поле должно появиться на форме

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

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

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

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

.НайтиПоНаименованию(ИмяСвойства, Истина);

Если Не ЗначениеЗаполнено(Свойство) Тогда

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

КонецЕсли;

Строки = Объект.ДополнительныеРеквизиты.НайтиСтроки(

Новый Структура("Свойство", Свойство));

Если Строки.Количество() = 0 Тогда

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

КонецЕсли;

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

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

Для дополнительных сведений подход другой — значение читается из регистра сведений «ДополнительныеСведения» по отбору «Объект + Свойство»:

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

"ВЫБРАТЬ

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

|ИЗ

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

|ГДЕ

| ДопСведения.Объект = &Объект

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

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

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

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

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

В запросе табличная часть присоединяется соединением по свойству. Типичный шаблон для номенклатуры:

ВЫБРАТЬ

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

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

ИЗ

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

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

КАК ДопРеквизиты

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

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

Если реквизитов нужно несколько, запрос с несколькими соединениями становится громоздким. Альтернатива — выбрать пары «Свойство–Значение» одним соединением и развернуть их свёрткой в коде, либо использовать временную таблицу. В отчётах на СКД в типовых конфигурациях дополнительные реквизиты часто доступны как поля сразу: механизм свойств автоматически расширяет набор данных, и поле можно просто перетащить в настройках отчёта.

При соединении всегда используйте левое соединение и условие на свойство в параметрах соединения, а не в секции ГДЕ — иначе объекты без заполненного реквизита выпадут из выборки. Это самая частая причина «пропавших» строк в отчётах.

Где искать значение, если реквизит не виден или пуст

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

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

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

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

Свойство найдено в плане видов характеристик
Норма

Ссылка на свойство заполнена

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

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

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

НайтиСтроки вернула одну строку с заполненным значением

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

Строк нет — реквизит не привязан к набору этого вида объектов

Значение в отчёте
Норма

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

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

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

Типичные ошибки и ограничения механизма

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

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

Типичные ошибки
01
Поиск свойства по наименованию в коде — после переименования реквизита пользователем обработка молча перестаёт работать
02
Внутреннее соединение с табличной частью — объекты без заполненного реквизита выпадают из отчёта
03
Сравнение значения со строкой, когда тип реквизита — «Дополнительное значение» (ссылка), — условие никогда не срабатывает
04
Чтение табличной части в клиентской процедуре управляемой формы — ошибка вызова, нужен серверный контекст
05
Массовое добавление десятков реквизитов вместо доработки конфигурации — деградация запросов и форм

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

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

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

Можно ли получить дополнительный реквизит через внешнюю обработку без изменения конфигурации?

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

Почему реквизит есть у одних товаров, а у других нет?

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

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

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

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

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

Итог

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

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