Как эффективно реализовать округление числа в большую сторону в 1С?

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

Задача округления чисел в большую сторону («в потолок») часто встречается в разработке на 1С:Предприятие, особенно при расчете цен, скидок или распределении квот. Стандартная функция Окр() в платформе работает по принципам математического округления, поэтому для реализации округления всегда в большую сторону нам потребуется разработать собственную логику.

Реализация через анализ остатка от деления

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

Суть алгоритма заключается в следующем: мы делим исходное число на заданный порядок (шаг), выделяем целую часть и при необходимости добавляем единицу, если остаток от деления отличен от нуля. Давайте разберем реализацию этого метода на практике:


Функция ОкруглитьВБольшуюСторону(Число, Порядок) Экспорт
    Если Число = 0 Тогда
        Возврат 0;
    КонецЕсли;

    // Вычисляем количество интервалов
    КоличествоИнтервалов = Число / Порядок;
    
    // Вычисляем целое количество интервалов
    ЦелыхИнтервалов = Цел(КоличествоИнтервалов);
    
    // Если число кратно порядку, возвращаем само число
    Если КоличествоИнтервалов = ЦелыхИнтервалов Тогда
        Возврат Число;
    КонецЕсли;
    
    // Иначе возвращаем следующий шаг
    Возврат Порядок * (ЦелыхИнтервалов + 1);
КонецФункции

Этот подход хорош тем, что он универсален. Вы можете передавать в качестве Порядок любые значения: 0.01, 0.05, 0.1 или 5, 10. Алгоритм будет работать стабильно и предсказуемо.

Использование функций платформы для простых задач

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

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


Функция ОкрБольш(Число, Разрядность) Экспорт
    Ц = Окр(Число, Разрядность);
    Если Ц >= Число Тогда
        Возврат Ц;
    КонецЕсли;
    Возврат Ц + Pow(10, -Разрядность);
КонецФункции

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

Советы по повышению эффективности

При написании кода для «нетленок» или высоконагруженных систем, следуйте этим рекомендациям:

  1. Избегайте преобразований типов: Старайтесь не использовать функции Строка() или Число() для манипуляций с порядком округления. Преобразования типов — это «тяжелые» операции, которые замедляют выполнение кода. Лучше передавать числовой параметр напрямую.
  2. Будьте осторожны с Pow(): Функция возведения в степень может быть избыточной для простых случаев. Если вы знаете разрядность заранее, проще умножить или разделить число на константу (например, 10, 100, 1000).
  3. Учитывайте бизнес-логику: Помните, что любое округление — это внесение погрешности. Если вы округляете каждую строку документа отдельно, итоговая сумма может отличаться от суммы, полученной при расчете без промежуточных округлений. В финансовых отчетах лучше производить округление только на финальном этапе расчета.
  4. Проверка отрицательных чисел: Большинство приведенных выше алгоритмов рассчитаны на работу с положительными числами. Если в вашей бизнес-логике возможны отрицательные значения, обязательно протестируйте их работу отдельно, так как логика «округления вверх» для отрицательных чисел может требовать использования функции Цел() с учетом знака.

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

← На главную