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