К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как в 1С округлить до целого числа в большую сторону

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

Во встроенном языке 1С нет отдельной функции «округлить вверх», аналогичной Excel CEILING. Стандартная функция Окр() округляет по арифметическим правилам: 1,4 станет 1, а 1,6 станет 2. Когда нужно гарантированно получить большее целое — например, рассчитать количество упаковок, рейсов транспорта или страниц отчёта — применяют комбинацию из целой части и сравнения с исходным числом.

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

Важно помнить о знаке числа. Для отрицательных значений «в большую сторону» означает движение к нулю: -1,2 должно округлиться до -1, а не до -2. Универсальная формула учитывает это автоматически, а упрощённые варианты — нет, поэтому выбор зависит от того, могут ли в данных встречаться отрицательные числа.

Универсальная формула округления вверх через Цел()

Функция Цел() отбрасывает дробную часть без округления: Цел(2,9) вернёт 2, а Цел(-2,9) вернёт -2. Чтобы получить округление в большую сторону, нужно проверить, есть ли вообще дробная часть, и при её наличии добавить единицу. Формула выглядит так:

Функция ОкруглитьВверх(Число)

ЦелаяЧасть = Цел(Число);

Если Число > ЦелаяЧасть Тогда

Возврат ЦелаяЧасть + 1;

Иначе

Возврат ЦелаяЧасть;

КонецЕсли;

КонецФункции

Компактный однострочный вариант той же логики:

Результат = Цел(Число) + ?(Число > Цел(Число), 1, 0);

Проверка на примерах: число 5,001 даст 6, число 5,0 даст 5, число -5,001 даст -5. Последний случай корректен именно как округление «в большую сторону», потому что -5 больше, чем -5,001. Если оформить код как функцию в общем модуле, её можно вызывать из любого места конфигурации.

bsl
Результат = Цел(Число) + ?(Число > Цел(Число), 1, 0);

Округление вверх через Окр() для положительных чисел

Если гарантированно, что числа неотрицательные (количества, суммы, объёмы), можно обойтись стандартной функцией Окр(). Трюк состоит в том, чтобы сдвинуть значение почти на единицу вверх и затем округлить стандартным способом:

Результат = Окр(Число + 0,499999999999, 0);

Здесь 0,499999999999 — чуть меньше половины. Если у числа есть любая дробная часть, сумма перевалит за следующую половину и Окр() округлит вверх. Если дробной части нет, добавка не дотянет до порога и число останется прежним. Например, Окр(3 + 0,499999999999, 0) = 3, а Окр(3,0001 + 0,499999999999, 0) = 4.

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

Сравнение вариантов

Цел() + проверка дробной части

Универсально, корректно с отрицательными числами, без погрешностей. Требует чуть больше кода.

Окр(Число + 0,4999..., 0)

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

Окр(Число, 0, РежимОкругления.Окр15как20)

Не решает задачу: режим влияет только на пограничное значение 0,5, а не на округление вверх любых дробей.

Округление вверх в запросах 1С

В языке запросов доступна функция Окр(), но конструкции Цел() в ней нет. Поэтому для округления вверх прямо в запросе используют тот же приём со сдвигом:

ВЫБРАТЬ

Окр(Потребность / ВместимостьКороба + 0,499999999999, 0) КАК КоличествоКоробов

ИЗ

РегистрСведений.Потребности КАК Потребности

Альтернатива — вычислить целую часть через Окр(Значение - 0,5, 0), что эквивалентно отбрасыванию дробной части для положительных чисел, и дальше сравнить через ВЫБОР:

ВЫБОР

КОГДА Значение > Окр(Значение - 0,5, 0)

ТОГДА Окр(Значение - 0,5, 0) + 1

ИНАЧЕ Окр(Значение - 0,5, 0)

КОНЕЦ

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

Практические сценарии: упаковки, рейсы, тарификация

Расчёт количества упаковок

Классическая задача: товар отгружается коробами по 12 штук, заказано 130 штук. Деление даёт 10,83 короба — отгрузить придётся 11. Код:

КоличествоКоробов = Цел(КоличествоШтук / ВместимостьКороба)

+ ?(КоличествоШтук % ВместимостьКороба > 0, 1, 0);

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

Тарификация по начатым периодам

При расчёте стоимости аренды или парковки часто тарифицируется каждый начатый час или сутки. Число 2,1 часа должно превратиться в 3. Формула через Цел() справляется напрямую, но проверьте граничный случай: ровно 2,0 часа должны тарифицироваться как 2, а не 3 — именно это и обеспечивает условие «число больше целой части».

Расчёт числа рейсов или смен

Общий вес груза делится на грузоподъёмность машины, результат округляется вверх. Здесь дополнительно стоит проверить делитель: если грузоподъёмность равна нулю или не заполнена, деление вызовет ошибку. Перед расчётом добавьте проверку и осмысленное сообщение пользователю.

Порядок действий
  1. 1
    Определите, могут ли в данных быть отрицательные числа
  2. 2
    Для смешанных данных возьмите формулу Цел(Число) + ?(Число > Цел(Число), 1, 0)
  3. 3
    Для строго положительных количеств допустим вариант Окр(Число + 0,499999999999, 0)
  4. 4
    Проверьте делитель на нуль перед расчётом
  5. 5
    Протестируйте граничные значения: целое число, число с малым остатком, ноль

Проверка результата и граничные случаи

Округление вверх чувствительно к границам, поэтому тестировать нужно не «среднее» значение, а края. Минимальный набор проверок: целое число (10 → 10), число чуть выше целого (10,0001 → 11), число чуть ниже целого (9,9999 → 10), ноль (0 → 0) и, если применимо, отрицательное значение (-2,3 → -2).

