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

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

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

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

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

Главное, что нужно понимать перед написанием кода: в 1С существует принципиальная разница между ссылкой на объект базы данных и объектом как редактируемой сущностью. Через ссылку можно только читать данные, а для изменения требуется получить объект методом ПолучитьОбъект(). Путаница между этими понятиями — источник большинства ошибок начинающих разработчиков.

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

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

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

Контрагент = Справочники.Контрагенты.НайтиПоКоду("000000123");

Наименование = Контрагент.Наименование;

ИНН = Контрагент.ИНН;

Такое обращение работает для ссылок на справочники, документы, планы видов характеристик, планы счетов и другие ссылочные типы. Стандартные реквизиты (Код, Наименование, Дата, Номер) доступны всегда, прикладные реквизиты — если они добавлены в конфигурацию.

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

Получение объекта методом ПолучитьОбъект()

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

ДокументСсылка = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("0001", ТекущаяДатаСеанса());

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

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

ДокументОбъект.Записать();

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

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

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

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

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

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

"ВЫБРАТЬ

| Контрагенты.Наименование,

| Контрагенты.ИНН

|ИЗ

| Справочник.Контрагенты КАК Контрагенты

|ГДЕ

| Контрагенты.Ссылка = &Ссылка";

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

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

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

ИНН = Выборка.ИНН;

КонецЕсли;

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

Обязательно передавайте изменяемые значения через параметры (УстановитьПараметр), а не конкатенацией строки запроса. Это защищает от ошибок синтаксиса и делает код безопаснее.

Сравнение способов получения значения

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

Подходит для быстрого чтения 1–2 реквизитов. Ограничение: каждое обращение — потенциальный запрос к базе, только чтение.

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

Нужен для изменения и записи данных, доступа к табличным частям. Ограничение: тяжёлая операция, не для массового чтения.

Запрос

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

Работа со структурами, соответствиями и табличными частями

Структура и соответствие

Структура — не объект базы данных, а коллекция пар «ключ-значение» в памяти. Значение из структуры получают либо через точку (если ключ — допустимый идентификатор), либо через квадратные скобки:

Данные = Новый Структура("Контрагент, Сумма");

Данные.Контрагент = КонтрагентСсылка;

Данные.Сумма = 15000;

Сумма = Данные.Сумма; // через точку

Сумма = Данные["Сумма"]; // через скобки

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

Значение = Неопределено;

Если Данные.Свойство("Сумма", Значение) Тогда

// ключ существует, значение в переменной Значение

КонецЕсли;

Для соответствия обращение возможно только через скобки: Значение = Соответствие[Ключ]. Метод Свойство() у соответствия отсутствует.

Табличная часть объекта

Табличные части доступны только через объект, а не через ссылку. Строки перебираются в цикле, значения колонок читаются через точку:

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

ИтогоСумма = 0;

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

ИтогоСумма = ИтогоСумма + СтрокаТовары.Сумма;

КонецЦикла;

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

bsl
Значение = Неопределено;
Если Структура.Свойство("ИмяКлюча", Значение) Тогда
	// ключ найден
Иначе
	// ключа нет, используем значение по умолчанию
КонецЕсли;

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

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

Если Контрагент.Пустая() Тогда

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

КонецЕсли;

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

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

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

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

Результат поиска объекта
Норма

Ссылка не пустая, Контрагент.Пустая() возвращает Ложь

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

Пустая ссылка — обращение к реквизитам даст пустые значения без ошибки

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

ЗначениеЗаполнено() возвращает Истина

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

Неопределено, пустая строка или дата 01.01.0001

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

Запрос по ссылке возвращает строку

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

В данных отображается «Объект не найден» — битая ссылка

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

Первая распространённая ошибка — попытка записать значение через ссылку: Ссылка.Наименование = "Новое". Платформа выдаст ошибку, потому что ссылка доступна только для чтения. Решение — получить объект и записать его.

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

Третья ошибка — чтение данных в цикле через точку от ссылки внутри запроса-обхода. Если уже есть выборка запроса, добавьте нужное поле прямо в текст запроса вместо обращения Выборка.Ссылка.Реквизит — это сокращает число обращений к базе в разы.

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

FAQ

Чем ссылка отличается от объекта в 1С?

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

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

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

Почему Контрагент.Наименование возвращает пустую строку без ошибки?

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

Можно ли получить значение табличной части без ПолучитьОбъект()?

Да, через запрос к табличной части: ИЗ Документ.ИмяДокумента.ИмяТабличнойЧасти с отбором по ссылке. Это быстрее, чем загрузка всего объекта, и подходит для чтения. Для изменения строк табличной части объект получить всё равно придётся.

Что возвращает запрос, если записей не найдено?

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

Как прочитать значение перечисления или предопределённого элемента?

Значения перечислений доступны напрямую: Перечисления.СтавкиНДС.НДС20. Предопределённые элементы справочников — через точку от менеджера: Справочники.Валюты.НайтиПредопределенное("RUB") или напрямую по имени предопределённого элемента, если оно задано в конфигураторе.

Итог

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

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