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

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

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

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

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

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

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

Чем ссылка отличается от объекта

Ссылка — это уникальный идентификатор записи (GUID плюс тип), который существует всегда, пока запись есть в базе. Через ссылку можно читать реквизиты «через точку», но каждое такое обращение — это неявный запрос к базе данных. Записать что-либо через ссылку нельзя: попытка Ссылка.Наименование = "Новое" вызовет ошибку, потому что у ссылки реквизиты доступны только для чтения.

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

Основной способ: метод ПолучитьОбъект()

Метод вызывается у любой ссылки на объект базы данных и возвращает соответствующий объект:

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

Если Не СсылкаНаДокумент.Пустая() Тогда

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

Если ДокОбъект <> Неопределено Тогда

ДокОбъект.Комментарий = "Изменено программно";

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

КонецЕсли;

КонецЕсли;

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

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

Как найти ссылку, чтобы получить объект

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

Поиск по коду или номеру

Для справочников с кодом и документов с номером:

ТоварСсылка = Справочники.Номенклатура.НайтиПоКоду("00-000123");

ДокСсылка = Документы.ПоступлениеТоваров.НайтиПоНомеру("АБ-157", Дата(2026, 5, 10));

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

Поиск по реквизиту и по наименованию

Метод НайтиПоРеквизиту("ИНН", "7707083893") ищет по значению любого реквизита, для которого в конфигураторе включена индексация (иначе поиск будет медленным). Метод НайтиПоНаименованию() ищет точное совпадение наименования и по умолчанию не учитывает помеченные на удаление — учитывайте это при обработках.

Поиск через запрос

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

Порядок действий
  1. 1
    Найдите ссылку: НайтиПоКоду(), НайтиПоНомеру(), НайтиПоРеквизиту() или запрос
  2. 2
    Проверьте, что ссылка не пустая: НЕ Ссылка.Пустая()
  3. 3
    Вызовите Объект = Ссылка.ПолучитьОбъект()
  4. 4
    Проверьте, что Объект <> Неопределено
  5. 5
    Измените реквизиты или табличные части
  6. 6
    Вызовите Объект.Записать() и обработайте возможное исключение

Когда объект получать не нужно

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

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

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

Чтение через ссылку (Ссылка.Наименование)

Подходит для чтения 1–2 реквизитов. Не позволяет изменять данные; много обращений через точку порождает лишние запросы.

Запрос к базе

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

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

Единственный способ изменить существующую запись. Медленнее, требует проверки на Неопределено и явной записи.

Менеджер.СоздатьЭлемент() / СоздатьДокумент()

Создаёт новый объект без ссылки. Ссылка появится только после Записать().

Создание нового объекта без ссылки

Новый элемент создают не из ссылки, а через менеджер типа: Справочники.Номенклатура.СоздатьЭлемент(), Документы.ЗаказКлиента.СоздатьДокумент(), ПланыВидовХарактеристик.Свойства.СоздатьЭлемент(). До первой записи у такого объекта ссылки нет — метод Ссылка вернёт пустую ссылку.

Если ссылка на новый объект нужна до записи (например, чтобы заполнить реквизит-владельца у подчинённых данных), используйте НовыйОбъект.УстановитьСсылкуНового(Справочники.Номенклатура.ПолучитьСсылку()). После Записать() объект получает постоянную ссылку, доступную через свойство Ссылка.

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

Наиболее частые проблемы: обращение к реквизитам результата ПолучитьОбъект() без проверки на Неопределено; попытка изменить реквизит через ссылку; забытый вызов Записать(); получение объекта в цикле для чтения. Ещё одна ловушка — попытка записать объект, открытый в этот момент пользователем в форме: платформа выдаст ошибку блокировки данных.

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

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

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

Результат ПолучитьОбъект()
Норма

Возвращён объект нужного типа, ТипЗнч() показывает СправочникОбъект/ДокументОбъект

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

Возвращено Неопределено — запись отсутствует в базе

Сохранение изменений
Норма

После Записать() данные видны в форме элемента и в запросе

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

Записать() не вызывался или вызвал исключение — изменения не сохранены

Производительность обработки
Норма

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

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

Объект получается для каждой строки выборки ради чтения

FAQ: частые вопросы о получении объекта в 1С

Почему ПолучитьОбъект() возвращает Неопределено, хотя ссылка не пустая?

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

Можно ли получить объект сразу из запроса?

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

Как получить объект, открытый в форме, из модуля формы?

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

Чем ПолучитьОбъект() отличается для тонкого клиента и сервера?

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

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

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

Итог

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

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