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

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

Оператор ВЫРАЗИТЬ в языке запросов 1С: как приводить типы данных

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

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

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

Конструкция доступна как в консоли запросов, так и в тексте модуля, и ведёт себя одинаково на всех поддерживаемых СУБД — платформа сама транслирует её в соответствующий диалект SQL. Ниже разобраны синтаксис, типовые сценарии, ограничения и ошибки, которые чаще всего встречаются на практике.

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

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

Примеры корректного указания типов:

ВЫРАЗИТЬ(Поле КАК СТРОКА(50))

ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15, 2))

ВЫРАЗИТЬ(Поле КАК ДАТА)

ВЫРАЗИТЬ(Поле КАК БУЛЕВО)

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

ВЫРАЗИТЬ(Поле КАК Документ.РеализацияТоваровУслуг)

Для примитивных типов параметры обязательны там, где они определяют хранение: у строки — длина, у числа — разрядность и точность. Длина строки не может превышать ограничения платформы, а указание СТРОКА(0) означает неограниченную длину, что сводит смысл приведения на нет. Для ссылочных типов параметров нет — достаточно полного имени объекта метаданных.

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

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

ВЫБРАТЬ

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

ИЗ

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

ГДЕ

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

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

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

Усечение строк и работа с числами

Строки неограниченной длины нельзя использовать в соединениях, группировках и сравнениях на равенство — СУБД не умеет эффективно сравнивать поля типа «текст неограниченной длины». Стандартный приём — привести такую строку к фиксированной разумной длине:

ВЫРАЗИТЬ(Документ.Комментарий КАК СТРОКА(150)) КАК КомментарийКратко

Длина подбирается под задачу: для ключа соединения достаточно стольких символов, сколько реально различает записи; для вывода в отчёт — сколько помещается в колонку. Избыточная длина увеличивает объём обрабатываемых данных, недостаточная — склеивает разные значения в одну группу, что искажает итоги.

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

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

ВЫРАЗИТЬ в соединениях и условиях

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

ВЫБРАТЬ

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

Реализации.СуммаДокумента

ИЗ

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

ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК Реализации

ПО Заказы.Ссылка = ВЫРАЗИТЬ(Реализации.ЗаказКлиента КАК Документ.ЗаказКлиента)

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

При этом не стоит оборачивать ВЫРАЗИТЬ вокруг индексированного поля в условии ради «подстраховки», если типы и так совпадают: функция над полем в предикате мешает использованию индекса. Приведение оправдано только при реальном несовпадении или составности типов.

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

ВЫРАЗИТЬ и NULL: что происходит с пустыми значениями

Если исходное значение — NULL, результат приведения тоже NULL, независимо от целевого типа. Если значение не NULL, но не соответствует целевому типу (ссылка другого объекта, строка, не приводимая к ссылке), результат также NULL. Это удобно для мягкой фильтрации, но опасно при агрегации: СУММА(ВЫРАЗИТЬ(...)) проигнорирует все «неподходящие» значения без какого-либо предупреждения.

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

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

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

Число строк в результате
Норма

Совпадает с ожиданием по отбору ССЫЛКА

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

Строк меньше, чем записей нужного типа — значения ушли в NULL

Суммы по приведённым числам
Норма

Итог сходится с контрольным отчётом по исходным данным

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

Итог занижен — часть значений не привелась и отброшена

Группировка по усечённой строке
Норма

Количество групп соответствует реальному числу различных значений

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

Групп подозрительно мало — строки обрезаны слишком коротко

Типичные сценарии в реальных конфигурациях

Дополнительные реквизиты и сведения

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

Поля «Объект» и «Документ-основание»

Реквизиты вроде «Основание» или «Объект расчётов» часто имеют составной тип из десятков документов. Приведение к одному документу позволяет достать его реквизиты и построить связку «основание — проводка — сумма» без разворачивания всех веток составного типа.

Временные таблицы и пакетные запросы

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

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

Ограничения и альтернативы

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

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

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

Маршрут решения

Как выбрать подход

Поле составного типа, нужны реквизиты одного объектаВЫРАЗИТЬ к этому типу плюс фильтр ССЫЛКА в условии
Строка неограниченной длины участвует в соединении или группировкеВЫРАЗИТЬ к СТРОКА(N) с длиной, достаточной для различения значений
Нужно только проверить тип без приведенияОператор ССЫЛКА или ТИПЗНАЧЕНИЯ() вместо ВЫРАЗИТЬ
Требуется преобразовать строку в число или датуОбработка в коде после запроса — ВЫРАЗИТЬ такие преобразования не выполняет

Часто задаваемые вопросы

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

ВЫРАЗИТЬ изменяет тип значения в результате запроса и позволяет обращаться к реквизитам объекта через точку. ССЫЛКА — это только логическая проверка в условии: она отвечает на вопрос «является ли значение ссылкой заданного типа», но само значение не преобразует.

Что вернёт ВЫРАЗИТЬ, если тип значения не совпадает с указанным?

Результатом будет NULL, а не ошибка выполнения. Записи с несовпадающим типом молча исключаются из соединений и агрегатов, поэтому при работе с составными полями стоит контролировать количество строк до и после приведения.

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

Да, конструкция ВЫРАЗИТЬ(&Параметр КАК Справочник.Контрагенты) корректна и полезна, когда параметр передаётся как значение составного типа. Это помогает платформе сформировать более точный запрос к СУБД.

Почему соединение по составному полю работает медленно и как это исправить?

Оптимизатор СУБД не знает фактический тип значений и не может эффективно использовать индексы. Приведите поле к конкретному типу через ВЫРАЗИТЬ и добавьте фильтр ССЫЛКА — план запроса станет предсказуемым, а соединение ускорится.

Какую длину указывать при усечении строки для группировки?

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

Преобразует ли ВЫРАЗИТЬ строку «100» в число 100?

Нет. Оператор выполняет приведение типа на уровне трактовки значения, а не конвертацию форматов. Для преобразования строкового представления числа в число потребуется обработка в коде встроенного языка после выполнения запроса.

Итог

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

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