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

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

При разработке отчетов на Системе компоновки данных (СКД) программисты часто сталкиваются с необходимостью не просто математического округления, а округления «в пользу организации» или до ближайшего «дальнего» значения. Типичный пример: значение 1,234 должно превратиться в 1,24, даже если по правилам математики оно должно округляться вниз. Рассмотрим подробно, как реализовать такие механизмы в вычисляемых полях СКД, разберем различные подходы и выясним, в чем разница между округлением значения и округлением отображения.

Метод 1: Математическое смещение через функцию Окр

Самый простой и часто используемый способ в среде 1С — это добавление «дельты» к исходному числу перед его округлением. Стандартная функция Окр() в СКД работает аналогично встроенному языку. Если нам нужно округлить число до 2 знаков после запятой так, чтобы любая третья цифра после запятой (от 1 до 9) увеличивала второй разряд, мы можем добавить корректирующее значение.

Проанализируем ситуацию: чтобы 1,231 стало 1,24, нам нужно «подтолкнуть» число. Рассмотрим формулу, которую можно вставить в колонку «Выражение» вычисляемого поля:


Окр(ИсходноеПоле + 0.0049, 2, РежимОкругления.Окр15как20)

Разберем по шагам, что здесь происходит:

  1. К значению 1,231 прибавляется 0,0049, получается 1,2359.
  2. Функция Окр с точностью 2 видит пятерку в третьем разряде.
  3. Благодаря параметру РежимОкругления.Окр15как20 число округляется в большую сторону, и мы получаем 1,24.

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

Метод 2: Реализация функции «Потолок» (Ceiling) через Цел

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

Посмотрим на пример выражения для округления до 2 знаков вверх:


Цел(ИсходноеПоле * 100 + 0.9999999999) / 100

Проанализируем этот алгоритм:

  1. Мы умножаем число на 100, чтобы перевести нужные нам знаки в целую часть (1,231 становится 123,1).
  2. Добавляем почти единицу (0.9999...). Это гарантирует, что любая дробная часть, даже самая минимальная, «перебросит» число к следующему целому. В нашем примере 123,1 + 0.999... = 124,099....
  3. Функция Цел() отсекает дробную часть, оставляя 124.
  4. Делим обратно на 100, получая искомое 1,24.

Метод 3: Использование функций общих модулей

Иногда логика округления настолько сложна, что стандартных выражений СКД не хватает. Выясним, как использовать мощь встроенного языка 1С внутри отчета. СКД позволяет вызывать функции общих модулей прямо в выражениях полей.

Для этого должны быть соблюдены условия:

Рассмотрим пример. Создадим в модуле РаботаСЧислами функцию:


Функция ОкруглитьДоДальнего(Значение, Разрядность) Экспорт
    Возврат Окр(Значение, Разрядность, РежимОкругления.Окр15как20);
КонецФункции

Теперь в СКД на закладке «Вычисляемые поля» в поле «Выражение» мы просто напишем:

РаботаСЧислами.ОкруглитьДоДальнего(Сумма, 2)

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

Различие между вычислением и оформлением

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

1. Округление в поле «Выражение»:

Если мы используем функции Окр или Цел в выражении вычисляемого поля, мы меняем само число. В этом случае в группировках и общих итогах будет суммироваться уже округленное значение. Если у вас 100 строк и в каждой вы добавили 0.01 при округлении, итоговая сумма увеличится на 1 рубль. Это правильно, если отчет должен отражать реальные взаиморасчеты с учетом округлений.

2. Округление через «Оформление» (Формат):

Если в свойствах поля (на закладке «Наборы данных» или в настройках отчета в «Условном оформлении») установить параметр «Формат» и указать «Точность = 2», система просто «спрячет» лишние знаки при выводе на экран. Однако в базе и в итогах по-прежнему будет храниться точное число (например, 1,234). В итоге может возникнуть ситуация, когда сумма в колонке визуально не совпадает с итогом (так называемая «ошибка округления»).

Применение параметра «Сдвиг» (Scale)

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

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

Особенности функции ВЫРАЗИТЬ в СКД

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

ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15, 2))

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

Итоги

Подведем итог нашему анализу. Для решения задачи округления «в большую сторону» в СКД у нас есть три основных пути:

  1. Математическая добавка: Окр(Число + 0.0049, 2) — быстро и просто для простых случаев.
  2. Функция Цел: Цел(Число * 100 + 0.99) / 100 — надежный способ имитации «Потолка».
  3. Общий модуль: самый профессиональный подход для сложной логики.

Выбирайте метод в зависимости от требований к точности итогов в вашем отчете. Если важна визуальная чистота без изменения итогов — используйте Оформление. Если же округление влияет на расчеты — используйте формулы в Выражении вычисляемого поля.

← На главную