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

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

Как получить УИД (GUID) ссылки в 1С

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

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

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

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

Уникальный идентификатор — это 128-битное значение, которое платформа присваивает каждой ссылке в момент создания объекта. Внешне он выглядит как строка вида 8b3b0e1a-5c2d-4f6a-9b1c-2d3e4f5a6b7c. Идентификатор не меняется при переименовании элемента, смене кода или перенумерации документов.

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

  • синхронизация справочников и документов между разными информационными базами;
  • поиск объекта по «битой» ссылке вида «Объект не найден (8b3b0e1a:...)»;
  • интеграция с сайтом, CRM или учётной системой, где 1С-объект хранится по GUID;
  • отладка обменов, когда нужно сопоставить записи в источнике и приёмнике.

Как получить УИД через объект методом УникальныйИдентификатор()

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

bsl
ОбъектЭлемента = СсылкаНаЭлемент.ПолучитьОбъект();
ГУИД = ОбъектЭлемента.УникальныйИдентификатор();
Сообщить(Строка(ГУИД));

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

Как получить УИД запросом без чтения объекта

Более лёгкий способ — язык запросов. В нём есть функция УНИКАЛЬНЫЙИДЕНТИФИКАТОР(), которая принимает ссылку и возвращает её идентификатор без выборки остальных полей объекта.

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

Этот вариант предпочтителен, когда нужно получить идентификаторы многих ссылок: можно одним запросом выбрать сразу таблицу «ссылка — УИД» по целому справочнику или документу. Нагрузка при этом минимальна, потому что читаются только служебные поля.

Обратите внимание: функция УНИКАЛЬНЫЙИДЕНТИФИКАТОР() поддерживается не во всех версиях платформы одинаково — в старых релизах 8.2/ранних 8.3 её может не быть. Перед использованием проверьте её наличие в синтакс-помощнике вашей версии платформы.

Как получить УИД через строковое представление ссылки

Ещё один обходной приём — преобразовать ссылку в строку через Строка(Ссылка) недостаточно (там будет представление), но через значение в строку внутреннего формата или через XML-сериализацию идентификатор извлекается. Классический способ — функция преобразования через ЗначениеВСтрокуВнутр:

bsl
СтрокаВнутр = ЗначениеВСтрокуВнутр(СсылкаНаЭлемент);
// Идентификатор содержится внутри строки в шестнадцатеричном виде,
// его извлекают разбором подстроки по известному шаблону.

Также распространён приём с XML: ссылка сериализуется через XMLСтрока(Ссылка), и результат уже содержит GUID в читаемом виде. Этот способ удобен тем, что возвращает идентификатор сразу в стандартном строковом формате «8-4-4-4-12».

bsl
ГУИДСтрокой = XMLСтрока(СсылкаНаЭлемент);
Сообщить(ГУИДСтрокой); // например: 8b3b0e1a-5c2d-4f6a-9b1c-2d3e4f5a6b7c

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

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

Если вы не разработчик, а пользователь или администратор, писать код необязательно. Существуют готовые внешние обработки «GUID ссылки», которые открываются через меню «Файл → Открыть» и показывают идентификатор выбранного объекта, а также выполняют обратный поиск объекта по GUID.

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

Порядок действий для разового просмотра
  1. 1
    Откройте внешнюю обработку просмотра GUID через Файл → Открыть
  2. 2
    Укажите ссылку на нужный объект в поле выбора
  3. 3
    Скопируйте отображённый идентификатор
  4. 4
    При необходимости выполните обратную проверку: найдите объект по этому GUID

Обратная задача: найти объект по известному УИД

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

bsl
ГУИД = Новый УникальныйИдентификатор("8b3b0e1a-5c2d-4f6a-9b1c-2d3e4f5a6b7c");
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(ГУИД);
Если Ссылка.ПолучитьОбъект() = Неопределено Тогда
    Сообщить("Объект с таким УИД не найден");
КонецЕсли;

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

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

Ограничения и риски при работе с УИД

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

Отдельный риск — массовое присвоение ссылок через УстановитьСсылкуНового() или загрузку с фиксированными GUID. Ошибка в таком коде может привести к «битым» ссылкам и рассинхронизации баз. Любые манипуляции с идентификаторами выполняйте на копии базы и только при наличии актуальной резервной копии.

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

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

Формат полученного идентификатора
Норма

Строка вида xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

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

Пустая строка, представление объекта или текст ошибки

Обратный поиск по GUID
Норма

ПолучитьСсылку(ГУИД) возвращает существующий объект

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

ПолучитьОбъект() возвращает Неопределено — объект удалён или тип выбран неверно

Совпадение в двух базах
Норма

Один и тот же элемент имеет одинаковый GUID в источнике и приёмнике

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

GUID различаются — элементы созданы независимо, нужна пересинхронизация

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

Почему у ссылки нет метода УникальныйИдентификатор()?

Таково устройство платформы: ссылка — это лёгкое значение-указатель, а метод УникальныйИдентификатор() реализован у объектов данных. Поэтому идентификатор получают либо через ПолучитьОбъект(), либо через запрос с функцией УНИКАЛЬНЫЙИДЕНТИФИКАТОР(), либо через XMLСтрока().

Как получить GUID сразу для списка элементов?

Используйте запрос с выборкой из таблицы справочника или документа и функцией УНИКАЛЬНЫЙИДЕНТИФИКАТОР(Таблица.Ссылка). Один запрос вернёт таблицу «ссылка — идентификатор» без чтения самих объектов, что работает быстро даже на больших объёмах.

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

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

Что делать, если в ошибке указан GUID, а объект не находится?

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

Совпадает ли GUID объекта после выгрузки и загрузки через обмен?

Если обмен настроен на перенос ссылок с сохранением идентификаторов (типовые обмены и конвертация данных так и работают), GUID совпадёт. Если же элементы создавались независимо в каждой базе, идентификаторы будут разными даже при совпадающих кодах и наименованиях.

Опасно ли хранить GUID 1С во внешней системе?

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

Итог

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

У ссылки 1С нет прямого метода получения УИД: используйте запрос с УНИКАЛЬНЫЙИДЕНТИФИКАТОР(), XMLСтрока() или ПолучитьОбъект().УникальныйИдентификатор(). Для обратного поиска применяйте ПолучитьСсылку(), а массовые операции с идентификаторами выполняйте только на копии базы.