Разработка и Конфигурация · 9 мин
Как округлить число в большую сторону в 1С
Как округлить число в большую сторону в 1С: функция Окр, приём с Цел, округление в запросах и формулах. Примеры кода, типичные ошибки и проверка результата.
Во встроенном языке 1С нет отдельной функции вида «ОкруглитьВверх», поэтому вопрос, как округлить в большую сторону, возникает у разработчиков и пользователей регулярно. Задача встречается при расчёте количества упаковок, тарификации, начислении пени, определении числа рейсов транспорта и в других ситуациях, где дробную часть нельзя просто отбросить.
Решить задачу можно несколькими способами: через функцию Окр с математическим трюком, через комбинацию Цел и проверки остатка, а также средствами языка запросов и формул в отчётах на СКД. Каждый вариант имеет свои ограничения — например, поведение с отрицательными числами или с точностью до нужного разряда.
Материал ниже разбирает рабочие приёмы с готовым кодом, объясняет, где какой подход применять, и показывает, как проверить корректность округления, чтобы не получить ошибку в цене, количестве или налоге.
Как округляет функция Окр и почему она не подходит напрямую
Стандартная функция Окр(Число, Разрядность) в 1С округляет по арифметическим правилам: если отбрасываемая часть меньше 0,5 — в меньшую сторону, если 0,5 и больше — в большую. То есть Окр(2,3, 0) даст 2, а Окр(2,5, 0) даст 3. Это не «округление вверх», а обычное математическое округление.
Если требуется всегда округлять в большую сторону (например, 2,1 должно стать 3), функция Окр в чистом виде не подходит. Попытка использовать её без дополнительных преобразований — самая частая причина ошибок в расчётах, когда заказчик ожидает «потолок» числа, а получает ближайшее целое.
Также помните, что второй параметр Окр задаёт разрядность: 0 — до целых, 2 — до сотых, а отрицательные значения (например, -1) округляют до десятков. Для округления вверх до сотых или тысяч придётся комбинировать разрядность с описанными ниже приёмами.
Способ 1: округление вверх через Окр со сдвигом
Классический трюк: прибавить к числу 0,5 (или половину шага разрядности) и затем применить обычное округление. Для целых чисел это выглядит так:
Результат = Окр(Число + 0.5, 0);
Логика проста: любое число с дробной частью после добавления 0,5 переходит через границу следующего целого, и Окр округляет его вверх. Например, 2,1 + 0,5 = 2,6 → Окр даст 3. Число 2,0 + 0,5 = 2,5 → Окр даст 3, что уже неверно: целое число не должно увеличиваться.
Чтобы целые числа не «прыгали» на единицу вверх, корректнее использовать сдвиг чуть меньше половины или проверку на целостность:
Если Число = Цел(Число) Тогда
Результат = Число;
Иначе
Результат = Окр(Число + 0.5, 0);
КонецЕсли;
Для округления вверх до сотых масштабируйте число: умножьте на 100, округлите вверх до целого, разделите на 100:
Результат = Окр(Число * 100 + 0.5, 0) / 100;
Способ 2: округление вверх через Цел и проверку остатка
Функция Цел(Число) отбрасывает дробную часть без округления. На её основе строится самый читаемый вариант округления вверх:
Функция ОкруглитьВверх(Число)
ЦелаяЧасть = Цел(Число);
Если Число > ЦелаяЧасть Тогда
Возврат ЦелаяЧасть + 1;
Иначе
Возврат ЦелаяЧасть;
КонецЕсли;
КонецФункции
Такая функция безопасна для целых чисел и прозрачна при чтении кода. Её удобно разместить в общем модуле конфигурации и вызывать из любых процедур — расчёта количества коробок, числа страниц печатной формы, количества рейсов.
Обратите внимание на отрицательные числа: Цел(-2,3) вернёт -2, и условие «Число > ЦелаяЧасть» не выполнится, результат останется -2. Математически «вверх» для -2,3 — это именно -2, так что поведение корректно. Но если бизнес-логика ждёт «вверх по модулю» (то есть -3), условие нужно переписать под конкретное требование.
- 1Откройте конфигуратор и создайте (или используйте существующий) общий модуль, например РаботаСЧислами
- 2Добавьте экспортную функцию ОкруглитьВверх с логикой через Цел и проверку дробной части
- 3Включите флажок «Вызов сервера» или «Клиент», если функция нужна в соответствующем контексте
- 4Вызовите функцию в нужном месте: Результат = РаботаСЧислами.ОкруглитьВверх(Число)
- 5Проверьте на тестовых значениях: 2.1 → 3, 2.0 → 2, 0.01 → 1
Округление вверх в запросах 1С
В языке запросов 1С есть функция ВЫРАЗИТЬ, которая при приведении к числу с меньшей точностью округляет по арифметическим правилам — аналогично Окр. Отдельного оператора «округлить вверх» в запросах нет, поэтому применяется тот же трюк со сдвигом:
ВЫБРАТЬ
ВЫРАЗИТЬ(Количество / Вместимость + 0.5 КАК ЧИСЛО(10, 0)) КАК ЧислоУпаковок
ИЗ
Документ.Заказ.Товары
Здесь деление количества на вместимость упаковки даёт дробное число, добавление 0,5 сдвигает его, а приведение к ЧИСЛО(10, 0) округляет — в результате получаем количество упаковок с запасом. Учтите, что для точных целых результатов деления (например, 10/5 = 2) сдвиг даст 3, поэтому при необходимости добавляйте проверку через ВЫБОР:
ВЫБОР
КОГДА Количество = ВЫРАЗИТЬ(Количество КАК ЧИСЛО(15, 0))
ТОГДА Количество
ИНАЧЕ ВЫРАЗИТЬ(Количество + 0.5 КАК ЧИСЛО(15, 0))
КОНЕЦ
В отчётах на СКД аналогичные выражения можно писать в вычисляемых полях — там доступен синтаксис встроенного языка, включая Цел и Окр, что упрощает задачу по сравнению с чистым запросом.
Типичные сценарии, где нужно округление вверх
Чаще всего округление в большую сторону требуется при расчёте количества тарных мест: если в коробку помещается 12 единиц товара, а заказано 25, нужно 3 коробки, а не 2. Формула: Цел(25/12) + 1 при наличии остатка.
Второй частый случай — тарификация по начатым единицам: минуты разговора, гигабайты трафика, дни аренды. Любая начатая единица оплачивается как полная, поэтому 61 минута при поминутной тарификации с округлением до 5 минут превращается в 65. Здесь сначала делят на шаг тарификации, округляют вверх, затем умножают обратно.
Третий сценарий — расчёт пени и процентов за дни просрочки, где частичный день по условиям договора считается полным. Перед внедрением такого округления сверьтесь с текстом договора или регламента: неверно выбранное направление округления напрямую влияет на деньги.
Проверка результата и типичные ошибки
После внедрения функции проверьте её на граничных значениях: целое число, число чуть выше целого (2,0001), значение ровно 0,5, отрицательное число, ноль. Ожидаемые результаты при округлении вверх: 2 → 2, 2,0001 → 3, 2,5 → 3, -2,3 → -2, 0 → 0.
Удобно вывести проверку через Сообщить в консоли кода или через тестовую обработку. Если конфигурация поддерживает юнит-тесты, добавьте функцию в набор проверок — это защитит от регресса при доработках.
Отдельно следите за порядком операций: сначала выполняйте все вычисления с максимальной точностью и округляйте только финальное значение для вывода или проведения. Промежуточное округление — частая причина копеечных расхождений в итогах.
Как проверить результат
Остаётся без изменений (5 → 5)
Увеличивается на 1 (5 → 6)
Округляется до следующего целого (3)
Округляется вниз до 2
Результат -2 при округлении вверх
Результат -3 без явного требования «по модулю»
FAQ
Есть ли в 1С встроенная функция округления вверх?
Нет, отдельной функции нет. Используются комбинации: Цел с проверкой дробной части либо Окр с предварительным сдвигом значения на половину шага разрядности.
Как округлить вверх до сотых, например цену 12,341?
Умножьте число на 100, округлите вверх до целого и разделите на 100: Окр(Цел(Число*100) + ?)… Практичнее: если Число*100 <> Цел(Число*100), результат (Цел(Число*100)+1)/100, иначе само число. Для 12,341 получится 12,35.
Как округлить вверх в запросе без вычисляемых полей СКД?
Используйте ВЫРАЗИТЬ(Значение + 0.5 КАК ЧИСЛО(15, 0)) для положительных дробных значений. Если нужно сохранить целые числа без изменений, оберните выражение в ВЫБОР с проверкой равенства значения его целой части.
Чем Цел отличается от Окр в 1С?
Цел просто отбрасывает дробную часть (2,9 → 2), а Окр округляет по арифметическим правилам (2,9 → 3, но 2,4 → 2). Ни одна из функций сама по себе не даёт гарантированное округление вверх.
Как округлить вверх до кратного значения, например до 5 или до 50?
Разделите число на шаг, округлите вверх до целого и умножьте обратно: Результат = Шаг * ОкруглитьВверх(Число / Шаг). Для 53 при шаге 5 получится 55, для 53 при шаге 50 — 100.
Почему после округления в документе копеечные расхождения в итогах?
Скорее всего, округление применяется к промежуточным значениям или по-разному в разных местах кода. Округляйте только итоговое значение и используйте единую функцию из общего модуля во всех расчётах.
Что важно запомнить
Округление вверх в 1С реализуется вручную: через Цел с проверкой дробной части или через Окр со сдвигом на 0,5. Проверяйте поведение на целых и отрицательных числах, округляйте только итоговые значения и применяйте единое правило во всех расчётах и запросах.