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

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

1С: ссылка как строка в запросе — как сравнивать и что учитывать

Как сравнить ссылку со строкой в запросе 1С: уникальный идентификатор, параметры типа Ссылка, функция ВЫРАЗИТЬ, типичные ошибки и ограничения платформы.

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

Понимание того, как платформа хранит и представляет ссылки, позволяет выбрать рабочий подход. У каждой ссылки есть уникальный идентификатор (GUID) — 32 шестнадцатеричных символа, которые часто и приходят из внешних систем в виде строки. Однако в запросе нет встроенной функции, которая преобразовала бы ссылку в её GUID-строку, и это главное ограничение, с которым приходится работать.

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

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

Язык запросов 1С выполняет строгую проверку типов операндов. Если написать условие вида ГДЕ Документ.Ссылка = "a1b2c3...", платформа сравнивает значение ссылочного типа со строковым литералом. Такое сравнение не вызывает явной ошибки во всех случаях, но результат всегда ложен: ссылка никогда не равна строке, и выборка окажется пустой.

Отдельная ловушка — сравнение с представлением. Когда разработчик видит в отладчике ссылку как «Реализация товаров 0000-000123 от 12.03.2026», возникает соблазн сравнить поле с этой строкой. Но отображаемое значение формируется платформой динамически и не является хранимым значением поля.

Также в запросе недоступен метод УникальныйИдентификатор() — это метод встроенного языка, а не функция языка запросов. Поэтому конструкция вида Документ.Ссылка.УникальныйИдентификатор() в тексте запроса невозможна в принципе.

Способ 1: передать ссылку параметром запроса

Самый быстрый и корректный вариант — не превращать ссылку в строку, а наоборот, получить объект ссылки в коде и передать его в запрос параметром. Сравнение ссылка-ссылка выполняется по индексу и работает максимально быстро.

Если в коде уже есть ссылка (например, из формы, результата другого запроса или найденная по коду/номеру), достаточно установить параметр и сравнить поле с ним:

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

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

"ВЫБРАТЬ

| РеализацияТоваровУслуг.СуммаДокумента

|ИЗ

| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

|ГДЕ

| РеализацияТоваровУслуг.Контрагент = &Контрагент";

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

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

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

Способ 2: получить ссылку из строки GUID до запроса

Когда из внешней системы приходит строка с GUID, её нужно превратить в ссылку средствами встроенного языка, а уже затем использовать в запросе. Для этого служит конструктор Новый УникальныйИдентификатор(СтрокаGUID) и метод менеджера объекта ПолучитьСсылку().

СтрокаGUID = "b3e1c2a4-5f6d-4e7b-8c9d-0a1b2c3d4e5f";

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

СсылкаНаДокумент = Документы.РеализацияТоваровУслуг.ПолучитьСсылку(Идентификатор);

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

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

"ВЫБРАТЬ

| РеализацияТоваровУслуг.Дата,

| РеализацияТоваровУслуг.Номер

|ИЗ

| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

|ГДЕ

| РеализацияТоваровУслуг.Ссылка = &Ссылка";

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

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

Обратная задача — получить строку GUID из ссылки — решается в коде одной строкой: Строка(Ссылка.УникальныйИдентификатор()). Это полезно при выгрузке данных во внешние системы, где ссылку нужно передать текстом.

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

Способ 3: сравнение представления ссылки со строкой

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

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

"ВЫБРАТЬ

| Товары.Ссылка

|ИЗ

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

|ГДЕ

| ПРЕДСТАВЛЕНИЕ(Товары.Ссылка) ПОДОБНО &Шаблон";

Запрос.УстановитьПараметр("Шаблон", "%кабель%");

Этот приём оправдан только в узких сценариях: разовый поиск в консоли запросов, поиск по части наименования, когда других критериев нет. Для регулярной работы он не подходит по двум причинам. Во-первых, представление вычисляется для каждой строки таблицы, индексы не используются, и на больших справочниках запрос существенно замедляется. Во-вторых, представление документа зависит от формата номера и даты, которые могут меняться настройками, — сравнение на точное равенство становится ненадёжным.

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

