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