Разработка и Конфигурация · 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Строка() универсальнее: она корректно сериализует любое значение, тогда как вызов метода у нессылочного значения вызовет ошибку.
Сравнение способов преобразования
Штатный метод платформы. Подходит, когда поле запроса гарантированно ссылочного типа. На нессылочном значении выдаст ошибку.
Универсальная сериализация любого значения в строку. Удобна при составных типах поля и в обменах, где 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 не существует, вы получите «битую» ссылку без ошибки. Проверить существование можно запросом по этой ссылке или через НайтиПоСсылкам().
- 1Преобразуйте строку в УникальныйИдентификатор через конструктор Новый УникальныйИдентификатор(Строка)
- 2Вызовите МенеджерОбъекта.ПолучитьСсылку(УИД) для нужного типа — справочника или документа
- 3Проверьте существование объекта запросом по полученной ссылке
- 4Если выборка пуста — объект отсутствует, обработайте эту ситуацию в коде
Проверка результата и типичные ошибки
После реализации убедитесь, что полученные идентификаторы совпадают с тем, что видно в интерфейсе. Быстрый способ сверки — открыть объект, выполнить в консоли кода Сообщить(Ссылка.УникальныйИдентификатор()) и сравнить строки посимвольно, включая регистр и дефисы.
Как проверить результат
36 символов: 8-4-4-4-12 шестнадцатеричных цифр через дефисы
Строка другой длины, без дефисов или с посторонними символами
GUID из кода совпадает с идентификатором, полученным через консоль для той же ссылки
Значения различаются — вероятно, перепутаны ссылки или байтовый порядок при чтении из СУБД
Запрос по ПолучитьСсылку(УИД) возвращает строку
Выборка пустая — объект удалён или УИД из другой базы
FAQ
Можно ли получить УИД в запросе без обхода выборки в коде?
Нет, штатной функции языка запросов для этого не существует. Альтернативы — постобработка результата в коде, внешние источники данных с прямым SQL-запросом или вычисляемые поля в СКД, где доступен встроенный язык.
Чем отличаются XMLСтрока(Ссылка) и Ссылка.УникальныйИдентификатор()?
Для ссылочного значения оба варианта возвращают одинаковую строку GUID. Разница в универсальности: XMLСтрока() работает с любыми типами и не вызывает ошибку на нессылочных значениях, а метод УникальныйИдентификатор() применим только к ссылкам.
Одинаков ли GUID одного объекта в разных базах?
Если объект попал в другую базу через обмен, сохраняющий ссылки (планы обмена, конвертация данных), GUID совпадает. Если объект создан заново в каждой базе вручную — идентификаторы будут разными, даже при совпадении наименований и кодов.
Как получить GUID объекта, не открывая форму?
Используйте консоль кода (в типовых конфигурациях — «Инструменты разработчика» или внешнюю консоль): получите ссылку любым способом и выполните Сообщить(Ссылка.УникальныйИдентификатор()). Также GUID виден в адресной строке браузера, если база опубликована на веб-сервере и объект открыт через тонкий клиент по ссылке вида e1cib.
Что делать, если ПолучитьСсылку(УИД) вернула несуществующий объект?
Это нормальное поведение метода — он не проверяет базу. Выполните запрос по полученной ссылке: если выборка пуста, объекта нет. Никогда не записывайте такую ссылку в реквизиты без проверки, иначе получите битую ссылку вида «Объект не найден».
Подходит ли GUID для синхронизации с внешней системой?
Да, это стандартная практика: внешняя система хранит GUID как первичный ключ объекта 1С. Учтите, что при удалении и повторном создании объекта GUID изменится, поэтому в интеграциях важно корректно обрабатывать удаление и не полагаться на наименование или код как на ключ.
Что важно запомнить
В языке запросов 1С функции получения GUID нет: выбирайте ссылки запросом и преобразуйте их через УникальныйИдентификатор() или XMLСтрока(). Для обратного поиска используйте ПолучитьСсылку() с обязательной проверкой существования объекта. Прямое чтение из СУБД — только на чтение и с учётом перестановки байтов.