Разработка и Конфигурация · 10 мин
Как в 1С получить объект из ссылки
Как в 1С получить объект из ссылки: метод ПолучитьОбъект(), НайтиПоСсылке(), разница между ссылкой и объектом, типичные ошибки и проверка результата.
Встроенный язык 1С разделяет два представления одного и того же элемента базы данных: ссылку и объект. Ссылка — это лёгкий идентификатор, который позволяет обращаться к реквизитам через точку, но не позволяет изменять данные. Объект — это полноценная программная копия записи, загруженная в память, которую можно редактировать и записывать обратно в базу.
Чтобы получить объект, чаще всего используют метод ПолучитьОбъект(), вызываемый у ссылки. Например: ОбъектТовара = СсылкаНаТовар.ПолучитьОбъект();. После этого можно менять реквизиты и табличные части, а затем вызвать ОбъектТовара.Записать();. Такая пара операций — основа большинства сценариев программного изменения данных в 1С.
Однако у ПолучитьОбъект() есть ограничения и подводные камни: метод вернёт Неопределено, если элемент удалён или битая ссылка, а при массовой обработке он существенно медленнее альтернатив. Ниже разобраны все основные способы получения объекта, условия их выбора и типичные ошибки.
Чем ссылка отличается от объекта
Ссылка — это уникальный идентификатор записи (GUID плюс тип), который существует всегда, пока запись есть в базе. Через ссылку можно читать реквизиты «через точку», но каждое такое обращение — это неявный запрос к базе данных. Записать что-либо через ссылку нельзя: попытка Ссылка.Наименование = "Новое" вызовет ошибку, потому что у ссылки реквизиты доступны только для чтения.
Объект (типы СправочникОбъект, ДокументОбъект и т.д.) — это загруженная в память копия записи со всеми реквизитами и табличными частями. Объект поддерживает методы Записать(), УстановитьПометкуУдаления(), Заполнить() и позволяет модифицировать данные. Плата за это — расход памяти и времени на чтение всей записи целиком.
Основной способ: метод ПолучитьОбъект()
Метод вызывается у любой ссылки на объект базы данных и возвращает соответствующий объект:
СсылкаНаДокумент = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("0001", ТекущаяДатаСеанса());
Если Не СсылкаНаДокумент.Пустая() Тогда
ДокОбъект = СсылкаНаДокумент.ПолучитьОбъект();
Если ДокОбъект <> Неопределено Тогда
ДокОбъект.Комментарий = "Изменено программно";
ДокОбъект.Записать();
КонецЕсли;
КонецЕсли;
Ключевой момент — обязательная проверка результата на Неопределено. Если запись физически отсутствует в базе (битая ссылка после обмена или прямого удаления), метод не вызовет исключение, а молча вернёт Неопределено. Обращение к реквизиту такого результата приведёт к ошибке «Поле объекта не обнаружено».
После изменений объект нужно записать явно. Без вызова Записать() все правки останутся только в памяти и будут потеряны при завершении кода. Для документов учитывайте режим записи: Записать(РежимЗаписиДокумента.Проведение) выполнит проведение, а обычный Записать() сохранит документ без движений.
Как найти ссылку, чтобы получить объект
Часто исходной ссылки нет — её нужно сначала найти. Для этого у менеджеров типов есть методы поиска, каждый из которых возвращает ссылку, а уже от неё получают объект.
Поиск по коду или номеру
Для справочников с кодом и документов с номером:
ТоварСсылка = Справочники.Номенклатура.НайтиПоКоду("00-000123");
ДокСсылка = Документы.ПоступлениеТоваров.НайтиПоНомеру("АБ-157", Дата(2026, 5, 10));
Если ничего не найдено, методы возвращают пустую ссылку соответствующего типа. Проверяйте её через Пустая() или функцию ЗначениеЗаполнено() до вызова ПолучитьОбъект().
Поиск по реквизиту и по наименованию
Метод НайтиПоРеквизиту("ИНН", "7707083893") ищет по значению любого реквизита, для которого в конфигураторе включена индексация (иначе поиск будет медленным). Метод НайтиПоНаименованию() ищет точное совпадение наименования и по умолчанию не учитывает помеченные на удаление — учитывайте это при обработках.
Поиск через запрос
Когда критерии сложные или нужно найти много записей, используйте запрос с выборкой поля Ссылка. Это быстрее перебора и позволяет сразу получить нужные реквизиты, чтобы вообще не вызывать ПолучитьОбъект() для чтения.
- 1Найдите ссылку: НайтиПоКоду(), НайтиПоНомеру(), НайтиПоРеквизиту() или запрос
- 2Проверьте, что ссылка не пустая: НЕ Ссылка.Пустая()
- 3Вызовите Объект = Ссылка.ПолучитьОбъект()
- 4Проверьте, что Объект <> Неопределено
- 5Измените реквизиты или табличные части
- 6Вызовите Объект.Записать() и обработайте возможное исключение
Когда объект получать не нужно
Частая ошибка начинающих — получать объект там, где достаточно ссылки или запроса. Если задача — прочитать наименование, ИНН или остаток, объект не нужен: чтение через ссылку или запрос решает задачу без загрузки всей записи и без риска случайно изменить данные.
Для пометки на удаление тоже есть облегчённый путь: метод Ссылка.ПолучитьОбъект().УстановитьПометкуУдаления() работает, но в типовых подсистемах есть процедуры работы с объектами, а для массовой пометки — штатные механизмы. Также помните, что обход блокировки объекта другим пользователем приведёт к ошибке при Записать(), поэтому в многопользовательской среде оборачивайте запись в попытку.
Сравнение вариантов
Подходит для чтения 1–2 реквизитов. Не позволяет изменять данные; много обращений через точку порождает лишние запросы.
Лучший вариант для чтения многих записей и сложных отборов. Только чтение, изменение невозможно.
Единственный способ изменить существующую запись. Медленнее, требует проверки на Неопределено и явной записи.
Создаёт новый объект без ссылки. Ссылка появится только после Записать().
Создание нового объекта без ссылки
Новый элемент создают не из ссылки, а через менеджер типа: Справочники.Номенклатура.СоздатьЭлемент(), Документы.ЗаказКлиента.СоздатьДокумент(), ПланыВидовХарактеристик.Свойства.СоздатьЭлемент(). До первой записи у такого объекта ссылки нет — метод Ссылка вернёт пустую ссылку.
Если ссылка на новый объект нужна до записи (например, чтобы заполнить реквизит-владельца у подчинённых данных), используйте НовыйОбъект.УстановитьСсылкуНового(Справочники.Номенклатура.ПолучитьСсылку()). После Записать() объект получает постоянную ссылку, доступную через свойство Ссылка.
Типичные ошибки и проверка результата
Наиболее частые проблемы: обращение к реквизитам результата ПолучитьОбъект() без проверки на Неопределено; попытка изменить реквизит через ссылку; забытый вызов Записать(); получение объекта в цикле для чтения. Ещё одна ловушка — попытка записать объект, открытый в этот момент пользователем в форме: платформа выдаст ошибку блокировки данных.
Для диагностики полезно проверять тип значения функцией ТипЗнч() и сравнивать его с ожидаемым через Тип("СправочникОбъект.Номенклатура"). Если метод вернул Неопределено, проверьте существование записи запросом по ссылке — отсутствие строки означает битую ссылку.
Как проверить результат
Возвращён объект нужного типа, ТипЗнч() показывает СправочникОбъект/ДокументОбъект
Возвращено Неопределено — запись отсутствует в базе
После Записать() данные видны в форме элемента и в запросе
Записать() не вызывался или вызвал исключение — изменения не сохранены
Чтение данных выполняется запросом, ПолучитьОбъект() только для изменяемых записей
Объект получается для каждой строки выборки ради чтения
FAQ: частые вопросы о получении объекта в 1С
Почему ПолучитьОбъект() возвращает Неопределено, хотя ссылка не пустая?
Ссылка может существовать как значение, но запись в базе отсутствует — это «битая ссылка», возникающая после удаления данных без контроля ссылочной целостности или некорректного обмена. Проверьте запросом, есть ли строка с такой ссылкой, и при необходимости восстановите данные или очистите битые ссылки.
Можно ли получить объект сразу из запроса?
Нет, запрос возвращает только значения полей, в том числе ссылку. Если нужен объект, выберите в запросе поле Ссылка и затем вызовите у неё ПолучитьОбъект(). Но если цель — только прочитать данные, объект не нужен: работайте с полями выборки напрямую.
Как получить объект, открытый в форме, из модуля формы?
В управляемой форме данные объекта представлены реквизитом формы (обычно «Объект»). Для получения редактируемого объекта используйте РеквизитФормыВЗначение("Объект"), а после изменений — ЗначениеВРеквизитФормы(). В модуле объекта сам объект доступен через контекст (ЭтотОбъект).
Чем ПолучитьОбъект() отличается для тонкого клиента и сервера?
Метод доступен только на сервере и в толстом клиенте. В клиентском контексте управляемого приложения получить объект нельзя — вызывайте серверную процедуру с директивой &НаСервере и передавайте туда ссылку.
Как изменить только один реквизит без загрузки всего объекта?
Стандартного способа точечной записи реквизита встроенный язык не предоставляет: изменение всегда идёт через объект и Записать(). Если нужно избежать событий записи, используйте Объект.ОбменДанными.Загрузка = Истина, но применяйте этот приём осознанно — он отключает проверки и подписки на события.
Что важно запомнить
Объект получают методом Ссылка.ПолучитьОбъект() с обязательной проверкой на Неопределено; изменения сохраняются только после Записать(). Для чтения данных объект не нужен — используйте ссылку или запрос, а новые записи создавайте через СоздатьЭлемент() и СоздатьДокумент().