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

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

Как в запросе 1С выразить поле как ссылку: ВЫРАЗИТЬ КАК

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

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

Типичная ситуация: в регистре сведений или документе есть поле «Объект» составного типа — СправочникСсылка.Номенклатура и СправочникСсылка.Контрагенты. Чтобы получить наименование номенклатуры, необходимо написать ВЫРАЗИТЬ(Поле.Объект КАК Справочник.Номенклатура).Наименование. Значения других типов при этом превратятся в NULL, что нужно учитывать при построении отборов и соединений.

Кроме ссылок, ВЫРАЗИТЬ применяется для усечения строк до нужной длины, приведения чисел к заданной точности и преобразования к дате. Это важно при объединениях запросов (ОБЪЕДИНИТЬ ВСЕ), где типы полей во всех частях должны совпадать, и при создании временных таблиц, где платформа строит индексы по типам полей.

Синтаксис ВЫРАЗИТЬ и допустимые типы

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

ВЫБРАТЬ

ВЫРАЗИТЬ(Таблица.Объект КАК Справочник.Номенклатура) КАК Номенклатура,

ВЫРАЗИТЬ(Таблица.Комментарий КАК Строка(100)) КАК КороткийКомментарий,

ВЫРАЗИТЬ(Таблица.Количество КАК Число(15, 3)) КАК Количество

ИЗ

РегистрСведений.СвойстваОбъектов КАК Таблица

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

Выразить поле как ссылку для доступа к реквизитам

Основной сценарий — обращение к реквизитам составного ссылочного поля. Платформа не знает заранее, ссылка какого вида лежит в конкретной строке, поэтому прямое обращение Поле.Наименование к составному полю либо запрещено, либо порождает неявные соединения со всеми таблицами возможных типов. Это резко замедляет запрос и может приводить к дублированию строк.

ВЫБРАТЬ

ВЫРАЗИТЬ(ЗначенияСвойств.Объект КАК Справочник.Номенклатура).Артикул КАК Артикул,

ВЫРАЗИТЬ(ЗначенияСвойств.Объект КАК Справочник.Номенклатура).Наименование КАК Наименование

ИЗ

РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойств

ГДЕ

ЗначенияСвойств.Объект ССЫЛКА Справочник.Номенклатура

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

Приведение типов в соединениях и отборах

Вторая частая задача — соединение таблиц по составному полю. Если в одной таблице поле составного типа, а в другой — ссылка конкретного вида, соединение без приведения заставит СУБД сравнивать значения разных типов, что мешает использованию индексов. Приведение поля к конкретному ссылочному типу в условии соединения выравнивает типы и ускоряет выполнение.

ВЫБРАТЬ

Заказы.Номер,

ВЫРАЗИТЬ(Заказы.Контрагент КАК Справочник.Контрагенты).ИНН КАК ИНН

ИЗ

Документ.ЗаказПокупателя КАК Заказы

ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты

ПО (ВЫРАЗИТЬ(Заказы.Контрагент КАК Справочник.Контрагенты) = Контрагенты.Ссылка)

В отборах (ГДЕ, параметры виртуальных таблиц) ВЫРАЗИТЬ обычно не нужна: сравнение составного поля со ссылкой конкретного типа платформа выполняет корректно. Но приведение бывает полезно, когда параметр отбора имеет составной тип, а поле — одиночный, или когда нужно сравнить строковое представление с усечённым значением. Не применяйте ВЫРАЗИТЬ к полю в условии без необходимости: функция над полем может отключить использование индекса по этому полю.

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

ВЫРАЗИТЬ для строк, чисел и дат

Для примитивных типов функция работает как усечение или округление. ВЫРАЗИТЬ(Поле КАК Строка(50)) обрежет строку до 50 символов, ВЫРАЗИТЬ(Поле КАК Число(10, 2)) приведёт число к двум знакам после запятой. Это стандартный приём при объединении запросов: если в одной части поле Строка(100), а в другой — Строка(200), приведите оба к одному типу, иначе объединение может дать ошибку несовместимости типов.

Приведение к Дате полезно для отсечения времени: ВЫРАЗИТЬ(Документ.Дата КАК Дата) в ряде случаев позволяет сгруппировать документы по дню, хотя для этой задачи чаще применяют НАЧАЛОПЕРИОДА. Учтите, что ВЫРАЗИТЬ к примитивному типу не выполняет преобразование между несовместимыми типами: строку «123» в число так не перевести, для этого потребуются обходные приёмы или обработка в коде.

