Разработка и Конфигурация · 9 мин
Как округлить число в запросе 1С
Как округлить число в запросе 1С: оператор ВЫРАЗИТЬ КАК ЧИСЛО, округление копеек и итогов, типовые ошибки и проверка результата на практических примерах.
Язык запросов 1С не содержит отдельной функции «ОКРУГЛИТЬ», и это часто ставит в тупик разработчиков, привыкших к SQL-диалектам с ROUND(). Тем не менее округление в запросе возможно — штатным оператором приведения типа ВЫРАЗИТЬ, который при преобразовании к числу с меньшей разрядностью выполняет округление по математическим правилам.
Задача округления возникает постоянно: расчёт цен со скидкой, НДС, средних значений, итогов по документам. Если не округлить промежуточные результаты, в отчётах появляются суммы с длинными дробными хвостами, а итоги «не сходятся на копейку» с проведёнными документами.
Ниже разобраны рабочие способы округления чисел в запросе 1С: приведение типа через ВЫРАЗИТЬ, округление до целого, отсечение дробной части, округление в большую сторону и типичные ошибки, которые приводят к неверным итогам.
Как работает ВЫРАЗИТЬ при округлении числа
Основной инструмент — конструкция ВЫРАЗИТЬ(Выражение КАК ЧИСЛО(Длина, Точность)). Когда исходное значение имеет больше знаков после запятой, чем указано в параметре «Точность», платформа округляет результат по арифметическим правилам: 0,5 и выше — вверх, меньше 0,5 — вниз.
Пример запроса, округляющего цену до двух знаков:
ВЫБРАТЬ
ВЫРАЗИТЬ(Цены.Цена * 1.2 КАК ЧИСЛО(15, 2)) КАК ЦенаСНДС
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних() КАК Цены
Здесь произведение может дать, например, 119,998 — после приведения к ЧИСЛО(15, 2) получится 120,00. Обратите внимание: округление происходит именно в момент приведения типа, а не при выводе в отчёт.
Округление до целого числа и до нужного знака
Чтобы округлить до целого, укажите нулевую точность: ВЫРАЗИТЬ(Сумма КАК ЧИСЛО(15, 0)). Значение 156,49 превратится в 156, а 156,51 — в 157.
Для округления до десятков, сотен или тысяч используется деление и умножение: сначала делите число на порядок, округляете до целого, затем умножаете обратно.
ВЫБРАТЬ
ВЫРАЗИТЬ(Продажи.СуммаОборот / 100 КАК ЧИСЛО(15, 0)) * 100 КАК СуммаДоСотен
ИЗ
РегистрНакопления.Продажи.Обороты КАК Продажи
Такой приём удобен в аналитических отчётах, где суммы показывают в тысячах рублей. Учтите, что при делении могут появиться длинные дробные части — именно поэтому промежуточное приведение к целому обязательно.
Как отсечь дробную часть без округления
Иногда нужно не округлить, а именно отбросить дробную часть (усечение): 156,99 должно стать 156. Прямой функции для этого нет, поэтому используют приём с вычитанием 0,5 перед приведением:
ВЫРАЗИТЬ(Значение - 0.5 КАК ЧИСЛО(15, 0))
Логика проста: вычитание 0,5 смещает границу математического округления, и любая дробная часть от 0 до 0,99 уходит вниз. Для отрицательных чисел приём работает зеркально — добавьте 0,5 вместо вычитания, либо обработайте знак через ВЫБОР.
Округление в большую сторону (вверх)
Округление вверх требуется, например, при расчёте количества упаковок: если нужно 10,2 коробки, заказывать придётся 11. В запросе это делается добавлением 0,5 перед приведением к целому:
ВЫРАЗИТЬ(Потребность.Количество / Упаковка.Вместимость + 0.4999999 КАК ЧИСЛО(15, 0)) КАК Коробок
Небольшая поправка 0,4999999 вместо ровно 0,5 защищает от ситуации, когда значение уже целое: 10,0 + 0,5 округлилось бы до 11, что неверно. Альтернатива — конструкция ВЫБОР КОГДА ... ТОГДА, где сравнивается исходное значение с его усечённой версией и при необходимости добавляется единица.
Как выбрать способ округления
Округление в СКД и при выводе отчёта
Если задача — только красиво показать число пользователю, округлять в запросе не обязательно. В схеме компоновки данных на закладке «Наборы данных» у поля есть параметр «Формат», где задаётся маска вида ЧДЦ=2 (число десятичных знаков). В этом случае данные остаются точными, а округление выполняется только при отображении.
Именно такой подход правильнее для расчётных отчётов: суммируются точные значения, и итог не расходится с детальными строками из-за накопленных ошибок округления. Округляйте в самом запросе только тогда, когда округлённое значение участвует в дальнейших вычислениях или должно совпасть с данными документа.
Где выполнять округление
Подходит, когда округлённое значение используется в расчётах, соединениях или группировках. Минус — потеря точности исходных данных.
Подходит для визуального округления в отчётах. Итоги считаются по точным значениям, но детальная строка и итог могут визуально различаться на копейку.
Функция Окр() в модуле даёт полный контроль, включая режимы округления. Подходит при постобработке результата, но не работает внутри выборки.
Типичные ошибки и как их избежать
Самая частая ошибка — округление каждой строки перед суммированием. Если сначала округлить 100 строк по 0,499 до нуля, а потом сложить, итог будет 0 вместо 49,9. Правильный порядок: сначала СУММА(), потом ВЫРАЗИТЬ к нужной точности.
Вторая проблема — недостаточная длина числа. Если указать ЧИСЛО(10, 2), а фактическая сумма превысит 8 разрядов целой части, в больших выборках можно получить ошибку переполнения или потерю данных. Для денежных сумм безопасный стандарт — ЧИСЛО(15, 2).
Третья ошибка — попытка округлить значение типа NULL или строку. ВЫРАЗИТЬ от строки вернёт NULL без сообщения об ошибке, и поле в отчёте окажется пустым. Перед округлением убедитесь, что выражение гарантированно числовое, при необходимости оберните в ЕСТЬNULL(Значение, 0).
Проверка результата округления
После внедрения округления проверьте три вещи. Первое — граничные значения: подайте в тестовый запрос 0,5, 0,499, 2,5 и убедитесь, что направление округления соответствует ожиданиям. Второе — сходимость итогов: итог отчёта должен совпадать с суммой по документам-источникам в пределах допустимой копеечной погрешности.
Третье — поведение на NULL и нуле. Пустые остатки и нулевые цены не должны приводить к пустым колонкам или ошибкам деления. Если в выражении есть деление, добавьте защиту через ВЫБОР КОГДА Знаменатель = 0 ТОГДА 0 ИНАЧЕ ... КОНЕЦ.
Как проверить результат
Округляется в нужную сторону по правилам учёта
0,5 уходит вниз или результат непредсказуем
Расхождение не больше допустимой копеечной погрешности
Итог систематически отличается — округление применено до суммирования
Поля заполнены нулями, ошибок деления нет
Пустые колонки или прерывание выполнения запроса
Часто задаваемые вопросы
Есть ли в языке запросов 1С функция ОКРУГЛИТЬ?
Нет, отдельной функции округления в языке запросов нет. Используется оператор приведения типа ВЫРАЗИТЬ(Значение КАК ЧИСЛО(Длина, Точность)), который при уменьшении точности округляет по математическим правилам. Во встроенном языке (в модуле) доступна функция Окр() с выбором режима округления.
Как округлить число до целого в запросе 1С?
Примените ВЫРАЗИТЬ(Значение КАК ЧИСЛО(15, 0)) — нулевая точность отбрасывает все знаки после запятой с математическим округлением. Для гарантированного усечения без округления вычтите 0,5 перед приведением.
Как округлить сумму вверх до целого?
Используйте конструкцию ВЫРАЗИТЬ(Значение + 0.4999999 КАК ЧИСЛО(15, 0)). Добавка чуть меньше 0,5 гарантирует, что любое дробное значение уйдёт вверх, а уже целое число не изменится. Для строгого контроля можно применить ВЫБОР со сравнением значения и его усечённой версии.
Почему итог отчёта не сходится с суммой строк после округления?
Чаще всего округление применено к каждой строке до группировки, и ошибки накапливаются. Перенесите ВЫРАЗИТЬ на уровень итогового выражения: сначала СУММА(), затем приведение типа. Если расхождение только визуальное, уберите округление из запроса и задайте формат поля в СКД.
Что делать, если ВЫРАЗИТЬ возвращает пустое значение?
Это признак того, что исходное выражение имеет тип NULL или нечисловой тип. Оберните значение в ЕСТЬNULL(Выражение, 0) и убедитесь, что все поля в выражении числовые. Проверить тип поля можно в консоли запросов, посмотрев тип значения в результате.
Можно ли округлить число только для отображения, не меняя данные?
Да. В схеме компоновки данных у поля есть свойство «Формат», где указывается, например, ЧДЦ=2. В отчётах на обычных формах аналогичный формат задаётся в свойствах колонки. Данные при этом остаются точными, а итоги считаются корректно.
Что важно запомнить
Округление в запросе 1С выполняется оператором ВЫРАЗИТЬ к типу ЧИСЛО с нужной точностью — по математическим правилам. Усечение и округление вверх делаются арифметическими приёмами с добавлением или вычитанием 0,5. Округляйте после суммирования, а для чисто визуального результата используйте формат поля в СКД.