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

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

Выражение уникального идентификатора строкой в запросе 1С

Как выразить уникальный идентификатор как строку в запросе 1С: функция ПРЕДСТАВЛЕНИЕ, сравнение GUID со строкой, типичные ошибки и проверка результата.

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

Понимание того, что именно можно сделать внутри запроса, а что нужно делать в коде модуля, экономит часы отладки. Например, сравнение GUID со строкой напрямую в запросе невозможно, но параметр типа «УникальныйИдентификатор» передаётся без проблем, а ссылку из параметра-строки можно восстановить средствами встроенного языка до выполнения запроса.

Ниже разобраны рабочие приёмы: что делает ПРЕДСТАВЛЕНИЕ и почему оно не возвращает GUID, как передать идентификатор параметром, как получить строковое представление ссылки до запроса и как проверить, что результат соответствует ожиданиям.

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

Язык запросов 1С работает с типами данных, хранящимися в базе: числа, строки, даты, булево, ссылки. Уникальный идентификатор существует как свойство объекта встроенного языка, но в запросе ссылка представлена ссылочным типом, и операции приведения её к строке с GUID не предусмотрено. Конструкции вида ВЫРАЗИТЬ(Товары.Ссылка КАК Строка(36)) для ссылок не работают — выражение допустимо только для примитивных типов.

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

Важно не путать GUID ссылки и представление ссылки. Представление — это то, что видит пользователь (например, «Поступление товаров 000001 от 12.03»), а идентификатор — 32 шестнадцатеричных символа вида b2c1a0f4-..., уникальные для каждого объекта базы.

Что делает функция ПРЕДСТАВЛЕНИЕ и когда она нужна

Функция ПРЕДСТАВЛЕНИЕ() в запросе возвращает строковое представление значения. Для ссылочных типов она вычисляется на сервере СУБД через соединение с основной таблицей объекта, поэтому возвращает наименование, номер документа с датой или другое стандартное представление — но не GUID.

ВЫБРАТЬ

ПРЕДСТАВЛЕНИЕ(Номенклатура.Ссылка) КАК ПредставлениеТовара

ИЗ

Справочник.Номенклатура КАК Номенклатура

Типичная ошибка — ожидать, что ПРЕДСТАВЛЕНИЕ вернёт идентификатор. Если внешняя система передаёт строку GUID и нужно найти объект, ПРЕДСТАВЛЕНИЕ бесполезно: сравнение строки GUID с наименованием товара никогда не даст совпадения.

Применение ПРЕДСТАВЛЕНИЕ оправдано, когда нужно вывести читаемое значение ссылки в выгрузку или отчёт без обхода результата запроса в коде. Учитывайте, что функция создаёт дополнительное соединение таблиц и может замедлять запрос на больших выборках.

Сравнение ссылки с GUID через параметр запроса

Самый частый сценарий: из внешней системы пришла строка с GUID, нужно найти соответствующий объект. Правильный путь — преобразовать строку в значение типа «УникальныйИдентификатор» в коде, затем получить ссылку и передать её параметром.

GUID = Новый УникальныйИдентификатор(СтрокаИзВнешнейСистемы);

СсылкаНаТовар = Справочники.Номенклатура.ПолучитьСсылку(GUID);

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

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

"ВЫБРАТЬ

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

| Номенклатура.Наименование КАК Наименование

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| Номенклатура.Ссылка = &ИскомаяСсылка";

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

Результат = Запрос.Выполнить();

Здесь никакого преобразования GUID в строку внутри запроса не требуется: сравнение идёт по ссылочному типу, что работает быстро и использует индексы. Если объект с таким GUID не существует, запрос просто вернёт пустой результат — это нормальное поведение, а не ошибка.

Проверить существование объекта до запроса можно методом ПолучитьОбъект() с проверкой на Неопределено либо через пустую ссылку: у несуществующей ссылки запрос по реквизитам вернёт NULL. Для массового поиска по списку GUID выгоднее сформировать таблицу значений со ссылками и передать её как временную таблицу в запрос.

Поиск объекта по строке GUID
  1. 1
    Получите строку GUID из внешнего источника и очистите её от фигурных скобок и пробелов
  2. 2
    Создайте значение: Новый УникальныйИдентификатор(СтрокаGUID)
  3. 3
    Получите ссылку: Справочники.ИмяСправочника.ПолучитьСсылку(GUID)
  4. 4
    Передайте ссылку параметром в запрос и сравнивайте с полем Ссылка
  5. 5
    Проверьте результат: пустая выборка означает, что объект с таким GUID отсутствует

Как получить GUID строкой для выгрузки из запроса

Обратная задача — выгрузить данные вместе с идентификаторами, например в JSON или CSV для сторонней системы. Внутри запроса это невозможно, поэтому строку получают при обходе результата:

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

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

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

