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

Разработка и Конфигурация · 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. 1
    Откройте конфигуратор и создайте (или используйте существующий) общий модуль, например РаботаСЧислами
  2. 2
    Добавьте экспортную функцию ОкруглитьВверх с логикой через Цел и проверку дробной части
  3. 3
    Включите флажок «Вызов сервера» или «Клиент», если функция нужна в соответствующем контексте
  4. 4
    Вызовите функцию в нужном месте: Результат = РаботаСЧислами.ОкруглитьВверх(Число)
  5. 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.

Удобно вывести проверку через Сообщить в консоли кода или через тестовую обработку. Если конфигурация поддерживает юнит-тесты, добавьте функцию в набор проверок — это защитит от регресса при доработках.

Типичные ошибки
01
Использование Окр без сдвига — получается арифметическое округление, а не округление вверх
02
Приём «+0,5» без проверки целостности — целые числа увеличиваются на единицу
03
Округление результата до умножения на цену — копеечные расхождения накапливаются в итогах документа
04
Игнорирование отрицательных значений — на возвратах и сторно расчёт ведёт себя иначе, чем ожидалось
05
Разные правила округления в коде и в запросе одного отчёта — суммы не сходятся между формами

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

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

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

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

Остаётся без изменений (5 → 5)

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

Увеличивается на 1 (5 → 6)

Дробное значение (например, 2,1)
Норма

Округляется до следующего целого (3)

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

Округляется вниз до 2

Отрицательное число (-2,3)
Норма

Результат -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. Проверяйте поведение на целых и отрицательных числах, округляйте только итоговые значения и применяйте единое правило во всех расчётах и запросах.