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

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

Как получить ссылку по GUID в 1С 8.3

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

Задача получить ссылку на объект по его GUID (уникальному идентификатору) возникает при обмене данными между базами, интеграции с внешними системами и восстановлении связей после переноса информации. В 1С:Предприятии 8.3 для этого предусмотрен штатный механизм: у каждой ссылки есть уникальный идентификатор, и по нему можно программно восстановить ссылку, не выполняя поиск по реквизитам.

Ключевая особенность механизма в том, что GUID сам по себе не хранит тип объекта. Один и тот же идентификатор теоретически может принадлежать элементу любого справочника или документу, поэтому для восстановления ссылки нужно знать, к какому менеджеру объектов обращаться — Справочники, Документы, ПланыВидовХарактеристик и так далее.

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

Что такое GUID и как он связан со ссылкой

Уникальный идентификатор (GUID, в терминах 1С — УникальныйИдентификатор) — это 128-битное значение, которое платформа присваивает каждой ссылке в момент создания объекта. Он не меняется при переименовании объекта, изменении кода или любых реквизитов и сохраняется до физического удаления данных.

Сама ссылка внутри платформы — это сочетание типа объекта и GUID. Именно поэтому один и тот же GUID в разных таблицах (например, у элемента справочника и у документа) будет давать разные ссылки. Строковое представление GUID имеет вид «b2b7c8d1-1234-5678-9abc-def012345678» и именно в таком виде передаётся при обменах, в веб-сервисах и файлах выгрузки.

Получение GUID из существующей ссылки

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

GUID = СсылкаНаОбъект.УникальныйИдентификатор();

СтрокаGUID = Строка(GUID); // "b2b7c8d1-..."

Результат можно преобразовать в строку для передачи через HTTP, записи в файл или хранения в реквизите строкового типа. При обратном преобразовании строки в идентификатор платформа контролирует формат: если строка не соответствует шаблону GUID, конструктор вызовет исключение, поэтому перед созданием идентификатора из внешних данных полезно оборачивать код в попытку.

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

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

bsl
СтрокаGUID = "b2b7c8d1-1234-5678-9abc-def012345678";
Ид = Новый УникальныйИдентификатор(СтрокаGUID);
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(Ид);

Если Ссылка.ПолучитьОбъект() = Неопределено Тогда
    // Объекта с таким GUID нет в базе — ссылка битая
КонецЕсли;

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

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

Получение ссылки с указанием конкретной таблицы

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

Поиск ссылки по GUID, когда тип объекта неизвестен

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

Функция НайтиСсылкуПоGUID(СтрокаGUID)

Ид = Новый УникальныйИдентификатор(СтрокаGUID);

Для Каждого Менеджер Из Справочники Цикл

Ссылка = Менеджер.ПолучитьСсылку(Ид);

Если Ссылка.ПолучитьОбъект() <> Неопределено Тогда

Возврат Ссылка;

КонецЕсли;

КонецЦикла;

// Аналогично перебрать Документы, ПланыВидовХарактеристик и т.д.

Возврат Неопределено;

КонецФункции

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

Проверка существования объекта и битые ссылки

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

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

"ВЫБРАТЬ Т.Ссылка ИЗ Справочник.Номенклатура КАК Т

|ГДЕ Т.Ссылка = &Ссылка");

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

ОбъектСуществует = Не Запрос.Выполнить().Пустой();

Ещё один признак битой ссылки — строковое представление вида «<Объект не найден> (b2b7c8d1:...)». Такие записи появляются при удалении объектов без контроля ссылочной целостности, при обменах с потерянными пакетами и после восстановления базы из неполной копии. Массовый поиск битых ссылок выполняют штатной обработкой «Поиск и удаление дублей» либо специализированными запросами по связанным таблицам.

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

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

Ссылка получена
Норма

Переменная содержит ссылку нужного типа

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

Неопределено — тип объекта не совпал с менеджером

Объект существует
Норма

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

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

Неопределено — ссылка битая, объекта в базе нет

Строковое представление
Норма

Наименование или номер объекта

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

<Объект не найден> с GUID в скобках

GUID в запросах и СКД

В языке запросов нет прямой функции сравнения ссылки со строкой GUID, поэтому типовой приём — сначала получить ссылку методом ПолучитьСсылку, а затем передать её в запрос параметром. Это работает быстро и использует индексы.

Обратная задача — выгрузить GUID в отчёт — решается через вычисляемые поля СКД с выражением на встроенном языке либо через внешние функции, помещённые в общий модуль. В чистом тексте запроса получить GUID без дополнительных механизмов нельзя.

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

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

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

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

Также учитывайте, что в файловой и клиент-серверной базе один и тот же объект имеет одинаковый GUID — идентификатор не зависит от варианта работы. А вот при копировании базы GUID всех объектов сохраняются, что и обеспечивает работоспособность обменов с копиями.

Практический порядок действий

Порядок действий
  1. 1
    Определите тип объекта, которому принадлежит GUID (справочник, документ и т.д.)
  2. 2
    Создайте идентификатор: Новый УникальныйИдентификатор(СтрокаGUID) внутри попытки
  3. 3
    Вызовите ПолучитьСсылку у нужного менеджера
  4. 4
    Проверьте существование объекта через ПолучитьОбъект() или запрос
  5. 5
    Если объект не найден — зафиксируйте битую ссылку в журнале и не используйте её в проведении документов
  6. 6
    Если тип неизвестен — переберите менеджеры, начиная с наиболее вероятных

Для разовых операций удобно использовать внешние обработки типа «консоль кода» или «редактор объекта», где можно ввести GUID и получить ссылку без написания своего кода. Для регулярных интеграций логику поиска по GUID выносят в общий модуль с кэшированием результатов в соответствии, чтобы не повторять обращения к базе для одних и тех же идентификаторов.

Итог

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

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

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

Можно ли получить ссылку по GUID, не зная типа объекта?

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

Почему ПолучитьСсылку возвращает ссылку, хотя объекта нет в базе?

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

Как преобразовать строку GUID обратно в идентификатор?

Конструктором: Новый УникальныйИдентификатор("b2b7c8d1-..."). Строка должна строго соответствовать формату GUID, иначе возникнет исключение. При получении строк из внешних систем оборачивайте преобразование в Попытка/Исключение.

Изменится ли GUID объекта при переносе базы или обновлении конфигурации?

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

Как найти все битые ссылки в базе?

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

Можно ли задать объекту нужный GUID при создании?

Да. Метод УстановитьСсылкуНового у объекта позволяет назначить ссылку (а значит, и GUID) до записи. Это стандартный приём в обменах данными, когда нужно, чтобы объект в базе-приёмнике имел тот же идентификатор, что и в источнике.