Разработка и Конфигурация · 9 мин
Как округлить число в 1С: способы, функция Окр и практические примеры
Как округлить число в 1С: функция Окр(), округление в форматной строке, округление цен и сумм в документах, типичные ошибки и примеры кода.
Округление чисел в 1С встречается повсюду: при расчёте цен и скидок, начислении налогов, формировании отчётов и печатных форм. При этом у платформы нет одного универсального «переключателя округления» — есть несколько разных механизмов, и выбор зависит от задачи: округлить значение в коде, показать число с нужным количеством знаков на экране или настроить точность хранения в реквизите.
Главный инструмент разработчика — встроенная функция Окр() (в англоязычном синтаксисе — Round()). Для отображения без изменения самого значения используется форматная строка Формат(), а для хранения сумм и количеств точность задаётся в свойствах реквизита через тип «Число». Важно понимать разницу: форматирование меняет только представление, а функция Окр() — само значение.
Функция Окр(): синтаксис и параметры
Функция Окр() округляет число до заданной разрядности. Полный синтаксис: Окр(ИсходноеЧисло, Разрядность, РежимОкругления). Первый параметр — само число или выражение. Второй — количество знаков после запятой: 0 округляет до целых, 2 — до копеек (сотых), а отрицательные значения округляют влево от запятой, например -1 округляет до десятков, -3 — до тысяч.
Третий параметр определяет правило округления. РежимОкругления.Окр15как10 (по умолчанию) работает по правилу «банковского» округления: если отбрасываемая часть ровно 0.5, число округляется до ближайшего чётного. Режим Окр15как20 округляет 0.5 всегда вверх — это привычное «школьное» правило, которого обычно ждут бухгалтеры.
Окр(2.5, 0, РежимОкругления.Окр15как10); // 2 (к ближайшему чётному)
Окр(2.5, 0, РежимОкругления.Окр15как20); // 3 (всегда вверх)
Окр(1234.567, 2); // 1234.57
Окр(1234.567, -2); // 1200
Округление вверх и вниз: Цел и другие приёмы
Стандартной функции «округлить вверх до целого» в языке 1С нет, но задача решается функцией Цел() (аналог Int()), которая отбрасывает дробную часть. Для округления вверх к целому используется приём: Цел(Число) + ?(Число > Цел(Число), 1, 0) или более короткая форма -Цел(-Число). Для округления вниз достаточно самой функции Цел().
Если нужно округлить вверх или вниз не до целого, а до заданного шага (например, до 0.5 или до 10 рублей), сначала делят число на шаг, округляют, затем умножают обратно. Так, округление количества упаковок вверх до целых упаковок при фасовке по 12 штук: Цел((Количество + 11) / 12) или универсально Окр(Количество / Шаг + 0.4999, 0) * Шаг — но корректнее использовать явную проверку остатка от деления.
// Округление вверх до шага 0.5
Результат = Цел((Число + 0.4999) / 0.5) * 0.5;
// Округление до десятков вверх
Результат = Цел((Число + 9) / 10) * 10;
Округление при выводе: функция Формат()
Когда значение должно храниться точно, а округляться только на экране или в печатной форме, применяют функцию Формат(). Параметр ЧДЦ задаёт число десятичных знаков: Формат(Сумма, "ЧДЦ=2") выведет сумму с двумя знаками. Дополнительно полезны параметры ЧРД (разделитель дробной части), ЧРГ (разделитель групп разрядов) и ЧН (представление нуля, например ЧН=0,00).
Ключевое отличие от Окр(): Формат() возвращает строку, а не число. Если результат нужен для дальнейших расчётов, строку придётся преобразовывать обратно, что неудобно и чревато ошибками. Поэтому правило простое: в расчётах — Окр(), в представлении — Формат().
Сравнение вариантов
Изменяет само числовое значение. Подходит для расчётов, записи в базу, итогов документов.
Меняет только отображение, возвращает строку. Подходит для печатных форм и сообщений, не для расчётов.
Задаётся в конфигураторе, обрезает лишние знаки при записи. Подходит для единой точности хранения по всей базе.
Настройка точности хранения в реквизитах
Точность хранения чисел определяется в конфигураторе: у реквизита с типом «Число» задаются свойства «Длина» и «Точность». Например, для денежных сумм типична длина 15 и точность 2, для количества в штуках — точность 0, для веса или курсов валют может требоваться 3–4 знака. При записи значения в реквизит платформа автоматически приводит его к заданной точности.
Для типовых полей вроде «Сумма», «Цена», «Количество» в конфигурациях используются общие определяемые типы и квалификаторы числа. Менять точность существующего реквизита, в котором уже есть данные, следует осторожно: уменьшение точности приведёт к необратимой потере дробной части при перезаписи объектов. Перед таким изменением делают резервную копию и проверяют отчёты, где участвует этот реквизит.
Округление цен, скидок и копеек в документах
Классическая проблема — копеечные расхождения: сумма по строкам не сходится с итогом документа, НДС «не бьётся» с расчётом вручную. Причина почти всегда в том, где именно выполняется округление. Правильная практика — округлять результат каждой строки (сумму строки, сумму НДС) до копеек сразу после расчёта, а итог документа получать суммированием уже округлённых строк, а не округлением общей суммы.
При расчёте цены со скидкой порядок операций тоже имеет значение: сначала вычисляется цена со скидкой, затем она округляется до копеек, и только потом умножается на количество. Если округлить итоговую сумму вместо цены, при большом количестве позиций покупатель увидит в чеке иную сумму, чем ожидал. В типовых конфигурациях эти правила уже реализованы в общих модулях расчёта — при доработках стоит переиспользовать их, а не писать собственные формулы.
Проверка результата и отладка
Проверить, как сработало округление, проще всего через окно «Вычислить выражение» (Shift+F9) в отладчике: введите Окр(ВашаПеременная, 2) и сравните с ожиданием. Для массовой проверки удобен консольный запрос или временный отчёт, выводящий исходное и округлённое значения рядом — так сразу видно систематические расхождения.
Признак корректной настройки: сумма строк документа равна итогу, НДС по строкам сходится с НДС итоговым, а печатная форма показывает те же значения, что хранятся в базе. Если печатная форма отличается от данных документа — почти наверняка в макете применён свой формат вывода, отличный от хранимой точности.
Как проверить результат
Значения совпадают до копейки
Расхождение на 0.01–0.05 — строки округляются неодинаково
Одинаковые цифры
На форме другое число — в макете задан собственный формат
Результат соответствует учётной политике
0.5 уходит к чётному при требовании округлять вверх
Частые вопросы
Чем Окр() отличается от Цел()?
Цел() просто отбрасывает дробную часть (всегда округляет вниз к целому), а Окр() округляет по математическим правилам до любой заданной разрядности, включая отрицательную (десятки, сотни, тысячи). Для отсечения копеек без округления используйте Цел(Число * 100) / 100.
Как округлить число до целого вверх в 1С?
Отдельной функции нет. Используйте приём: Результат = Цел(Число) + ?(Число > Цел(Число), 1, 0). Для отрицательных чисел проверьте логику отдельно, так как Цел() работает с ними иначе, чем интуитивно ожидается.
Почему Окр(2.5, 0) возвращает 2, а не 3?
По умолчанию действует режим Окр15как10 — «банковское» округление, при котором ровно половина округляется к ближайшему чётному. Укажите третьим параметром РежимОкругления.Окр15как20, чтобы 0.5 всегда округлялась вверх.
Как убрать копеечные расхождения между НДС в строках и итогом?
Округляйте сумму НДС каждой строки до копеек сразу при расчёте, а итоговый НДС получайте суммированием строк. Если расхождение принципиально недопустимо, разницу принято относить на последнюю (или самую крупную) строку документа.
Можно ли округлить число в запросе 1С?
В языке запросов есть функция ОКР(Значение, Разрядность) с аналогичным поведением. Однако для денежных расчётов надёжнее выбирать данные запросом без округления и округлять в коде, где доступен явный режим округления.
Влияет ли региональная настройка Windows на округление в 1С?
На результат Окр() — нет, он зависит только от параметров функции. Региональные настройки влияют на представление чисел при выводе (разделитель дробной части, групп разрядов), если форматная строка не задана явно. Поэтому в печатных формах формат лучше указывать явно.
Что важно запомнить
В расчётах округляйте функцией Окр() с явным режимом округления, в представлении — функцией Формат(), точность хранения задавайте в свойствах реквизита. Округляйте каждую строку документа, а не только итог, и проверяйте результат на контрольных примерах с 0.5 и копеечными значениями.