Разработка и Конфигурация · 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 всегда увеличивает модуль числа). Если режим не указан, платформа применяет банковское округление.
Сумма = Окр(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Откройте справочник видов цен (раздел CRM и маркетинг или Настройки и справочники).
- 2В карточке вида цены установите точность — число знаков после запятой.
- 3Задайте правило округления: арифметически, вверх или вниз, и порядок (до 0,01, до 1, до 10).
- 4При необходимости включите округление до 9 или 99 в конце цены.
- 5Пересчитайте цены обработкой и проверьте результат на нескольких позициях вручную.
Округление в зарплате, налогах и регламентированной отчётности
В ЗУП и бухгалтерских конфигурациях правила округления заданы методологически, и менять их произвольно нельзя. НДФЛ, например, исчисляется в полных рублях: сумма меньше 50 копеек отбрасывается, 50 копеек и более округляется до рубля. Страховые взносы, наоборот, считаются с копейками. Эти правила заложены в конфигурацию и соответствуют требованиям законодательства.
В регламентированных отчётах многие показатели выводятся в рублях или тысячах рублей — отчёт сам округляет значения при заполнении. Если вы дорабатываете такой отчёт, сохраняйте исходный порядок: сначала суммирование точных значений, потом округление итога. Округление каждой строки перед суммированием почти гарантированно даст расхождение с контрольными соотношениями.
Округление при выводе: форматная строка против Окр()
Частая ситуация: число нужно только красиво показать, а не изменить. Для этого в 1С есть функция Формат() и конструкция форматной строки, например Формат(Сумма; "ЧДЦ=2") выведет значение с двумя знаками после запятой, округлив его при отображении. В табличных документах аналогичную роль играет свойство формата ячейки.
Принципиальная разница: Формат() не меняет само значение — в реквизите остаётся полная точность. Окр() меняет значение, и все последующие вычисления пойдут уже от округлённого числа. Если округлить раньше времени, накопленная погрешность в итогах может стать заметной.
Чем округлять в разных задачах
Когда округлённое значение должно храниться и участвовать в дальнейших расчётах: цены, суммы строк, итоги документов.
Когда нужно только отображение: отчёты, печатные формы, сообщения пользователю. Значение в данных не меняется.
Когда округление должно быть единообразным для пользователей без доработки кода и управляться через интерфейс.
Типичные ошибки и как проверить результат
Самая частая ошибка — двойное округление: значение округляется в запросе или в одной процедуре, а потом ещё раз в другой. Вторая по распространённости — сравнение округлённых и неокруглённых величин, из-за чего контроль «сумма строк = итог документа» периодически не сходится на копейку.
Ещё одна ловушка — тип и точность реквизита. Если у числового реквизита в конфигураторе задана точность 2 знака, то при записи платформа сама обрежет или округлит лишние разряды, даже если в коде вы хранили больше. Проверяйте длину и точность в свойствах объекта метаданных, а не только формулу расчёта.
Как проверить результат
Окр(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 вверх». Для отображения применяйте Формат() и не смешивайте его с хранимыми значениями. Округляйте итоги, а не каждую строку, сверяйте точность реквизитов с формулами и не трогайте методику округления налогов без проверки на копии базы.