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

Понимание различий между методами округления критически важно для корректного формирования отчетов и проведения финансовых расчетов. Неправильный выбор функции может привести к расхождениям в итоговых суммах, особенно при работе с большими объемами данных. В этой статье мы детально разберем синтаксис основных функций, их поведение с отрицательными числами и нюансы работы с типом Число в контексте запросов.

Базовая функция ОКРУГЛ в языке запросов

Самым распространенным инструментом для приведения чисел к нужной точности является функция ОКРУГЛ. Она принимает два аргумента: само числовое выражение и количество знаков после запятой, до которого необходимо выполнить округление. Синтаксис функции интуитивно понятен и схож с реализациями в других языках программирования, что облегчает миграцию логики из внешнего кода внутрь запроса.

Если второй параметр равен нулю, результат будет целым числом. При указании положительного значения дробная часть округляется по правилам математики: цифры от 0 до 4 отбрасываются, а от 5 до 9 увеличивают предыдущий разряд.

Рассмотрим пример использования в теле запроса для получения суммы с точностью до копеек:

ВЫБРАТЬ

Товары.Номенклатура,

Товары.Цена,

ОКРУГЛ(Товары.Цена * Товары.Количество, 2) КАК Сумма

ИЗ

Справочник.Товары КАК Товары

Особенностью функции ОКРУГЛ является ее поведение при работе с отрицательными числами. В отличие от некоторых математических библиотек, где округление может идти в сторону нуля или бесконечности, в 1С используется арифметическое округление. Это означает, что -1.5 будет округлено до -2, а не до -1, что соответствует стандартному правилу "школьного" округления.

⚠️ Внимание: При округлении валютных сумм всегда проверяйте режим rounding mode вашей конфигурации. В некоторых отраслевых решениях может требоваться банковское округление, которое отличается от стандартного арифметического при значении ровно 5 в последнем разряде.

📊 Какой метод округления вы используете чаще всего?
ОКРУГЛ (арифметическое)
ЦЕЛ (в меньшую сторону)
ОКР (по четности)
В коде после получения данных

Отсечение дробной части функцией ЦЕЛ

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

Использование функции ЦЕЛ часто встречается при расчете количества целых упаковок, паллет или коробок, когда остаток не имеет смысла или не может быть отгружен. Например, если у вас есть 10.9 коробок, функция вернет 10, так как 0.9 коробки не существует в физическом мире для отгрузки.

Синтаксис функции предельно прост и требует только одного аргумента:

ВЫБРАТЬ

Склад.Остаток,

ЦЕЛ(Склад.Остаток / 10) КАК ПолныеУпаковки

ИЗ

РегистрНакопления.ОстаткиТоваров КАК Склад

Следует быть осторожным при применении ЦЕЛ к отрицательным значениям. Если результат деления равен -3.7, функция вернет -4, так как это ближайшее целое число, которое меньше исходного. Такое поведение может привести к логическим ошибкам, если разработчик ожидает усечения в сторону нуля (получения -3).

💡

Для получения поведения "усечение в сторону нуля" для отрицательных чисел используйте комбинацию функций: ЕСЛИ Число < 0 ТО -ЦЕЛ(-Число) ИНАЧЕ ЦЕЛ(Число) КОНЕЦ.

Банковское округление с помощью функции ОКР

В финансовых операциях, где накапливаются большие объемы данных, стандартное арифметическое округление может создавать систематическую погрешность в пользу одной из сторон. Чтобы минимизировать эту ошибку, используется метод bankers' rounding, который в 1С реализован через функцию ОКР. Этот метод округляет числа до ближайшего четного значения, если дробная часть равна ровно 0.5.

Функция ОКР принимает те же аргументы, что и ОКРУГЛ: число и количество знаков. Разница проявляется только в пограничных случаях. Например, число 2.5 при использовании ОКР округлится до 2 (ближайшее четное), а 3.5 — до 4. Это позволяет статистически компенсировать ошибки округления при суммировании больших массивов данных.

Пример использования в запросе для формирования регламентированной отчетности:

ВЫБРАТЬ

Регистр.СуммаНачисления,

ОКР(Регистр.СуммаНачисления, 0) КАК СуммаДляОтчета

ИЗ

РегистрНакопления.НачисленияЗарплаты КАК Регистр

