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

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

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

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

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

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

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

Синтаксис функции ВЫРАЗИТЬ

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

Пример запроса с приведением числа и строки:

ВЫБРАТЬ

ВЫРАЗИТЬ(Товары.Сумма КАК ЧИСЛО(15, 2)) КАК Сумма,

ВЫРАЗИТЬ(Товары.Комментарий КАК СТРОКА(50)) КАК Комментарий

ИЗ

Документ.РеализацияТоваровУслуг.Товары КАК Товары

Если значение невозможно привести к указанному типу, результатом будет NULL. Это важно учитывать: например, при приведении ссылки составного типа к «чужому» справочнику вы получите не ошибку, а NULL, и такая строка может «потеряться» при соединении.

Округление и форматирование чисел

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

При указании меньшей целой части, чем реально содержится в числе, результат может стать NULL или некорректным в зависимости от СУБД. Поэтому разрядность целой части лучше задавать с запасом: для денежных сумм обычно достаточно ЧИСЛО(15, 2), для курсов и коэффициентов — ЧИСЛО(10, 4) или точнее.

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

Обрезка и приведение строк

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

Типичный сценарий — объединение данных из разных источников, где одно поле хранится как СТРОКА(50), а другое как строка неограниченной длины. Приведение обоих к одинаковой длине позволяет корректно выполнить соединение или сравнение.

Приведение ссылок составного типа

Если реквизит имеет составной тип (например, «ДокументОснование» может ссылаться на несколько видов документов), при соединении с конкретной таблицей рекомендуется явно привести ссылку:

ВЫБРАТЬ

Поступление.Номер,

ВЫРАЗИТЬ(Поступление.ДокументОснование КАК Документ.ЗаказПоставщику).Дата КАК ДатаЗаказа

ИЗ

Документ.ПоступлениеТоваровУслуг КАК Поступление

ГДЕ

Поступление.ДокументОснование ССЫЛКА Документ.ЗаказПоставщику

Условие с оператором ССЫЛКА отфильтровывает строки, где основание относится к другому виду документов — иначе поле ДатаЗаказа будет NULL. Такая пара «ВЫРАЗИТЬ + проверка ССЫЛКА» — стандартный приём при работе с составными типами.

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

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

Приведение даты и поля периода

К типу ДАТА приводят строковые или числовые представления дат редко, чаще ВЫРАЗИТЬ используют для отсечения времени у значения типа «дата со временем» — например, через приведение к ДАТА с последующим использованием функций НАЧАЛОПЕРИОДА. На практике для отсечения времени чаще применяют НАЧАЛОПЕРИОДА(Поле, ДЕНЬ), так как поведение ВЫРАЗИТЬ к ДАТА зависит от СУБД.

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

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

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

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

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

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

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

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

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

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

Совпадает с ожидаемым до приведения

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

Строки пропали — значения привелись в NULL

Числовые итоги
Норма

Суммы округлены до нужной точности

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

Появились NULL или обрезанные значения

Поля через точку после ВЫРАЗИТЬ
Норма

Заполнены для нужных видов ссылок

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

Пусто везде — неверно указан вид объекта

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

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

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

Можно ли использовать ВЫРАЗИТЬ в условии ГДЕ?

Да, функцию можно применять в условиях, например ГДЕ ВЫРАЗИТЬ(Поле КАК СТРОКА(10)) = "Значение". Однако такие условия обычно не используют индексы, поэтому на больших таблицах лучше фильтровать по исходному полю.

Что произойдёт, если строка длиннее указанной в СТРОКА(N)?

Строка будет обрезана до N символов, ошибка не возникнет. Отсечённая часть текста в результате запроса будет потеряна, поэтому длину стоит выбирать с запасом относительно реальных данных.

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

Значение ссылки относится к другому виду объекта, и приведение дало NULL. Добавьте условие Поле ССЫЛКА НужныйВид или убедитесь, что указали правильный вид справочника или документа.

Работает ли ВЫРАЗИТЬ в СКД и динамических списках?

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

Как округлить число до целого в запросе?

Приведите значение к типу с нулевой точностью: ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15, 0)). Округление выполняется арифметически — 0,5 и выше округляется в большую сторону.

Итог

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

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