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

Разработка и Конфигурация · 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. 1
    Получите строку GUID из внешней системы или журнала обмена
  2. 2
    Создайте УникальныйИдентификатор из строки или передайте строку напрямую
  3. 3
    Вызовите ПолучитьСсылкуПоУникальномуИдентификатору у менеджера нужного типа
  4. 4
    Проверьте существование ссылки запросом
  5. 5
    Вызовите Ссылка.ПолучитьОбъект() и сравните с Неопределено
  6. 6
    Работайте с объектом, при изменении не забудьте Объект.Записать()

Как определить тип объекта, если он неизвестен

Частая задача при разборе обменов: есть GUID, но неизвестно, документ это или элемент справочника. Универсального метода «найти по UID везде» в платформе нет. Решения два: перебор по списку ожидаемых типов или использование механизмов, где тип известен по контексту (планы обмена, регистрация изменений).

При переборе типов строят цикл по коллекциям метаданных и для каждого менеджера вызывают ПолучитьСсылкуПоУникальномуИдентификатору с последующей проверкой существования. Это дорогая операция — на больших базах её выполняют только в сервисных обработках, а не в прикладном коде.

Если GUID пришёл из плана обмена, тип обычно известен из состава узла. В БСП также есть функции для работы со ссылками по идентификаторам в механизмах синхронизации данных, где тип передаётся вместе с идентификатором.

Маршрут решения

Как выбрать действие

Тип объекта известен заранееВызывайте ПолучитьСсылкуПоУникальномуИдентификатору у конкретного менеджера
Тип неизвестен, разбор обменаПеребирайте ограниченный список типов с проверкой существования запросом
Нужно только прочитать реквизиты без измененияНе вызывайте ПолучитьОбъект() — обращайтесь к реквизитам через ссылку или запрос
Объект нужно изменитьПолучите объект методом ПолучитьОбъект(), измените и запишите

Получение объекта и работа с данными

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

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

Типичные ошибки и ограничения

Самая частая ошибка — передача строки GUID в неверном формате. Конструктор Новый УникальныйИдентификатор(Строка) выбрасывает исключение, если строка не соответствует формату. Данные из внешних систем стоит предварительно проверять, особенно если GUID приходит в фигурных скобках (формат COM) — скобки нужно удалить.

Вторая группа ошибок связана с ожиданием, что метод вернёт Неопределено для несуществующего объекта. Метод вернёт ссылку в любом случае, и попытка, например, заполнить её реквизиты даст пустые значения, что маскирует проблему. Всегда проверяйте существование отдельно.

Третья типичная ситуация — попытка получить по UID объект независимого регистра сведений или записи регистра. Уникальные идентификаторы есть только у ссылочных типов: справочников, документов, планов видов характеристик, планов счетов, планов видов расчёта, планов обмена, бизнес-процессов и задач. У записей регистров UID нет.

Типичные ошибки
01
Ожидание Неопределено от ПолучитьСсылкуПоУникальномуИдентификатору: метод всегда возвращает ссылку, существование проверяется отдельно
02
Передача строки GUID с фигурными скобками: исключение в конструкторе УникальныйИдентификатор
03
ПолучитьОбъект() ради чтения одного реквизита: лишнее вычитывание всего объекта и табличных частей
04
Поиск по UID записей регистров: у нессылочных типов уникального идентификатора нет
05
Перебор всех метаданных в прикладном коде: тяжёлая операция, допустима только в сервисных обработках

Производительность и безопасные приёмы

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

Для разового сервисного поиска удобно написать универсальную функцию, принимающую строку GUID и тип, и возвращающую структуру «Ссылка, Существует, Объект». Такая обёртка убирает дублирование проверок и снижает риск забыть сравнение с Неопределено.

Итог

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

Объект по UID получают в два шага: ПолучитьСсылкуПоУникальномуИдентификатору у менеджера нужного типа, затем ПолучитьОбъект(). Метод получения ссылки не проверяет её существование — делайте это запросом. UID есть только у ссылочных типов, строку GUID проверяйте на формат, а массовые проверки выполняйте пакетными запросами.

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

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

Нет, в языке запросов нет функции преобразования GUID в ссылку. Ссылку формируют во встроенном языке методом ПолучитьСсылкуПоУникальномуИдентификатору, а дальше её можно передать в запрос как параметр для чтения реквизитов.

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

Это означает, что объекта с таким GUID нет в базе — ссылка «битая». Такое бывает после удаления объекта без контроля ссылочной целостности или при рассинхронизации обменов. Проверяйте результат на Неопределено до обращения к реквизитам.

Как получить GUID существующей ссылки?

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

Чем отличается ПолучитьСсылку от ПолучитьСсылкуПоУникальномуИдентификатору?

ПолучитьСсылку() без параметров создаёт ссылку с новым сгенерированным GUID — её используют при программном создании объектов с заранее заданной ссылкой. ПолучитьСсылкуПоУникальномуИдентификатору строит ссылку по уже известному GUID.

Работает ли метод на клиенте в управляемых формах?

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

Как найти объект по GUID из другой базы без перебора типов?

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