Разработка и Конфигурация · 12 мин
Ссылка как строка в запросе 1С: способы преобразования
Как в запросе 1С получить ссылку как строку: ПРЕДСТАВЛЕНИЕ, ПРЕДСТАВЛЕНИЕССЫЛКИ, УникальныйИдентификатор, вычисляемые поля. Примеры, ошибки, FAQ.
В языке запросов 1С ссылка — это служебный тип данных, который нельзя напрямую привести к строке привычными функциями. Когда возникает задача вывести ссылку в отчёт, передать её в параметр, сравнить с текстовым значением или выгрузить уникальный идентификатор, разработчик сталкивается с ограничениями платформы: функции СТРОКА() в языке запросов не существует, а прямое приведение типов для ссылок не поддерживается.
На практике используются несколько обходных путей: функции ПРЕДСТАВЛЕНИЕ и ПРЕДСТАВЛЕНИЕССЫЛКИ, получение реквизитов ссылки (код, наименование, номер), а также программное преобразование через Строка(Ссылка.УникальныйИдентификатор()) уже после выполнения запроса. У каждого способа есть свои ограничения: представление не гарантирует уникальности, уникальный идентификатор нельзя получить непосредственно в тексте запроса, а разные типы ссылок требуют разной обработки.
Ниже разобраны рабочие приёмы с примерами кода, их границы применимости и типичные ошибки, которые приводят к пустым результатам или ошибкам выполнения запроса.
Почему ссылку нельзя просто преобразовать в строку
Язык запросов 1С работает с типизированными полями, и ссылка в нём — составной объект, содержащий тип объекта и уникальный идентификатор. В отличие от встроенного языка, где доступна функция Строка(), в запросе такой функции нет, а операторы приведения типов (ВЫРАЗИТЬ) работают только с примитивными типами: числом, строкой, датой, булево.
Попытка написать ВЫРАЗИТЬ(Ссылка КАК Строка(36)) приведёт к ошибке конструктора запроса или ошибке выполнения: платформа не умеет выполнять такое приведение на уровне СУБД. Это принципиальное ограничение архитектуры, а не недоработка конкретной версии платформы.
Поэтому задача «ссылка как строка» всегда решается косвенно: либо получением текстового представления, либо извлечением строковых реквизитов объекта, либо программной обработкой результата запроса.
Получение текстового представления: ПРЕДСТАВЛЕНИЕ и ПРЕДСТАВЛЕНИЕССЫЛКИ
Самый частый способ вывести ссылку как строку — функция ПРЕДСТАВЛЕНИЕССЫЛКИ(). Она принимает ссылочное поле и возвращает строку, которую пользователь видит в интерфейсе: наименование для справочника, номер и дату для документа.
ВЫБРАТЬ
ПРЕДСТАВЛЕНИЕССЫЛКИ(Продажи.Номенклатура) КАК НоменклатураСтрокой,
ПРЕДСТАВЛЕНИЕССЫЛКИ(Продажи.Регистратор) КАК ДокументСтрокой
ИЗ
РегистрНакопления.Продажи КАК Продажи
Функция ПРЕДСТАВЛЕНИЕ() работает шире: она формирует представление для поля любого типа, включая примитивные. Для ссылочных полей обе функции дают одинаковый результат, но ПРЕДСТАВЛЕНИЕССЫЛКИ явно показывает намерение разработчика и понятнее при чтении кода.
Важное ограничение: представление нельзя использовать для идентификации объекта. Два элемента справочника «Номенклатура» могут иметь одинаковое наименование, и по строке «Товар А» вы не восстановите конкретную ссылку. Представление подходит только для вывода в отчёты, печатные формы и сообщения пользователю.
Получение строковых реквизитов через точку
Если нужна не вся строка представления, а конкретное строковое значение объекта, надёжнее обратиться к реквизиту напрямую: Ссылка.Наименование, Ссылка.Номер, Ссылка.Код. Такие поля уже имеют строковый тип, и с ними можно работать стандартными строковыми операциями запроса.
ВЫБРАТЬ
Товары.Ссылка.Код КАК Код,
Товары.Ссылка.Наименование КАК Наименование,
Товары.Ссылка.НаименованиеПолное КАК ПолноеНаименование
ИЗ
Справочник.Номенклатура КАК Товары
ГДЕ
Товары.Ссылка.Наименование ПОДОБНО &Шаблон
Для документов аналогично доступны Номер и Дата. Комбинация этих полей часто заменяет представление: например, в выгрузке для сторонней системы удобнее передать номер и дату отдельными колонками, чем склеенную строку вида «Реализация 0000-001234 от 12.03.2026».
Учитывайте составной тип: если поле запроса имеет составной тип ссылки (например, регистратор в регистре), обращение через точку к реквизиту, которого нет у части типов, вернёт NULL для несовместимых записей. Фильтруйте по типу через ВЫБОР КОГДА Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг ТОГДА ....
Уникальный идентификатор ссылки как строка
Уникальный идентификатор (GUID) — единственный способ получить строковое значение, которое однозначно идентифицирует ссылку. Проблема в том, что в языке запросов нет функции для его извлечения: запрос возвращает ссылку, а преобразование выполняется уже в коде встроенного языка.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ИдентификаторСтрокой = Строка(Выборка.Ссылка.УникальныйИдентификатор());
// Например: "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
КонецЦикла;
Обратное преобразование тоже выполняется программно: Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаИД)). Такая пара преобразований — стандартный приём при обмене данными с внешними системами, где ссылку нужно передавать текстом.
Если GUID нужен именно внутри запроса (например, для соединения с таблицей, загруженной из внешнего источника), придётся заранее подготовить временную таблицу «ссылка — идентификатор» программно и передать её в запрос как параметр. Прямого пути через текст запроса нет.
Сравнение ссылки со строкой и поиск по строке
Обратная задача — найти объект по строке — решается поиском по реквизитам, а не по самой ссылке. Если известен код или наименование, фильтр ставится по этим полям; если известен GUID, он преобразуется в ссылку программно до выполнения запроса.
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Код = &КодСтрокой
Частая ошибка — попытка сравнить ссылку со строкой напрямую: ГДЕ Ссылка = &СтрокаСсылки, где параметр содержит текст. Такой запрос либо не выполнится, либо вернёт пустой результат, потому что типы несовместимы. Параметр должен иметь ссылочный тип: передайте в него ссылку, полученную через ПолучитьСсылку() или из другого объекта.
Для поиска по представлению используйте ПОДОБНО с наименованием, но помните о производительности: поиск по подстроке без индекса на больших справочниках выполняется медленно. Если такой поиск нужен регулярно, лучше искать по коду или добавить отдельное индексированное поле.
- 1Определите, что именно нужно: представление для пользователя, реквизит объекта или GUID для интеграции
- 2Для отчёта используйте ПРЕДСТАВЛЕНИЕССЫЛКИ(Поле) прямо в тексте запроса
- 3Для GUID выберите Ссылку в запросе и преобразуйте её программно: Строка(Ссылка.УникальныйИдентификатор())
- 4Проверьте результат на тестовых данных: строка не пустая, формат соответствует ожиданиям, значения уникальны там, где требуется уникальность
Типичные ошибки и их последствия
Первая распространённая ошибка — использование представления для объединения таблиц. Запрос выполняется, но строки с одинаковыми наименованиями склеиваются неправильно, и в отчёте появляются задвоения или чужие данные. Соединять таблицы нужно строго по ссылке.
Вторая ошибка — ожидание, что ПРЕДСТАВЛЕНИЕССЫЛКИ вернёт GUID. Функция возвращает пользовательское представление, и попытка распарсить его как идентификатор обречена. Для идентификатора существует только программный путь.
Третья ошибка — использование ПРЕДСТАВЛЕНИЕ в условиях отбора СКД или динамического списка без необходимости. Функция представления вычисляется для каждой строки и мешает оптимизатору, что заметно замедляет выборку на больших объёмах. Отбирайте по ссылке, а представление выводите только в итоговом наборе полей.
Проверка результата и выбор подходящего способа
После реализации проверьте три вещи: тип возвращаемого поля (строка, а не ссылка), непустоту значений на реальных данных и уникальность там, где строка используется как ключ. Быстрее всего это сделать в консоли запросов, выведя поле рядом с исходной ссылкой и сверив несколько строк вручную.
Выбор способа зависит от цели. Для отчётов и печатных форм достаточно ПРЕДСТАВЛЕНИЕССЫЛКИ. Для выгрузки в стороннюю систему, где объект идентифицируется кодом, выводите реквизиты через точку. Для интеграций, где нужна строгая идентификация, передавайте GUID, полученный программно после запроса.
Если строковое представление ссылки требуется в запросе регулярно и в больших объёмах (например, для обмена), рассмотрите вариант хранить GUID в отдельном строковом реквизите объекта и заполнять его при записи. Это избыточно, но снимает необходимость программной постобработки и ускоряет выборки.
Как выбрать способ
Что важно запомнить
Прямого приведения ссылки к строке в запросе 1С нет. Для вывода используйте ПРЕДСТАВЛЕНИЕССЫЛКИ, для данных объекта — реквизиты через точку, для уникальной идентификации — программное преобразование уникального идентификатора. Соединения и сравнения выполняйте только по ссылке, а не по её строковому виду.
Частые вопросы
Можно ли в запросе получить GUID ссылки без программного кода?
Нет, функции извлечения уникального идентификатора в языке запросов не существует. Обходной путь — выбрать ссылку и преобразовать её после выполнения: Строка(Выборка.Ссылка.УникальныйИдентификатор()). Если GUID нужен внутри запроса, заранее сформируйте временную таблицу «ссылка — идентификатор» и передайте её параметром.
Чем ПРЕДСТАВЛЕНИЕ отличается от ПРЕДСТАВЛЕНИЕССЫЛКИ?
Для ссылочных полей результат одинаковый. ПРЕДСТАВЛЕНИЕ универсальнее и работает с любыми типами (числа, даты, строки), а ПРЕДСТАВЛЕНИЕССЫЛКИ предназначена только для ссылок и яснее отражает намерение разработчика. В запросах с отборами обе функции лучше использовать только в списке полей, а не в условиях.
Почему сравнение ссылки со строкой возвращает пустой результат?
Потому что типы несовместимы: ссылка и строка никогда не равны. Платформа либо выдаёт ошибку, либо молча не находит совпадений. Передайте в параметр ссылку нужного типа — получите её через ПолучитьСсылку() из GUID или выберите из базы по коду или наименованию.
Как вывести ссылку строкой в СКД?
Добавьте в набор данных вычисляемое поле с выражением ПРЕДСТАВЛЕНИЕССЫЛКИ(Ссылка) или выведите реквизиты через точку (Ссылка.Наименование). В пользовательских настройках отчёта поле будет доступно как обычная строка. Учитывайте, что группировка по представлению объединит разные объекты с одинаковым текстом.
Можно ли по строке представления восстановить ссылку?
Надёжно — нет: представление не уникально и может меняться при смене настроек объекта. Восстановление возможно только по уникальным реквизитам (код с установленной уникальностью) или по GUID через Справочники.ИмяСправочника.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаИД)).
Влияет ли ПРЕДСТАВЛЕНИЕССЫЛКИ на производительность запроса?
Да, вычисление представления требует обращения к данным объекта для каждой строки результата. На небольших выборках это незаметно, но в запросах по миллионам записей и в условиях отбора функция заметно замедляет выполнение. Фильтруйте по ссылке и выводите представление только в финальном наборе полей.