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

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

Как обратиться к реквизиту объекта 1С

Как обратиться к реквизиту объекта в 1С: через точку, квадратные скобки, ДанныеФормыВЗначение. Примеры кода, типичные ошибки и способы проверки результата.

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

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

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

Обращение к реквизиту через точку

Самый распространённый способ — обращение через точку. Оно работает для прикладных объектов (справочников, документов, регистров), а также для структур и строк таблиц значений. Имя реквизита указывается после точки точно так, как оно задано в конфигураторе.

ОбъектСправочника = Справочники.Номенклатура.НайтиПоКоду("00000123").ПолучитьОбъект();

Артикул = ОбъектСправочника.Артикул;

ОбъектСправочника.Наименование = "Новое наименование";

ОбъектСправочника.Записать();

Через точку можно проходить по цепочке ссылок: Документ.Контрагент.ИНН. Однако учтите, что каждое разыменование ссылки при программном обращении вызывает обращение к базе данных. Цепочки из трёх и более звеньев в цикле заметно замедляют код — в таких случаях лучше использовать запрос.

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

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

Когда имя реквизита хранится в переменной или вычисляется динамически, используйте квадратные скобки: Объект["Наименование"]. Этот способ работает для объектов данных, структур, строк таблиц значений и данных формы.

ИмяРеквизита = "Наименование";

Значение = Объект[ИмяРеквизита];

Объект["Комментарий"] = "Заполнено программно";

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

Для Каждого Реквизит Из Объект.Метаданные().Реквизиты Цикл

ЗначениеРеквизита = Объект[Реквизит.Имя];

Сообщить(Реквизит.Имя + " = " + ЗначениеРеквизита);

КонецЦикла;

Перед обращением по строковому имени полезно проверить, существует ли реквизит, особенно если имя приходит извне — из файла, настроек или пользовательского ввода. Иначе код упадёт с той же ошибкой «Поле объекта не обнаружено».

Чтение реквизитов ссылки без получения объекта

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

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

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

"ВЫБРАТЬ

| Номенклатура.Артикул,

| Номенклатура.Наименование

|ИЗ

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

|ГДЕ

| Номенклатура.Ссылка = &Ссылка";

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

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

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

Артикул = Выборка.Артикул;

КонецЕсли;

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

Сравнение способов чтения реквизита

Через точку от ссылки

Подходит для одного-двух реквизитов. Каждое обращение — отдельный запрос к базе.

Запрос

Оптимален для нескольких реквизитов и обхода коллекций. Только чтение, изменить данные нельзя.

ПолучитьОбъект()

Нужен только для изменения данных. Загружает объект целиком, дорого по ресурсам.

Обращение к реквизитам на управляемой форме

На управляемой форме объект обычно представлен реквизитом формы типа ДанныеФормыСтруктура, например Объект для формы документа. В клиентском коде доступны только реквизиты формы и данные, переданные на клиента; произвольно вызвать ПолучитьОбъект() на клиенте нельзя.

Для записи данных в объект на сервере используется преобразование РеквизитФормыВЗначение и обратно ЗначениеВРеквизитФормы:

&НаСервере

Процедура ЗаполнитьКомментарийНаСервере()

ОбъектДокумента = РеквизитФормыВЗначение("Объект");

ОбъектДокумента.Комментарий = "Сформировано автоматически";

ЗначениеВРеквизитФормы(ОбъектДокумента, "Объект");

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

Если объект на форме ещё не записан, у него нет ссылки — обращение Объект.Ссылка вернёт пустую ссылку. Проверяйте это условие перед тем, как передавать ссылку в запросы или другие процедуры.

Обход табличных частей и обращение к их реквизитам

Реквизиты табличной части доступны через строку табличной части. Обход выполняется циклом Для Каждого, обращение к реквизиту строки — через точку или квадратные скобки.

Для Каждого СтрокаТовары Из ОбъектДокумента.Товары Цикл

СтрокаТовары.Цена = СтрокаТовары.Цена * 1.1;

Сумма = СтрокаТовары["Сумма"];

КонецЦикла;

Если нужно только прочитать данные табличной части по ссылке, снова выгоднее запрос с обращением к табличной части: Документ.РеализацияТоваровУслуг.Товары. Это позволяет сразу получить итоги и отфильтрованные строки без загрузки объекта.

При изменении строк табличной части объекта не забывайте вызывать Записать() после завершения всех изменений. Запись внутри цикла по каждой строке — частая причина медленной работы и лишних блокировок.

Типичные ошибки и их последствия

Типичные ошибки
01
Обращение к реквизиту Неопределено: если функция поиска вернула Неопределено, а не ссылку, обращение к реквизиту вызовет ошибку. Всегда проверяйте результат поиска.
02
Чтение реквизитов в цикле через точку от ссылки: сотни обращений к базе вместо одного запроса. Используйте запрос с соединением.
03
Изменение объекта без Записать(): изменения остаются только в памяти и теряются.
04
Опечатка в строковом имени реквизита: ошибка проявится только в момент выполнения. Проверяйте наличие реквизита через метаданные.

Отдельная группа ошибок связана с разделением клиентского и серверного контекста. Попытка обратиться к менеджеру справочника или выполнить запрос в клиентской процедуре управляемой формы приведёт к ошибке компиляции или выполнения. Логика работы с объектами должна быть вынесена в серверные процедуры.

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

Как проверить результат обращения

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

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

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

Значение реквизита
Норма

ЗначениеЗаполнено() возвращает Истина, тип соответствует ожидаемому

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

Неопределено, пустая ссылка или значение другого типа

Существование реквизита
Норма

Реквизит есть в Метаданные().Реквизиты или стандартных реквизитах

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

Ошибка «Поле объекта не обнаружено» при выполнении

Запись объекта
Норма

Записать() выполняется без исключений, объект доступен по ссылке

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

Ошибка блокировки или нарушение прав доступа

Для отладки удобно использовать точку останова и окно «Вычислить выражение» в конфигураторе: там можно проверить любое обращение к реквизиту до того, как код попадёт в рабочую базу. Это быстрее, чем выводить значения через Сообщить().

Итог

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

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

Частые вопросы

Чем отличается обращение Ссылка.Реквизит от Ссылка.ПолучитьОбъект().Реквизит?

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

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

Используйте квадратные скобки: Объект[ИмяРеквизита]. Способ работает для объектов данных, структур и строк таблиц значений. Перед обращением желательно проверить наличие реквизита через метаданные.

Почему возникает ошибка «Поле объекта не обнаружено»?

Указанного реквизита нет у объекта: опечатка в имени, обращение к реквизиту другого типа объекта или обращение к Неопределено. Проверьте тип значения и состав реквизитов через конфигуратор или метаданные.

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

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

Как безопасно прочитать реквизит, если объект может быть не найден?

Проверьте результат поиска: если НайтиПоКоду или НайтиПоНаименованию вернул пустую ссылку, используйте метод Пустая() или сравнение с пустой ссылкой перед обращением к реквизитам. Для функций, возвращающих Неопределено, добавьте явную проверку на Неопределено.

Что быстрее: запрос или обращение через точку в цикле?

Запрос. Обращение через точку в цикле порождает отдельное обращение к базе на каждой итерации, тогда как один запрос получает все данные сразу. Разница особенно заметна на больших объёмах данных и в клиент-серверном режиме.