Разработка и Конфигурация · 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. Если оформить код как функцию в общем модуле, её можно вызывать из любого места конфигурации.
Результат = Цел(Число) + ?(Число > Цел(Число), 1, 0);Округление вверх через Окр() для положительных чисел
Если гарантированно, что числа неотрицательные (количества, суммы, объёмы), можно обойтись стандартной функцией Окр(). Трюк состоит в том, чтобы сдвинуть значение почти на единицу вверх и затем округлить стандартным способом:
Результат = Окр(Число + 0,499999999999, 0);
Здесь 0,499999999999 — чуть меньше половины. Если у числа есть любая дробная часть, сумма перевалит за следующую половину и Окр() округлит вверх. Если дробной части нет, добавка не дотянет до порога и число останется прежним. Например, Окр(3 + 0,499999999999, 0) = 3, а Окр(3,0001 + 0,499999999999, 0) = 4.
У этого способа есть ограничение: для очень больших чисел и при особых требованиях к точности двоичное представление дробей может дать погрешность на граничных значениях. В типовых прикладных расчётах (упаковки, рейсы, смены) это не проявляется, но для финансовых вычислений с жёсткими требованиями лучше использовать формулу через Цел() — она не опирается на хитрости с плавающей точкой.
Сравнение вариантов
Универсально, корректно с отрицательными числами, без погрешностей. Требует чуть больше кода.
Короткая запись, подходит только для неотрицательных чисел, теоретически уязвима к погрешностям представления дробей.
Не решает задачу: режим влияет только на пограничное значение 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Определите, могут ли в данных быть отрицательные числа
- 2Для смешанных данных возьмите формулу Цел(Число) + ?(Число > Цел(Число), 1, 0)
- 3Для строго положительных количеств допустим вариант Окр(Число + 0,499999999999, 0)
- 4Проверьте делитель на нуль перед расчётом
- 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
Результат 8 — условие сравнения некорректно
Результат 8
Результат 7 — дробная часть потеряна
Результат -3
Результат -4 — использована формула только для положительных чисел
Понятное сообщение пользователю
Ошибка исполнения «Деление на ноль»
Типичные ошибки при округлении вверх
Самая частая ошибка — использовать Окр(Число, 0) и считать, что это округление вверх. Функция округляет арифметически: 4,2 станет 4. В расчёте упаковок это приводит к нехватке тары и расхождениям в документах. Вторая типичная ошибка — прибавлять единицу безусловно: Цел(Число) + 1. Тогда целое число 10 превращается в 11, и заказ на ровное количество коробов внезапно требует лишнюю.
Третья группа ошибок связана с отрицательными числами и делением. Формула Окр(Число + 0,4999..., 0) для -2,3 даст -2, что формально верно, но для -2,6 даст уже -2 вместо ожидаемого -2 — на границе половины поведение становится неочевидным. А забытая проверка делителя на нуль приводит к падению расчёта в момент проведения документа, часто у пользователя без прав на отладку.
Оформление в виде переиспользуемой функции
Если округление вверх нужно в нескольких местах конфигурации, вынесите его в общий модуль, например РаботаСЧислами. Функция с понятным именем читается лучше, чем повторяющиеся однострочники, и упрощает исправление логики в одном месте.
// Округляет число до целого в большую сторону.
//
// Параметры:
// Число - Число - исходное значение.
//
// Возвращаемое значение:
// Число - наименьшее целое, не меньшее исходного.
//
Функция ОкруглитьВверх(Число) Экспорт
ЦелаяЧасть = Цел(Число);
Возврат ЦелаяЧасть + ?(Число > ЦелаяЧасть, 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), а затем применяйте формулу округления вверх.