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

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

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

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

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

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

Ниже разобраны основные приёмы: округление в выборке и в итогах, работа с NULL, округление до целого и до копеек, различия между запросом и встроенным языком, а также типичные ошибки, из-за которых округление «не срабатывает» или даёт неверные итоги.

Как работает ВЫРАЗИТЬ для округления

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

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

Пример запроса, округляющего сумму продаж до копеек:

ВЫБРАТЬ

Товары.Номенклатура КАК Номенклатура,

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

ИЗ

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

Округление до целого, копеек и заданной разрядности

До целого числа

Для округления до целых укажите нулевую точность: ВЫРАЗИТЬ(Количество КАК ЧИСЛО(10, 0)). Значение 7,5 станет 8, значение 7,4 — 7. Это удобно при расчёте штучного количества упаковок, где дробная часть недопустима.

До копеек (двух знаков)

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

До десятков или сотен

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

bsl
ВЫРАЗИТЬ(Сумма * СтавкаНДС / 100 КАК ЧИСЛО(15, 2)) КАК СуммаНДС

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

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

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

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

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

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

NULL, составные типы и подводные камни

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

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

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

Отличия от округления во встроенном языке

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

Практический критерий выбора: если округление нужно для группировок, соединений или итогов — делайте его в запросе. Если оно касается финального отображения пары значений — дешевле округлить в коде при обходе выборки.

Сравнение вариантов

ВЫРАЗИТЬ в запросе

Работает в группировках и итогах, не требует обхода данных. Ограничение: только арифметическое округление, нет режимов вверх/вниз.

Окр() во встроенном языке

Гибкие режимы округления, удобно для финального отображения. Требует обхода результата запроса и не работает внутри агрегатов.

Округление в СКД

Форматная строка и настройки поля ресурса округляют при выводе, не меняя данные. Подходит для отчётов, но не для расчётов.

Проверка результата и типичные ошибки

Проверяйте округление в консоли запросов на контрольных значениях: 0,5 (граница округления), 2,675 (известная проблема двоичного представления дробей), отрицательные числа и NULL. Убедитесь, что итог по колонке сходится с ожидаемым и что тип поля результата — именно ЧИСЛО с нужной разрядностью.

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

Отдельно отметим поведение значений вида 2,675: из-за двоичного представления дробных чисел такое значение может округлиться до 2,67, а не до 2,68. Это не ошибка запроса, а особенность хранения вещественных чисел. В денежных расчётах, где критична каждая копейка, избегайте промежуточных дробных вычислений или согласуйте правило округления с методологией учёта.

Итог

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

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

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

Есть ли в языке запросов 1С функция ОКРУГЛИТЬ?

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

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

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

Почему ВЫРАЗИТЬ возвращает NULL вместо округлённого числа?

Чаще всего исходное значение равно NULL (например, после левого соединения) или поле строкового типа содержит нечисловые данные. Оберните поле в ЕСТЬNULL(Поле, 0) и проверьте тип источника данных.

Чем отличается округление в запросе от функции Окр() в коде?

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

Почему 2,675 округляется до 2,67, а не до 2,68?

Это следствие двоичного представления дробных чисел: значение 2,675 в памяти хранится как чуть меньшее число, поэтому арифметическое округление даёт 2,67. Для критичных денежных расчётов минимизируйте промежуточные дробные операции.

Как округлить сумму до сотен или тысяч в запросе?

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