Как округлить число вверх до заданной кратности в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При переносе формул из Excel в платформу 1С часто возникает необходимость округлить число в большую сторону до определенного шага (кратности). Например, в Excel функция ОКРВВЕРХ(625; 500) возвращает результат 1000. Разберем, как реализовать аналогичную логику в 1С 8.3 во встроенном языке и в текстах запросов.

Ограничения стандартной функции Окр()

Проанализируем стандартную функцию 1С Окр(<Число>, <Разрядность>, <РежимОкругления>). Если передать в нее отрицательную разрядность, например Окр(Число, -3), платформа выполнит округление до тысяч (1000, 2000, 3000). Однако у этого метода есть два существенных ограничения:

  1. Фиксированная кратность степеням 10: стандартная функция может округлять только до десятков, сотен, тысяч, но не поддерживает произвольный шаг (например, 50, 250 или 500).
  2. Режимы округления: системные режимы РежимОкругления.Окр15как20 и РежимОкругления.Окр15как10 предназначены для математического и банковского округления, но не выполняют безусловное округление всегда вверх (до ближайшего большего значения).

Вариант 1. Округление через оператор остатка от деления (%)

Рассмотрим наиболее надежный и производительный способ на встроенном языке 1С. Для вычисления шага кратности воспользуемся оператором получения остатка от деления %.

Разберем логику по шагам:

  1. Находим остаток от деления исходного числа на требуемый шаг (например, 500).
  2. Если остаток равен нулю, число уже кратно шагу и не требует изменений.
  3. Если остаток больше нуля, прибавляем к исходному числу разницу между шагом и остатком.

Посмотрим на пример программного кода:


Кратность = 500;
Остаток = ИсходноеЧисло % Кратность;

Если ИсходноеЧисло < 20000 Тогда
    Результат = ?(Остаток = 0, ИсходноеЧисло, ИсходноеЧисло + (Кратность - Остаток));
Иначе
    Результат = ИсходноеЧисло;
КонецЕсли;

Вариант 2. Округление через функцию Цел()

Рассмотрим альтернативный способ с выделением целой части с помощью функции Цел(). При использовании этой схемы важно не допустить распространенной ошибки, когда формула (Цел(Число / 500) + 1) * 500 ошибочно увеличивает числа, которые уже делятся на 500 без остатка (например, число 500 превращается в 1000).

Для корректного расчета выполним проверку на наличие дробной части:


Кратность = 500;
Частное = ИсходноеЧисло / Кратность;

Если ИсходноеЧисло < 20000 Тогда
    Если Цел(Частное) = Частное Тогда
        Результат = ИсходноеЧисло;
    Иначе
        Результат = (Цел(Частное) + 1) * Кратность;
    КонецЕсли;
Иначе
    Результат = ИсходноеЧисло;
КонецЕсли;

Обратите внимание: функция Цел() в 1С отсекает дробную часть по направлению к нулю (для отрицательного числа Цел(-1.2) вернет -1). Если в расчете могут участвовать отрицательные числа, необходимо предварительно проверять знак числа для корректного выбора направления округления.

Вариант 3. Округление вверх до шага в тексте запроса

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


ВЫБОР 
    КОГДА Таблица.ПолеЧисло < 20000 ТОГДА
        ВЫРАЗИТЬ((Таблица.ПолеЧисло + 499.9999) / 500 - 0.5 КАК ЧИСЛО(15, 0)) * 500
    ИНАЧЕ 
        Таблица.ПолеЧисло
КОНЕЦ

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

← На главную