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

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

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

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

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

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

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

Функция Окр() — математическое округление

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

Примеры использования:

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

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

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

Результат = Окр(-7.5, 0); // -8

Результат = Окр(123.456, 2); // 123.46 (до сотых)

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

Разрядность может быть и отрицательной: Окр(1234, -2) округлит до сотен и вернёт 1200. Это полезно, когда требуется округлить сумму до десятков или сотен рублей.

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

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

Результат = Цел(15.9);   // 15

Результат = Цел(15.1); // 15

Результат = Цел(-7.9); // -7

Типичное применение — расчёт количества полных упаковок, полных лет или целых частей при разложении суммы. Например, если нужно узнать, сколько полных коробов поместится в заказ, «честное» округление даст неверный результат, а Цел() — корректный.

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

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

Округление вверх до целого:

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

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

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

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

Иначе

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

КонецЕсли;

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

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

Порядок выбора способа округления
  1. 1
    Определите правило: математическое, отсечение, всегда вверх или всегда вниз
  2. 2
    Для математического используйте Окр(Число, 0)
  3. 3
    Для отсечения дробной части используйте Цел(Число)
  4. 4
    Для округления вверх добавьте проверку дробной части к Цел()
  5. 5
    Проверьте поведение на граничных значениях: 0.5, -0.5, целых числах
  6. 6
    Прогоните расчёт на реальных данных и сверьте итоги с эталоном

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

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

ВЫБРАТЬ

ВЫРАЗИТЬ(Продажи.СуммаОборот КАК ЧИСЛО(15, 0)) КАК СуммаЦелая,

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

ИЗ

РегистрНакопления.Продажи.Обороты КАК Продажи

Если нужно именно отсечение дробной части, а не округление, в запросе придётся пойти на ухищрение: например, вычесть 0,5 перед приведением типа для положительных чисел. Такие приёмы снижают читаемость запроса, поэтому нередко разумнее выгрузить результат и округлить уже в коде.

Учитывайте, что приведение типа в запросе выполняется на уровне СУБД, и на очень больших выборках дополнительные вычисления могут влиять на скорость выполнения. По возможности округляйте уже сгруппированные итоги, а не каждую строку детальных данных.

Округление без изменения значения: формат и представление

Иногда округлять само число не нужно — достаточно показать пользователю целое значение, сохранив точные данные для дальнейших расчётов. Для этого служит функция Формат() и свойство «Формат» у полей форм и печатных макетов.

СтрокаДляВывода = Формат(1234.56, "ЧДЦ=0");  // "1 235"

Параметр ЧДЦ=0 задаёт ноль знаков после запятой, при этом отображение округляется по арифметическим правилам. В макетах табличных документов тот же эффект даёт установка формата в свойствах ячейки или параметра. Это правильный подход для отчётов: итоги внизу отчёта тогда сходятся с суммой точных значений, а не с суммой округлённых строк.

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

Типичные ошибки
01
Округление каждой строки документа вместо итоговой суммы — копеечные расхождения с учётом
02
Использование Цел() там, где нужно математическое округление, — заниженные значения
03
Округление через Формат() с последующим преобразованием строки обратно в число — потеря точности и лишний код
04
Изменение округления в типовом модуле — потеря изменений при обновлении конфигурации
05
Игнорирование отрицательных значений — неожиданный результат на сторнирующих документах

Проверка результата и граничные случаи

После внедрения округления проверьте поведение на граничных значениях: ровно 0,5, значения чуть ниже и выше половины, отрицательные числа, ноль и уже целые числа. Удобно вывести тестовую таблицу через Сообщить() или в отладчике, чтобы убедиться, что выбранная функция ведёт себя так, как ожидает бизнес-логика.

Для денежных расчётов дополнительно сверьте итоги: сумма округлённых значений может отличаться от округлённой суммы. Если требование — чтобы сумма частей равнялась итогу, применяется распределение погрешности: разницу добавляют к последней или к самой большой строке. Такое встречается, например, при распределении скидки по позициям чека.

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

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

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

Окр(0.5, 0)
Норма

Возвращает 1

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

Возвращает 0 — использована другая функция или неверная разрядность

Цел(15.9)
Норма

Возвращает 15

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

Возвращает 16 — перепутано с Окр()

Сумма округлённых строк vs округлённая сумма
Норма

Расхождение известно и обработано

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

Копеечные расхождения всплывают в отчётах случайно

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

Поведение соответствует правилам расчёта

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

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

Итог и ответы на частые вопросы

Выбор способа округления в 1С сводится к трём вопросам: нужно ли математическое округление или отсечение, где выполняется расчёт (код, запрос или отображение) и как обрабатывать граничные и отрицательные значения. В большинстве случаев достаточно Окр(Число, 0), Цел(Число) и ВЫРАЗИТЬ(... КАК Число(15, 0)) в запросах.

Итог

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

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

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

Окр() округляет по арифметическим правилам: 15,5 превратится в 16. Цел() просто отбрасывает дробную часть: 15,9 станет 15. Для отрицательных чисел Цел() отбрасывает дробь в сторону нуля, а Окр() округляет от нуля.

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

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

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

Возьмите целую часть через Цел(Число) и прибавьте 1, если исходное число больше своей целой части. Альтернатива — Окр(Число + 0.5, 0), но вариант с явной проверкой понятнее и надёжнее на граничных значениях.

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

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

Почему после округления не сходятся итоги документа?

Обычно причина в том, что округляется каждая строка, а затем округлённые значения суммируются — накапливается погрешность. Округляйте итоговую сумму или распределяйте разницу по строкам осознанно, например добавляя её к последней позиции.

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

Передайте в Окр() отрицательную разрядность: Окр(Число, -1) округлит до десятков, Окр(Число, -2) — до сотен. Например, Окр(1234, -2) вернёт 1200.