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

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

Как выразить значение как число в запросе 1С

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

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

Без явного приведения запрос может вернуть неожиданный результат: строки «10» и «2» отсортируются как «10», «2», а сумма по полю составного типа окажется пустой. Понимание того, как работает приведение к числу, избавляет от трудноуловимых ошибок в отчётах и обработках.

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

Синтаксис функции ВЫРАЗИТЬ для числового типа

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

Пример простого запроса:

ВЫБРАТЬ

ВЫРАЗИТЬ(Товары.Код КАК ЧИСЛО(10, 0)) КАК КодЧислом

ИЗ

Справочник.Товары КАК Товары

Длина указывается в диапазоне от 1 до 38, точность — от 0 до значения длины. Если точность не указать, платформа по умолчанию применит дробную часть нулевой длины, то есть значение станет целым. Параметры длины и точности влияют не только на отображение, но и на результат округления: лишние знаки дробной части отсекаются с округлением.

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

Когда требуется приведение к числу

На практике приведение к числу в запросе нужно в нескольких типовых ситуациях. Первая — сортировка строкового поля, содержащего числа: артикулы, коды, номера документов, хранящиеся как строка. Без приведения сортировка идёт посимвольно, и «100» окажется раньше «20».

Вторая ситуация — соединение таблиц по полям разного типа. Если в одном регистре количество хранится как строка, а в другом как число, прямое соединение не даст совпадений. Приведение обоих полей к одному числовому типу решает задачу.

Третья — работа с полями составного типа. Когда реквизит может хранить и строку, и число, агрегатные функции СУММА, СРЕДНЕЕ по такому полю ведут себя непредсказуемо. Приведение к числу перед группировкой делает расчёт корректным.

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

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

Как выбрать действие

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

Преобразование строки в число

Платформа умеет преобразовывать в число строки, состоящие из цифр с необязательным знаком минус и разделителем дробной части. Пробелы по краям обычно не мешают. Однако если в строке встречаются буквы, разделители разрядов, символы валюты или нестандартные разделители, результатом будет NULL, а не ошибка выполнения запроса — это важно учитывать при проверке.

Пример с обработкой возможных NULL:

ВЫБРАТЬ

Данные.СтроковоеЗначение,

ЕСТЬNULL(ВЫРАЗИТЬ(Данные.СтроковоеЗначение КАК ЧИСЛО(15, 2)), 0) КАК ЧисловоеЗначение

ИЗ

РегистрСведений.Данные КАК Данные

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

Разделитель дробной части

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

Усечение точности и округление

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

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

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

Приведение полей составного типа и NULL

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

Это свойство используют как фильтр: сравнение результата приведения с NULL позволяет отобрать только те записи, где хранится именно число. Пример:

ВЫБРАТЬ

Данные.Объект,

ВЫРАЗИТЬ(Данные.Значение КАК ЧИСЛО(15, 2)) КАК ЧисловоеЗначение

ИЗ

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

ГДЕ

НЕ ВЫРАЗИТЬ(Данные.Значение КАК ЧИСЛО(15, 2)) ЕСТЬ NULL

Аналогично работает приведение даты к числу и обратно: платформа допускает преобразование даты в число (число секунд), однако такие приёмы используют редко и только при полном понимании последствий, поскольку переносимость между СУБД не гарантирована.

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

Типичные ошибки и как их избежать

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

Вторая ошибка — заниженная длина числа. Если указать ЧИСЛО(5, 2) для сумм, которые могут достигать миллионов, запрос упадёт с ошибкой переполнения или вернёт некорректные данные в зависимости от СУБД. Всегда закладывайте запас по разрядности.

Третья — приведение в условии соединения вместо приведения в выборке. Соединение по вычисляемому выражению не использует индексы и на больших таблицах приводит к полному перебору. По возможности нормализуйте данные заранее или соединяйтесь по исходным полям.

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

Типичные ошибки
01
Ожидание извлечения цифр из строки «12 шт.» — ВЫРАЗИТЬ вернёт NULL, а не 12
02
Заниженная длина ЧИСЛО(5, 2) для крупных сумм — переполнение или ошибка СУБД
03
Приведение типов в условии соединения — отказ от индексов и резкое замедление запроса
04
Игнорирование NULL в результате — заниженные итоги без сообщений об ошибке
05
Разная разрядность у полей в ОБЪЕДИНЕНИИ — неявные преобразования и потеря точности

Проверка результата и производительность

После написания запроса проверьте три вещи. Во-первых, тип результирующего поля: в консоли запросов тип отображается для каждой колонки, и там должно быть именно Число с нужной длиной и точностью. Во-вторых, долю NULL: выполните запрос с подсчётом строк, где приведённое поле ЕСТЬ NULL, — большое количество NULL говорит о «грязных» исходных данных. В-третьих, сходимость итогов: сумма по приведённому полю должна совпадать с контрольным расчётом по исходным данным.

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

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

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

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

Тип поля в результате запроса
Норма

Число с заданной длиной и точностью

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

Остался строкой или составным типом

Количество NULL после приведения
Норма

NULL нет или их число объяснимо качеством данных

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

Значительная часть строк стала NULL

Итоговая сумма по приведённому полю
Норма

Совпадает с контрольным расчётом по исходным данным

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

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

Время выполнения запроса
Норма

Сопоставимо с запросом без приведения

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

Появилось полное сканирование из-за ВЫРАЗИТЬ в условии

FAQ

Чем ВЫРАЗИТЬ отличается от функции Число() во встроенном языке?

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

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

Результатом будет NULL, а не ошибка выполнения. Поэтому при работе с непроверенными строковыми данными результат стоит оборачивать в ЕСТЬNULL или отдельно анализировать записи с NULL.

Можно ли указать ЧИСЛО без параметров длины и точности?

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

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

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

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

Приведение типа в условии соединения не позволяет СУБД использовать индекс по исходному полю, и таблица сканируется целиком. Решение — соединять по исходным полям, нормализовать данные заранее или перенести приведение во временную таблицу с последующим индексированием.

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

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

Итог

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

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