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

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

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

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

Округление до целого числа — одна из самых частых операций во встроенном языке 1С: она нужна при расчёте количества упаковок, штучных товаров, дней, ставок сотрудников и во многих других сценариях. Платформа предоставляет для этого встроенные функции, и выбор конкретной зависит от того, какой результат требуется: ближайшее целое, целая часть без дроби или округление всегда вверх.

Основной инструмент — функция Окр(), которая округляет число по арифметическим правилам до заданной разрядности, включая нулевую (то есть до целых). Для отбрасывания дробной части без округления используется функция Цел() (английский синоним — Int()). Важно понимать разницу между ними: Окр(2,7; 0) вернёт 3, а Цел(2,7) вернёт 2.

Отдельная ситуация — округление в запросах и в формулах печатных форм. В языке запросов 1С есть свои конструкции (ВЫРАЗИТЬ с приведением типа), которые работают иначе, чем функции встроенного языка. Ниже разобраны все варианты с примерами кода, правилами выбора и типичными ошибками.

Функция Окр(): округление до ближайшего целого

Функция Окр() — стандартный способ округления в 1С. Синтаксис: Окр(ИсходноеЧисло; Разрядность; РежимОкругления). Чтобы округлить до целого, вторым параметром передаётся 0. Третий параметр необязателен и определяет, как обрабатывается значение ровно посередине (например, 2,5).

По умолчанию действует режим Округление15как20: значение 0,5 в младшем разряде округляется в большую сторону. Альтернатива — Округление15как10, при котором 2,5 превратится в 2, а 3,5 — в 4 (так называемое банковское округление к чётному). Для большинства учётных задач подходит режим по умолчанию.

Примеры работы функции:

Результат = Окр(2,4; 0);   // 2

Результат = Окр(2,5; 0); // 3 (режим по умолчанию)

Результат = Окр(2,7; 0); // 3

Результат = Окр(-2,5; 0); // -3

Результат = Окр(2,5; 0; РежимОкругления.Округление15как10); // 2

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

Функция Цел(): отбрасывание дробной части

Функция Цел() (английский синоним Int()) возвращает целую часть числа, просто отсекая всё, что после запятой. Это не округление в математическом смысле: Цел(9,99) даст 9, а не 10. Функция удобна, когда дробная часть заведомо не должна влиять на результат — например, при вычислении количества полных дней между датами или полных лет стажа.

Для положительных чисел Цел() эквивалентна округлению вниз. С отрицательными числами поведение нужно проверять: Цел(-2,7) возвращает -2, то есть отбрасывается дробная часть по направлению к нулю, а не в меньшую сторону. Если требуется строгое округление вниз для любых чисел, используйте комбинацию с проверкой знака.

Цел(9,99);    // 9

Цел(9,01); // 9

Цел(-2,7); // -2

Цел(-2,3); // -2

Округление всегда вверх или всегда вниз

Встроенных функций «округлить вверх» и «округлить вниз» напрямую во встроенном языке 1С нет, поэтому их собирают из Цел() и проверки остатка. Типовая задача — расчёт количества упаковок: если товара 10,2 коробки, заказывать нужно 11.

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

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

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

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

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

Иначе

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

КонецЕсли;

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

Округление вниз для положительных чисел — это просто Цел(Число). Для смешанных данных с отрицательными значениями корректнее сравнивать Число - Цел(Число) с нулём и учитывать знак, либо заранее привести данные к положительным, если по смыслу задачи отрицательных быть не должно.

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

В языке запросов функций Окр() и Цел() нет. Округление выполняется через приведение типа с помощью конструкции ВЫРАЗИТЬ: если привести число к типу ЧИСЛО с нулём знаков после запятой, значение округлится по арифметическим правилам.

ВЫБРАТЬ

ВЫРАЗИТЬ(Продажи.Количество / 3 КАК ЧИСЛО(10, 0)) КАК КоличествоЦелое

ИЗ

Документ.Продажа КАК Продажи

При таком приведении действует арифметическое округление: 2,5 станет 3, а 2,4 — 2. Если нужно именно отбросить дробную часть (аналог Цел()), прямой конструкции нет — обычно вычитают остаток от деления на 1 либо выполняют округление уже после запроса, при обходе выборки средствами встроенного языка.

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

bsl
Результат = Окр(Количество / ВУпаковке; 0); // до ближайшего целого
ПолныхУпаковок = Цел(Количество / ВУпаковке); // отбросить дробную часть

Округление в формулах, СКД и печатных формах

