Разработка и Конфигурация · 11 мин
Как округляются числа в 1С: правила, функции и настройка
Как работает округление чисел в 1С: функции Окр, Цел, разрядность, округление цен и сумм в документах, типичные ошибки и способы проверки результата.
Округление чисел в 1С — одна из тех тем, которая кажется простой, пока сумма в накладной не разойдётся с суммой в отчёте на копейку. Платформа 1С:Предприятие хранит и вычисляет числа с фиксированной точностью, а округление применяется либо явно — через встроенные функции, либо автоматически — при записи значения в реквизит с ограниченной разрядностью. Понимание того, где именно происходит округление, помогает избежать расхождений в учёте.
Ключевой момент: в 1С нет единого «глобального» правила округления. Результат зависит от трёх факторов — какой функцией вы округляете, какая разрядность задана у реквизита или типа данных и какие настройки округления установлены в конкретной конфигурации (например, правила округления цен и сумм НДС). Каждый из этих уровней разбирается ниже.
Отдельная зона риска — арифметика с дробными числами перед округлением. Если сначала умножить цену на количество, а потом округлить, и если округлить цену, а потом умножить — результаты могут отличаться. Именно поэтому в типовых конфигурациях порядок операций строго регламентирован, и менять его без понимания последствий не стоит.
Как хранятся числа в платформе 1С
Платформа 1С:Предприятие использует десятичный числовой тип с фиксированной точностью, а не двоичные числа с плавающей точкой, как во многих других языках. Это важно: значение 0,1 хранится точно, а не как бесконечная двоичная дробь, поэтому классических ошибок вида «0,1 + 0,2 ≠ 0,3» в 1С практически не возникает.
Точность числа определяется квалификатором типа: общей длиной (максимум 38 знаков) и числом знаков после запятой (точностью). Например, реквизит с типом «Число (15, 2)» физически не может хранить третий знак после запятой — при записи лишние разряды будут отсечены с округлением по арифметическому правилу.
Из этого следует практический вывод: если в расчётах нужна промежуточная точность выше, чем у реквизита, выполняйте вычисления в переменных с явным округлением там, где это требуется, а не полагайтесь на автоматическое усечение при записи. Иначе в разных документах одинаковые расчёты могут дать разные результаты в зависимости от порядка присвоения.
Функция Окр(): основной инструмент округления
Встроенная функция Окр(Число, Разрядность, РежимОкругления) — стандартный способ округлить значение в коде. Второй параметр задаёт, до какого знака округлять: 2 — до сотых (копеек), 0 — до целых, -2 — до сотен. Третий параметр необязателен и определяет режим.
Доступны два режима округления. РежимОкругления.Окр15как20 — значение по умолчанию: 0,5 округляется в большую сторону (2,5 → 3). РежимОкругления.Окр15как10 — 0,5 округляется в меньшую сторону (2,5 → 2). Второй режим применяется редко, в основном там, где этого требуют специальные методики расчёта.
Примеры использования в коде:
Цена = Окр(123.456, 2); // 123.46
СуммаБезКопеек = Окр(123.5, 0); // 124
СуммаВниз = Окр(123.5, 0, РежимОкругления.Окр15как10); // 123
Тысячи = Окр(123456, -3); // 123000
Обратите внимание на отрицательную разрядность: она округляет целую часть числа. Это удобно, когда отчёт нужно показать в тысячах или миллионах, — не делите на 1000 вручную, а используйте Окр с отрицательным параметром, чтобы избежать лишних дробных операций.
Функции Цел() и Int(): отбрасывание дробной части
Функция Цел() (в английском синтаксисе — Int()) не округляет, а отсекает дробную часть: Цел(2,9) вернёт 2, а Цел(-2,9) вернёт -2. Это принципиально другое поведение, и путать его с округлением нельзя — разница на граничных значениях составит единицу.
Типовой сценарий применения Цел() — вычисление количества полных упаковок, полных дней или целой части при разложении числа на составляющие. Например, чтобы узнать, сколько полных коробов поместится в заказ, делят количество на ёмкость короба и берут Цел() от результата.
Если нужно округлить «вверх» (например, сколько коробов потребуется, чтобы упаковать весь товар), готовой функции в платформе нет — используют приём: Цел((Количество + Ёмкость - 1) / Ёмкость) для целых значений либо сравнение с Цел() и добавление единицы при наличии остатка.
Округление цен и сумм в документах
В прикладных конфигурациях (Управление торговлей, ERP, Комплексная автоматизация) округление цен и сумм управляется настройками, а не только кодом. Как правило, для валют и типов цен задаётся порядок округления: до копеек, до рублей, до десятков рублей — и направление (арифметически, всегда вверх или всегда вниз). Точное расположение настроек зависит от версии конфигурации, обычно это разделы настройки ценообразования или параметры валюты.
Принципиально важный вопрос — что округляется первым: цена или сумма. В типовых решениях обычно действует правило: сумма строки рассчитывается как произведение цены на количество с последующим округлением, а итог документа — как сумма округлённых строк. Из-за этого итог по документу не всегда равен произведению «средней» цены на общее количество — и это нормальное поведение, а не ошибка.
При изменении настроек округления в работающей базе помните: новые правила применятся к новым расчётам, а уже проведённые документы автоматически не пересчитаются. Для согласованности данных потребуется перепроведение документов, что на больших объёмах — отдельная операция, требующая копии базы и тестирования.
Округление НДС и расчётных сумм налогов
НДС — самая частая причина «копеечных» расхождений. Сумма налога может считаться двумя способами: от каждой строки документа с последующим суммированием либо от общей базы документа. Оба способа дают корректный, но разный результат, и расхождение в 1–2 копейки между ними — математически неизбежно.
В типовых конфигурациях способ расчёта НДС задаётся настройками учётной политики или параметрами учёта. Менять способ в середине отчётного периода не следует: счета-фактуры и книги покупок/продаж, сформированные по разным методикам, могут не сойтись с данными контрагентов и декларацией.
Практическая рекомендация: если сумма НДС в вашем документе не совпадает с расчётом контрагента на копейку, не «подгоняйте» её ручной правкой без необходимости — сначала проверьте, каким методом считает каждая из сторон. Часто достаточно договориться о едином порядке расчёта в договоре.
- 1Определите, где возникло расхождение: цена, сумма строки, итог документа или НДС
- 2Проверьте разрядность реквизитов в конфигураторе или через описание типов
- 3Выясните, каким методом считается НДС — построчно или от итоговой базы
- 4Сравните порядок операций: что округляется первым — цена или сумма
- 5При необходимости зафиксируйте единый порядок расчёта в коде или настройках и перепроверьте на копии базы
Округление при выводе: формат и представление
Округление значения и его отображение — разные вещи. Функция Формат() и строки формата в макетах и полях форм позволяют показать число с нужным количеством знаков, не меняя самого значения. Например, Формат(Сумма, "ЧДЦ=2") выведет число с двумя знаками после запятой, визуально округлив его, но в переменной останется исходное значение.
Это удобно для отчётов и печатных форм, но таит ловушку: пользователь видит округлённое число, а в итогах участвует неокруглённое, и сумма видимых значений не сходится с итогом. Если отчёт должен быть «сходимым» до копейки, округляйте значения функцией Окр() до вывода, а не только форматируйте их.
В СКД (системе компоновки данных) аналогичная ситуация: формат поля в настройках отчёта влияет только на представление. Ресурсы и группировки рассчитываются по исходным данным, поэтому для точных итогов округление нужно выполнять в запросе или в выражении вычисляемого поля.
Как проверить и отладить округление
Самый быстрый способ проверить, как округлится конкретное значение, — воспользоваться окном «Вычислить выражение» в конфигураторе (Shift+F9 при остановке в отладчике) и выполнить Окр() с нужными параметрами. Это исключает догадки и показывает точный результат платформенного округления.
Для поиска источника расхождений в документе пройдите цепочку расчёта: цена из прайса → цена в строке → сумма строки → итог → НДС. На каждом шаге зафиксируйте значение с максимальной точностью (например, выведите через Сообщить() без формата). Место, где появляется лишний знак или отличающаяся копейка, и есть точка округления.
При доработке собственных расчётов закладывайте проверку: после округления сравнивайте результат с ожидаемым диапазоном и логируйте пограничные случаи (значения, ровно равные x,5 на границе разряда). Это заметно упрощает разбор спорных ситуаций с пользователями.
Как проверить результат
Равна Окр(Цена × Количество, 2) при стандартной настройке
Отличается на копейки без видимой причины — проверьте, не округляется ли цена до умножения
Равен сумме округлённых строк
Не равен произведению итогового количества на цену — это нормально при построчном округлении, но подозрительно при расхождении больше нескольких копеек
Совпадает с расчётом по выбранному методу (построчно или от базы)
Расходится с декларацией или данными контрагента систематически — проверьте настройку метода расчёта
FAQ: частые вопросы об округлении в 1С
Почему 0,5 в 1С округляется вверх, а не по «банковскому» правилу?
Функция Окр() по умолчанию использует арифметическое округление: 0,5 всегда уходит в большую сторону. Банковское округление (к ближайшему чётному) платформой не поддерживается напрямую — если методика требует именно его, алгоритм придётся реализовать в коде самостоятельно.
Можно ли округлить число всегда в большую сторону?
Готовой функции «вверх» нет. Для целых величин используют приём с Цел() и добавлением единицы при наличии остатка; для дробных — прибавляют половину разряда и применяют Окр(), либо сравнивают значение с его округлением вниз и корректируют результат.
Почему сумма в печатной форме не сходится с суммой на экране?
Чаще всего в макете или форме задан разный формат вывода: одно поле показывает два знака, другое — округляет до целых. Проверьте строки формата (ЧДЦ) в обоих местах и убедитесь, что округляется само значение, а не только его представление.
Что будет, если уменьшить разрядность реквизита в конфигураторе?
При реструктуризации существующие значения будут округлены до новой точности, и вернуть отсечённые разряды нельзя. Перед таким изменением обязательно сделайте копию базы и оцените, где эта точность использовалась в расчётах.
Как округлить итоги отчёта до тысяч без ошибок?
Используйте Окр(Значение, -3) — это округлит до целых тысяч арифметически. Не делите на 1000 с последующим форматированием: тогда в итогах участвуют неокруглённые значения, и сумма видимых строк может не сойтись с общим итогом.
Откуда берутся расхождения в копейках между документами поставщика и покупателя?
Стороны могут использовать разный порядок расчёта: округлять цену до умножения или после, считать НДС построчно или от общей базы. Расхождение на 1–2 копейки при этом неизбежно; выход — зафиксировать единый порядок расчёта в договоре или допустить ручную корректировку суммы по согласованию.
Что важно запомнить
Окр() округляет арифметически (0,5 — вверх), Цел() отсекает дробную часть. Разрядность реквизита обрезает лишние знаки при записи. Форматирование меняет только вид числа, но не значение. Расхождения в копейках обычно вызваны порядком операций или методом расчёта НДС — сначала найдите точку округления, потом исправляйте.