ВЫРАЗИТЬ против альтернатив

ВЫРАЗИТЬ КАК ссылка

Приводит составное поле к конкретному виду ссылки, открывает доступ к реквизитам. Значения других типов становятся NULL

Оператор ССЫЛКА

Только проверяет тип значения (ИСТИНА/ЛОЖЬ) и подходит для отборов, но не даёт доступа к реквизитам

ТИПЗНАЧЕНИЯ()

Возвращает тип значения для сравнения в условии; используется в паре с ТИП() для фильтрации по виду объекта

Проверка результата и ограничения

После написания запроса проверьте его в консоли запросов на реальных данных. Признак корректной работы: реквизиты ссылки заполнены для строк нужного типа и равны NULL для остальных. Если все значения реквизитов пустые — вероятно, приведённый тип не совпадает с фактическим типом данных в поле, либо поле вообще не ссылочное. Проверить фактические типы помогает запрос с ТИПЗНАЧЕНИЯ(Поле) в выборке.

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

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

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

Реквизиты приведённой ссылки
Норма

Заполнены для строк нужного типа, NULL для остальных

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

NULL во всех строках — тип приведения не совпадает с данными

Скорость запроса
Норма

Запрос выполняется без неявных соединений, план использует индексы

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

Резкое замедление — вероятно, обращение к реквизитам без ВЫРАЗИТЬ

Количество строк
Норма

Совпадает с ожиданием после фильтра ССЫЛКА

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

Лишние строки с пустыми реквизитами — забыто условие по типу

Порядок действий при написании запроса

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

Если запрос строится динамически в коде, формируйте текст приведения через подстановку имени объекта метаданных, полученного из описания типов реквизита. Это надёжнее, чем жёсткое кодирование имён справочников: при переименовании объекта запрос не сломается. Для запросов в СКД помните, что поля-выражения с ВЫРАЗИТЬ нужно явно добавить в список выбранных полей, иначе конструктор настроек их не увидит.

Итог

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

ВЫРАЗИТЬ(Поле КАК Справочник.Имя) приводит составное поле к конкретному виду ссылки и открывает доступ к её реквизитам; несовпадающие типы превращаются в NULL. Дополняйте приведение фильтром ССЫЛКА, не используйте ВЫРАЗИТЬ в условиях без необходимости и проверяйте результат в консоли запросов.

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

Чем ВЫРАЗИТЬ отличается от оператора ССЫЛКА?

ВЫРАЗИТЬ меняет трактовку значения и позволяет обращаться к реквизитам ссылки через точку. ССЫЛКА — только проверка типа, возвращающая Истина или Ложь; она используется в условиях для фильтрации строк по виду объекта и не даёт доступа к реквизитам.

Почему после ВЫРАЗИТЬ реквизиты ссылки пустые?

Наиболее вероятная причина — фактический тип значения не совпадает с типом приведения, поэтому результат равен NULL. Проверьте реальные типы данных в поле запросом с ТИПЗНАЧЕНИЯ(Поле) и убедитесь, что выбранный вид ссылки входит в составной тип реквизита.

Можно ли выразить строку как число через ВЫРАЗИТЬ?

Нет, преобразование между несовместимыми типами (строка в число, строка в дата) функцией ВЫРАЗИТЬ не выполняется. Оно умеет усечь строку по длине, округлить число до заданной точности или привести составное ссылочное поле к одному из допустимых видов ссылок.

Нужно ли применять ВЫРАЗИТЬ, если поле имеет одиночный тип?

Нет, для поля с единственным ссылочным типом реквизиты доступны напрямую, и приведение ничего не даст. ВЫРАЗИТЬ оправдана только для составных типов, для усечения строк и чисел либо для выравнивания типов при объединении запросов.

Влияет ли ВЫРАЗИТЬ на производительность запроса?

Да, в обе стороны. Приведение составного поля перед обращением к реквизитам обычно ускоряет запрос, убирая неявные соединения. Но ВЫРАЗИТЬ над полем в условии отбора может отключить использование индекса по этому полю, поэтому в секции ГДЕ применяйте её только при реальной необходимости.

Работает ли ВЫРАЗИТЬ в параметрах виртуальных таблиц и СКД?

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