При переносе формул из Excel в платформу 1С часто возникает необходимость округлить число в большую сторону до определенного шага (кратности). Например, в Excel функция ОКРВВЕРХ(625; 500) возвращает результат 1000. Разберем, как реализовать аналогичную логику в 1С 8.3 во встроенном языке и в текстах запросов.
Проанализируем стандартную функцию 1С Окр(<Число>, <Разрядность>, <РежимОкругления>). Если передать в нее отрицательную разрядность, например Окр(Число, -3), платформа выполнит округление до тысяч (1000, 2000, 3000). Однако у этого метода есть два существенных ограничения:
РежимОкругления.Окр15как20 и РежимОкругления.Окр15как10 предназначены для математического и банковского округления, но не выполняют безусловное округление всегда вверх (до ближайшего большего значения).Рассмотрим наиболее надежный и производительный способ на встроенном языке 1С. Для вычисления шага кратности воспользуемся оператором получения остатка от деления %.
Разберем логику по шагам:
Посмотрим на пример программного кода:
Кратность = 500;
Остаток = ИсходноеЧисло % Кратность;
Если ИсходноеЧисло < 20000 Тогда
Результат = ?(Остаток = 0, ИсходноеЧисло, ИсходноеЧисло + (Кратность - Остаток));
Иначе
Результат = ИсходноеЧисло;
КонецЕсли;
Рассмотрим альтернативный способ с выделением целой части с помощью функции Цел(). При использовании этой схемы важно не допустить распространенной ошибки, когда формула (Цел(Число / 500) + 1) * 500 ошибочно увеличивает числа, которые уже делятся на 500 без остатка (например, число 500 превращается в 1000).
Для корректного расчета выполним проверку на наличие дробной части:
Кратность = 500;
Частное = ИсходноеЧисло / Кратность;
Если ИсходноеЧисло < 20000 Тогда
Если Цел(Частное) = Частное Тогда
Результат = ИсходноеЧисло;
Иначе
Результат = (Цел(Частное) + 1) * Кратность;
КонецЕсли;
Иначе
Результат = ИсходноеЧисло;
КонецЕсли;
Обратите внимание: функция Цел() в 1С отсекает дробную часть по направлению к нулю (для отрицательного числа Цел(-1.2) вернет -1). Если в расчете могут участвовать отрицательные числа, необходимо предварительно проверять знак числа для корректного выбора направления округления.
Выясним, как решить аналогичную задачу внутри запроса 1С. В языке запросов отсутствуют оператор остатка от деления % и функция Цел(). Для округления вверх до шага кратности используем конструкцию ВЫРАЗИТЬ(... КАК ЧИСЛО) со сдвигом расчетного значения:
ВЫБОР
КОГДА Таблица.ПолеЧисло < 20000 ТОГДА
ВЫРАЗИТЬ((Таблица.ПолеЧисло + 499.9999) / 500 - 0.5 КАК ЧИСЛО(15, 0)) * 500
ИНАЧЕ
Таблица.ПолеЧисло
КОНЕЦ
Данная конструкция смещает диапазон дробных чисел так, чтобы математическое округление функции ВЫРАЗИТЬ всегда срабатывало в большую сторону для любых некратных значений.