Разработка и Конфигурация · 9 мин
Как получить УИД (GUID) ссылки в 1С
Как получить уникальный идентификатор (УИД, GUID) ссылки объекта в 1С: через запрос, встроенный язык, внешние обработки и COM. Примеры кода и типичные ошибки.
Уникальный идентификатор (УИД, GUID) ссылки — это внутреннее значение, по которому платформа 1С однозначно определяет объект базы данных независимо от его кода, номера или наименования. Он нужен при обмене данными между базами, интеграции с внешними системами, поиске «битых» ссылок и отладке. Получить его можно несколькими способами: встроенными средствами языка, запросом, через внешние обработки или извне — через COM и веб-сервисы.
Важно понимать ограничение платформы: привычный метод УникальныйИдентификатор() есть у объектов (например, СправочникОбъект), но не у значений типа «ссылка». Поэтому разработчики используют обходные приёмы — через запрос, преобразование строки или сериализацию. Ниже разобраны рабочие варианты с готовым кодом.
Что такое УИД ссылки и когда он нужен
Уникальный идентификатор — это 128-битное значение, которое платформа присваивает каждой ссылке в момент создания объекта. Внешне он выглядит как строка вида 8b3b0e1a-5c2d-4f6a-9b1c-2d3e4f5a6b7c. Идентификатор не меняется при переименовании элемента, смене кода или перенумерации документов.
Практические ситуации, где без УИД не обойтись:
- синхронизация справочников и документов между разными информационными базами;
- поиск объекта по «битой» ссылке вида «Объект не найден (8b3b0e1a:...)»;
- интеграция с сайтом, CRM или учётной системой, где 1С-объект хранится по GUID;
- отладка обменов, когда нужно сопоставить записи в источнике и приёмнике.
Как получить УИД через объект методом УникальныйИдентификатор()
Самый очевидный путь — получить объект из ссылки и вызвать метод УникальныйИдентификатор(). Он доступен у объектов справочников, документов, планов видов характеристик и других ссылочных типов.
ОбъектЭлемента = СсылкаНаЭлемент.ПолучитьОбъект();
ГУИД = ОбъектЭлемента.УникальныйИдентификатор();
Сообщить(Строка(ГУИД));У способа есть существенный недостаток: ПолучитьОбъект() выполняет полное чтение объекта из базы данных. Для разового получения идентификатора это допустимо, но в цикле по тысячам ссылок такой подход заметно нагружает сервер. Кроме того, метод вызовет ошибку, если ссылка «битая» или у пользователя нет прав на чтение объекта.
Как получить УИД запросом без чтения объекта
Более лёгкий способ — язык запросов. В нём есть функция УНИКАЛЬНЫЙИДЕНТИФИКАТОР(), которая принимает ссылку и возвращает её идентификатор без выборки остальных полей объекта.
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ УНИКАЛЬНЫЙИДЕНТИФИКАТОР(&Ссылка) КАК УИД";
Запрос.УстановитьПараметр("Ссылка", СсылкаНаЭлемент);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ГУИД = Выборка.УИД;
КонецЕсли;Этот вариант предпочтителен, когда нужно получить идентификаторы многих ссылок: можно одним запросом выбрать сразу таблицу «ссылка — УИД» по целому справочнику или документу. Нагрузка при этом минимальна, потому что читаются только служебные поля.
Обратите внимание: функция УНИКАЛЬНЫЙИДЕНТИФИКАТОР() поддерживается не во всех версиях платформы одинаково — в старых релизах 8.2/ранних 8.3 её может не быть. Перед использованием проверьте её наличие в синтакс-помощнике вашей версии платформы.
Как получить УИД через строковое представление ссылки
Ещё один обходной приём — преобразовать ссылку в строку через Строка(Ссылка) недостаточно (там будет представление), но через значение в строку внутреннего формата или через XML-сериализацию идентификатор извлекается. Классический способ — функция преобразования через ЗначениеВСтрокуВнутр:
СтрокаВнутр = ЗначениеВСтрокуВнутр(СсылкаНаЭлемент);
// Идентификатор содержится внутри строки в шестнадцатеричном виде,
// его извлекают разбором подстроки по известному шаблону.Также распространён приём с XML: ссылка сериализуется через XMLСтрока(Ссылка), и результат уже содержит GUID в читаемом виде. Этот способ удобен тем, что возвращает идентификатор сразу в стандартном строковом формате «8-4-4-4-12».
ГУИДСтрокой = XMLСтрока(СсылкаНаЭлемент);
Сообщить(ГУИДСтрокой); // например: 8b3b0e1a-5c2d-4f6a-9b1c-2d3e4f5a6b7cВыбирайте этот вариант, когда нужен именно строковый GUID для передачи во внешнюю систему: он не требует ни чтения объекта, ни запроса.
Как узнать УИД без программирования
Если вы не разработчик, а пользователь или администратор, писать код необязательно. Существуют готовые внешние обработки «GUID ссылки», которые открываются через меню «Файл → Открыть» и показывают идентификатор выбранного объекта, а также выполняют обратный поиск объекта по GUID.
Ещё один путь — «Все функции» (в тонком клиенте включается через параметры запуска или настройки). В некоторых инструментах разработчика, встроенных в типовые конфигурации на БСП, есть команда вывода технической информации об объекте, где отображается и уникальный идентификатор.
- 1Откройте внешнюю обработку просмотра GUID через Файл → Открыть
- 2Укажите ссылку на нужный объект в поле выбора
- 3Скопируйте отображённый идентификатор
- 4При необходимости выполните обратную проверку: найдите объект по этому GUID
Обратная задача: найти объект по известному УИД
Частая ситуация — в журнале обмена или в тексте ошибки фигурирует GUID, и нужно понять, какому объекту он соответствует. Для этого идентификатор преобразуют обратно в ссылку через метод менеджера объекта ПолучитьСсылку():
ГУИД = Новый УникальныйИдентификатор("8b3b0e1a-5c2d-4f6a-9b1c-2d3e4f5a6b7c");
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(ГУИД);
Если Ссылка.ПолучитьОбъект() = Неопределено Тогда
Сообщить("Объект с таким УИД не найден");
КонецЕсли;Загвоздка в том, что нужно знать тип объекта — GUID сам по себе не хранит информацию о виде справочника или документа. Если тип неизвестен, придётся перебирать менеджеры ссылочных типов либо использовать универсальные обработки поиска по GUID, которые делают это автоматически.
Ограничения и риски при работе с УИД
Уникальный идентификатор присваивается объектом навсегда, но при обменах возможны коллизии: если один и тот же элемент создавался независимо в двух базах, у него будут разные GUID, и синхронизация по идентификатору даст дубли. Поэтому в распределённых системах GUID согласуют на этапе первоначальной выгрузки.
Отдельный риск — массовое присвоение ссылок через УстановитьСсылкуНового() или загрузку с фиксированными GUID. Ошибка в таком коде может привести к «битым» ссылкам и рассинхронизации баз. Любые манипуляции с идентификаторами выполняйте на копии базы и только при наличии актуальной резервной копии.
Как проверить результат
Строка вида xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Пустая строка, представление объекта или текст ошибки
ПолучитьСсылку(ГУИД) возвращает существующий объект
ПолучитьОбъект() возвращает Неопределено — объект удалён или тип выбран неверно
Один и тот же элемент имеет одинаковый GUID в источнике и приёмнике
GUID различаются — элементы созданы независимо, нужна пересинхронизация
Частые вопросы
Почему у ссылки нет метода УникальныйИдентификатор()?
Таково устройство платформы: ссылка — это лёгкое значение-указатель, а метод УникальныйИдентификатор() реализован у объектов данных. Поэтому идентификатор получают либо через ПолучитьОбъект(), либо через запрос с функцией УНИКАЛЬНЫЙИДЕНТИФИКАТОР(), либо через XMLСтрока().
Как получить GUID сразу для списка элементов?
Используйте запрос с выборкой из таблицы справочника или документа и функцией УНИКАЛЬНЫЙИДЕНТИФИКАТОР(Таблица.Ссылка). Один запрос вернёт таблицу «ссылка — идентификатор» без чтения самих объектов, что работает быстро даже на больших объёмах.
Можно ли узнать GUID элемента в пользовательском режиме без обработок?
Штатной команды «показать GUID» в типовых формах обычно нет. Практичный вариант — внешняя обработка просмотра идентификаторов или инструменты разработчика, встроенные в конфигурации на базе БСП, где есть вывод технической информации об объекте.
Что делать, если в ошибке указан GUID, а объект не находится?
Сначала определите тип объекта — по контексту ошибки или перебором менеджеров ссылочных типов. Затем выполните ПолучитьСсылку() с этим GUID и проверьте ПолучитьОбъект(): если возвращается Неопределено, объект был удалён, и ссылку нужно либо удалить из документов, либо восстановить объект из резервной копии.
Совпадает ли GUID объекта после выгрузки и загрузки через обмен?
Если обмен настроен на перенос ссылок с сохранением идентификаторов (типовые обмены и конвертация данных так и работают), GUID совпадёт. Если же элементы создавались независимо в каждой базе, идентификаторы будут разными даже при совпадающих кодах и наименованиях.
Опасно ли хранить GUID 1С во внешней системе?
Сам по себе идентификатор не содержит данных объекта и безопасен для хранения. Риск в другом: при пересоздании элемента в 1С (удалении и создании заново) GUID изменится, и связь во внешней системе потеряется — предусмотрите механизм актуализации соответствий.
Что важно запомнить
У ссылки 1С нет прямого метода получения УИД: используйте запрос с УНИКАЛЬНЫЙИДЕНТИФИКАТОР(), XMLСтрока() или ПолучитьОбъект().УникальныйИдентификатор(). Для обратного поиска применяйте ПолучитьСсылку(), а массовые операции с идентификаторами выполняйте только на копии базы.