Разработка и Конфигурация · 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 либо выполняют округление уже после запроса, при обходе выборки средствами встроенного языка.
Практическая рекомендация: если логика округления нетривиальна (вверх, вниз, с учётом знака), не пытайтесь реализовать её целиком в запросе. Получите исходные данные запросом, а округление выполните в коде — так решение проще читать и отлаживать.
Результат = Окр(Количество / ВУпаковке; 0); // до ближайшего целого
ПолныхУпаковок = Цел(Количество / ВУпаковке); // отбросить дробную частьОкругление в формулах, СКД и печатных формах
В схеме компоновки данных округление задаётся в выражении ресурса или вычисляемого поля. Можно использовать ВЫРАЗИТЬ с типом ЧИСЛО(15, 0) прямо в запросе набора данных либо функции языка выражений СКД. Учтите, что округление в ресурсах выполняется при каждой группировке, и суммы округлённых значений могут не совпасть с округлённой суммой — это нормальное следствие порядка операций.
В макетах табличных документов и печатных формах округление часто выполняют не вычислением, а форматированием: функция Формат(Число; "ЧДЦ=0") выведет число без дробной части, при этом само значение останется дробным. Это важное различие: форматирование меняет только отображение, а Окр() меняет само значение.
Способы получить целое число
Арифметическое округление до ближайшего целого. Подходит для большинства расчётов; 2,5 станет 3.
Отбрасывание дробной части к нулю. Подходит для полных дней, лет, целых упаковок; 9,99 станет 9.
Округление в запросе по арифметическим правилам. Не умеет округлять строго вверх или вниз.
Только форматирует вывод, значение не меняется. Не использовать для последующих расчётов.
Типичные ошибки и проверка результата
Самая частая ошибка — путать Окр() и Цел(). Разработчик ожидает округление, а функция отбрасывает дробную часть, и при больших объёмах расхождение накапливается в заметную сумму. Вторая типичная ошибка — округлять промежуточные результаты в цепочке расчётов: округлять нужно только финальное значение, иначе погрешности складываются.
Ещё одна проблема — округление чисел с плавающей точкой, полученных делением. Из-за особенностей двоичного представления значение визуально равное 2,5 может храниться как 2,4999999, и Окр() вернёт 2 вместо ожидаемых 3. Если такие случаи критичны, добавляйте небольшую поправку или используйте тип с фиксированной точностью.
Проверять результат удобно через отладчик: поставьте точку останова после вычисления и посмотрите значение в табло. Для массовой проверки выведите пары «исходное — округлённое» в журнал регистрации или временное сообщение на тестовых данных, включая граничные значения 0,5, 0,49, 0,51 и отрицательные числа.
Как проверить результат
Получено 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, отбрасывая дробную часть к нулю. Для сторно и корректировок проверяйте, какое поведение требуется по правилам учёта.