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

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

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

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

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

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

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

Где хранятся значения свойств в 1С

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

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

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

Получение значения из табличной части «ДополнительныеРеквизиты»

Если свойство является дополнительным реквизитом, значение читается из табличной части объекта. Сначала получаем ссылку на само свойство — по имени или по предопределённому имени, затем ищем строку в табличной части.

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

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

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

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

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

КонецЕсли;

ОбъектДанных = ОбъектСсылка.ПолучитьОбъект();

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

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

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

КонецЕсли;

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

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

Обратите внимание: метод НайтиПоНаименованию с параметром «Истина» ищет точное совпадение наименования. Если в базе есть два свойства с похожими именами («Цвет» и «Цвет товара»), неточный поиск вернёт не то свойство. Надёжнее использовать предопределённые элементы плана видов характеристик и обращаться к ним по имени: ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.ЦветТовара.

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

Получение значения запросом

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

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

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

"ВЫБРАТЬ

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

|ИЗ

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

|ГДЕ

| ДопРеквизиты.Ссылка = &Ссылка

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

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

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

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

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

ЗначениеСвойства = Выборка.Значение;

Иначе

ЗначениеСвойства = Неопределено;

КонецЕсли;

Для дополнительных сведений запрос идёт к регистру сведений:

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

"ВЫБРАТЬ

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

|ИЗ

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

|ГДЕ

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

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

Признак корректного результата: запрос вернул ровно одну строку с заполненным значением. Если строк нет — либо свойство не заполнено у объекта, либо вы перепутали тип хранилища (ищете сведение в табличной части или наоборот).

Порядок получения значения свойства
  1. 1
    Определите, где хранится свойство: доп. реквизит (табличная часть) или доп. сведение (регистр сведений)
  2. 2
    Получите ссылку на свойство из плана видов характеристик по предопределённому имени или наименованию
  3. 3
    Выполните запрос к нужному хранилищу с параметрами «Ссылка» и «Свойство»
  4. 4
    Проверьте, что выборка вернула строку, и обработайте случай пустого значения
  5. 5
    Проверьте тип возвращаемого значения — он соответствует типу, заданному в настройках свойства

Использование типовых функций БСП

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

// Значение одного свойства

Значение = УправлениеСвойствами.ЗначениеСвойства(ОбъектСсылка, СвойствоСсылка);

// Все дополнительные свойства объекта сразу

СвойстваОбъекта = УправлениеСвойствами.СвойстваОбъекта(ОбъектСсылка, Истина, Истина);

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

Преимущество подхода — устойчивость к изменениям структуры хранения при обновлении конфигурации. Недостаток — зависимость от БСП: в самописной конфигурации без библиотеки эти функции недоступны, и придётся использовать запросы из предыдущего раздела.

Чтение свойства на форме объекта

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

&НаКлиенте

Процедура ПриИзмененииСвойства()

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

Если СтрокаОписания.Свойство = ИскомоеСвойство Тогда

Значение = ЭтотОбъект[СтрокаОписания.ИмяРеквизитаЗначение];

Прервать;

КонецЕсли;

КонецЦикла;

КонецПроцедуры

Если форма уже открыта и объект изменён пользователем, чтение из базы запросом вернёт старые данные, а не те, что на экране. Это частая причина «неправильных» значений в проверках перед записью — данные нужно брать из реквизитов формы, а не из СУБД.

Типичные ошибки и как их избежать

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

Вторая группа ошибок связана с типами значений. Свойство может иметь составной тип (строка, число, ссылка на справочник значений свойств). Сравнение Значение = "Красный" не сработает, если значение хранится как ссылка на элемент справочника «ЗначенияСвойствОбъектов». Сравнивайте либо ссылки, либо приводите значение к строке через Строка(Значение).

Типичные ошибки
01
Поиск свойства по частичному наименованию — находится чужое свойство с похожим именем; используйте предопределённые элементы или точное совпадение
02
Чтение доп. сведения из табличной части или наоборот — запрос возвращает пустоту; сначала уточните тип хранилища в настройках
03
Сравнение значения-ссылки со строкой — условие никогда не срабатывает; проверяйте тип значения через ТипЗнч()
04
Вызов ПолучитьОбъект() в цикле по тысяче элементов — обработка работает минутами; замените на один запрос с группировкой
05
Чтение свойства из базы при открытой изменённой форме — получены устаревшие данные вместо введённых пользователем

Проверка результата и отладка

Чтобы убедиться, что код читает правильное значение, выполните проверку в три шага. Сначала откройте карточку объекта в пользовательском режиме и зафиксируйте отображаемое значение свойства. Затем выполните свой код в консоли кода или отладчике и сравните результат. Наконец, проверьте тип значения: Сообщить(ТипЗнч(Значение)) — тип должен совпадать с ожидаемым.

Если значение пустое, проверьте запросом напрямую в консоли запросов, есть ли вообще строка с этой парой «объект + свойство» в хранилище. Отсутствие строки означает, что свойство никогда не заполнялось; наличие строки с пустым значением — что свойство очищено, и это разные ситуации для прикладной логики.

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

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

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

Значение в коде совпадает с отображаемым на форме

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

Код возвращает Неопределено или старое значение

Тип возвращаемого значения
Норма

Тип соответствует настройке свойства (строка, число, ссылка)

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

Ожидалась строка, пришла ссылка на справочник значений

Наличие строки в хранилище
Норма

Запрос в консоли возвращает одну строку по паре объект+свойство

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

Строк нет — неверная ссылка на свойство или тип хранилища

Часто задаваемые вопросы

Как получить значение свойства, если известно только его наименование?

Используйте ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(Имя, Истина) с точным совпадением. Учтите, что наименования могут дублироваться между наборами свойств разных объектов, поэтому надёжнее хранить ссылку на свойство в константе или использовать предопределённый элемент.

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

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

Почему запрос возвращает пустой результат, хотя свойство заполнено?

Чаще всего вы обращаетесь не к тому хранилищу: ищете сведение в табличной части «ДополнительныеРеквизиты» или реквизит в регистре «ДополнительныеСведения». Проверьте тип свойства в разделе «Дополнительные реквизиты и сведения» панели администрирования.

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

Напишите запрос к табличной части с условием «Ссылка В (&СписокСсылок)» и итогами или левым соединением к списку. Это выполнится одним обращением к базе вместо загрузки каждого объекта методом ПолучитьОбъект().

Как сравнить значение свойства со строкой, если оно хранится как ссылка?

Приведите значение к строке функцией Строка(Значение) для отображения, но для сравнения получите ссылку на нужный элемент справочника значений свойств и сравнивайте ссылки — это быстрее и надёжнее, чем сравнение представлений.

Итог

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

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