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

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

Как получить ГУИД по ссылке в 1С

Как получить ГУИД (уникальный идентификатор) по ссылке на объект в 1С: функция УникальныйИдентификатор(), обратное восстановление ссылки по ГУИДу, типичные ошибки.

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

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

Важно понимать: ГУИД существует только у ссылочных типов данных (справочники, документы, планы видов характеристик, планы счетов, бизнес-процессы, задачи и др.). У записей регистров сведений, у примитивных типов (число, строка, дата) ГУИДа нет — попытка получить его приведёт к ошибке.

Что такое ГУИД ссылки и когда он нужен

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

Практические ситуации, где без ГУИДа не обойтись:

  • обмен между базами без конвертации данных — сопоставление объектов по идентификатору;
  • интеграция через HTTP-сервисы и OData — внешняя система хранит ГУИДы объектов 1С;
  • восстановление ссылки по сообщению «Объект не найден (8e2c4f1a:...)»;
  • поиск объекта по строковому представлению ссылки из логов и журнала регистрации;
  • предопределённые элементы и синхронизация справочников между узлами РИБ.

Основной способ: метод УникальныйИдентификатор()

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

bsl
// Получение ГУИДа по ссылке
СсылкаНаЭлемент = Справочники.Номенклатура.НайтиПоКоду("000000123");

Если Не СсылкаНаЭлемент.Пустая() Тогда
    ГУИД = СсылкаНаЭлемент.УникальныйИдентификатор();
    СтрокаГУИД = Строка(ГУИД); // "8e2c4f1a-3b5d-4e6f-9a0b-1c2d3e4f5a6b"
    Сообщить("ГУИД элемента: " + СтрокаГУИД);
Иначе
    Сообщить("Элемент не найден");
КонецЕсли;

Обратите внимание на проверку Пустая(). Если ссылка пустая (незаполненный реквизит), метод УникальныйИдентификатор() вернёт ГУИД из одних нулей: 00000000-0000-0000-0000-000000000000. Это не ошибка, но и не идентификатор реального объекта — такую ситуацию нужно обрабатывать отдельно.

Метод работает одинаково для всех ссылочных типов: справочников, документов, перечислений (у предопределённых значений перечислений тоже есть ссылки), планов обмена, бизнес-процессов и задач.

Обратная задача: получить ссылку по ГУИДу

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

bsl
// Восстановление ссылки по строке ГУИДа
СтрокаГУИД = "8e2c4f1a-3b5d-4e6f-9a0b-1c2d3e4f5a6b";

ГУИД = Новый УникальныйИдентификатор(СтрокаГУИД);
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(ГУИД);

// Проверяем, существует ли объект с такой ссылкой
Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1 Истина ИЗ Справочник.Номенклатура ГДЕ Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Если Запрос.Выполнить().Пустой() Тогда
    Сообщить("Объект с таким ГУИДом отсутствует в базе");
КонецЕсли;

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

Получение ГУИДа из строкового представления ссылки

Иногда ссылки нет вовсе — есть только её строковое представление, например значение поля «Данные» из журнала регистрации вида Номенклатура 8e2c4f1a-3b5d-4e6f-9a0b-1c2d3e4f5a6b или значение из XML-файла обмена. В этом случае ГУИД извлекается из строки как подстрока.

Строковое представление ссылки всегда содержит ГУИД в стандартном формате из 36 символов (32 шестнадцатеричные цифры и 4 дефиса). Достаточно найти этот фрагмент регулярным поиском по длине или по позиции последнего пробела.

bsl
// Извлечение ГУИДа из строки вида "Номенклатура 8e2c4f1a-..."
СтрокаСсылки = "Номенклатура 8e2c4f1a-3b5d-4e6f-9a0b-1c2d3e4f5a6b";

Если СтрДлина(СтрокаСсылки) >= 36 Тогда
    СтрокаГУИД = Прав(СтрокаСсылки, 36);
    Попытка
        ГУИД = Новый УникальныйИдентификатор(СтрокаГУИД);
        Сообщить("Извлечён ГУИД: " + Строка(ГУИД));
    Исключение
        Сообщить("Строка не содержит корректный ГУИД");
    КонецПопытки;
КонецЕсли;

Как быстро узнать ГУИД без программирования

Разработчику не всегда удобно писать код ради одного идентификатора. Есть несколько штатных приёмов узнать ГУИД объекта напрямую.