Важно отметить, что функция ОКР работает только с типом Число. Если в поле хранятся данные другого типа, предварительно необходимо привести их к числовому виду, иначе запрос завершится ошибкой выполнения. Это частая проблема при работе с универсальными коллекциями значений.

⚠️ Внимание: Не используйте функцию ОКР для розничных чеков, если это не требуется законодательно. Покупатели привыкли к обычному математическому округлению, и округление 1.5 рубля до 1 рубля может вызвать недоумение.

Таблица сравнения функций округления

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

Исходное число Функция ОКРУГЛ (2 знака) Функция ЦЕЛ Функция ОКР (0 знаков)
10.124 10.12 10 10
10.125 10.13 10 10
10.126 10.13 10 10
-5.5 -6 -6 -6
5.5 6 5 6

Анализ таблицы показывает, что основные расхождения наблюдаются при работе с цифрой 5 в старшем отбрасываемом разряде. Функция ЦЕЛ ведет себя наиболее агрессивно по отношению к дробной части, просто удаляя ее, тогда как ОКРУГЛ и ОКР пытаются найти ближайшее целое или четное значение.

Почему 5.5 округляется до 6 в функции ОКР?

Потому что 6 является ближайшим четным числом к 5.5. Если бы число было 4.5, оно округлилось бы до 4.

Особенности работы с типом Decimal и точностью

В платформе 1С:Предприятие тип данных Число реализован как Decimal с фиксированной точностью. По умолчанию точность составляет 15 знаков до запятой и 4 знака после, однако эти параметры могут быть изменены в метаданных объекта или в самом запросе. Понимание внутренней структуры хранения чисел помогает избежать ошибок потери точности при многократных вычислениях.

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

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

ВЫБРАТЬ

КАК ЧИСЛО(15, 4) ВЫРАЗИТЬ(Товары.Цена / Товары.Коэффициент КАК ЧИСЛО(15, 6)) КАК ТочнаяЦена

ИЗ

Справочник.Товары КАК Товары

Использование конструкции ВЫРАЗИТЬ.. КАК является мощным инструментом для контроля за переполнением разрядной сетки. Если результат вычисления превышает доступную разрядность, система выдаст ошибку, что лучше, чем получение некорректного усеченного значения.

💡

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

Частые ошибки и способы их устранения

Одной из самых распространенных ошибок при работе с округлением в запросах является попытка округлить поле, которое уже имеет тип Строка или Дата. Язык запросов 1С строго типизирован, и неявное приведение типов в функциях математики не поддерживается. Необходимо явно преобразовать данные перед вызовом функции округления.

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

  • 🔍 Проверьте типы полей в метаданных перед написанием запроса.
  • 🔍 Используйте функцию ЕСТЬNULL для обработки пустых значений перед математическими операциями.
  • 🔍 Тестируйте запросы на граничных значениях (ровно 0.5, отрицательные числа, очень большие числа).

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

⚠️ Внимание: Избегайте вложенных вызовов функций округления внутри условий соединения таблиц (JOIN). Это может существенно замедлить работу запроса и сделать план выполнения неоптимальным.

☑️ Чек-лист перед внедрением округления в продакшн

Выполнено: 0 / 4
В чем разница между ОКРУГЛ и ОКР в 1С?

Функция ОКРУГЛ выполняет классическое арифметическое округление (0-4 вниз, 5-9 вверх). Функция ОКР использует банковское округление: если дробная часть ровно 0.5, число округляется до ближайшего четного значения. Это снижает статистическую погрешность при суммировании.

Как округлить число до десятков или сотен в запросе?

Для этого используйте отрицательное значение во втором параметре функции. Например, ОКРУГЛ(Число, -1) округлит до десятков, а ОКРУГЛ(Число, -2) — до сотен. Дробная часть при этом заменяется нулями.

Можно ли использовать округление в условии WHERE?

Технически можно, но не рекомендуется. Вызов функции над полем в условии ГДЕ отключает использование индекса по этому полю, что приводит к полному сканированию таблицы. Лучше вычислить диапазон значений заранее и использовать обычные операторы сравнения.

Что вернет функция ЦЕЛ для числа -3.9?

Функция ЦЕЛ вернет -4. Она округляет в сторону минус бесконечности, то есть выбирает ближайшее целое число, которое меньше или равно исходному. Это важно учитывать при работе с отрицательными остатками.