Параметр типа Ссылка

Самый быстрый и надёжный вариант; требует, чтобы ссылка уже была получена в коде. Подходит всегда, когда есть доступ к объекту.

ПолучитьСсылку из GUID

Единственный корректный путь при обмене с внешними системами; требует знать тип объекта и валидный формат строки GUID.

ПРЕДСТАВЛЕНИЕ() ПОДОБНО

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

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

Отдельный сценарий — отборы в динамических списках и СКД, где пользователь или разработчик формирует условие программно. В отборах компоновки данных значение отбора также должно быть ссылкой, а не строкой. Если передать в Значение элемента отбора строку с GUID, отбор молча не сработает.

Правильная последовательность та же: сначала преобразовать строку в ссылку через ПолучитьСсылку(), затем присвоить её значению отбора с видом сравнения «Равно». Если нужен отбор по списку ссылок, используйте вид сравнения «В списке» и передавайте СписокЗначений со ссылочными элементами.

В произвольных запросах динамических списков действуют те же правила, что и в обычных запросах: параметры устанавливаются через Список.Параметры.УстановитьЗначениеПараметра(), и тип значения должен быть ссылочным.

Типичные ошибки и как их распознать

Первая и самая частая ошибка — передача в параметр строки вместо ссылки. Внешне код выглядит корректно, запрос выполняется без исключений, но возвращает пустую таблицу. Диагностируется проверкой ТипЗнч(Параметр) в отладчике.

Вторая ошибка — попытка использовать УникальныйИдентификатор() прямо в тексте запроса. Здесь платформа выдаёт ошибку компоновки запроса, и она видна сразу, в отличие от первого случая.

Третья группа ошибок связана с форматом GUID: лишние пробелы, фигурные скобки вокруг строки (формат {b3e1c2a4-...} встречается в выгрузках), недопустимые символы. Конструктор Новый УникальныйИдентификатор() в этом случае выбрасывает исключение — его стоит оборачивать в попытку при обработке данных из внешних источников.

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

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

После реализации любого из способов проверьте три вещи. Во-первых, тип параметра: в отладчике значение должно иметь ссылочный тип конкретного объекта, например «ДокументСсылка.РеализацияТоваровУслуг». Во-вторых, наличие данных: выполните запрос без условия и убедитесь, что искомый объект вообще есть в таблице. В-третьих, скорость: на рабочих объёмах запрос с параметром-ссылкой должен выполняться практически мгновенно; если нет — проверьте, не применяется ли к полю функция, отключающая индекс.

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

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

Тип значения параметра в отладчике
Норма

Ссылочный тип конкретного объекта метаданных

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

Тип «Строка» — сравнение никогда не сработает

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

Объект найден по известному GUID

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

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

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

Мгновенный отклик при сравнении по ссылке

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

Заметная задержка — вероятно, в условии функция ПРЕДСТАВЛЕНИЕ или ВЫРАЗИТЬ

Итог

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

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

Частые вопросы

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

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

Почему запрос с параметром-строкой не выдаёт ошибку, но ничего не находит?

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

Как найти объект, если известен GUID, но неизвестен его тип?

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

Чем опасно использование ПРЕДСТАВЛЕНИЕ() в условии запроса?

Функция вычисляется для каждой строки таблицы, поэтому индексы не применяются, и на больших таблицах запрос выполняется долго. Кроме того, текст представления зависит от настроек формата номера и даты, поэтому точное сравнение ненадёжно.

Как передать GUID в запрос из внешней системы через веб-сервис?

Принимайте GUID строковым параметром, в коде веб-сервиса преобразуйте его через Новый УникальныйИдентификатор() внутри блока Попытка/Исключение, получите ссылку методом ПолучитьСсылку() и передайте её в запрос параметром ссылочного типа.

Работает ли сравнение ссылки со строкой в СКД и динамических списках?

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