Как узнать ГУИД без кода
  1. 1
    Откройте объект в режиме 1С:Предприятие и посмотрите адресную строку браузера в веб-клиенте или в тонком клиенте с навигационными ссылками — там есть параметр вида ref=8e2c4f1a...
  2. 2
    В тонком клиенте выполните «Получить навигационную ссылку» (через меню или сочетание клавиш) и скопируйте фрагмент после ref=
  3. 3
    В консоли запросов или консоли кода (внешние инструменты разработчика) выполните одну строку: Сообщить(Ссылка.УникальныйИдентификатор())
  4. 4
    Для пакетной выгрузки ГУИДов используйте запрос с функцией УникальныйИдентификатор(Ссылка) в консоли запросов

В языке запросов 1С есть функция УникальныйИдентификатор(), которая возвращает ГУИД ссылки прямо в результате запроса. Это удобно для выгрузки соответствия «объект — идентификатор» во внешние системы.

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

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

Типичные ошибки
01
Вызов УникальныйИдентификатор() у объекта (СправочникОбъект), а не у ссылки — у объекта данных этого метода нет, сначала получите Объект.Ссылка
02
Попытка получить ГУИД у записи регистра сведений или у примитивного типа — ссылочного типа там нет, будет ошибка выполнения
03
Использование ПолучитьСсылку() без проверки существования объекта — в базе появляются битые ссылки «Объект не найден»
04
Хранение ГУИДа как строки без учёта типа объекта — один и тот же ГУИД теоретически может встретиться у разных типов, храните и тип, и идентификатор
05
Передача ГУИДа из XML в инвертированном виде без обратной перестановки байтов — ссылка не находится в базе

Ещё одно ограничение: у предопределённых элементов справочников ГУИД формируется по особым правилам и может отличаться между базами даже для одного и того же предопределённого элемента, если элементы создавались не через обновление конфигурации, а вручную. При интеграциях полагайтесь на имя предопределённого элемента, а не только на его идентификатор.

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

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

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

Строка ГУИДа
Норма

36 символов, формат 8-4-4-4-12 с дефисами, только шестнадцатеричные цифры

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

Другая длина, лишние символы, русские буквы вместо латинских

Ссылка по ГУИДу
Норма

Запрос по ссылке возвращает объект, реквизиты читаются

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

При обращении к реквизиту — «Объект не найден»

Пустая ссылка
Норма

ГУИД 00000000-0000-0000-0000-000000000000 означает незаполненный реквизит

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

Нулевой ГУИД ошибочно сохранён как идентификатор реального объекта во внешней системе

Сравнение способов получения ГУИДа

Сравнение вариантов

Метод УникальныйИдентификатор() в коде

Штатный и самый надёжный способ; требует наличия ссылки и возможности выполнить код

Функция УникальныйИдентификатор() в запросе

Подходит для пакетной выгрузки идентификаторов; результат — строковое представление

Навигационная ссылка в клиенте

Быстрый ручной способ без кода; неудобен для массовой обработки

Разбор строкового представления

Единственный вариант, когда есть только текст из журнала или файла; требует проверки формата

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

Итог

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

ГУИД ссылки получают методом Ссылка.УникальныйИдентификатор(), обратно ссылку восстанавливают через ПолучитьСсылку(Новый УникальныйИдентификатор(Строка)). Всегда проверяйте существование объекта после ПолучитьСсылку и обрабатывайте пустые ссылки с нулевым ГУИДом.

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

Можно ли изменить ГУИД существующего объекта?

Штатными средствами — нет, идентификатор неизменен на протяжении жизни объекта. Косвенный приём — создать новый объект, скопировать данные и перенести ссылки, но это рискованная операция, требующая полного поиска ссылок по базе.

Почему у двух одинаковых элементов в разных базах разные ГУИДы?

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

Как найти объект по сообщению «Объект не найден (8e2c4f1a:...)»?

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

Есть ли ГУИД у записей регистра сведений?

Нет. Записи регистров не являются ссылочными объектами и идентифицируются набором измерений (и периода для периодических регистров). Метод УникальныйИдентификатор() для них недоступен.

Как передать ГУИД во внешнюю систему через HTTP-сервис?

Преобразуйте ГУИД в строку функцией Строка() или XMLСтрока() и передайте в теле ответа. Внешняя система хранит его как текст, а при обратном запросе передаёт строку, которую 1С преобразует через Новый УникальныйИдентификатор().

Совпадает ли ГУИД ссылки с тем, что видно в SQL-базе напрямую?

В таблицах СУБД ссылка хранится в двоичном виде, и при просмотре через SQL-запросы байты отображаются в ином порядке, чем в строковом ГУИДе 1С. Прямое сопоставление требует перестановки байтов; работать с базой на уровне SQL в обход платформы не рекомендуется.