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

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

Как округлять в 1С: функции, настройки и типовые сценарии

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

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

Ключевой момент, который нужно понимать сразу: в 1С по умолчанию используется так называемое «банковское округление» — при значении ровно 0,5 в отбрасываемой части число округляется к ближайшему чётному. Это отличается от привычного «школьного» правила, где 0,5 всегда идёт вверх, и часто становится причиной вопросов «почему 2,5 превратилось в 2, а не в 3».

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

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

Во встроенном языке 1С округление выполняется функцией Окр(). Она принимает до трёх параметров: само число, разрядность (до какого знака округлять) и режим округления. Минимальный вызов выглядит так: Окр(123,456; 2) — результат 123,46.

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

Третий параметр определяет поведение на границе 0,5. Доступны два режима: Округление15как10 (0,5 идёт к нулю, то есть к ближайшему чётному при симметричном округлении) и Округление15как20 (0,5 всегда увеличивает модуль числа). Если режим не указан, платформа применяет банковское округление.

bsl
Сумма = Окр(123,456; 2);                          // 123,46
СуммаВТысячах = Окр(1234567; -3);                // 1235000
ЦенаВверх = Окр(10,5; 0; Округление15как20);     // 11
ЦенаБанк = Окр(10,5; 0);                          // 10 (банковское округление)

Банковское округление и как его обойти

Банковское (математическое, округление Гаусса) округление выбрано в платформе не случайно: при массовых расчётах оно уменьшает систематическую погрешность, потому что 0,5 уходит то вверх, то вниз с равной вероятностью. Но пользователи и проверяющие часто ждут классическое правило «пять копеек — вверх».

Чтобы получить привычное поведение, явно передавайте третий параметр: Окр(Сумма; 2; Округление15как20). Это особенно важно в печатных формах и документах, где сумма должна совпадать с расчётом «на калькуляторе» у контрагента.

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

Функция Окр() не умеет округлять строго вверх или строго вниз — для этого используют Цел() и самостоятельные приёмы. Округление вниз до целого: Цел(Число). Округление вверх: Цел(Число) + ?(Число = Цел(Число), 0, 1). Для дробных разрядов предварительно умножьте число на 10, 100 и так далее, а после округления разделите обратно.

Округление цен и сумм в торговых документах

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

Дополнительно доступны «психологические» правила округления — например, чтобы цена заканчивалась на 9 или 99. Эти настройки применяются при расчёте цен по формулам и при автоматическом переоценивании, но не пересчитывают уже проведённые документы задним числом.

В документах продажи итоговая сумма складывается из округлённых сумм по строкам. Поэтому при ручном изменении цены или скидки проверяйте, что произведение «цена × количество» после округления совпадает с суммой строки — иначе при обмене с ЭДО или выгрузке в онлайн-кассу возможны расхождения в копейку.

Как настроить округление цены в типовой конфигурации
  1. 1
    Откройте справочник видов цен (раздел CRM и маркетинг или Настройки и справочники).
  2. 2
    В карточке вида цены установите точность — число знаков после запятой.
  3. 3
    Задайте правило округления: арифметически, вверх или вниз, и порядок (до 0,01, до 1, до 10).
  4. 4
    При необходимости включите округление до 9 или 99 в конце цены.
  5. 5
    Пересчитайте цены обработкой и проверьте результат на нескольких позициях вручную.

Округление в зарплате, налогах и регламентированной отчётности

В ЗУП и бухгалтерских конфигурациях правила округления заданы методологически, и менять их произвольно нельзя. НДФЛ, например, исчисляется в полных рублях: сумма меньше 50 копеек отбрасывается, 50 копеек и более округляется до рубля. Страховые взносы, наоборот, считаются с копейками. Эти правила заложены в конфигурацию и соответствуют требованиям законодательства.

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

Округление при выводе: форматная строка против Окр()

Частая ситуация: число нужно только красиво показать, а не изменить. Для этого в 1С есть функция Формат() и конструкция форматной строки, например Формат(Сумма; "ЧДЦ=2") выведет значение с двумя знаками после запятой, округлив его при отображении. В табличных документах аналогичную роль играет свойство формата ячейки.

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

Чем округлять в разных задачах

Окр()

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

Формат() / формат ячейки

Когда нужно только отображение: отчёты, печатные формы, сообщения пользователю. Значение в данных не меняется.

Настройки видов цен и параметров учёта

Когда округление должно быть единообразным для пользователей без доработки кода и управляться через интерфейс.

Типичные ошибки и как проверить результат

Самая частая ошибка — двойное округление: значение округляется в запросе или в одной процедуре, а потом ещё раз в другой. Вторая по распространённости — сравнение округлённых и неокруглённых величин, из-за чего контроль «сумма строк = итог документа» периодически не сходится на копейку.

Ещё одна ловушка — тип и точность реквизита. Если у числового реквизита в конфигураторе задана точность 2 знака, то при записи платформа сама обрежет или округлит лишние разряды, даже если в коде вы хранили больше. Проверяйте длину и точность в свойствах объекта метаданных, а не только формулу расчёта.

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

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

Поведение на границе 0,5
Норма

Окр(2,5) и Окр(3,5) дают ожидаемую пару 2 и 4 (банковское) или 3 и 4 (15как20)

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

Результат неожиданный — значит, режим округления не задан или задан неверно

Итог документа
Норма

Сумма округлённых строк равна округлённому итогу в пределах одной копейки

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

Систематические расхождения в копейках по многим документам

Хранимое значение
Норма

В реквизите после записи столько знаков, сколько задано точностью метаданных

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

Значение «само» обрезалось или округлилось не так, как в коде

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

Почему Окр(2,5; 0) возвращает 2, а не 3?

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

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

Штатной функции «вверх» нет. Для целых используйте конструкцию Цел(Число) + ?(Число > Цел(Число), 1, 0). Для дробных разрядов сначала умножьте число на 10 в нужной степени, округлите вверх до целого, затем разделите обратно.

Чем отличается Окр() от Формат()?

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

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

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

Почему после записи документа сумма отличается от той, что была в коде?

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

Как округляется НДФЛ в 1С:ЗУП?

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

Итог

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

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