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

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

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

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

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

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

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

Функция Окр(): синтаксис и параметры

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

Параметр «Разрядность» работает в обе стороны. Значение 2 округлит до сотых (копеек), значение 0 — до целых. Отрицательные значения округляют влево от запятой: -1 — до десятков, -2 — до сотен, -3 — до тысяч. Например, Окр(1234,56; -2) вернёт 1200.

Примеры базового использования:

Результат = Окр(123,456; 2);    // 123,46

Результат = Окр(123,454; 2); // 123,45

Результат = Окр(123,456; 0); // 123

Результат = Окр(1250; -2); // 1300 (с режимом по умолчанию)

Результат = Окр(1249; -2); // 1200

Режимы округления: 15как20 и 15как10

Третий параметр функции определяет, как обрабатывать «пограничную» пятёрку — ситуацию, когда отбрасываемая часть равна ровно половине единицы последнего оставляемого разряда. В 1С доступны два режима из перечисления РежимОкругления.

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

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

Результат = Окр(2,5; 0; РежимОкругления.Округлить15как20); // 3

Результат = Окр(2,5; 0; РежимОкругления.Округлить15как10); // 2

Результат = Окр(3,5; 0; РежимОкругления.Округлить15как10); // 4

Округление вверх и вниз: как реализовать в 1С

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

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

// Округление вверх до целого

Функция ОкруглитьВверх(Число)

Целое = Цел(Число);

Если Число > Целое Тогда

Возврат Целое + 1;

Иначе

Возврат Целое;

КонецЕсли;

КонецФункции

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

Результат = ОкруглитьВверх(Сумма * 100) / 100;

Практический сценарий — расчёт количества упаковок. Если в упаковке 12 штук, а нужно 100, то 100 / 12 = 8,33. Округление вверх даст 9 упаковок — иначе товара не хватит. Округление вниз применяют, например, при расчёте скидок, когда нельзя превысить заданный лимит.

Округление отображения через форматную строку

Когда само значение менять нельзя, а показать нужно округлённым, используется функция Формат() с параметром ЧДЦ (число десятичных знаков). Например, Формат(123,456; "ЧДЦ=2") выведет строку «123,46», но переменная сохранит исходное значение 123,456.

Тот же принцип работает в свойствах реквизитов форм, колонок таблиц и ячеек макетов печатных форм: в поле «Формат» указывается ЧДЦ=2 или другая разрядность. Это удобно для отчётов, где промежуточные расчёты должны оставаться точными, а вывод — компактным.

Главный риск этого подхода — визуальные расхождения итогов. Если в колонке отображаются округлённые значения, а итог считается по исходным данным, сумма «на глаз» может не сойтись с итоговой строкой на копейку-другую. Пользователи часто воспринимают это как ошибку программы.

Окр() или Формат()

Окр() — округление значения

Подходит для сумм документов, цен, налогов. Результат фиксируется в данных и сходится в итогах. Ограничение: точность исходного значения теряется.

Формат() — округление отображения

Подходит для отчётов, печатных форм, коэффициентов. Исходное значение сохраняется. Ограничение: возможны визуальные расхождения между строками и итогом.

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

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

Типовая задача — расчёт суммы строки как Количество × Цена с последующим округлением до копеек: Сумма = Окр(Количество * Цена; 2). Если цена задана с тремя знаками (например, при пересчёте из валюты), без явного округления сумма строки и сумма НДС, рассчитанная от неё, могут разойтись с итогами документа.

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

Порядок действий при расчёте суммы строки
  1. 1
    Рассчитайте произведение Количество × Цена без округления
  2. 2
    Округлите результат до 2 знаков: Окр(Сумма; 2)
  3. 3
    Рассчитайте НДС от уже округлённой суммы и округлите его до 2 знаков
  4. 4
    Сложите итоги документа из округлённых значений строк
  5. 5
    Проверьте: итог по колонке должен совпадать с суммой документа до копейки

Число в строке: округление при преобразовании

Фраза «выразить как число» часто означает обратную задачу: есть строка или значение с лишней точностью, и его нужно привести к числу с заданным округлением. Если значение хранится как строка («123,456»), сначала выполняется преобразование функцией Число(), затем округление: Окр(Число(СтрокаЗначение); 2).

При обратном преобразовании — из числа в строку для сообщений, наименований или файлов обмена — используйте Формат() с параметром ЧДЦ, а не простое строковое представление. Иначе в строку попадут все хранимые знаки, и внешняя система может отклонить файл из-за лишних разрядов. Для форматов обмена (XML, CSV, JSON) дополнительно проверяйте требования к разделителю дробной части: во многих форматах нужна точка, а не запятая.

Типичные ошибки
01
Округлять только отображение через Формат, а итоги считать по исходным значениям — итоги визуально не сходятся с суммой строк
02
Округлять промежуточные результаты на каждом шаге длинной цепочки расчётов — накапливается погрешность; округлять нужно конечный результат
03
Не учитывать отрицательную разрядность: Окр(Сумма; -2) округляет до сотен, а не до сотых
04
Использовать Цел() для округления до копеек без умножения на 100 — теряется дробная часть полностью
05
Ожидать от Окр() банковского округления по умолчанию — по умолчанию половина всегда идёт вверх

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

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

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

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

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

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

Совпадают до копейки

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

Расхождение больше 0,01–0,02 — где-то смешаны округлённые и исходные значения

Пограничные значения (2,5; 0,125; -2,5)
Норма

Результат соответствует выбранному режиму округления

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

Половина уходит не туда — проверьте третий параметр Окр()

Печатная форма против данных документа
Норма

Отображаемые суммы равны хранимым

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

На печати копейки не сходятся — используется Формат вместо округления данных

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

Итог

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

Окр(Число; Разрядность; Режим) меняет само значение, Формат с ЧДЦ — только отображение. По умолчанию половина округляется вверх; банковское округление включается режимом Округлить15как10. В денежных расчётах округляйте конечные суммы строк и итоги, а не промежуточные вычисления, и проверяйте сходимость итогов до копейки.

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

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

Используйте Окр(Число; 0) — второй параметр равен нулю. Если нужно просто отбросить дробную часть без округления, примените Цел(Число): Цел(7,9) вернёт 7, тогда как Окр(7,9; 0) вернёт 8.

Как округлить до тысяч или сотен?

Передайте отрицательную разрядность: Окр(12345; -2) округлит до сотен, Окр(12345; -3) — до тысяч. С режимом по умолчанию половина округляется вверх: Окр(12500; -3) даст 13000.

Чем отличается Округлить15как20 от Округлить15как10?

Оба режима различаются только на «пограничной» пятёрке. Округлить15как20 (по умолчанию) всегда округляет половину вверх: 2,5 → 3. Округлить15как10 округляет половину к ближайшему чётному: 2,5 → 2, но 3,5 → 4. Второй режим снижает систематическую погрешность в больших массивах расчётов.

Как округлить всегда вверх, если такой функции нет?

Возьмите целую часть через Цел() и прибавьте 1, если исходное число больше своей целой части. Для округления вверх до копеек сначала умножьте число на 100, примените тот же приём, затем разделите на 100.

Почему итог отчёта не сходится с суммой отображаемых строк?

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

Как округлить число, полученное из строки?

Сначала преобразуйте строку функцией Число(), затем округлите: Окр(Число(СтрокаЗначение); 2). Убедитесь, что в строке используется допустимый разделитель дробной части, иначе преобразование завершится ошибкой — при загрузке из файлов разделитель часто приходится предварительно заменять функцией СтрЗаменить().