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

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

Как получить УИД в запросе 1С 8.3

Как получить уникальный идентификатор (УИД/GUID) ссылки в запросе 1С 8.3: функция XMLСтрока, СУБД-запросы, поиск по GUID, типичные ошибки и ограничения платформы.

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

Обойти ограничение можно несколькими способами: выполнить запрос и преобразовать ссылки в коде, использовать функции СУБД при прямом доступе к базе, применить сериализацию ссылки через XML или воспользоваться стандартными подсистемами БСП. Каждый вариант имеет свою область применения, скорость и ограничения.

Ниже разобраны рабочие приёмы получения УИД в связке с запросом 1С 8.3, обратная задача поиска ссылки по идентификатору, а также типичные ошибки, из-за которых код возвращает пустые или некорректные значения.

Почему в запросе 1С нельзя получить УИД напрямую

Язык запросов 1С работает с типами данных платформы: ссылками, строками, числами, датами. Тип «УникальныйИдентификатор» в список типов полей запроса не входит, поэтому конструкции вида ВЫБРАТЬ Таб.Ссылка.УникальныйИдентификатор() не существует — запрос просто не скомпилируется. Даже попытка представить ссылку строкой через ПРЕДСТАВЛЕНИЕ(Ссылка) вернёт наименование объекта, а не его GUID.

Это осознанное ограничение платформы: GUID хранится на уровне СУБД во внутреннем бинарном формате, и 1С не раскрывает его в запросном API. Поэтому все рабочие приёмы сводятся либо к постобработке результата запроса в коде, либо к обращению к базе средствами самой СУБД.

Способ 1. Запрос плюс преобразование ссылок в коде

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

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

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

"ВЫБРАТЬ

| Контрагенты.Ссылка КАК Ссылка,

| Контрагенты.Наименование КАК Наименование

|ИЗ

| Справочник.Контрагенты КАК Контрагенты";

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

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

УИД = XMLСтрока(Выборка.Ссылка);

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

Сообщить(Выборка.Наименование + " — " + УИД);

КонецЦикла;

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

Сравнение способов преобразования

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

Штатный метод платформы. Подходит, когда поле запроса гарантированно ссылочного типа. На нессылочном значении выдаст ошибку.

XMLСтрока(Ссылка)

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

Способ 2. Получить GUID средствами СУБД

Если база работает в клиент-серверном варианте (MS SQL, PostgreSQL), GUID хранится в таблицах в бинарном виде, и его можно вытащить прямым SQL-запросом через внешние источники данных или ADO. Это самый быстрый вариант для массовой выгрузки миллионов записей, но он требует знания структуры хранения и прав на чтение базы напрямую.

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

Способ 3. Выгрузка через сериализацию и планы обмена

Когда GUID нужен для интеграции, часто проще не вытаскивать его отдельно, а сериализовать объект целиком. При выгрузке через ЗаписатьXML(), универсальный формат EnterpriseData или планы обмена платформа автоматически включает ссылку как GUID в атрибут Ref. Внешняя система получает идентификатор без дополнительных преобразований.

Для разовой задачи в консоли кода достаточно выгрузить результат запроса через XDTO или вручную собрать структуру с полем XMLСтрока(Ссылка). В типовых конфигурациях на БСП есть готовые процедуры обмена, где идентификаторы передаются штатно — стоит проверить их, прежде чем писать свой механизм.

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

Часто требуется обратное действие: внешняя система передала строку GUID, а нужно найти объект в базе и использовать его в запросе. Для этого строку преобразуют в значение типа «УникальныйИдентификатор», затем получают ссылку через менеджер объекта.

УИД = Новый УникальныйИдентификатор("a1b2c3d4-e5f6-7890-abcd-ef1234567890");

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

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

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

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

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

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

Проверка результата и типичные ошибки

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

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

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

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

36 символов: 8-4-4-4-12 шестнадцатеричных цифр через дефисы

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

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

Совпадение с объектом
Норма

GUID из кода совпадает с идентификатором, полученным через консоль для той же ссылки

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

Значения различаются — вероятно, перепутаны ссылки или байтовый порядок при чтении из СУБД

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

Запрос по ПолучитьСсылку(УИД) возвращает строку

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

Выборка пустая — объект удалён или УИД из другой базы

Типичные ошибки
01
Попытка написать Ссылка.УникальныйИдентификатор() прямо в тексте запроса — запрос не компилируется, такой функции в языке запросов нет
02
Использование ПРЕДСТАВЛЕНИЕ(Ссылка) вместо GUID — возвращается наименование объекта, которое не уникально и меняется
03
Чтение GUID напрямую из таблиц SQL без перестановки байтов — идентификатор не совпадает со значением платформы
04
Вызов ПолучитьСсылку() без проверки существования — в базе остаются битые ссылки, которые потом ломают отчёты и обмены

FAQ

Можно ли получить УИД в запросе без обхода выборки в коде?

Нет, штатной функции языка запросов для этого не существует. Альтернативы — постобработка результата в коде, внешние источники данных с прямым SQL-запросом или вычисляемые поля в СКД, где доступен встроенный язык.

Чем отличаются XMLСтрока(Ссылка) и Ссылка.УникальныйИдентификатор()?

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

Одинаков ли GUID одного объекта в разных базах?

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

Как получить GUID объекта, не открывая форму?

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

Что делать, если ПолучитьСсылку(УИД) вернула несуществующий объект?

Это нормальное поведение метода — он не проверяет базу. Выполните запрос по полученной ссылке: если выборка пуста, объекта нет. Никогда не записывайте такую ссылку в реквизиты без проверки, иначе получите битую ссылку вида «Объект не найден».

Подходит ли GUID для синхронизации с внешней системой?

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

Итог

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

В языке запросов 1С функции получения GUID нет: выбирайте ссылки запросом и преобразуйте их через УникальныйИдентификатор() или XMLСтрока(). Для обратного поиска используйте ПолучитьСсылку() с обязательной проверкой существования объекта. Прямое чтение из СУБД — только на чтение и с учётом перестановки байтов.