Разработка и Конфигурация · 8 мин
Как округлить число до сотых в 1С
Как округлить число до сотых в 1С: функция Окр(), режимы округления, примеры кода, округление в запросах и типичные ошибки с денежными суммами.
Округление до сотых — одна из самых частых операций в 1С: цены, суммы документов, расчёт НДС и скидок почти всегда требуют точности до копеек. Во встроенном языке для этого существует функция Окр() (в английском синтаксисе — Round()), которая принимает число, разрядность и режим округления.
Базовый вызов выглядит так: Окр(Число, 2). Второй параметр задаёт количество знаков после запятой. Например, Окр(123.456, 2) вернёт 123.46, а Окр(123.454, 2) — 123.45. По умолчанию применяется арифметическое округление: половина и больше — вверх, меньше половины — вниз.
Важно понимать, что округление не изменяет исходное значение — функция возвращает новое число. Если нужно сохранить результат, его присваивают переменной или реквизиту объекта. Также следует помнить, что отображение числа на форме (форматная строка) и фактическое округление значения — разные вещи: форматирование меняет только вид, но не само значение.
Функция Окр(): синтаксис и параметры
Функция имеет три параметра: Окр(ИсходноеЧисло, Разрядность, РежимОкругления). Первый — само число или выражение. Второй — количество знаков дробной части: значение 2 означает округление до сотых, 0 — до целых, 1 — до десятых. Допускаются отрицательные значения: Окр(1234.56, -2) округлит до сотен и вернёт 1200.
Третий параметр определяет правило обработки «пограничной» пятёрки. Значение Округление15как20 (используется по умолчанию) округляет 0.5 в большую сторону. Значение Округление15как10 реализует так называемое банковское округление: 0.5 округляется к ближайшему чётному разряду. Например, Окр(2.345, 2, Округление15как10) даст 2.34, а Окр(2.355, 2, Округление15как10) — 2.36.
Сумма = 123.456;
Результат = Окр(Сумма, 2); // 123.46
РезультатБанк = Окр(Сумма, 2, Округление15как10); // банковское округление
ДоЦелых = Окр(Сумма, 0); // 123Режимы округления: арифметический и банковский
Арифметический режим (Округление15как20) привычен большинству пользователей: 0.125 округляется до 0.13. Именно его обычно ожидают в торговых и бухгалтерских расчётах, и он подходит для большинства документов.
Банковское округление (Округление15как10) уменьшает систематическую погрешность при массовых суммированиях: половинки распределяются поровну вверх и вниз. Его применяют в статистических и финансовых расчётах, где важна несмещённость итога. В типовых конфигурациях 1С для денежных сумм чаще используется стандартный арифметический режим.
Сравнение режимов
0.5 всегда вверх. Подходит для цен, НДС, копеек в документах. Стандартный выбор.
0.5 к ближайшему чётному. Снижает накопленную погрешность в больших массивах расчётов.
Округление вверх и вниз без режима
Функция Окр() не умеет округлять строго вверх или строго вниз — для этого применяют приёмы с Цел() (отбрасывание дробной части) или арифметические трюки. Округление вниз до сотых: Цел(Число * 100) / 100. Здесь число умножается на 100, дробная часть отбрасывается, затем результат делится обратно.
Округление вверх до сотых: -Цел(-Число 100) / 100 или проверка остатка: если Число 100 > Цел(Число * 100), прибавить 0.01 к усечённому значению. Такие приёмы нужны, например, при расчёте количества упаковок или минимальных платежей, где недобор недопустим.
Вниз = Цел(Число <em> 100) / 100;
Вверх = ?(Число </em> 100 = Цел(Число <em> 100), Число, (Цел(Число </em> 100) + 1) / 100);Округление в запросах
В языке запросов 1С есть собственная функция ОКР() с двумя параметрами: ОКР(Сумма, 2). Режим округления в запросе задать нельзя — работает арифметическое правило. Если нужен банковский режим или округление строго вверх/вниз, расчёт выполняют уже после выборки, в коде.
Пример: ВЫБРАТЬ ОКР(Таб.Сумма * 1.2, 2) КАК СуммаСНДС ИЗ Документ.Реализация КАК Таб. Учтите, что округление внутри запроса до группировки и после неё может давать разные итоги — сначала решите, на каком уровне детализации копейки должны сойтись.
Форматная строка: отображение без округления значения
Если задача — только показать число с двумя знаками после запятой, значение округлять не обязательно. В свойствах поля формы или через функцию Формат(Число, "ЧДЦ=2") задаётся представление: число выводится с двумя разрядами, но в данных хранится полная точность. Это удобно для промежуточных расчётов, где округлять рано.
Обратная сторона: пользователь видит 10.13, а в реквизите хранится 10.1349. При последующих вычислениях это может дать «неожиданные» итоги. Поэтому для денежных реквизитов в типовых конфигурациях обычно задана точность 2 знака на уровне метаданных — тогда округление выполняет сама платформа при записи.
Типичные ошибки при округлении до сотых
Частая проблема — округление на каждом шаге многоступенчатого расчёта. Если округлять цену, затем сумму строки, затем скидку и НДС, накопленная погрешность может дать расхождение в несколько копеек с ожидаемым итогом. Правильная тактика — хранить максимальную точность до финального шага и округлять один раз.
Вторая ошибка — сравнение неокруглённых чисел на равенство. Из-за особенностей представления дробных чисел выражение 0.1 + 0.2 = 0.3 может оказаться ложным. Перед сравнением округлите обе части до нужного разряда: Окр(А, 2) = Окр(Б, 2).
Проверка результата и практические рекомендации
После внедрения округления проверьте расчёт на наборах данных с «неудобными» значениями: суммах, дающих третий знак 5, цепочках умножения на ставку НДС, позициях с копеечными ценами. Сверьте итог документа с суммой округлённых строк — в типовых решениях расхождение обычно списывается на последнюю строку.
Для отладки выводите промежуточные значения через Сообщить() или смотрите их в отладчике. Если расчёт реализован в типовой конфигурации, сначала изучите её штатные процедуры округления (например, общие модули работы с ценами) — дублирование своей логики часто ломает обновления.
Как проверить результат
Итог документа равен сумме строк
Расхождение в копейках между строками и итогом
Округляется по выбранному режиму предсказуемо
Результат «плавает» в зависимости от промежуточных вычислений
Два знака после запятой, совпадает с хранимым значением
Экран показывает 10.13, а в реквизите 10.1349
Что важно запомнить
Округление до сотых — Окр(Число, 2). Режим по умолчанию арифметический, банковский задаётся третьим параметром. Округляйте один раз в конце расчёта, для отображения используйте форматную строку, а дробные числа перед сравнением приводите к одной точности.
Частые вопросы
Как округлить число до сотых в запросе 1С?
Используйте функцию ОКР с двумя параметрами: ОКР(Сумма, 2). Режим округления в запросе не настраивается — применяется арифметическое правило. Для других режимов обрабатывайте результат выборки в коде.
Чем отличается Окр() от форматной строки ЧДЦ=2?
Окр() изменяет само значение и возвращает округлённое число. Форматная строка меняет только отображение: на экране два знака, но в переменной или реквизите хранится полная дробная часть.
Как округлить до сотых строго вверх?
Стандартной функции нет. Приём: умножьте число на 100, возьмите целую часть, при наличии остатка добавьте 1 и разделите на 100. Либо используйте выражение вида -Цел(-Число * 100) / 100.
Почему Окр(2.675, 2) иногда даёт 2.67, а не 2.68?
Из-за двоичного представления дробных чисел 2.675 может храниться как 2.674999... и округляться вниз. Если критична стабильность, добавляйте небольшую поправку или выполняйте расчёт через промежуточное умножение на 100 с округлением до целого.
Можно ли задать округление для реквизита на уровне конфигурации?
Да. У числового реквизита в метаданных есть свойство «Точность». Если задать 2, платформа будет хранить значение с двумя знаками после запятой, отсекая лишние разряды при записи.