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

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

Как обратиться к дополнительному реквизиту в 1С

Как обратиться к дополнительному реквизиту в 1С: работа через БСП, табличную часть ДополнительныеРеквизиты, ПланыВидовХарактеристик и управляемые формы.

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

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

Где физически хранятся дополнительные реквизиты

В конфигурациях на БСП (Управление торговлей, ERP, Бухгалтерия предприятия, ЗУП и другие) механизм дополнительных реквизитов устроен единообразно. У объекта, которому разрешены дополнительные реквизиты (справочник «Номенклатура», «Контрагенты», документы и т.д.), есть табличная часть ДополнительныеРеквизиты с колонками Свойство (ссылка на ПВХ) и Значение (хранимое значение, тип соответствует типу свойства).

Описания самих реквизитов — название, тип значения, принадлежность к набору — хранятся в плане видов характеристик ДополнительныеРеквизитыИСведения. Наборы привязки к конкретным видам объектов лежат в справочнике НаборыДополнительныхРеквизитовИСведений. Это важно понимать: чтобы обратиться к значению, сначала нужна ссылка на свойство.

Как получить ссылку на свойство

Самый распространённый способ — поиск по наименованию (заголовку) свойства. Наименование должно точно совпадать с тем, что видит пользователь в карточке объекта, включая регистр и пробелы.

Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Цвет товара", Истина);

Если Свойство.Пустая() Тогда

ВызватьИсключение "Дополнительный реквизит не найден";

КонецЕсли;

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

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

Запрос.Текст =

"ВЫБРАТЬ ПЕРВЫЕ 1

| Свойства.Ссылка КАК Свойство

|ИЗ

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

|ГДЕ

| Свойства.Имя = &Имя";

Запрос.УстановитьПараметр("Имя", "ЦветТовара");

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда

Свойство = Выборка.Свойство;

КонецЕсли;

Чтение и запись значения на сервере

Когда ссылка на свойство известна, значение читается из табличной части объекта. Метод Найти возвращает строку или Неопределено:

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

Если СтрокаРеквизита <> Неопределено Тогда

ЗначениеЦвета = СтрокаРеквизита.Значение;

Иначе

ЗначениеЦвета = Неопределено; // реквизит не заполнен

КонецЕсли;

Запись выполняется симметрично: либо обновляется существующая строка, либо добавляется новая. После изменения объект нужно записать.

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

Если СтрокаРеквизита = Неопределено Тогда

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

СтрокаРеквизита.Свойство = Свойство;

КонецЕсли;

СтрокаРеквизита.Значение = НовоеЗначение;

Объект.Записать();

Порядок действий
  1. 1
    Получите ссылку на свойство по имени или наименованию из ПВХ ДополнительныеРеквизитыИСведения
  2. 2
    Откройте объект (Объект = Ссылка.ПолучитьОбъект()) или работайте с объектом в модуле
  3. 3
    Найдите строку в табличной части ДополнительныеРеквизиты по колонке Свойство
  4. 4
    Прочитайте или установите поле Значение с учётом типа свойства
  5. 5
    Запишите объект и проверьте результат в карточке в режиме предприятия

Обращение к дополнительному реквизиту в запросе

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

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

Запрос.Текст =

"ВЫБРАТЬ

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

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

|ИЗ

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

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

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

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

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

Условие на свойство обязательно помещайте в параметры виртуальной таблицы соединения (как в примере), а не в секцию ГДЕ — иначе левое соединение превратится во внутреннее и товары без заполненного реквизита пропадут из выборки.

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

Работа на управляемой форме

На форме объекта БСП динамически создаёт реквизиты формы для каждого дополнительного реквизита. Их имена формируются по шаблону вида ДополнительныйРеквизитЗначение_<GUID>, поэтому обращаться к ним по фиксированному имени нельзя — имя зависит от конкретного свойства.

Для программного доступа используйте структуру описания, которую БСП хранит в реквизите формы Свойства_ОписаниеДополнительныхРеквизитов (список значений, где представление — имя реквизита формы, а значение — ссылка на свойство). Найдя нужное свойство, читайте значение через ЭтаФорма[ИмяРеквизитаФормы].

