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