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

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

Как получить уникальный идентификатор 1С из ссылки

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

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

Разработчики и администраторы регулярно сталкиваются с задачей: есть ссылка на объект, нужно получить её GUID в виде строки вида «a1b2c3d4-e5f6-7890-abcd-ef1234567890». Обратная задача тоже встречается часто: по известному GUID восстановить ссылку и найти объект в базе. Ниже разобраны оба направления с примерами кода.

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

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

Ссылка в 1С — это не навигационная ссылка и не путь к объекту, а значение специального типа, которое однозначно указывает на объект в базе данных. Физически ссылка состоит из двух частей: типа объекта (например, «СправочникСсылка.Номенклатура») и уникального идентификатора — GUID.

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

Навигационная ссылка вида «e1cib/data/Справочник.Номенклатура?ref=...» — это отдельная сущность для открытия объекта в клиенте. Она содержит GUID в закодированном виде, но напрямую методы работы со ссылками её не принимают.

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

Основной и штатный способ — вызов метода УникальныйИдентификатор() у ссылки. Метод доступен в тонком, толстом и веб-клиенте, на сервере и во внешних соединениях, дополнительных прав не требует.

// Получение GUID из ссылки

СсылкаНаТовар = Справочники.Номенклатура.НайтиПоКоду("000000123");

Если Не СсылкаНаТовар.Пустая() Тогда

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

СтрокаГУИД = Строка(ГУИД); // "a1b2c3d4-e5f6-..."

Сообщить(СтрокаГУИД);

КонецЕсли;

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

Частая ситуация: метод вызывают у пустой ссылки. Ошибки не будет — вернётся GUID из нулей «00000000-0000-0000-0000-000000000000». Если такое значение нежелательно в обмене, проверяйте ссылку методом Пустая() до получения идентификатора.

bsl
ГУИД = Ссылка.УникальныйИдентификатор();
СтрокаГУИД = Строка(ГУИД);

Способ 2: получение GUID через запрос

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

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

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Ссылка

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| НЕ Номенклатура.ПометкаУдаления";

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

Сообщить(Строка(Выборка.Ссылка.УникальныйИдентификатор()));

КонецЦикла;

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

Обратная задача: восстановить ссылку по GUID

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

СтрокаГУИД = "a1b2c3d4-e5f6-7890-abcd-ef1234567890";

Попытка

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

Исключение

Сообщить("Некорректный формат GUID");

Возврат;

КонецПопытки;

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

// Проверка, что объект реально существует в базе

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

Запрос.Текст = "ВЫБРАТЬ 1 ИЗ Справочник.Номенклатура ГДЕ Ссылка = &Ссылка";

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

Если Запрос.Выполнить().Пустой() Тогда

Сообщить("Объект с таким GUID не найден");

КонецЕсли;

Критически важный момент: ПолучитьСсылку() всегда вернёт ссылку, даже если объекта с таким GUID в базе нет. Сама по себе ссылка — это просто «указатель», и платформа не проверяет его существование. Если обратиться к реквизитам несуществующего объекта, получите ошибку или «битую ссылку» вида «<Объект не найден>». Поэтому после восстановления ссылки всегда проверяйте наличие объекта запросом или через ПолучитьОбъект() с проверкой на Неопределено.

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

Как узнать GUID объекта без программирования

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

Третий вариант — извлечь GUID из навигационной ссылки. Скопируйте ссылку на объект (команда «Получить ссылку» в форме объекта), и в конце строки после «?ref=» будет закодированный идентификатор. Он хранится в специальном формате с переставленными байтами, поэтому простым копированием символов его не восстановить — нужна функция перекодировки, которая меняет местами группы шестнадцатеричных цифр. Готовые функции такого преобразования широко используются в типовых обработках интеграции.

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

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

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

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

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

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

Проверка результата

Корректность полученного GUID легко проверить: длина строки должна быть ровно 36 символов, формат — пять групп шестнадцатеричных цифр через дефис (8-4-4-4-12). Если строка короче, длиннее или содержит символы вне диапазона 0–9 и a–f, значит, в неё попало что-то лишнее — например, представление объекта вместо идентификатора.

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

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

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

Формат строки GUID
Норма

36 символов, группы 8-4-4-4-12, только цифры и буквы a–f

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

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

Существование объекта по восстановленной ссылке
Норма

Запрос по ссылке возвращает запись

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

Запрос пустой, в интерфейсе видно «Объект не найден»

Круговое преобразование GUID → ссылка → GUID
Норма

Итоговый GUID совпадает с исходным

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

Значения различаются — ошибка в коде преобразования

FAQ

Можно ли получить GUID у записи регистра сведений?

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

Изменится ли GUID объекта после обмена данными между базами?

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

Чем навигационная ссылка отличается от GUID?

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

Как получить GUID в запросе, без встроенного языка?

В языке запросов функции извлечения GUID нет. Выбирайте поле Ссылка, а идентификатор извлекайте при обходе результата методом УникальныйИдентификатор(). Вывод ссылки в СКД или макет даст представление объекта, а не GUID.

Что вернёт УникальныйИдентификатор() у пустой ссылки?

GUID из одних нулей: 00000000-0000-0000-0000-000000000000. Ошибки не произойдёт, поэтому перед получением идентификатора стоит проверять ссылку методом Пустая(), чтобы нулевой GUID не попал в обмен или интеграцию.

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

Да. У нового объекта перед записью можно вызвать метод УстановитьСсылкуНового(), передав заранее созданную ссылку с нужным GUID: Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаГУИД)). Так делают при синхронизации, чтобы объект в приёмнике получил идентификатор источника.

Итог

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

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