Для Каждого ЭлементОписания Из Свойства_ОписаниеДополнительныхРеквизитов Цикл

Если ЭлементОписания.Значение = Свойство Тогда

ЗначениеНаФорме = ЭтаФорма[ЭлементОписания.Представление];

Прервать;

КонецЕсли;

КонецЦикла;

Если нужно только показать или скрыть дополнительный реквизит на форме, ищите элемент формы по тому же имени и управляйте свойством Видимость. Учитывайте, что состав реквизитов формы пересоздаётся при записи набора свойств, поэтому привязываться к индексам элементов нельзя.

Дополнительные сведения: чем отличается обращение

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

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

Запрос.Текст =

"ВЫБРАТЬ

| Сведения.Значение КАК Значение

|ИЗ

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

|ГДЕ

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

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

Сравнение вариантов

Дополнительный реквизит

Хранится в табличной части объекта, виден на основной вкладке карточки, участвует в движениях объекта при записи. Подходит для часто используемых полей ввода.

Дополнительное сведение

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

Типичные ошибки и проверка результата

Чаще всего обращение к дополнительному реквизиту «не работает» из-за неверного поиска свойства: заголовок в коде не совпадает с заголовком в базе (лишний пробел, другой регистр), либо свойство находится в другом наборе и у объекта просто нет соответствующей строки. Всегда проверяйте, что ссылка на свойство найдена, прежде чем искать строку в табличной части.

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

Типичные ошибки
01
Поиск свойства по наименованию с опечаткой — строка табличной части не находится, значение молча остаётся Неопределено
02
Условие на свойство в секции ГДЕ запроса вместо параметров соединения — из выборки пропадают объекты без заполненного реквизита
03
Обращение к реквизиту формы по жёстко заданному имени — после пересоздания формы код перестаёт работать
04
Присвоение строки свойству с типом ДополнительноеЗначение — при записи объекта возникает ошибка несоответствия типов
Контрольные точки

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

Ссылка на свойство
Норма

Свойство найдено, Ссылка не пустая

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

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

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

Найти вернул строку, Значение заполнено

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

Строка не найдена — реквизит не заполнялся у объекта

Значение после записи
Норма

В карточке объекта в режиме предприятия отображается новое значение

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

Значение сброшено — несовпадение типа значения с типом свойства

FAQ

Почему Объект.ДополнительныеРеквизиты пуст, хотя в карточке реквизит заполнен?

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

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

Откройте список дополнительных реквизитов (Администрирование → Общие настройки → Дополнительные реквизиты), найдите нужный и посмотрите поле «Имя» в его карточке. Если имя не видно, используйте поиск по наименованию или выгрузите свойство через запрос к ПВХ.

Можно ли обратиться к дополнительному реквизиту на клиенте без вызова сервера?

На управляемой форме — да: значения уже загружены в динамические реквизиты формы, и их можно читать через ЭтаФорма[ИмяРеквизита]. А вот поиск свойства в ПВХ и работа с табличной частью объекта требуют серверного контекста.

Чем отличается поиск по наименованию от поиска по имени и что надёжнее?

Наименование — это заголовок, который видит пользователь и может изменить в любой момент. Имя формируется один раз при создании свойства и обычно не меняется. Для прикладного кода поиск по имени надёжнее, но требует заранее узнать имя в конкретной базе.

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

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

Что делать, если у свойства составной тип значения?

Проверяйте тип значения перед записью через ТипЗнч() и приводите значение к одному из типов, перечисленных в свойстве (поле ТипЗначения). Для ссылочных типов из списка значений используйте элементы справочника ЗначенияСвойствОбъектов.

Итог

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

Дополнительный реквизит читается и пишется через табличную часть ДополнительныеРеквизиты: сначала найдите ссылку на свойство в ПВХ ДополнительныеРеквизитыИСведения, затем строку по этой ссылке. В запросах используйте левое соединение с условием на свойство в параметрах, на форме — динамические реквизиты через описание БСП. Дополнительные сведения хранятся отдельно, в одноимённом регистре.