Разработка и Конфигурация · 8 мин
Как округлить число до целого в 1С
Как округлить число до целого в 1С: функция Окр(), Цел(), Int(), округление вверх и вниз, примеры кода, типичные ошибки и проверка результата.
Округление чисел — одна из самых частых операций при разработке и доработке конфигураций 1С: цены, количества, суммы НДС, показатели отчётов. Во встроенном языке 1С для этого есть штатная функция Окр(), а также несколько вспомогательных приёмов, когда нужно округлить строго вверх или строго вниз. Выбор способа зависит от того, какое правило округления требуется по бизнес-логике.
Ошибка в округлении напрямую бьёт по деньгам: расхождения в копейках между документами и отчётами, проблемы при сверке с контрагентами и налоговой. Поэтому важно понимать не только синтаксис, но и то, как именно работает каждый метод, и где он даёт неожиданный результат.
Функция Окр() — основной способ округления
Функция Окр() (в английском синтаксисе — Round()) — стандартный инструмент округления во встроенном языке 1С. Она принимает два параметра: само число и разрядность, до которой нужно округлить. Для округления до целого второй параметр равен нулю.
Результат = Окр(123.6, 0); // 124
Результат = Окр(123.4, 0); // 123
Результат = Окр(123.5, 0); // 124
Функция работает по арифметическим правилам: дробная часть 0,5 и выше округляется вверх, меньше 0,5 — вниз. Это соответствует «школьному» правилу округления, которое ожидает большинство пользователей.
Второй параметр может быть и отрицательным — тогда округление идёт влево от запятой: Окр(1234, -2) вернёт 1200. Это полезно, когда требуется округлить сумму до десятков или сотен, например при расчёте плановых показателей.
Округление вниз: функция Цел()
Когда нужно отбросить дробную часть независимо от её значения, используйте функцию Цел() (английский синтаксис — Int()). Она возвращает целую часть числа, то есть фактически округляет вниз для положительных значений.
Результат = Цел(123.9); // 123
Результат = Цел(123.1); // 123
Типичный сценарий — расчёт количества полных упаковок, полных лет стажа, целых штук при списании. Например, если в упаковке 12 единиц, а нужно отгрузить 100, то полных упаковок будет Цел(100 / 12) — то есть 8.
Будьте внимательны с отрицательными числами: Цел(-123.9) вернёт -123, то есть функция отбрасывает дробную часть по направлению к нулю, а не в меньшую сторону. Если для отрицательных значений нужно математическое округление вниз, добавьте проверку знака.
Округление вверх: готовой функции нет
Во встроенном языке 1С нет отдельной функции «округлить вверх» (аналога Ceil). Её реализуют вручную одним из двух способов.
Первый способ — через сравнение с целой частью:
Функция ОкруглитьВверх(Число)
ЦелаяЧасть = Цел(Число);
Если Число > ЦелаяЧасть Тогда
Возврат ЦелаяЧасть + 1;
Иначе
Возврат ЦелаяЧасть;
КонецЕсли;
КонецФункции
Второй, более короткий приём — сдвиг на 0,5 с последующим арифметическим округлением: Окр(Число + 0.5, 0). Для положительных чисел это даёт округление вверх, но для граничных значений и отрицательных чисел поведение отличается, поэтому вариант с явной проверкой надёжнее и читается легче.
Как выбрать способ округления
Округление в запросах и при выводе
В языке запросов 1С есть своя функция округления — Окр() (в запросах пишется как Окр либо Round в зависимости от версии платформы). Она работает аналогично: ВЫБРАТЬ Окр(Сумма, 0) ИЗ Документ.Реализация. Удобно округлять уже на этапе выборки, чтобы не обрабатывать каждую строку в коде.
Если задача — только показать пользователю целое число без изменения самого значения, используйте форматирование через функцию Формат(Число, "ЧДЦ=0"). Значение в переменной останется дробным, а на экране и в печатной форме отобразится округлённым. Это правильный подход, когда расчёты должны вестись с полной точностью.
Тот же принцип действует в СКД и макетах печатных форм: задайте формат поля «Число, 0 знаков после запятой», и платформа сама выполнит отображение без изменения данных в базе.
Сравнение способов округления в 1С
Арифметическое округление до целого. Подходит для сумм и количеств, где важна ближайшая точность.
Отбрасывание дробной части. Подходит для подсчёта полных единиц; осторожно с отрицательными числами.
Меняет только отображение, значение не трогает. Подходит для отчётов и печатных форм.
Полный контроль над правилом. Требуется для тарифов и регламентированных расчётов.
Типичные ошибки и подводные камни
Самая частая ошибка — округлять промежуточные результаты в цепочке расчётов. Например, сначала округлить цену, потом умножить на количество и округлить сумму: итог расходится с расчётом без промежуточного округления. Правило простое: округляйте только конечный результат, который уходит в документ или отчёт.
Вторая проблема — двоичное представление дробных чисел. Значение, которое выглядит как 2,5, в памяти может быть 2,4999999, и Окр() вернёт 2 вместо ожидаемых 3. В типовых расчётах с деньгами используйте тип Число с фиксированной точностью, заданной в метаданных, а не результат сложных вычислений «на лету».
Третья ошибка — смешивание округления данных и форматирования. Если округлили значение кодом, а потом ещё и задали формат с нулём знаков, результат может отличаться от ожидаемого при граничных значениях. Выбирайте один уровень: либо округление в данных, либо форматирование при выводе.
Проверка результата
После внедрения округления проверьте его на граничных значениях: ровно 0,5; числа вида 0,499999; отрицательные значения; ноль. Убедитесь, что поведение совпадает с требованиями учётной политики или регламента расчёта.
Полезный приём — написать небольшую обработку или процедуру, которая прогоняет функцию по набору тестовых значений и выводит результат в таблицу. Это занимает несколько минут и снимает вопросы при приёмке доработки.
Как проверить результат
Возвращает 3
Возвращает 2 — проверьте, не является ли аргумент результатом вычисления с погрешностью
Возвращает -2, если это соответствует логике
Ожидалось -3 — нужна отдельная обработка отрицательных чисел
Совпадает с суммой строк и с контрольным расчётом вручную
Расхождения в копейках — округление применено к промежуточным значениям
Что важно запомнить
Окр(Число, 0) — арифметическое округление до целого, Цел(Число) — отбрасывание дробной части, округление вверх реализуется собственной функцией. Округляйте только конечный результат, а для отображения без изменения данных используйте Формат().
Частые вопросы
Как округлить число до целого в запросе 1С?
Используйте функцию Окр прямо в тексте запроса: «ВЫБРАТЬ Окр(Таб.Сумма, 0) КАК СуммаЦелая ИЗ ...». Второй параметр задаёт разрядность, ноль означает округление до целого. Это избавляет от построчной обработки результата в коде.
Чем Окр() отличается от Цел()?
Окр() округляет по арифметическим правилам: дробная часть 0,5 и выше увеличивает результат. Цел() просто отбрасывает дробную часть: Цел(7.9) вернёт 7, а Окр(7.9, 0) вернёт 8.
Как округлить в большую сторону, если такой функции нет?
Напишите функцию: вычислите Цел(Число) и, если исходное число больше полученной целой части, верните Цел(Число) + 1, иначе — саму целую часть. Для положительных чисел также работает приём Окр(Число + 0.5, 0), но явная проверка надёжнее.
Почему Окр(2.5, 0) иногда возвращает 2 вместо 3?
Из-за двоичного представления дробных чисел значение может храниться как 2.4999999. Такое бывает, если аргумент — результат вычислений. Используйте типы с фиксированной точностью из метаданных или добавляйте небольшую корректировку перед округлением.
Можно ли округлить число только для отображения, не меняя значение?
Да. Используйте Формат(Число, "ЧДЦ=0") для строки или настройте формат поля в макете, отчёте или СКД. Само значение останется дробным, изменится только представление на экране и в печатной форме.
Делает ли 1С банковское округление (0,5 до чётного)?
Нет, штатная Окр() всегда округляет 0,5 вверх. Если регламент требует банковского округления, реализуйте алгоритм самостоятельно: проверяйте дробную часть и чётность целой части перед принятием решения.