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