// дальше строка записывается в файл или структуру

КонецЦикла;

Метод УникальныйИдентификатор() доступен у любой ссылки. Оборачивание в Строка() даёт стандартный формат с дефисами: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx. Именно этот формат обычно ожидают внешние системы.

Если выгрузка массовая и обход в коде становится узким местом, альтернатива — использовать план обмена или сериализацию через ЗаписьJSON с типовыми механизмами, где идентификаторы выгружаются автоматически. Для разовых выгрузок обход выборки проще и прозрачнее.

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

Динамическое формирование текста запроса с GUID

Иногда встречается приём, когда GUID подставляют прямо в текст запроса строковой конкатенацией, чтобы потом сравнивать через ПРЕДСТАВЛЕНИЕ или строковые операции. Это антипаттерн: такой запрос не использует индексы, работает медленно и ломается при смене представлений объектов.

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

Если требуется сравнение по GUID в СКД или динамическом списке, где параметр со ссылкой недоступен, добавьте в запрос вычисляемое условие через параметр типа «УникальныйИдентификатор» не получится напрямую — вместо этого передайте ссылку, полученную заранее в коде, либо используйте отбор по ссылке в настройках компоновки.

Типичные ошибки
01
Ожидание, что ПРЕДСТАВЛЕНИЕ вернёт GUID — функция возвращает наименование или номер объекта, сравнение со строкой GUID никогда не срабатывает
02
Попытка ВЫРАЗИТЬ ссылку КАК Строка — язык запросов не поддерживает приведение ссылочных типов к строке, запрос падает с ошибкой
03
Сравнение строки GUID с полем Ссылка напрямую — несовместимость типов, условие не выполняется или запрос не компилируется
04
Конкатенация GUID в текст запроса — потеря индексации, медленная работа и риск синтаксических ошибок
05
Передача строки GUID параметром вместо ссылки — сравнение строки со ссылкой не даёт совпадений даже при правильном значении

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

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

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

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

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

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

36 символов с дефисами, шестнадцатеричные цифры

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

Лишние символы, скобки, неверная длина — исключение при создании

Результат запроса по ссылке
Норма

Одна строка с нужным объектом

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

Пустая выборка при существующем объекте — GUID из другой базы

Время выполнения
Норма

Запрос по ссылке выполняется мгновенно

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

Секунды на простом условии — вероятно, сравнение идёт по строкам без индекса

FAQ

Можно ли в запросе 1С получить GUID ссылки без обхода результата в коде?

Нет. Язык запросов не содержит функции преобразования ссылки в её уникальный идентификатор. Стандартный путь — получить ссылку в выборке и вызвать Ссылка.УникальныйИдентификатор() при обходе результата.

Чем ПРЕДСТАВЛЕНИЕ отличается от GUID?

ПРЕДСТАВЛЕНИЕ возвращает читаемое описание объекта: наименование элемента справочника или номер и дату документа. GUID — служебный 128-битный идентификатор, который не меняется при редактировании и не отображается пользователю. Это разные значения, и подменять одно другим нельзя.

Как найти объект, если внешняя система прислала GUID строкой?

Преобразуйте строку: GUID = Новый УникальныйИдентификатор(Строка), затем получите ссылку через МенеджерОбъекта.ПолучитьСсылку(GUID) и используйте её параметром запроса. Предварительно очищайте строку от фигурных скобок и пробелов.

Почему запрос с условием Ссылка = &СтрокаGUID не находит объект?

Потому что параметр содержит строку, а поле Ссылка — ссылочный тип. Сравнение разнотипных значений не даёт совпадений. Передавайте параметром именно ссылку, полученную через ПолучитьСсылку(), а не исходную строку.

Меняется ли GUID объекта при его редактировании или переносе?

При обычном редактировании GUID не меняется. Новый идентификатор объект получает только при создании. При обмене через типовые механизмы идентификаторы сохраняются, что позволяет сопоставлять объекты между базами. При загрузке через обработки, создающие объекты заново, GUID будет новым.

Как массово найти объекты по списку GUID?

Сформируйте таблицу значений с колонкой ссылок, заполнив её через ПолучитьСсылку() для каждого GUID, передайте таблицу параметром во временную таблицу запроса и выполните соединение с основной таблицей по ссылке. Это работает значительно быстрее цикла с отдельными запросами.

Итог

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

GUID нельзя вывести строкой внутри запроса 1С — ПРЕДСТАВЛЕНИЕ возвращает представление, а не идентификатор. Строку GUID преобразуйте в коде через Новый УникальныйИдентификатор(), получайте ссылку через ПолучитьСсылку() и передавайте параметром. Для выгрузки идентификаторов обходите результат запроса и вызывайте Ссылка.УникальныйИдентификатор().