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

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

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

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

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

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

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

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

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

bsl
СуммаБезКопеек = Окр(СуммаДокумента, 0);
// 123,49 -> 123
// 123,50 -> 124
// -123,50 -> -124

Функция применяет арифметическое округление: дробная часть меньше 0,5 отбрасывается, 0,5 и больше — увеличивает целую часть на единицу. Это соответствует привычным правилам округления в бухгалтерии и подходит для большинства расчётов налогов и итоговых сумм.

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

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

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

Функция Цел() не округляет, а просто отсекает дробную часть. Цел(123,99) вернёт 123, хотя математически правильное округление дало бы 124. Для положительных чисел это округление «вниз».

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

Сравнение способов округления

Окр(Сумма, 0)

Математическое округление до целого. Подходит для сумм, налогов, цен. 123,5 превращается в 124.

Цел(Сумма)

Отбрасывание дробной части без округления. Подходит для количеств и сроков, но не для денег. 123,99 превращается в 123.

ВЫРАЗИТЬ в запросе

Приведение типа к Число(15, 0) с округлением по правилам СУБД. Удобно при выборке больших объёмов данных.

Настройка точности в конфигурации

Округление цен и сумм на уровне метаданных без кода. Работает только в пределах возможностей типовой конфигурации.

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

Когда данные обрабатываются запросом, округлять каждую строку в цикле после выборки неэффективно. Правильнее выполнить округление на стороне СУБД с помощью оператора ВЫРАЗИТЬ:

bsl
ВЫБРАТЬ
	ВЫРАЗИТЬ(Продажи.СуммаОборот КАК ЧИСЛО(15, 0)) КАК СуммаЦелая
ИЗ
	РегистрНакопления.Продажи.Обороты КАК Продажи

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

Альтернатива — получить данные запросом без округления, а затем округлить функцией Окр() уже в коде при обработке результата. Этот вариант предсказуемее, так как правила округления будут одинаковыми независимо от СУБД.

Округление в типовых конфигурациях без программирования

Не всегда нужно писать код. В типовых решениях (1С:Бухгалтерия, Управление торговлей, ERP) часть задач решается настройками. Точность цен и сумм задаётся в параметрах учёта или в свойствах валют и видов цен — например, можно настроить округление цен до целых рублей при расчёте по формулам ценообразования.

В механизмах ценообразования УТ и ERP у вида цен есть правила округления: порядок округления и вариант (в большую сторону, в меньшую, по арифметическим правилам). Это позволяет получать целые цены автоматически при установке цен номенклатуры.

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

Типичные сценарии и подводные камни

Расхождение суммы строк и итога документа

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

Округление НДС

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

Округление при обмене данными

Если округление выполняется в одной системе, а данные затем передаются в другую (например, из УТ в Бухгалтерию), убедитесь, что обе стороны округляют одинаково. Иначе при сверке будут возникать копеечные расхождения, которые трудно отследить.

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

Проверка результата округления

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

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

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

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

Значение 123,50 после округления
Норма

Окр(123,50, 0) даёт 124

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

Получено 123 — используется Цел() или режим Окр15как10

Итог документа против суммы строк
Норма

Итог равен сумме округлённых строк

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

Разница в рубли — итог посчитан от исходных значений

Печатная форма и данные базы
Норма

Суммы совпадают с точностью до заявленной разрядности

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

На печати целые, в базе копейки — округлено только отображение

Итог

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

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

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

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

Окр() выполняет математическое округление: 123,5 станет 124. Цел() просто отбрасывает дробную часть: 123,99 станет 123. Для денег почти всегда нужна Окр(), а Цел() применяется для количеств, дней, лет и подобных величин.

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

Штатной функции «вверх» во встроенном языке нет. Используйте приём: если значение не равно своей целой части, прибавьте единицу к результату Цел(). Для цен в УТ и ERP округление «в большую сторону» задаётся в настройках правил округления вида цен.

Можно ли округлить сумму до целых без программирования?

Да, если речь о ценах — в типовых конфигурациях с механизмом ценообразования правила округления настраиваются в виде цен. Для печатных форм достаточно форматной строки ЧДЦ=0. Полное округление всех сумм документов без доработки обычно недоступно.

Почему после округления в запросе результат отличается от Окр()?

Приведение типа ВЫРАЗИТЬ выполняется на стороне СУБД, и правила обработки значения ровно 0,5 могут отличаться от правил платформы 1С. Чтобы результат был предсказуемым и одинаковым везде, округляйте в коде функцией Окр() после выполнения запроса.

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

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

Опасно ли менять округление в рабочей базе?

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