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

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

Ссылка как строка в запросе 1С: способы преобразования

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

В языке запросов 1С ссылка — это служебный тип данных, который нельзя напрямую привести к строке привычными функциями. Когда возникает задача вывести ссылку в отчёт, передать её в параметр, сравнить с текстовым значением или выгрузить уникальный идентификатор, разработчик сталкивается с ограничениями платформы: функции СТРОКА() в языке запросов не существует, а прямое приведение типов для ссылок не поддерживается.

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

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

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

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

Попытка написать ВЫРАЗИТЬ(Ссылка КАК Строка(36)) приведёт к ошибке конструктора запроса или ошибке выполнения: платформа не умеет выполнять такое приведение на уровне СУБД. Это принципиальное ограничение архитектуры, а не недоработка конкретной версии платформы.

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

Получение текстового представления: ПРЕДСТАВЛЕНИЕ и ПРЕДСТАВЛЕНИЕССЫЛКИ

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

ВЫБРАТЬ

ПРЕДСТАВЛЕНИЕССЫЛКИ(Продажи.Номенклатура) КАК НоменклатураСтрокой,

ПРЕДСТАВЛЕНИЕССЫЛКИ(Продажи.Регистратор) КАК ДокументСтрокой

ИЗ

РегистрНакопления.Продажи КАК Продажи

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

Важное ограничение: представление нельзя использовать для идентификации объекта. Два элемента справочника «Номенклатура» могут иметь одинаковое наименование, и по строке «Товар А» вы не восстановите конкретную ссылку. Представление подходит только для вывода в отчёты, печатные формы и сообщения пользователю.

Получение строковых реквизитов через точку

Если нужна не вся строка представления, а конкретное строковое значение объекта, надёжнее обратиться к реквизиту напрямую: Ссылка.Наименование, Ссылка.Номер, Ссылка.Код. Такие поля уже имеют строковый тип, и с ними можно работать стандартными строковыми операциями запроса.

ВЫБРАТЬ

Товары.Ссылка.Код КАК Код,

Товары.Ссылка.Наименование КАК Наименование,

Товары.Ссылка.НаименованиеПолное КАК ПолноеНаименование

ИЗ

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

ГДЕ

Товары.Ссылка.Наименование ПОДОБНО &Шаблон

Для документов аналогично доступны Номер и Дата. Комбинация этих полей часто заменяет представление: например, в выгрузке для сторонней системы удобнее передать номер и дату отдельными колонками, чем склеенную строку вида «Реализация 0000-001234 от 12.03.2026».

Учитывайте составной тип: если поле запроса имеет составной тип ссылки (например, регистратор в регистре), обращение через точку к реквизиту, которого нет у части типов, вернёт NULL для несовместимых записей. Фильтруйте по типу через ВЫБОР КОГДА Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг ТОГДА ....

Уникальный идентификатор ссылки как строка

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

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

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

"ВЫБРАТЬ

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

|ИЗ

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

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

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

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

// Например: "a1b2c3d4-e5f6-7890-abcd-ef1234567890"

КонецЦикла;

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

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

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

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

ВЫБРАТЬ

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

ИЗ

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

ГДЕ

Номенклатура.Код = &КодСтрокой

Частая ошибка — попытка сравнить ссылку со строкой напрямую: ГДЕ Ссылка = &СтрокаСсылки, где параметр содержит текст. Такой запрос либо не выполнится, либо вернёт пустой результат, потому что типы несовместимы. Параметр должен иметь ссылочный тип: передайте в него ссылку, полученную через ПолучитьСсылку() или из другого объекта.

Для поиска по представлению используйте ПОДОБНО с наименованием, но помните о производительности: поиск по подстроке без индекса на больших справочниках выполняется медленно. Если такой поиск нужен регулярно, лучше искать по коду или добавить отдельное индексированное поле.

Порядок действий при выгрузке ссылки строкой
  1. 1
    Определите, что именно нужно: представление для пользователя, реквизит объекта или GUID для интеграции
  2. 2
    Для отчёта используйте ПРЕДСТАВЛЕНИЕССЫЛКИ(Поле) прямо в тексте запроса
  3. 3
    Для GUID выберите Ссылку в запросе и преобразуйте её программно: Строка(Ссылка.УникальныйИдентификатор())
  4. 4
    Проверьте результат на тестовых данных: строка не пустая, формат соответствует ожиданиям, значения уникальны там, где требуется уникальность

Типичные ошибки и их последствия

Первая распространённая ошибка — использование представления для объединения таблиц. Запрос выполняется, но строки с одинаковыми наименованиями склеиваются неправильно, и в отчёте появляются задвоения или чужие данные. Соединять таблицы нужно строго по ссылке.

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

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

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

Проверка результата и выбор подходящего способа

После реализации проверьте три вещи: тип возвращаемого поля (строка, а не ссылка), непустоту значений на реальных данных и уникальность там, где строка используется как ключ. Быстрее всего это сделать в консоли запросов, выведя поле рядом с исходной ссылкой и сверив несколько строк вручную.

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

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

Маршрут решения

Как выбрать способ

Нужно показать объект пользователю в отчёте или сообщенииИспользуйте ПРЕДСТАВЛЕНИЕССЫЛКИ(Ссылка) прямо в запросе
Нужен код, номер или наименование как отдельные строкиОбратитесь к реквизитам через точку: Ссылка.Код, Ссылка.Наименование
Нужен GUID для обмена с внешней системойВыберите Ссылку в запросе и преобразуйте программно: Строка(Ссылка.УникальныйИдентификатор())
Нужно найти объект по строке из внешних данныхИщите по реквизитам (код, наименование) или преобразуйте строку GUID в ссылку до запроса
Итог

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

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

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

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

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

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

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

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

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

Как вывести ссылку строкой в СКД?

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

Можно ли по строке представления восстановить ссылку?

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

Влияет ли ПРЕДСТАВЛЕНИЕССЫЛКИ на производительность запроса?

Да, вычисление представления требует обращения к данным объекта для каждой строки результата. На небольших выборках это незаметно, но в запросах по миллионам записей и в условиях отбора функция заметно замедляет выполнение. Фильтруйте по ссылке и выводите представление только в финальном наборе полей.