Разработка и Конфигурация · 11 мин
Как получить ГУИД по ссылке в 1С
Как получить ГУИД (уникальный идентификатор) по ссылке на объект в 1С: функция УникальныйИдентификатор(), обратное восстановление ссылки по ГУИДу, типичные ошибки.
ГУИД (GUID, глобальный уникальный идентификатор) — это 128-битное значение, которое платформа 1С присваивает каждой ссылке на объект базы: элементу справочника, документу, плану счетов и т.д. Знать ГУИД нужно при обмене данными между базами, при интеграции с внешними системами (сайты, мобильные приложения, веб-сервисы), при поиске «потерянных» объектов и при разборе ссылок вида «Объект не найден».
Получить ГУИД по ссылке можно двумя путями: встроенным методом ссылки УникальныйИдентификатор() в коде на встроенном языке либо разбором строкового представления ссылки. Первый способ — штатный и рекомендуемый, второй применяется, когда есть только текстовое представление ссылки, например из журнала регистрации или внешнего файла.
Важно понимать: ГУИД существует только у ссылочных типов данных (справочники, документы, планы видов характеристик, планы счетов, бизнес-процессы, задачи и др.). У записей регистров сведений, у примитивных типов (число, строка, дата) ГУИДа нет — попытка получить его приведёт к ошибке.
Что такое ГУИД ссылки и когда он нужен
Каждая ссылка в 1С состоит из двух частей: указания на тип объекта (какой это справочник или вид документа) и уникального идентификатора внутри этого типа. ГУИД — именно вторая часть. Он генерируется платформой при создании объекта и не меняется на протяжении всей жизни объекта, даже если меняются код, наименование и другие реквизиты.
Практические ситуации, где без ГУИДа не обойтись:
- обмен между базами без конвертации данных — сопоставление объектов по идентификатору;
- интеграция через HTTP-сервисы и OData — внешняя система хранит ГУИДы объектов 1С;
- восстановление ссылки по сообщению «Объект не найден (8e2c4f1a:...)»;
- поиск объекта по строковому представлению ссылки из логов и журнала регистрации;
- предопределённые элементы и синхронизация справочников между узлами РИБ.
Основной способ: метод УникальныйИдентификатор()
У любого значения ссылочного типа есть метод УникальныйИдентификатор(). Он возвращает значение типа УникальныйИдентификатор, которое при необходимости легко преобразуется в строку.
// Получение ГУИДа по ссылке
СсылкаНаЭлемент = Справочники.Номенклатура.НайтиПоКоду("000000123");
Если Не СсылкаНаЭлемент.Пустая() Тогда
ГУИД = СсылкаНаЭлемент.УникальныйИдентификатор();
СтрокаГУИД = Строка(ГУИД); // "8e2c4f1a-3b5d-4e6f-9a0b-1c2d3e4f5a6b"
Сообщить("ГУИД элемента: " + СтрокаГУИД);
Иначе
Сообщить("Элемент не найден");
КонецЕсли;Обратите внимание на проверку Пустая(). Если ссылка пустая (незаполненный реквизит), метод УникальныйИдентификатор() вернёт ГУИД из одних нулей: 00000000-0000-0000-0000-000000000000. Это не ошибка, но и не идентификатор реального объекта — такую ситуацию нужно обрабатывать отдельно.
Метод работает одинаково для всех ссылочных типов: справочников, документов, перечислений (у предопределённых значений перечислений тоже есть ссылки), планов обмена, бизнес-процессов и задач.
Обратная задача: получить ссылку по ГУИДу
Зеркальная задача встречается так же часто: есть строка с ГУИДом (из файла обмена, из запроса внешней системы), нужно получить ссылку на объект. Для этого используется конструктор Новый УникальныйИдентификатор(Строка) и метод менеджера объекта ПолучитьСсылку().
// Восстановление ссылки по строке ГУИДа
СтрокаГУИД = "8e2c4f1a-3b5d-4e6f-9a0b-1c2d3e4f5a6b";
ГУИД = Новый УникальныйИдентификатор(СтрокаГУИД);
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(ГУИД);
// Проверяем, существует ли объект с такой ссылкой
Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1 Истина ИЗ Справочник.Номенклатура ГДЕ Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Если Запрос.Выполнить().Пустой() Тогда
Сообщить("Объект с таким ГУИДом отсутствует в базе");
КонецЕсли;Конструктор Новый УникальныйИдентификатор(Строка) вызовет исключение, если строка не соответствует формату ГУИДа (не хватает символов, лишние символы, недопустимые знаки). При обработке внешних данных оборачивайте вызов в Попытка...Исключение.
Получение ГУИДа из строкового представления ссылки
Иногда ссылки нет вовсе — есть только её строковое представление, например значение поля «Данные» из журнала регистрации вида Номенклатура 8e2c4f1a-3b5d-4e6f-9a0b-1c2d3e4f5a6b или значение из XML-файла обмена. В этом случае ГУИД извлекается из строки как подстрока.
Строковое представление ссылки всегда содержит ГУИД в стандартном формате из 36 символов (32 шестнадцатеричные цифры и 4 дефиса). Достаточно найти этот фрагмент регулярным поиском по длине или по позиции последнего пробела.
// Извлечение ГУИДа из строки вида "Номенклатура 8e2c4f1a-..."
СтрокаСсылки = "Номенклатура 8e2c4f1a-3b5d-4e6f-9a0b-1c2d3e4f5a6b";
Если СтрДлина(СтрокаСсылки) >= 36 Тогда
СтрокаГУИД = Прав(СтрокаСсылки, 36);
Попытка
ГУИД = Новый УникальныйИдентификатор(СтрокаГУИД);
Сообщить("Извлечён ГУИД: " + Строка(ГУИД));
Исключение
Сообщить("Строка не содержит корректный ГУИД");
КонецПопытки;
КонецЕсли;Как быстро узнать ГУИД без программирования
Разработчику не всегда удобно писать код ради одного идентификатора. Есть несколько штатных приёмов узнать ГУИД объекта напрямую.
- 1Откройте объект в режиме 1С:Предприятие и посмотрите адресную строку браузера в веб-клиенте или в тонком клиенте с навигационными ссылками — там есть параметр вида ref=8e2c4f1a...
- 2В тонком клиенте выполните «Получить навигационную ссылку» (через меню или сочетание клавиш) и скопируйте фрагмент после ref=
- 3В консоли запросов или консоли кода (внешние инструменты разработчика) выполните одну строку: Сообщить(Ссылка.УникальныйИдентификатор())
- 4Для пакетной выгрузки ГУИДов используйте запрос с функцией УникальныйИдентификатор(Ссылка) в консоли запросов
В языке запросов 1С есть функция УникальныйИдентификатор(), которая возвращает ГУИД ссылки прямо в результате запроса. Это удобно для выгрузки соответствия «объект — идентификатор» во внешние системы.
// Запрос с получением ГУИДов
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Наименование КАК Наименование,
| УникальныйИдентификатор(Номенклатура.Ссылка) КАК ГУИД
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ПометкаУдаления";Типичные ошибки и ограничения
Ещё одно ограничение: у предопределённых элементов справочников ГУИД формируется по особым правилам и может отличаться между базами даже для одного и того же предопределённого элемента, если элементы создавались не через обновление конфигурации, а вручную. При интеграциях полагайтесь на имя предопределённого элемента, а не только на его идентификатор.
При обмене через планы обмена (РИБ, универсальный формат) ГУИДы центрального и периферийного узлов синхронизируются автоматически — вручную править идентификаторы в таких базах нельзя, это нарушит целостность обмена.
Как проверить результат
36 символов, формат 8-4-4-4-12 с дефисами, только шестнадцатеричные цифры
Другая длина, лишние символы, русские буквы вместо латинских
Запрос по ссылке возвращает объект, реквизиты читаются
При обращении к реквизиту — «Объект не найден»
ГУИД 00000000-0000-0000-0000-000000000000 означает незаполненный реквизит
Нулевой ГУИД ошибочно сохранён как идентификатор реального объекта во внешней системе
Сравнение способов получения ГУИДа
Сравнение вариантов
Штатный и самый надёжный способ; требует наличия ссылки и возможности выполнить код
Подходит для пакетной выгрузки идентификаторов; результат — строковое представление
Быстрый ручной способ без кода; неудобен для массовой обработки
Единственный вариант, когда есть только текст из журнала или файла; требует проверки формата
Выбор способа зависит от исходных данных: есть живая ссылка — используйте метод, нужна массовая выгрузка — запрос, есть только текст — разбор строки с последующей проверкой через Новый УникальныйИдентификатор().
Что важно запомнить
ГУИД ссылки получают методом Ссылка.УникальныйИдентификатор(), обратно ссылку восстанавливают через ПолучитьСсылку(Новый УникальныйИдентификатор(Строка)). Всегда проверяйте существование объекта после ПолучитьСсылку и обрабатывайте пустые ссылки с нулевым ГУИДом.
Частые вопросы
Можно ли изменить ГУИД существующего объекта?
Штатными средствами — нет, идентификатор неизменен на протяжении жизни объекта. Косвенный приём — создать новый объект, скопировать данные и перенести ссылки, но это рискованная операция, требующая полного поиска ссылок по базе.
Почему у двух одинаковых элементов в разных базах разные ГУИДы?
ГУИД генерируется в момент создания объекта в конкретной базе. Если элементы создавались независимо, идентификаторы будут разными, даже при совпадающих кодах и наименованиях. Синхронизацию по ГУИДам обеспечивают планы обмена или загрузка с принудительной установкой ссылки.
Как найти объект по сообщению «Объект не найден (8e2c4f1a:...)»?
Идентификатор в таком сообщении представлен в инвертированном виде. Существуют обработки и консоли кода, которые преобразуют его в стандартный ГУИД перестановкой байтов, после чего ссылку можно восстановить через ПолучитьСсылку и проверить, в какой таблице она должна была находиться.
Есть ли ГУИД у записей регистра сведений?
Нет. Записи регистров не являются ссылочными объектами и идентифицируются набором измерений (и периода для периодических регистров). Метод УникальныйИдентификатор() для них недоступен.
Как передать ГУИД во внешнюю систему через HTTP-сервис?
Преобразуйте ГУИД в строку функцией Строка() или XMLСтрока() и передайте в теле ответа. Внешняя система хранит его как текст, а при обратном запросе передаёт строку, которую 1С преобразует через Новый УникальныйИдентификатор().
Совпадает ли ГУИД ссылки с тем, что видно в SQL-базе напрямую?
В таблицах СУБД ссылка хранится в двоичном виде, и при просмотре через SQL-запросы байты отображаются в ином порядке, чем в строковом ГУИДе 1С. Прямое сопоставление требует перестановки байтов; работать с базой на уровне SQL в обход платформы не рекомендуется.