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

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

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

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

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

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

Зачем нужен оператор ВЫРАЗИТЬ

В типовых конфигурациях многие реквизиты имеют составной тип: например, поле «Регистратор» в регистре накопления может ссылаться на десятки видов документов. Если соединить таблицу по такому полю без приведения типа, платформа будет проверять все возможные типы, и запрос заметно замедлится.

Вторая причина — строки неограниченной длины. Реквизиты типа «Строка (неограниченная)» нельзя использовать в группировках и сравнениях без потери производительности, а в некоторых случаях запрос вообще откажется выполняться. Приведение к строке фиксированной длины решает проблему.

Третья причина — корректная работа конструкций ВЫБОР КОГДА и объединений. Если ветки возвращают значения разных типов, явное приведение делает результат предсказуемым и упрощает дальнейшую обработку в СКД или коде.

Синтаксис и допустимые типы

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

bsl
ВЫБРАТЬ
	ВЫРАЗИТЬ(Таб.Комментарий КАК СТРОКА(100)) КАК КомментарийКраткий,
	ВЫРАЗИТЬ(Таб.Сумма КАК ЧИСЛО(15, 2)) КАК Сумма,
	ВЫРАЗИТЬ(Таб.Регистратор КАК Документ.РеализацияТоваровУслуг) КАК Реализация
ИЗ
	РегистрНакопления.Продажи КАК Таб

Для ссылочных типов указывается полное имя объекта метаданных: Справочник.Контрагенты, Документ.ПоступлениеТоваровУслуг, ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения. Если значение не соответствует указанному типу, результатом будет пустая ссылка этого типа, а не ошибка — это важно учитывать при проверках.

Приведение строк и чисел

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

Для чисел приведение меняет точность и разрядность. Это полезно, когда в разных таблицах одно и то же по смыслу поле описано с разной точностью: сравнение ЧИСЛО(15,2) и ЧИСЛО(10,2) в соединении может дать неожиданные результаты, а явное приведение выравнивает форматы.

При уменьшении разрядности лишние знаки округляются по правилам платформы. Если критична точность расчётов, лучше приводить оба операнда к большей точности, а не к меньшей.

Работа с составными типами и ссылками

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

bsl
ВЫБРАТЬ
	Продажи.Номенклатура,
	СУММА(Продажи.Количество) КАК Количество
ИЗ
	РегистрНакопления.Продажи КАК Продажи
ГДЕ
	Продажи.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
СГРУППИРОВАТЬ ПО
	Продажи.Номенклатура

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

ВЫРАЗИТЬ в соединениях, ВЫБОР КОГДА и ОБЪЕДИНИТЬ

При соединении виртуальных таблиц с полями составного типа приведение в условии соединения сокращает объём проверяемых записей. Оптимизатор СУБД получает чёткий тип и строит более эффективный план.

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

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

Полезная привычка: в запросах к регистрам сведений и накоплений сразу приводить измерения составного типа к конкретному виду, даже если сейчас фильтрация не требуется. Это страхует от деградации скорости при росте объёма данных и появлении новых видов документов в составном типе.
ПЗ
Практическое замечание

Типичные ошибки и ограничения

Типичные ошибки
01
Попытка превратить строку в число через ВЫРАЗИТЬ — оператор не конвертирует данные, результатом будет NULL или ошибка; конвертацию делают в коде.
02
Обращение к реквизиту через точку от поля составного типа без ВЫРАЗИТЬ — запрос соединяется со всеми таблицами типа и работает медленно.
03
Слишком короткая длина строки в СТРОКА(N) — данные молча обрезаются, и сравнение или группировка дают неверный результат.
04
Приведение к типу, которого нет в составном поле, — все значения становятся пустыми ссылками, и выборка оказывается пустой.

Есть и ограничения синтаксиса. Нельзя приводить к типу «Тип», нельзя использовать ВЫРАЗИТЬ в параметрах виртуальных таблиц — там тип задаётся иначе, через условие в параметрах. В итогах (ИТОГИ ПО) приведённое поле используется как обычное, проблем не возникает.

Ещё одна тонкость: ВЫРАЗИТЬ(... КАК СТРОКА(N)) для значения NULL вернёт NULL, а не пустую строку. Если дальше идёт сравнение с пустой строкой, добавьте ЕСТЬNULL.

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

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

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

Тип колонки в результате
Норма

Колонка имеет один ожидаемый тип, виден в консоли запросов

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

Составной тип сохранился — ВЫРАЗИТЬ не применён или применён не к тому полю

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

Совпадает с количеством при выборке без приведения и условий

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

Строк меньше — часть значений превратилась в пустые ссылки и отфильтровалась

Скорость выполнения
Норма

Соединение по приведённому полю выполняется заметно быстрее

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

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

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

Итог

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

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

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

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

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

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

Нет. Оператор приводит тип, но не выполняет конвертацию содержимого. Строковое значение, приведённое к ЧИСЛО, даст NULL. Преобразование делают средствами встроенного языка (Число()) либо через вычисляемые конструкции с проверкой содержимого.

Что происходит со значением неподходящего типа?

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

Почему запрос с ВЫРАЗИТЬ всё равно работает медленно?

Приведение типа помогает только когда оно применено к полю, участвующему в соединении или фильтрации. Если медленная часть — обращение к реквизитам через точку от составного поля, нужно привести тип до такого обращения. Также проверьте индексы и не фильтруете ли вы по вычисляемому выражению, которое блокирует использование индекса.

Можно ли использовать ВЫРАЗИТЬ в параметрах виртуальной таблицы?

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

Как узнать, какие типы входят в составное поле?

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