Отдельный риск — типы данных. Если значение приходит из строки или из COM/Excel-обмена, перед округлением преобразуйте его в число явно, иначе получите ошибку исполнения. Также помните, что в 1С дробная часть хранится в двоичном виде: 0,1 + 0,2 может дать 0,30000000000000004. Если сравнение с целой частью критично, сначала округлите исходное значение до нужной точности через Окр(Число, 2), а уже потом округляйте вверх.

Контрольные точки

Как проверить результат

Целое число на входе, например 7
Норма

Результат 7

Тревожный признак

Результат 8 — условие сравнения некорректно

Дробь чуть выше целого, например 7,0001
Норма

Результат 8

Тревожный признак

Результат 7 — дробная часть потеряна

Отрицательное число, например -3,4
Норма

Результат -3

Тревожный признак

Результат -4 — использована формула только для положительных чисел

Нулевой делитель в расчёте упаковок
Норма

Понятное сообщение пользователю

Тревожный признак

Ошибка исполнения «Деление на ноль»

Типичные ошибки при округлении вверх

Самая частая ошибка — использовать Окр(Число, 0) и считать, что это округление вверх. Функция округляет арифметически: 4,2 станет 4. В расчёте упаковок это приводит к нехватке тары и расхождениям в документах. Вторая типичная ошибка — прибавлять единицу безусловно: Цел(Число) + 1. Тогда целое число 10 превращается в 11, и заказ на ровное количество коробов внезапно требует лишнюю.

Третья группа ошибок связана с отрицательными числами и делением. Формула Окр(Число + 0,4999..., 0) для -2,3 даст -2, что формально верно, но для -2,6 даст уже -2 вместо ожидаемого -2 — на границе половины поведение становится неочевидным. А забытая проверка делителя на нуль приводит к падению расчёта в момент проведения документа, часто у пользователя без прав на отладку.

Типичные ошибки
01
Использовать Окр(Число, 0) как округление вверх — 4,2 округлится до 4, и упаковок не хватит
02
Прибавлять 1 безусловно: Цел(Число) + 1 — целое 10 превратится в 11
03
Игнорировать отрицательные числа — формула для положительных даёт неверный результат на возвратах и корректировках
04
Не проверять делитель на нуль — расчёт падает с ошибкой при проведении документа
05
Округлять вверх значение с двоичной погрешностью без предварительного Окр() до нужной точности

Оформление в виде переиспользуемой функции

Если округление вверх нужно в нескольких местах конфигурации, вынесите его в общий модуль, например РаботаСЧислами. Функция с понятным именем читается лучше, чем повторяющиеся однострочники, и упрощает исправление логики в одном месте.

// Округляет число до целого в большую сторону.

//

// Параметры:

// Число - Число - исходное значение.

//

// Возвращаемое значение:

// Число - наименьшее целое, не меньшее исходного.

//

Функция ОкруглитьВверх(Число) Экспорт

ЦелаяЧасть = Цел(Число);

Возврат ЦелаяЧасть + ?(Число > ЦелаяЧасть, 1, 0);

КонецФункции

Комментарий-описание по стандарту оформления кода помогает коллегам и системе подсказок редактора. Если модуль серверный, вызов из клиентского кода потребует флага «Вызов сервера» — учтите это при размещении функции.

Итог

Что важно запомнить

Округление вверх в 1С делается формулой Цел(Число) + ?(Число > Цел(Число), 1, 0) — она корректна для любых чисел. Для строго положительных значений допустим приём Окр(Число + 0,499999999999, 0), в том числе в запросах. Всегда проверяйте граничные случаи: целые числа, малые дробные остатки, ноль и делитель.

Частые вопросы

Есть ли в 1С готовая функция округления вверх, как CEILING в Excel?

Нет, во встроенном языке такой функции нет. Есть Окр() с арифметическим округлением и Цел() с отбрасыванием дробной части. Округление вверх реализуется их комбинацией: Цел(Число) + ?(Число > Цел(Число), 1, 0).

Чем Цел() отличается от Окр(Число, 0)?

Цел() просто отбрасывает дробную часть: Цел(4,9) = 4. Окр() округляет по правилам математики: Окр(4,9, 0) = 5, а Окр(4,4, 0) = 4. Для округления вверх ни одна из них в одиночку не подходит.

Как округлить вверх до десятых или сотых, а не до целого?

Умножьте число на 10 или 100, округлите вверх до целого и разделите обратно: ОкруглитьВверх(Число * 100) / 100. Из-за двоичного представления дробей результат иногда стоит дополнительно прогнать через Окр(Результат, 2) для чистого отображения.

Работает ли формула с отрицательными числами?

Формула через Цел() корректна: -2,3 округлится до -2, что и есть «в большую сторону». Приём с Окр(Число + 0,4999..., 0) для отрицательных чисел на границах половины может дать неожиданный результат, поэтому для смешанных данных используйте только вариант с Цел().

Как округлить вверх в запросе, если там нет Цел()?

Используйте Окр(Значение + 0,499999999999, 0) для неотрицательных данных или конструкцию ВЫБОР со сравнением значения и Окр(Значение - 0,5, 0). При сложной логике проще выбрать сырые данные и округлить их в коде при обходе выборки.

Почему 0,1 + 0,2 иногда округляется вверх, хотя должно дать ровно 0,3?

Дробные числа хранятся в двоичном виде, и сумма может оказаться 0,30000000000000004 — с дробной частью она округлится вверх до 1. Перед округлением приведите значение к нужной точности: Окр(Значение, 2), а затем применяйте формулу округления вверх.