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