Разработка и Конфигурация · 9 мин
1С: как получить объект по уникальному идентификатору (GUID)
Как в 1С получить ссылку и объект по уникальному идентификатору (GUID): метод ПолучитьСсылкуПоУникальномуИдентификатору, проверка существования, типичные ошибки.
Во встроенном языке 1С получить объект по уникальному идентификатору можно только в два этапа: сначала из GUID получают ссылку, затем по ссылке — сам объект. Прямого метода «получить объект по UID» у платформы нет, потому что уникальный идентификатор существует именно у ссылки, а объект — это данные, прочитанные из базы по этой ссылке.
Типовая цепочка выглядит так: есть строка вида «a1b2c3d4-1234-5678-9abc-def012345678», менеджер объекта (Справочники, Документы и т.д.) преобразует её в ссылку методом ПолучитьСсылкуПоУникальномуИдентификатору, а дальше вызов ПолучитьОбъект() загружает данные. Понимание этой двухступенчатой схемы снимает большинство вопросов и ошибок.
Ниже разобраны синтаксис метода, проверка существования ссылки, работа с битой ссылкой, особенности для разных типов метаданных и типичные ошибки, из-за которых код возвращает Неопределено или падает с исключением.
Что такое уникальный идентификатор в 1С и где он хранится
Уникальный идентификатор (GUID, UID) — это 128-битное значение, которое платформа присваивает каждой ссылке при создании объекта. Он одинаков в любой базе, куда объект был выгружен, поэтому именно GUID используется для обмена данными между информационными базами, синхронизации с сайтами и внешними системами.
Важно понимать: GUID принадлежит ссылке, а не записи таблицы напрямую. Две разные ссылки всегда имеют разные идентификаторы, а удалённый объект оставляет после себя «битую ссылку» с тем же GUID. Поэтому получение ссылки по UID ещё не гарантирует, что объект существует в базе.
Строковое представление GUID в 1С имеет стандартный вид 8-4-4-4-12 шестнадцатеричных символов. В запросах идентификатор ссылки недоступен напрямую — в языке запросов нет функции для его чтения, поэтому работа с UID ведётся только во встроенном языке.
Метод ПолучитьСсылкуПоУникальномуИдентификатору: синтаксис и пример
Метод вызывается у менеджера конкретного вида объекта: Справочники.Имя, Документы.Имя, ПланыСчетов.Имя и так далее. Это принципиальное ограничение: нужно заранее знать, объект какого типа вы ищете. Параметр метода — либо объект типа УникальныйИдентификатор, либо его строковое представление.
УИД = Новый УникальныйИдентификатор("a1b2c3d4-1234-5678-9abc-def012345678");
Ссылка = Справочники.Номенклатура.ПолучитьСсылкуПоУникальномуИдентификатору(УИД);
Если Ссылка.ПолучитьОбъект() = Неопределено Тогда
Сообщить("Объект не найден — битая ссылка");
Иначе
Объект = Ссылка.ПолучитьОбъект();
КонецЕсли;
Метод не обращается к базе для проверки существования объекта — он просто формирует ссылку указанного типа с заданным идентификатором. Именно поэтому вызов выполняется быстро, но результат может оказаться ссылкой на несуществующий объект.
Как проверить, что ссылка существует в базе
Самый быстрый способ проверки — запрос с условием по ссылке. Запрос не блокирует таблицу надолго и не вычитывает данные объекта целиком, в отличие от ПолучитьОбъект().
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 Т.Ссылка ИЗ Справочник.Номенклатура КАК Т ГДЕ Т.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Существует = Не Запрос.Выполнить().Пустой();
Альтернатива — функция НайтиПоСсылкам из состава БСП или собственная обёртка. Если объект гарантированно существует (например, UID пришёл из синхронизированной системы с контролем целостности), допустимо сразу вызвать ПолучитьОбъект() и сравнить результат с Неопределено.
- 1Получите строку GUID из внешней системы или журнала обмена
- 2Создайте УникальныйИдентификатор из строки или передайте строку напрямую
- 3Вызовите ПолучитьСсылкуПоУникальномуИдентификатору у менеджера нужного типа
- 4Проверьте существование ссылки запросом
- 5Вызовите Ссылка.ПолучитьОбъект() и сравните с Неопределено
- 6Работайте с объектом, при изменении не забудьте Объект.Записать()
Как определить тип объекта, если он неизвестен
Частая задача при разборе обменов: есть GUID, но неизвестно, документ это или элемент справочника. Универсального метода «найти по UID везде» в платформе нет. Решения два: перебор по списку ожидаемых типов или использование механизмов, где тип известен по контексту (планы обмена, регистрация изменений).
При переборе типов строят цикл по коллекциям метаданных и для каждого менеджера вызывают ПолучитьСсылкуПоУникальномуИдентификатору с последующей проверкой существования. Это дорогая операция — на больших базах её выполняют только в сервисных обработках, а не в прикладном коде.
Если GUID пришёл из плана обмена, тип обычно известен из состава узла. В БСП также есть функции для работы со ссылками по идентификаторам в механизмах синхронизации данных, где тип передаётся вместе с идентификатором.
Как выбрать действие
Получение объекта и работа с данными
Метод ПолучитьОбъект() вычитывает из базы все данные объекта, включая табличные части, и создаёт объект в памяти. Если ссылки нет в базе, метод возвращает Неопределено — исключения не возникает. Это удобно, но требует явной проверки, иначе обращение к реквизиту Неопределено вызовет ошибку выполнения.
Если нужно только прочитать несколько реквизитов, ПолучитьОбъект() избыточен: обращение Ссылка.Наименование или Ссылка.Дата выполнит точечный запрос и будет быстрее. Получение объекта оправдано, когда данные меняются, нужна табличная часть целиком или вызываются обработчики записи.
Типичные ошибки и ограничения
Самая частая ошибка — передача строки GUID в неверном формате. Конструктор Новый УникальныйИдентификатор(Строка) выбрасывает исключение, если строка не соответствует формату. Данные из внешних систем стоит предварительно проверять, особенно если GUID приходит в фигурных скобках (формат COM) — скобки нужно удалить.
Вторая группа ошибок связана с ожиданием, что метод вернёт Неопределено для несуществующего объекта. Метод вернёт ссылку в любом случае, и попытка, например, заполнить её реквизиты даст пустые значения, что маскирует проблему. Всегда проверяйте существование отдельно.
Третья типичная ситуация — попытка получить по UID объект независимого регистра сведений или записи регистра. Уникальные идентификаторы есть только у ссылочных типов: справочников, документов, планов видов характеристик, планов счетов, планов видов расчёта, планов обмена, бизнес-процессов и задач. У записей регистров UID нет.
Производительность и безопасные приёмы
ПолучитьСсылкуПоУникальномуИдентификатору — дешевая операция, но каждая последующая проверка существования или ПолучитьОбъект() — это обращение к СУБД. При массовой обработке (например, загрузка тысячи строк из файла) формируйте пакетные запросы: соберите ссылки в таблицу значений и одним запросом проверьте существование всех.
Для разового сервисного поиска удобно написать универсальную функцию, принимающую строку GUID и тип, и возвращающую структуру «Ссылка, Существует, Объект». Такая обёртка убирает дублирование проверок и снижает риск забыть сравнение с Неопределено.
Что важно запомнить
Объект по UID получают в два шага: ПолучитьСсылкуПоУникальномуИдентификатору у менеджера нужного типа, затем ПолучитьОбъект(). Метод получения ссылки не проверяет её существование — делайте это запросом. UID есть только у ссылочных типов, строку GUID проверяйте на формат, а массовые проверки выполняйте пакетными запросами.
Частые вопросы
Можно ли получить объект по UID одним запросом?
Нет, в языке запросов нет функции преобразования GUID в ссылку. Ссылку формируют во встроенном языке методом ПолучитьСсылкуПоУникальномуИдентификатору, а дальше её можно передать в запрос как параметр для чтения реквизитов.
Почему ПолучитьОбъект() вернул Неопределено, хотя ссылка есть?
Это означает, что объекта с таким GUID нет в базе — ссылка «битая». Такое бывает после удаления объекта без контроля ссылочной целостности или при рассинхронизации обменов. Проверяйте результат на Неопределено до обращения к реквизитам.
Как получить GUID существующей ссылки?
Используйте метод Ссылка.УникальныйИдентификатор() — он вернёт объект типа УникальныйИдентификатор, который можно преобразовать в строку функцией Строка() или XMLСтрока() для передачи во внешние системы.
Чем отличается ПолучитьСсылку от ПолучитьСсылкуПоУникальномуИдентификатору?
ПолучитьСсылку() без параметров создаёт ссылку с новым сгенерированным GUID — её используют при программном создании объектов с заранее заданной ссылкой. ПолучитьСсылкуПоУникальномуИдентификатору строит ссылку по уже известному GUID.
Работает ли метод на клиенте в управляемых формах?
Метод доступен на толстом и тонком клиенте, но ПолучитьОбъект() в управляемом приложении доступен только на сервере. Поэтому всю цепочку — получение ссылки, проверку, чтение объекта — выполняют в серверной процедуре.
Как найти объект по GUID из другой базы без перебора типов?
Надёжнее всего передавать вместе с GUID имя типа (например, «Справочник.Номенклатура») — так делают в типовых механизмах синхронизации. Если тип неизвестен, остаётся только перебор по ограниченному списку метаданных с проверкой существования каждой ссылки запросом.