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