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