При разработке отчетов на Системе компоновки данных (СКД) программисты часто сталкиваются с необходимостью не просто математического округления, а округления «в пользу организации» или до ближайшего «дальнего» значения. Типичный пример: значение 1,234 должно превратиться в 1,24, даже если по правилам математики оно должно округляться вниз. Рассмотрим подробно, как реализовать такие механизмы в вычисляемых полях СКД, разберем различные подходы и выясним, в чем разница между округлением значения и округлением отображения.
Самый простой и часто используемый способ в среде 1С — это добавление «дельты» к исходному числу перед его округлением. Стандартная функция Окр() в СКД работает аналогично встроенному языку. Если нам нужно округлить число до 2 знаков после запятой так, чтобы любая третья цифра после запятой (от 1 до 9) увеличивала второй разряд, мы можем добавить корректирующее значение.
Проанализируем ситуацию: чтобы 1,231 стало 1,24, нам нужно «подтолкнуть» число. Рассмотрим формулу, которую можно вставить в колонку «Выражение» вычисляемого поля:
Окр(ИсходноеПоле + 0.0049, 2, РежимОкругления.Окр15как20)
Разберем по шагам, что здесь происходит:
1,231 прибавляется 0,0049, получается 1,2359.Окр с точностью 2 видит пятерку в третьем разряде.РежимОкругления.Окр15как20 число округляется в большую сторону, и мы получаем 1,24.Важно помнить, что в СКД функция Окр поддерживает те же параметры, что и в обычном коде. Если вы не укажете режим округления, система может использовать настройки по умолчанию, что приведет к непредсказуемым результатам на пограничных значениях (например, 0.5).
Если требуется гарантированное округление вверх до целого или определенного знака (аналог функции Ceiling в SQL), можно воспользоваться комбинацией умножения и функции Цел. Этот метод более надежен, так как не зависит от механизмов работы Окр.
Посмотрим на пример выражения для округления до 2 знаков вверх:
Цел(ИсходноеПоле * 100 + 0.9999999999) / 100
Проанализируем этот алгоритм:
100, чтобы перевести нужные нам знаки в целую часть (1,231 становится 123,1).0.9999...). Это гарантирует, что любая дробная часть, даже самая минимальная, «перебросит» число к следующему целому. В нашем примере 123,1 + 0.999... = 124,099....Цел() отсекает дробную часть, оставляя 124.100, получая искомое 1,24.Иногда логика округления настолько сложна, что стандартных выражений СКД не хватает. Выясним, как использовать мощь встроенного языка 1С внутри отчета. СКД позволяет вызывать функции общих модулей прямо в выражениях полей.
Для этого должны быть соблюдены условия:
Экспорт.Рассмотрим пример. Создадим в модуле РаботаСЧислами функцию:
Функция ОкруглитьДоДальнего(Значение, Разрядность) Экспорт
Возврат Окр(Значение, Разрядность, РежимОкругления.Окр15как20);
КонецФункции
Теперь в СКД на закладке «Вычисляемые поля» в поле «Выражение» мы просто напишем:
РаботаСЧислами.ОкруглитьДоДальнего(Сумма, 2)
Это самый гибкий метод, позволяющий реализовать любую бизнес-логику, включая проверку на отрицательные числа или особые правила для разных валют.
Важный момент, который часто упускают новички: разница между изменением значения и изменением представления. Выясним причину, почему это критично для итогов отчета.
1. Округление в поле «Выражение»:
Если мы используем функции Окр или Цел в выражении вычисляемого поля, мы меняем само число. В этом случае в группировках и общих итогах будет суммироваться уже округленное значение. Если у вас 100 строк и в каждой вы добавили 0.01 при округлении, итоговая сумма увеличится на 1 рубль. Это правильно, если отчет должен отражать реальные взаиморасчеты с учетом округлений.
2. Округление через «Оформление» (Формат):
Если в свойствах поля (на закладке «Наборы данных» или в настройках отчета в «Условном оформлении») установить параметр «Формат» и указать «Точность = 2», система просто «спрячет» лишние знаки при выводе на экран. Однако в базе и в итогах по-прежнему будет храниться точное число (например, 1,234). В итоге может возникнуть ситуация, когда сумма в колонке визуально не совпадает с итогом (так называемая «ошибка округления»).
Разберем еще один интересный инструмент — свойство «Сдвиг» в параметрах редактирования или формата. Это не совсем математическое округление, но крайне полезная функция для визуализации данных.
1,234 превратится в 1234 (умножение на 10 в степени 3).1234 превратится в 1,234 (деление на 1000).Это удобно использовать, когда нужно вывести отчет в тысячах рублей, при этом не создавая дополнительных вычисляемых полей и не меняя логику расчета итогов.
Рассмотрим ситуацию с использованием ВЫРАЗИТЬ. Некоторые разработчики пытаются использовать ее для округления в вычисляемых полях, как это делается в запросах:
ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15, 2))
Однако стоит помнить: в языке выражений СКД (не в тексте запроса, а именно в вычисляемых полях) функция ВЫРАЗИТЬ работает преимущественно для приведения типов данных. Для математических манипуляций с разрядностью чисел в СКД рекомендуется использовать именно функцию Окр(), так как она дает более предсказуемый результат и позволяет управлять режимом округления.
Подведем итог нашему анализу. Для решения задачи округления «в большую сторону» в СКД у нас есть три основных пути:
Окр(Число + 0.0049, 2) — быстро и просто для простых случаев.Цел(Число * 100 + 0.99) / 100 — надежный способ имитации «Потолка».Выбирайте метод в зависимости от требований к точности итогов в вашем отчете. Если важна визуальная чистота без изменения итогов — используйте Оформление. Если же округление влияет на расчеты — используйте формулы в Выражении вычисляемого поля.