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

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

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

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

Уникальный идентификатор (GUID) — это 36-символьная строка вида «a1b2c3d4-e5f6-7890-abcd-ef1234567890», которую платформа 1С присваивает каждой ссылке на объект базы: элементу справочника, документу, узлу плана обмена. GUID широко используется при обмене данными между базами, интеграции с сайтами, мобильными приложениями и внешними сервисами — именно по GUID внешняя система однозначно идентифицирует объект.

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

Важно понимать ограничение: GUID сам по себе не содержит информации о типе объекта. Одна и та же строка может быть идентификатором элемента справочника «Номенклатура», документа «Реализация товаров» или любого другого объекта. Поэтому перед получением ссылки нужно знать (или определить), к какому типу относится искомый объект.

Как получить ссылку по GUID через ПолучитьСсылку

Основной способ — метод ПолучитьСсылку, доступный у менеджера любого ссылочного типа: Справочники, Документы, ПланыВидовХарактеристик, ПланыСчетов, ПланыОбмена, БизнесПроцессы, Задачи. Метод принимает значение типа УникальныйИдентификатор и возвращает ссылку соответствующего вида.

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

bsl
СтрокаГУИД = "a1b2c3d4-e5f6-7890-abcd-ef1234567890";
УИД = Новый УникальныйИдентификатор(СтрокаГУИД);
СсылкаНаТовар = Справочники.Номенклатура.ПолучитьСсылку(УИД);

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

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

Как проверить, существует ли объект с таким GUID

ПолучитьСсылку не обращается к базе данных — метод просто «собирает» ссылку из типа и идентификатора. Поэтому существование объекта нужно проверять отдельно. Есть два рабочих способа.

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

Второй — запрос к таблице объекта с условием по ссылке. Это быстрее и удобнее при пакетной проверке множества GUID: можно одним запросом найти все существующие ссылки из списка.

bsl
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", СсылкаНаТовар);

Если Запрос.Выполнить().Пустой() Тогда
    // Объекта нет в базе
КонецЕсли;

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

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

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

bsl
Функция НайтиСсылкуПоГУИД(СтрокаГУИД)
    УИД = Новый УникальныйИдентификатор(СтрокаГУИД);
    Для Каждого Менеджер Из Метаданные.Справочники Цикл
        Ссылка = Справочники[Менеджер.Имя].ПолучитьСсылку(УИД);
        Если Ссылка.ПолучитьОбъект() <> Неопределено Тогда
            Возврат Ссылка;
        КонецЕсли;
    КонецЦикла;
    // Аналогично перебрать Документы и другие виды
    Возврат Неопределено;
КонецФункции

Для разового поиска удобнее воспользоваться типовой обработкой «Поиск и замена значений» из подсистемы БСП или сторонними инструментами поиска по GUID — они перебирают таблицы автоматически. В типовых конфигурациях на БСП также есть общий модуль ОбщегоНазначения с функциями работы со ссылками.

Как получить GUID из ссылки — обратная задача

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

bsl
ГУИДСтрокой = Строка(НоменклатураСсылка.УникальныйИдентификатор());
// Результат: "a1b2c3d4-e5f6-7890-abcd-ef1234567890"

Учтите: в запросах метод УникальныйИдентификатор() тоже доступен — можно выбрать сразу пары «Ссылка + GUID» для выгрузки. Это стандартный приём при формировании файлов обмена и ответов HTTP-сервисов.

Особые случаи: планы обмена, COM и внешние соединения

Получение ссылки в другой базе через COM или веб-сервис

При соединении с другой базой 1С через COMConnector код выполняется в контексте той базы, поэтому синтаксис тот же: Новый УникальныйИдентификатор в пространстве внешнего соединения и ПолучитьСсылку у его менеджеров. Через HTTP-сервисы GUID обычно передаётся строкой в параметрах запроса, а серверный код сервиса выполняет описанное выше преобразование.

GUID из строки без дефисов или в другом формате

Некоторые системы передают GUID без дефисов, в фигурных скобках или в «перевёрнутом» порядке байт (так хранится идентификатор в файловых таблицах и при выгрузке через ВыгрузитьПоПравилу). Конструктор Новый УникальныйИдентификатор принимает только стандартный формат с дефисами, поэтому строку нужно предварительно нормализовать — вставить дефисы в позиции 9, 14, 19 и 24.

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

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

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

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

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

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

Ссылка по GUID получается в два шага: строка → Новый УникальныйИдентификатор → ПолучитьСсылку у менеджера нужного типа. Метод не проверяет существование объекта, поэтому результат всегда проверяйте. Тип объекта из GUID не восстанавливается — его нужно знать заранее или искать перебором.

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

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

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

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

Метод не обращается к данным — он формирует типизированное значение из вида объекта и идентификатора. Это сделано специально: такой механизм позволяет, например, создавать новые объекты с заранее заданным GUID через УстановитьСсылкуНового. Проверка существования — отдельная операция.

Как получить ссылку по GUID в запросе 1С?

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

Что делать, если GUID пришёл без дефисов?

Нормализуйте строку: вставьте дефисы после 8-го, 12-го, 16-го и 20-го символов, чтобы получить стандартный формат 8-4-4-4-12. После этого конструктор Новый УникальныйИдентификатор примет строку. Если порядок байт перевёрнут (характерно для выгрузок из некоторых обменов), потребуется дополнительная перестановка частей.

Могут ли два разных объекта иметь одинаковый GUID?

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

Как найти GUID битой ссылки в документе?

У битой ссылки (значение вида «Объект не найден») метод УникальныйИдентификатор() по-прежнему работает и возвращает исходный GUID. Это позволяет собрать идентификаторы всех потерянных объектов и затем искать их в базе-источнике или резервной копии.