Разработка и Конфигурация · 10 мин
УИД в запросе 1С как строка: способы преобразования и сравнения
Как работать с уникальным идентификатором в запросе 1С как со строкой: функция ПРЕДСТАВЛЕНИЕ, передача УИД строкой в параметр, обратное преобразование и типичные ошибки.
Уникальный идентификатор (УИД, GUID) в 1С — это 128-битное значение, которое платформа хранит в собственном внутреннем формате. В языке запросов нет прямого приведения типа «УникальныйИдентификатор → Строка», поэтому задача «получить УИД как строку в запросе» решается обходными путями: через функцию ПРЕДСТАВЛЕНИЕ, через параметры и через промежуточные вычисления в коде.
Чаще всего потребность возникает в трёх ситуациях: нужно сравнить ссылку с идентификатором, полученным из внешней системы в виде строки; нужно выгрузить УИД в текстовом виде для обмена; нужно найти объект по строковому представлению GUID. У каждого сценария — своё корректное решение, и выбор неправильного приводит либо к пустому результату запроса, либо к ошибке сравнения типов.
Почему в запросе нельзя просто привести УИД к строке
Язык запросов 1С поддерживает ограниченный набор операций приведения типов: ВЫРАЗИТЬ работает только с примитивными типами (Число, Строка, Дата, Булево) и ссылочными типами, но не умеет преобразовывать уникальный идентификатор в строку. Конструкция вида ВЫРАЗИТЬ(Ссылка.УникальныйИдентификатор КАК Строка(36)) синтаксически недопустима — поля типа «УникальныйИдентификатор» вообще не существует у ссылки как доступного реквизита запроса.
При этом само значение УИД в запросе использовать можно: параметр запроса вполне принимает значение типа УникальныйИдентификатор, и сравнение ссылки с ним через функцию УникальныйИдентификатор() в некоторых контекстах доступно. Проблема возникает именно на стыке «строка ↔ УИД» внутри текста запроса.
Практический вывод: всё, что касается преобразования строки в УИД, надёжнее выполнять в коде встроенного языка до выполнения запроса, а в запрос передавать уже готовое типизированное значение. Это устраняет неоднозначности форматов и ошибки сравнения.
Получение строкового представления через ПРЕДСТАВЛЕНИЕ
Функция ПРЕДСТАВЛЕНИЕ() в запросе возвращает текстовое представление значения. Для ссылки она вернёт представление объекта (например, «Реализация товаров 00001 от 12.01»), а не его УИД — это важно не путать. Для значения типа УникальныйИдентификатор, если оно хранится в реквизите, ПРЕДСТАВЛЕНИЕ вернёт строку вида «5f4dcc3b-...».
Типичный сценарий: в регистре сведений или справочнике есть реквизит типа УникальныйИдентификатор, заполненный при обмене. Тогда запрос вида:
ВЫБРАТЬ
ПРЕДСТАВЛЕНИЕ(Данные.ИдентификаторВнешний) КАК УИДСтрокой
ИЗ
РегистрСведений.СоответствияОбъектов КАК Данные
вернёт строковое представление идентификатора, пригодное для выгрузки в файл или передачи во внешнюю систему. Учтите, что регистр символов и наличие дефисов соответствуют стандартному формату GUID — внешние системы обычно принимают его без дополнительной обработки, но регистр букв в разных системах может отличаться (верхний/нижний), поэтому при сравнениях на той стороне приводите строки к одному регистру.
Сравнение ссылки со строкой УИД через параметр
Самая частая задача: из внешней системы пришёл GUID строкой, нужно найти соответствующий объект в 1С. Правильный путь — преобразовать строку в УникальныйИдентификатор в коде, а затем получить ссылку:
УИД = Новый УникальныйИдентификатор(СтрокаУИД);
СсылкаНаОбъект = Справочники.Номенклатура.ПолучитьСсылку(УИД);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", СсылкаНаОбъект);
Такой подход не требует никаких строковых операций в запросе: сравнение идёт по ссылкам, используется индекс, скорость максимальная. Попытка же сравнить в запросе строку с УИД напрямую (ГДЕ Ссылка.УникальныйИдентификатор = &СтрокаУИД) невозможна — у ссылки нет такого поля в языке запросов.
Проверка результата: если ПолучитьСсылку(УИД) вернула ссылку на несуществующий объект, запрос просто ничего не найдёт. Поэтому перед запросом полезно проверить существование объекта через СсылкаНаОбъект.ПолучитьОбъект() с осторожностью или через запрос по ссылке — запрос не вызовет исключения на «битой» ссылке.
- 1Получите строку GUID из внешнего источника и очистите её от пробелов и фигурных скобок
- 2Создайте значение: Новый УникальныйИдентификатор(СтрокаУИД)
- 3Получите ссылку нужного менеджера: Справочники.Имя.ПолучитьСсылку(УИД)
- 4Передайте ссылку в параметр запроса и сравнивайте по равенству ссылок
- 5Проверьте, что выборка непустая, прежде чем работать с результатом
Передача УИД параметром и сравнение в условии ГДЕ
Параметр запроса принимает значение типа УникальныйИдентификатор напрямую. Это полезно, когда в реквизитах таблиц хранятся именно УИД (типично для регистров соответствия при обменах):
Запрос.Текст =
"ВЫБРАТЬ
| Соответствия.ОбъектБазы КАК ОбъектБазы
|ИЗ
| РегистрСведений.СоответствияОбъектов КАК Соответствия
|ГДЕ
| Соответствия.ИдентификаторВнешний = &УИД";
Запрос.УстановитьПараметр("УИД", Новый УникальныйИдентификатор(СтрокаУИД));
Если попытаться передать в такой параметр строку, запрос либо вернёт пустой результат, либо выдаст ошибку несоответствия типов — поведение зависит от контекста, но корректного сравнения не будет никогда. Строка «5f4dcc3b-...» и УникальныйИдентификатор с тем же визуальным видом — разные значения разных типов.
Обратное преобразование — из УИД в строку — в коде выполняется просто: Строка(УИД) или XMLСтрока(УИД). Функция XMLСтрока предпочтительнее при обменах, так как гарантирует канонический вид независимо от региональных настроек.
Выгрузка УИД строкой для обмена и отчётов
Когда задача — выгрузить идентификаторы объектов в файл, в запросе получить строку напрямую нельзя, поэтому стандартный приём: выбрать ссылки запросом, а строковое представление получить уже при обходе выборки:
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СтрокаУИД = XMLСтрока(Выборка.Ссылка.УникальныйИдентификатор());
// запись в файл, таблицу значений или передача в HTTP-запрос
КонецЦикла;
Метод УникальныйИдентификатор() вызывается на ссылке и не требует обращения к объекту целиком — это дёшёвая операция, не читающая данные объекта из базы. Поэтому производительность обхода не пострадает.
Альтернатива без кода — если в базе уже ведётся регистр соответствия с реквизитом типа УникальныйИдентификатор, строку можно получить в запросе через ПРЕДСТАВЛЕНИЕ, как показано выше. Но создавать такой реквизит только ради выгрузки нерационально: проще вычислить строку при обходе.
Сравнение способов работы с УИД в запросе
| Задача | Способ | Ограничение |
|---|---|---|
| Найти объект по GUID-строке | Новый УникальныйИдентификатор(Строка) + ПолучитьСсылку + параметр | Нужно знать тип объекта (менеджер) |
| Сравнить УИД-реквизит со значением | Параметр запроса типа УникальныйИдентификатор | Строка в параметре не подойдёт |
| Получить УИД строкой из запроса | ПРЕДСТАВЛЕНИЕ(РеквизитУИД) | Работает только для реквизита типа УИД, не для ссылки |
| Выгрузить УИД ссылки строкой | XMLСтрока(Ссылка.УникальныйИдентификатор()) при обходе | Требуется код после запроса |
Как выбрать подход
Проверка корректности строки УИД и обработка ошибок
Конструктор Новый УникальныйИдентификатор(Строка) выбрасывает исключение, если строка не соответствует формату GUID. В обменах с внешними системами такие ситуации неизбежны: пустые значения, обрезанные строки, лишние символы. Оборачивайте преобразование в попытку:
Попытка
УИД = Новый УникальныйИдентификатор(СокрЛП(СтрокаУИД));
Исключение
// журналирование: строка не является валидным GUID
Продолжить;
КонецПопытки;
Признаки корректной строки: длина 36 символов, дефисы на позициях 9, 14, 19, 24, остальные символы — шестнадцатеричные цифры. Внешние системы иногда присылают GUID в фигурных скобках {…} — их нужно убрать до преобразования.
Что важно запомнить
В языке запросов 1С нет прямого приведения УИД к строке. Для реквизитов типа УникальныйИдентификатор используйте ПРЕДСТАВЛЕНИЕ, для поиска объекта по строке GUID — конструктор УникальныйИдентификатор в коде и сравнение ссылок через параметр. Строку из ссылки получайте через XMLСтрока(Ссылка.УникальныйИдентификатор()) при обходе выборки.
Частые вопросы
Можно ли в условии ГДЕ написать Ссылка.УникальныйИдентификатор = &УИД?
Нет. У ссылки в языке запросов нет поля «УникальныйИдентификатор» — обращение к нему вызовет ошибку построения запроса. Сравнивайте сами ссылки: сначала получите ссылку через ПолучитьСсылку(УИД), затем передайте её параметром.
Чем отличается Строка(УИД) от XMLСтрока(УИД)?
Для уникального идентификатора обе функции возвращают одинаковый канонический вид. Разница существенна для других типов (даты, числа), поэтому при обменах принято использовать XMLСтрока как универсальный и предсказуемый вариант.
Почему запрос с ПРЕДСТАВЛЕНИЕ возвращает наименование, а не GUID?
Потому что функция применена к ссылке, а не к реквизиту типа УникальныйИдентификатор. Для ссылки представление — это видимое описание объекта (наименование, номер, дата). GUID ссылки в запросе строкой получить нельзя, только через код.
Как сопоставить объекты двух баз по УИД, если типы объектов разные?
Через регистр сведений соответствия: в одном измерении храните ссылку на объект, в другом — строковый или УИД-идентификатор внешнего объекта. Поиск ведите по регистру, а не по сравнению идентификаторов напрямую.
Строка GUID пришла в верхнем регистре — будет ли работать конструктор?
Да, конструктор УникальныйИдентификатор нечувствителен к регистру шестнадцатеричных цифр. А вот строковое сравнение двух GUID-строк регистрозависимо — при сопоставлении строками приводите обе к одному регистру через НРег или ВРег.