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