В схеме компоновки данных округление задаётся в выражении ресурса или вычисляемого поля. Можно использовать ВЫРАЗИТЬ с типом ЧИСЛО(15, 0) прямо в запросе набора данных либо функции языка выражений СКД. Учтите, что округление в ресурсах выполняется при каждой группировке, и суммы округлённых значений могут не совпасть с округлённой суммой — это нормальное следствие порядка операций.

В макетах табличных документов и печатных формах округление часто выполняют не вычислением, а форматированием: функция Формат(Число; "ЧДЦ=0") выведет число без дробной части, при этом само значение останется дробным. Это важное различие: форматирование меняет только отображение, а Окр() меняет само значение.

Способы получить целое число

Окр(Число; 0)

Арифметическое округление до ближайшего целого. Подходит для большинства расчётов; 2,5 станет 3.

Цел(Число)

Отбрасывание дробной части к нулю. Подходит для полных дней, лет, целых упаковок; 9,99 станет 9.

ВЫРАЗИТЬ(... КАК ЧИСЛО(n, 0))

Округление в запросе по арифметическим правилам. Не умеет округлять строго вверх или вниз.

Формат(Число; "ЧДЦ=0")

Только форматирует вывод, значение не меняется. Не использовать для последующих расчётов.

Типичные ошибки и проверка результата

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

Ещё одна проблема — округление чисел с плавающей точкой, полученных делением. Из-за особенностей двоичного представления значение визуально равное 2,5 может храниться как 2,4999999, и Окр() вернёт 2 вместо ожидаемых 3. Если такие случаи критичны, добавляйте небольшую поправку или используйте тип с фиксированной точностью.

Типичные ошибки
01
Использовать Цел() вместо Окр() — дробная часть отбрасывается, и итоги занижаются
02
Округлять каждый промежуточный шаг расчёта — погрешности накапливаются, округлять нужно финальный результат
03
Применять Формат() для расчётов — формат меняет только отображение, значение остаётся дробным
04
Не учесть отрицательные числа — Окр(-2,5; 0) даёт -3, что может ломать логику сторно и корректировок
05
Ожидать от ВЫРАЗИТЬ в запросе округления вверх — конструкция округляет только арифметически

Проверять результат удобно через отладчик: поставьте точку останова после вычисления и посмотрите значение в табло. Для массовой проверки выведите пары «исходное — округлённое» в журнал регистрации или временное сообщение на тестовых данных, включая граничные значения 0,5, 0,49, 0,51 и отрицательные числа.

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

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

Значение 2,5 после Окр(x; 0)
Норма

Получено 3 (режим по умолчанию)

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

Получено 2 — проверьте режим округления или двоичное представление числа

Цепочка расчётов
Норма

Округление применено только к итоговому значению

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

Округление на каждом шаге — итог расходится с ручным пересчётом

Отрицательные значения
Норма

Поведение на -2,5 и -2,4 соответствует бизнес-правилу

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

Сторно и корректировки округляются не в ту сторону

Итог

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

Окр(Число; 0) округляет до ближайшего целого, Цел(Число) отбрасывает дробную часть. В запросах используется ВЫРАЗИТЬ с типом ЧИСЛО(n, 0). Округляйте только финальный результат и проверяйте поведение на граничных и отрицательных значениях.

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

Чем Окр() отличается от Цел() в 1С?

Окр() округляет по арифметическим правилам до указанной разрядности: Окр(2,7; 0) даст 3. Цел() просто отсекает дробную часть: Цел(2,7) даст 2. Для округления до ближайшего целого почти всегда нужна Окр().

Как округлить число до целого в запросе 1С?

Используйте приведение типа: ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15, 0)). Значение округлится арифметически. Округления строго вверх или вниз в языке запросов нет — такую логику выполняйте в коде после получения данных.

Как округлить всегда в большую сторону?

Возьмите целую часть через Цел(Число) и добавьте 1, если исходное число больше своей целой части: Результат = Цел(Ч) + ?(Ч > Цел(Ч), 1, 0). Это типовой приём для расчёта количества упаковок и рейсов.

Почему Окр(2,5; 0) иногда возвращает 2?

Две возможные причины: задан режим Округление15как10 (округление к чётному) либо число хранится как 2,49999... из-за двоичного представления результата деления. Проверьте третий параметр функции и точность исходного значения.

Можно ли округлить значение только для отображения, не меняя его?

Да, используйте функцию Формат(Число; "ЧДЦ=0") или настройку формата поля в форме и макете. Само значение останется дробным, что правильно, если оно участвует в дальнейших расчётах.

Как округляется отрицательное число, например -2,5?

При режиме по умолчанию Окр(-2,5; 0) возвращает -3, то есть округление идёт от нуля. Цел(-2,5) вернёт -2, отбрасывая дробную часть к нулю. Для сторно и корректировок проверяйте, какое поведение требуется по правилам учёта.