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