Как в 1С округлить число до ближайшего большего значения, кратного 5?

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

В практике разработки на платформе 1С часто возникают задачи нестандартного округления. Одной из таких задач является округление «вверх» до ближайшего числа, кратного пяти. Например, если число оканчивается на 1, 2, 3 или 4, оно должно превратиться в 5, а если на 6, 7, 8 или 9 — в 10 (следующий десяток). Если число уже кратно 5 (оканчивается на 0 или 5), оно должно остаться неизменным.

Рассмотрим подробнее несколько способов реализации этого алгоритма: от простых математических формул в коде до сложных конструкций в запросах.

Способ 1. Использование функции Окр() в программном коде

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

Рассмотрим пример кода, который эффективно решает задачу:


// Переменная МоеЧисло — исходное значение
// Результат будет округлен до ближайшего большего кратного 5
Результат = Окр(МоеЧисло * 2 + 4, -1) / 2;

Разберем по шагам, как это работает на примере числа 1381:

  1. Умножаем на 2: 1381 * 2 = 2762.
  2. Прибавляем поправку 4: 2762 + 4 = 2766.
  3. Округляем до десятков (параметр -1 в функции Окр): 2766 превращается в 2770.
  4. Делим на 2: 2770 / 2 = 1385. Результат достигнут.

Если мы возьмем число 1385, которое уже кратно 5:

  1. 1385 * 2 = 2770.
  2. 2770 + 4 = 2774.
  3. Округляем до десятков: 2774 превращается в 2770.
  4. 2770 / 2 = 1385. Число не изменилось, что соответствует условию.

Способ 2. Округление через шаг квантования

Еще один профессиональный подход заключается в делении числа на нужный «шаг» (в нашем случае это 5), выполнении округления до целого и последующем умножении обратно. Выясним, как это реализовать максимально надежно:


// Использование режима округления "1.5 как 2" (школьное округление)
Результат = Окр(МоеЧисло / 5, 0, РежимОкругления.Окр15как20) * 5;

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


// Универсальная формула для округления вверх до кратного N
Шаг = 5;
Результат = Цел((МоеЧисло + (Шаг - 0.01)) / Шаг) * Шаг;

Способ 3. Реализация округления в запросах 1С

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

Проанализируем особенность: ВЫРАЗИТЬ(Число КАК ЧИСЛО(15, 0)) на уровне СУБД (например, MS SQL Server) может использовать «банковское округление» (округление до ближайшего четного). Чтобы имитировать отсечение дробной части (аналог Цел), из числа вычитают 0.5.

Посмотрим на пример реализации сложной формулы округления до 5 в запросе:


ВЫБОР
    КОГДА ТарифнаяСтавка % 5 = 0 
    ТОГДА ТарифнаяСтавка
    ИНАЧЕ (ВЫРАЗИТЬ((ТарифнаяСтавка / 5) - 0.5 КАК ЧИСЛО(15, 0)) + 1) * 5
КОНЕЦ

Если же ваша версия платформы или СУБД накладывает ограничения на использование оператора остатка от деления (%), можно применить математическую эмуляцию логики из Способа 1:


// Пример формулы в запросе для повышения ставки с округлением
(ВЫРАЗИТЬ((ВЫРАЗИТЬ((ВТ_Данные.Цена * 1.1 - 0.5) КАК ЧИСЛО(15, 0)) * 2 + 4) / 10 КАК ЧИСЛО(15, 0))) * 10 / 2

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

Важные замечания

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

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

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

← На главную