Разработка и Конфигурация · 11 мин
Уникальный идентификатор как строка в запросе 1С
Как получить уникальный идентификатор (GUID) в виде строки в запросе 1С: ПРЕДСТАВЛЕНИЕССЫЛКИ, сравнение подходов, передача GUID в параметр, типичные ошибки.
В языке запросов 1С нет функции, которая напрямую преобразует уникальный идентификатор (GUID) ссылки в строку. Это регулярно становится проблемой при интеграциях: внешняя система передаёт GUID текстом, а сравнить его со ссылкой в запросе напрямую нельзя — типы несовместимы, и запрос вернёт пустой результат или ошибку.
На практике задача решается тремя рабочими способами: функцией ПРЕДСТАВЛЕНИЕССЫЛКИ, преобразованием GUID в значение ссылки до выполнения запроса и сравнением через параметр, а также выборкой всех ссылок с последующей обработкой в коде. У каждого подхода есть ограничения по производительности и точности, которые важно понимать до выбора решения.
Ниже разобраны синтаксис, примеры запросов, границы применимости каждого метода и типичные ошибки, которые приводят к пустым выборкам и долгому поиску причины.
Как устроен GUID ссылки и почему его нельзя сравнить со строкой
Каждая ссылка на объект базы (элемент справочника, документ, план счетов) содержит уникальный идентификатор — 128-битное значение, которое в строковом виде выглядит как «8a1b2c3d-4e5f-…». Встроенный язык позволяет получить его методом Ссылка.УникальныйИдентификатор(), но только в коде, не в запросе.
В языке запросов поле «Ссылка» имеет ссылочный тип. Сравнение вида ГДЕ Товары.Ссылка = "8a1b2c3d-…" не сработает: строковый литерал не приводится автоматически к ссылке. Запрос либо вернёт пустую выборку, либо на некоторых СУБД завершится ошибкой несовместимости типов.
Обратное тоже верно: получить «сырой» GUID полем запроса нельзя. Конструкций вроде Ссылка.УникальныйИдентификатор в языке запросов не существует. Поэтому любая работа с GUID как со строкой строится либо через текстовое представление ссылки, либо через предварительные преобразования в коде.
Способ 1: ПРЕДСТАВЛЕНИЕССЫЛКИ для получения строки
Функция ПРЕДСТАВЛЕНИЕССЫЛКИ(Ссылка) возвращает текстовое представление ссылки — то, что пользователь видит в интерфейсе (например, «Товар "Гвоздь 100мм"» или номер и дату документа). Важно: это не GUID, а человекочитаемое представление.
ВЫБРАТЬ
ПРЕДСТАВЛЕНИЕССЫЛКИ(Номенклатура.Ссылка) КАК ПредставлениеСсылки,
Номенклатура.Код
ИЗ
Справочник.Номенклатура КАК Номенклатура
Функция подходит, когда нужно вывести ссылку текстом в отчёт, выгрузку или журнал. Она работает и с битыми ссылками — для них вернёт строка вида «<Объект не найден> (…)», что удобно для диагностики.
Ограничение принципиально: через ПРЕДСТАВЛЕНИЕССЫЛКИ нельзя получить именно GUID и нельзя надёжно сравнивать записи между базами — представления в разных системах могут совпадать у разных объектов или различаться у одного объекта.
Способ 2: поиск объекта по GUID-строке через параметр
Самая частая практическая задача — обратная: внешняя система прислала GUID строкой, нужно найти объект. Правильный путь — преобразовать строку в ссылку до запроса и передать её параметром:
Идентификатор = Новый УникальныйИдентификатор(СтрокаGUID);
СсылкаНаТовар = Справочники.Номенклатура.ПолучитьСсылку(Идентификатор);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка,
| Номенклатура.Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", СсылкаНаТовар);
Результат = Запрос.Выполнить();
Такой запрос использует индекс по ссылке и выполняется быстро даже на больших таблицах. Это эталонный вариант для интеграций: преобразование типов делается один раз в коде, а запрос остаётся простым.
Нюанс: метод ПолучитьСсылку создаёт значение ссылки даже если объекта с таким GUID в базе нет. Запрос в этом случае просто вернёт пустую выборку — это норма, а не ошибка. Проверять существование объекта нужно именно по результату запроса, а не по заполненности ссылки.
- 1Проверьте формат строки GUID: 36 символов с дефисами, без фигурных скобок
- 2Создайте значение: Новый УникальныйИдентификатор(СтрокаGUID)
- 3Получите ссылку нужного типа через МенеджерОбъекта.ПолучитьСсылку()
- 4Передайте ссылку параметром в запрос с условием Ссылка = &Ссылка
- 5Проверьте Результат.Пустой() — признак того, что объект не найден
Способ 3: выгрузка GUID в строку при обходе результата
Когда нужна выгрузка с GUID для внешней системы (XML, JSON, CSV), идентификатор преобразуют в строку уже в коде при обходе выборки:
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
СтрокаGUID = XMLСтрока(Выборка.Ссылка.УникальныйИдентификатор());
// или Строка(Выборка.Ссылка.УникальныйИдентификатор())
КонецЦикла;
Функция XMLСтрока() предпочтительнее для интеграций: она даёт каноническую форму GUID без региональных сюрпризов. Обычное Строка() тоже возвращает тот же формат для GUID, но XMLСтрока явно фиксирует намерение сериализации.
Если выгрузка идёт через планы обмена или типовые механизмы конвертации, GUID обычно сериализуется автоматически — ручное преобразование нужно только в самописных форматах.
Сравнение GUID в условии запроса без параметра
Иногда требуется сравнить идентификаторы двух ссылок прямо в запросе — например, найти дубли по GUID в разных таблицах. Здесь работает только сравнение ссылок как ссылок: Таблица1.Ссылка = Таблица2.Ссылка. Сравнивать их строковые представления для этой цели нельзя — разные объекты могут иметь одинаковые наименования.
Если GUID хранится в базе как строковый реквизит (частая ситуация после обменов), соединение «ссылка = строка с GUID» в запросе невозможно в принципе. Варианты обхода:
- при записи данных сразу создавать из строки ссылку и хранить её, а не текст;
- делать соединение в коде: выбрать строки, для каждой построить ссылку и проверить существование;
- для разовой сверки — выгрузить обе стороны в таблицы значений и сопоставить в коде.
Подходы к работе с GUID в запросах
Для вывода ссылки текстом в отчётах. Не возвращает GUID, не подходит для сопоставления объектов.
Для поиска объекта по строке GUID из внешней системы. Быстро, использует индекс; требует преобразования в коде до запроса.
Для выгрузки GUID в файлы и сервисы. Гибко, но не работает, если строка нужна прямо в тексте запроса.
Частые ошибки и как их диагностировать
Ошибка номер один — передача строки GUID в параметр вместо ссылки. Запрос выполняется без ошибок, но возвращает пустоту, и причину ищут в данных. Диагностика проста: выведите тип параметра через ТипЗнч() перед выполнением.
Вторая группа ошибок — формат строки. Конструктор Новый УникальныйИдентификатор() требует строку строго вида «xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx». Фигурные скобки, префиксы, верхний регистр с лишними символами или урезанная строка вызовут исключение. Перед конвертацией очищайте строку: СтрЗаменить(СтрокаGUID, "{", "") и аналогично для «}».
Третья ловушка — попытка получить GUID через точку в тексте запроса (Ссылка.УникальныйИдентификатор). Конструктор запросов такое поле не предложит, а написанный вручную текст упадёт с ошибкой при выполнении. Это ожидаемое поведение платформы, а не дефект запроса.
Проверка результата и контрольные точки
После внедрения любого из способов проверьте поведение на граничных случаях: несуществующий GUID, GUID объекта другого типа, битая ссылка. Корректная реализация во всех этих случаях возвращает пустую выборку или управляемое сообщение, а не исключение.
Для интеграционных сценариев полезно зафиксировать тестовый объект с известным GUID и проверять поиск по нему после обновлений конфигурации — это быстро выявляет регрессии в коде обмена.
Как проверить корректность решения
Запрос возвращает ровно одну запись
Пустая выборка или несколько записей
Пустая выборка без исключений
Ошибка выполнения или найденный объект
36 символов, дефисы на местах, нижний или верхний регистр единообразно
Фигурные скобки, префиксы, обрезанная строка
Ссылка нужного типа (СправочникСсылка.… и т.п.)
Строка
Когда какой способ выбирать
Для вывода ссылки текстом в отчёте — ПРЕДСТАВЛЕНИЕССЫЛКИ. Для поиска объекта по GUID из внешней системы — преобразование в ссылку и параметр. Для выгрузки идентификаторов наружу — обход выборки с XMLСтрока. Для сопоставления между базами — только GUID, хранимый или передаваемый как идентификатор, а не как наименование.
Комбинировать подходы нормально: например, в одном запросе выбрать данные, а GUID добавить при обходе. Главное — не пытаться решить задачу «в лоб» строковым сравнением, которого язык запросов не поддерживает.
Что важно запомнить
GUID нельзя получить строкой напрямую в запросе 1С. Для вывода текста используйте ПРЕДСТАВЛЕНИЕССЫЛКИ, для поиска по GUID — преобразуйте строку в ссылку и передайте параметром, для выгрузки — обходите выборку и применяйте XMLСтрока. Никогда не сравнивайте объекты по строковым представлениям.
Частые вопросы
Можно ли получить GUID ссылки прямо в тексте запроса?
Нет, язык запросов 1С не имеет функции для извлечения уникального идентификатора. Получить GUID можно только в коде через Ссылка.УникальныйИдентификатор() при обходе результата запроса.
Чем ПРЕДСТАВЛЕНИЕССЫЛКИ отличается от GUID?
ПРЕДСТАВЛЕНИЕССЫЛКИ возвращает человекочитаемый текст (наименование, номер документа), который может меняться и совпадать у разных объектов. GUID — неизменный технический идентификатор объекта. Для сопоставления данных между системами годится только GUID.
Почему запрос с условием по GUID возвращает пустой результат?
Чаще всего в параметр передана строка вместо ссылки. Проверьте, что параметр создан через МенеджерОбъекта.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаGUID)). Также пустой результат — норма, если объекта с таким GUID в базе нет.
Что делать, если GUID приходит с фигурными скобками?
Очистите строку перед конвертацией: уберите символы «{» и «}» через СтрЗаменить. Конструктор Новый УникальныйИдентификатор принимает только формат из 36 символов с дефисами, без обрамления.
Как найти объект, если GUID хранится в базе как строковый реквизит?
Соединить ссылку со строкой в запросе нельзя. Выберите строки, в коде преобразуйте каждую в ссылку и проверьте существование объекта отдельным запросом или методом ПолучитьОбъект. На перспективу лучше изменить структуру и хранить ссылку, а не строку.
Есть ли разница между Строка() и XMLСтрока() для GUID?
Для уникального идентификатора обе функции возвращают одинаковый формат. XMLСтрока предпочтительнее в интеграциях, так как явно показывает, что значение сериализуется для обмена, и единообразно работает с другими типами данных.