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

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

Запрос 1С: ВЫРАЗИТЬ как Число и округление

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

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

Важно понимать с самого начала: округление происходит по математическим правилам — цифра 5 и выше округляет вверх, меньше 5 — вниз. То есть ВЫРАЗИТЬ(2.5 КАК ЧИСЛО(10, 0)) вернёт 3, а ВЫРАЗИТЬ(2.4 КАК ЧИСЛО(10, 0)) вернёт 2. Специальных функций «округлить вверх» или «округлить вниз» в языке запросов 1С нет — их приходится эмулировать арифметически.

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

Синтаксис ВЫРАЗИТЬ КАК ЧИСЛО

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

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

ВЫБРАТЬ

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

ИЗ

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

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

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

Как округлить до целого, до копеек и до нужного знака

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

Типовые варианты:

  • ВЫРАЗИТЬ(Сумма КАК ЧИСЛО(15, 2)) — округление до копеек;
  • ВЫРАЗИТЬ(Количество КАК ЧИСЛО(15, 3)) — до тысячных долей единицы;
  • ВЫРАЗИТЬ(Дней КАК ЧИСЛО(10)) — до целого числа;
  • ВЫРАЗИТЬ(Сумма / 100 КАК ЧИСЛО(15, 0)) * 100 — округление до сотен.

Последний приём — округление не к знакам после запятой, а к разрядам целой части: сначала делим на нужный порядок, округляем до целого, затем умножаем обратно. Так можно округлить цену до десятков, сотен или тысяч рублей, что бывает нужно при ценообразовании.

Округление вверх и вниз: чего в запросах нет

В языке запросов 1С нет аналогов функций ОкрВверх и ОкрВниз. ВЫРАЗИТЬ всегда округляет математически. Если бизнес-правило требует всегда округлять в большую сторону (например, количество упаковок для отгрузки), применяют арифметический приём: прибавить 0,5 перед округлением для «вверх» или вычесть 0,5 для «вниз» — с поправкой на граничные случаи.

Более надёжный вариант для округления вверх до целого — через ВЫБОР:

ВЫБОР

КОГДА Количество = ВЫРАЗИТЬ(Количество КАК ЧИСЛО(15, 0))

ТОГДА Количество

ИНАЧЕ ВЫРАЗИТЬ(Количество КАК ЧИСЛО(15, 0)) + 1

КОНЕЦ КАК Упаковок

Здесь проверяется, совпадает ли исходное значение с округлённым. Если совпадает — число уже целое, если нет — берётся округлённое вниз плюс единица. Для округления вниз достаточно проверить, что математическое округление увеличило значение, и тогда вычесть единицу.

bsl
// Округление вверх до целого в запросе
ВЫБОР
	КОГДА Количество = ВЫРАЗИТЬ(Количество КАК ЧИСЛО(15, 0))
		ТОГДА Количество
	ИНАЧЕ ВЫРАЗИТЬ(Количество - 0.5 КАК ЧИСЛО(15, 0)) + 1
КОНЕЦ

Типовые сценарии применения

Расчёт сумм и НДС

Самый массовый сценарий — вычисление суммы документа или суммы НДС с округлением до копеек. Ошибка в копейках при дальнейшем сравнении с данными проведённого документа приводит к расхождениям, поэтому округлять нужно тем же способом и в том же месте, что и в типовой логике.

Приведение типов при соединениях

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

Группировка по округлённым значениям

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

Как добавить округление в существующий запрос
  1. 1
    Найдите выражение, результат которого нужно округлить (сумма, произведение, деление).
  2. 2
    Определите требуемую точность: 2 знака для денег, 3 для веса, 0 для целых.
  3. 3
    Оберните выражение в ВЫРАЗИТЬ(... КАК ЧИСЛО(длина, точность)) с запасом по длине.
  4. 4
    Выполните запрос в консоли запросов и проверьте граничные значения: 0,5; 1,005; отрицательные числа.
  5. 5
    Сравните результат с данными, рассчитанными типовым механизмом, чтобы правила округления совпадали.

Частые ошибки и ограничения

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

Вторая ошибка — ожидание «бухгалтерского» округления. Математическое округление 2,5 даёт 3, но −2,5 даёт −2 (округление по модулю в большую сторону от нуля работает иначе, чем ожидают некоторые разработчики). Проверяйте отрицательные значения отдельно, особенно в запросах по возвратам и сторно.

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

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

Проверка результата и альтернативы

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

Если правила округления сложнее математических (например, округление по настройкам валюты или до кратности упаковки), разумнее выполнить расчёт в коде встроенного языка через функцию Окр() с явным указанием режима округления, а запрос использовать только для выборки сырых данных. Смешивать оба подхода в одном расчёте не стоит — получите расхождения в копейках.

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

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

Значение 2,5 при ЧИСЛО(10, 0)
Норма

Результат 3

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

Результат 2 — проверьте версию платформы и СУБД

Отрицательное значение −2,5
Норма

Результат −3 или ожидаемое по принятому правилу

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

Результат не совпадает с логикой типового расчёта

Крупная сумма в пределах длины
Норма

Сумма выводится без ошибки

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

Ошибка переполнения — увеличьте длину

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

Копейки совпадают

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

Расхождение — правила округления различаются

Итог

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

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

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

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

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

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

Чаще всего причина в том, что исходное поле строковое или составного типа и содержит значение, которое нельзя интерпретировать как число. Проверьте содержимое поля до приведения и очистите данные от нечисловых символов.

Как округлить до целого всегда в меньшую сторону?

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

Работает ли ВЫРАЗИТЬ в итогах и группировках?

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

Что указать в длине, если не знаю максимальное значение?

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

Можно ли округлить до тысяч без деления и умножения?

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