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

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

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

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

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

Такая особенность часто становится неожиданностью для разработчиков, которые переносят логику из модуля в запрос. При этом задача округлить цены, суммы, количества или курсы валют возникает постоянно: в отчетах на СКД, при формировании печатных форм, при сравнении сумм из разных источников, где расхождение в копейках ломает соединения таблиц.

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

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

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

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

Пример запроса с округлением суммы до копеек:

ВЫБРАТЬ

Продажи.Номенклатура КАК Номенклатура,

ВЫРАЗИТЬ(Продажи.Сумма КАК ЧИСЛО(15, 2)) КАК Сумма

ИЗ

РегистрНакопления.Продажи.Обороты(, , , ) КАК Продажи

Округление в вычисляемых выражениях и агрегатных функциях

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

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

Округлить до или после суммирования

Если сначала округлить каждую строку, а потом просуммировать, итог может отличаться от округленной суммы «сырых» значений на несколько копеек. Для отчетов, где итог должен сойтись с бухгалтерскими данными, обычно суммируют точные значения и округляют только результат. Для печатных форм, где важна сходимость построчно, округляют каждую строку.

ВЫБРАТЬ

ВЫРАЗИТЬ(СУММА(Продажи.Сумма) КАК ЧИСЛО(15, 2)) КАК СуммаИтог

ИЗ

РегистрНакопления.Продажи.Обороты(, , , ) КАК Продажи

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

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

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

Округление вниз до целого можно выполнить так: вычесть 0,5 и применить обычное округление — ВЫРАЗИТЬ(Количество - 0.5 КАК ЧИСЛО(15, 0)). Округление вверх — прибавить 0,5 и округлить: ВЫРАЗИТЬ(Количество + 0.499999 КАК ЧИСЛО(15, 0)). Такие конструкции работают, но ухудшают читаемость запроса.

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

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

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

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

Округление в коде после запроса

Гибкость: доступны любые правила, включая округление вверх и до кратного. Требуется обход выборки и дополнительный код

Вычисляемое поле СКД

Удобно для отчетов: выражение на встроенном языке, есть функция Окр(). Работает только в рамках отчета на СКД

Округление в СКД и вычисляемых полях отчета

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

Например, вычисляемое поле с выражением Окр(Сумма / Курс, 2) округлит результат деления до двух знаков. Здесь же можно использовать третий параметр функции Окр для округления вверх или вниз, чего запрос не умеет.

Практическая рекомендация: расчеты, которые влияют на соединения и группировки, округляйте в запросе, а представление данных для пользователя — в вычисляемых полях или формате поля на вкладке «Настройки».

Если задача — только красиво показать число в отчете, округлять его в запросе не обязательно. В настройках СКД для поля можно задать форматную строку, например ЧДЦ=2, и значение отобразится с двумя знаками, оставаясь точным для расчетов и итогов.
ПЗ
Практическое замечание

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

Когда данные уже получены из запроса, округление выполняется функцией встроенного языка Окр(Число, Точность, РежимОкругления). Первый параметр — исходное число, второй — количество знаков после запятой (может быть отрицательным для округления до десятков и сотен), третий — режим: математически, вверх или вниз.

Пример обработки результата запроса:

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

СуммаОкругленная = Окр(Выборка.Сумма, 2);

Упаковки = Окр(Выборка.Количество / ВУпаковке, 0,

РежимОкругления.Окр15как20);

КонецЦикла;

Режим Окр15как20 соответствует округлению «0,5 вверх», что при добавлении 0,5 к значению дает эффект округления вверх для дробной части. Для строгого округления вниз используют вычитание или целочисленную обработку через Цел(Число).

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

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

После добавления округления обязательно проверьте запрос на пограничных значениях. Самые показательные случаи: дробная часть ровно 0,5 (проверка правила округления), значения с тремя и более знаками после запятой, крупные суммы, близкие к пределу указанной длины числа.

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

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

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

Значение 10,455 с ЧИСЛО(15, 2)
Норма

Результат 10,46 или 10,45 в зависимости от представления — поведение стабильно на одинаковых данных

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

Результат меняется от запуска к запуску или отличается в запросе и в коде

Крупная сумма при ЧИСЛО(15, 2)
Норма

Целая часть сохраняется полностью, ошибок нет

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

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

Итог отчета
Норма

Итог сходится с учетными данными или расхождение объяснимо построчным округлением

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

Расхождение на копейки без видимой причины — проверьте порядок округления и суммирования

Ограничения и когда запрос не подходит

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

Также учитывайте, что в виртуальных таблицах регистров расчетные поля могут уже иметь фиксированную разрядность, заданную в метаданных измерений и ресурсов. Если ресурс регистра объявлен как Число(15, 2), то значения в нем уже хранятся с двумя знаками, и дополнительное округление в запросе ничего не изменит — расхождения нужно искать на этапе проведения документов.

Итог

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

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

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

Почему запрос с функцией ОКРУГЛИТЬ выдает ошибку?

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

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

Используйте ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15, 0)) — ноль во втором параметре означает отсутствие дробной части. Значение 7,5 станет 8, а 7,4 — 7.

Как округлить в запросе строго вверх или вниз?

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

Почему сумма округленных строк не совпадает с округленной суммой?

Это нормальное следствие округления: отброшенные доли копеек в каждой строке накапливаются. Выберите один принцип: либо суммируете точные значения и округляете итог, либо округляете строки и принимаете возможное расхождение итога с учетными данными.

Можно ли округлить число в отчете СКД без изменения запроса?

Да, двумя способами. Первый — вычисляемое поле с выражением Окр(Поле, 2). Второй — форматная строка поля в настройках, например ЧДЦ=2: значение останется точным, но отобразится с двумя знаками. Для визуального представления второй вариант предпочтительнее.

Что означают параметры в ЧИСЛО(15, 2)?

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