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

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

Как округлить число до десятых в 1С

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

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

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

Ниже разобраны все рабочие способы округления до десятых с примерами кода, типичные ошибки и способы проверки результата.

Функция Окр() — основной способ округления значения

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

Результат = Окр(12,345; 1);   // 12,3

Результат = Окр(12,35; 1); // 12,4 (по умолчанию 0,5 округляется вверх)

Результат = Окр(-7,27; 1); // -7,3

Третий необязательный параметр задаёт режим округления. Значение РежимОкругления.Окр15как20 округляет 0,05 вверх (поведение по умолчанию), а РежимОкругления.Окр15как10 — вниз, то есть Окр(12,35; 1; РежимОкругления.Окр15как10) вернёт 12,3. Этот нюанс критичен, когда результат сверяется с внешней системой, где действуют другие правила.

Учтите, что функция возвращает новое значение, а не изменяет переменную «на месте». Распространённая ошибка — вызвать Окр(Сумма; 1); без присваивания и ожидать, что переменная Сумма изменится. Правильно: Сумма = Окр(Сумма; 1);.

bsl
Сумма = 123,456;
Сумма = Окр(Сумма, 1); // 123,5
СуммаВниз = Окр(123,45, 1, РежимОкругления.Окр15как10); // 123,4

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

Если исходное число должно сохраниться для дальнейших расчётов, а округлить нужно только представление, используйте функцию Формат() с параметром ЧДЦ (число десятичных знаков):

Строка = Формат(12,345; "ЧДЦ=1");  // "12,3"

Строка = Формат(12; "ЧДЦ=1"); // "12,0"

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

Для полей ввода на форме есть свойство «Формат редактирования» и отдельно «Формат» — первое влияет на вид при редактировании, второе — на отображение. Если требуется, чтобы пользователь физически не мог ввести больше одного знака после запятой, ограничьте точность в типе данных реквизита: в свойстве «Тип» укажите Число с точностью 1.

Сравнение вариантов

Окр(Число, 1)

Меняет само значение. Подходит, когда округлённое число участвует в дальнейших расчётах или выгрузке. Необратимо — исходная точность теряется.

Формат(Число, "ЧДЦ=1")

Меняет только строковое представление. Значение остаётся исходным. Подходит для отчётов и печати, но результат — строка, а не число.

Точность в метаданных

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

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

В языке запросов 1С нет прямого аналога функции Окр(), поэтому округление до десятых выполняется через приведение типа. Конструкция ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15,1)) приводит значение к числу с одним знаком после запятой, при этом применяется арифметическое округление.

ВЫБРАТЬ

ВЫРАЗИТЬ(Продажи.СуммаОборот КАК ЧИСЛО(15, 1)) КАК Сумма

ИЗ

РегистрНакопления.Продажи.Обороты КАК Продажи

Альтернативный приём — арифметический: умножить на 10, отбросить дробную часть или округлить и разделить обратно. Однако в чистом виде без целочисленного деления это громоздко, поэтому ВЫРАЗИТЬ — стандартное решение. Учтите, что первая цифра в скобках — общая разрядность числа: если значения могут превышать 999 999 999 999 999,9, увеличьте её, иначе получите ошибку переполнения или усечение.

Округление в СКД и отчётах

В отчётах на системе компоновки данных округление до десятых обычно делается на вкладке «Наборы данных» — в вычисляемом поле через ВЫРАЗИТЬ, либо на уровне оформления. Откройте настройки отчёта, выберите поле и в параметре «Формат» укажите ЧДЦ=1. Это самый безопасный путь: данные в запросе остаются точными, а округляется только вывод.

Опасный сценарий — когда итоги по группировкам считаются от уже округлённых детальных записей. Например, три строки по 0,04 после округления до десятых дадут 0,0 + 0,0 + 0,0 = 0,0, хотя их сумма 0,12 округляется в 0,1. Если отчёт сверяется с бухгалтерией, определитесь, что первично: округлённые строки или округлённый итог, и зафиксируйте это в логике отчёта.

Округление в печатных формах и при выгрузке

В макетах печатных форм параметры области можно форматировать прямо в свойствах ячейки: выделите ячейку макета, откройте свойства и в поле «Формат» задайте ЧДЦ=1. Тогда при выводе через Параметры.Сумма = Значение число автоматически отобразится с одним знаком.

При выгрузке в Excel, XML или обмене с внешними системами решите заранее, что передаётся: число или строка. Если выгружать результат Формат(), придёт строка с десятичным разделителем по региональным настройкам (запятая), что часто ломает импорт на принимающей стороне. Для файлов обмена надёжнее передавать результат Окр(Число; 1) как число, а форматирование оставить принимающей системе.

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

Проверить округление проще всего в консоли кода (если она доступна) или через Сообщить() в отладочной процедуре. Также полезно проверить граничные значения: 0,05; 0,15; -0,05; большие числа вроде 999999999,95 — именно на них всплывают различия режимов округления и переполнение разрядности.

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

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

Окр(12,35; 1)
Норма

Возвращает 12,4 при режиме по умолчанию

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

Возвращает 12,3 — значит, где-то задан режим Окр15как10 или используется другое округление

Тип результата Формат()
Норма

Ожидается строка для вывода пользователю

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

Строка передаётся в арифметику или выгрузку как число — будут ошибки преобразования

Итоги отчёта после округления
Норма

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

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

Копеечные расхождения между детализацией и итогом без объяснения

Типичные ошибки
01
Вызов Окр(Сумма; 1) без присваивания результата — переменная не меняется, округление теряется без всякой ошибки.
02
Использование Формат() для дальнейших расчётов — функция возвращает строку, и попытка сложить такие значения даёт ошибку преобразования типов.
03
Округление на каждом шаге расчёта вместо одного раза в конце — накапливается погрешность, итоги не сходятся с первичкой.
04
Разрядность ЧИСЛО(10,1) в запросе при больших суммах — переполнение и усечение значений без явного предупреждения в части сценариев.

Как выбрать подходящий способ

Маршрут решения

Как выбрать действие

Округлённое значение нужно в дальнейших расчётах или выгрузкеИспользуйте Сумма = Окр(Сумма; 1) и при необходимости задайте режим округления
Нужно только красиво показать число в отчёте или формеПримените Формат(Число; "ЧДЦ=1") или свойство Формат у поля — значение не трогайте
Округление требуется в запросе или СКДИспользуйте ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15,1)) с запасом по разрядности
Нужно ограничить ввод пользователя одним знаком после запятойЗадайте точность 1 в типе реквизита в конфигураторе

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

Итог

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

Окр(Число; 1) меняет само значение, Формат(Число; "ЧДЦ=1") — только отображение, ВЫРАЗИТЬ(КАК ЧИСЛО(15,1)) работает в запросах. Результат Окр() нужно присваивать, режим округления 0,05 проверять на граничных значениях, а точность существующих реквизитов менять только после копии базы.

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

Чем отличается Окр() от Цел() и можно ли округлить до десятых через Цел()?

Цел() отбрасывает дробную часть до целого числа без округления. До десятых через него округляют приёмом Цел(Число * 10 + 0,5) / 10, но это устаревший способ: он некорректно работает с отрицательными числами и не даёт выбора режима. Используйте Окр() — она предназначена именно для этого.

Почему Окр(2,675; 2) иногда возвращает 2,67, а не 2,68?

Числа с плавающей точкой хранятся в двоичном виде, и 2,675 внутренне может представляться как 2,67499..., поэтому округление идёт вниз. Это особенность представления дробных чисел, а не ошибка функции. Если критична точная обработка «пятёрки», проверяйте конкретные значения и при необходимости используйте явный режим округления.

Как округлить до десятых все числа в колонке таблицы значений?

Пройдите по таблице циклом: Для Каждого Строка Из Таблица Цикл Строка.Сумма = Окр(Строка.Сумма; 1); КонецЦикла. Если таблица большая и данные пришли из запроса, эффективнее округлить ещё в запросе через ВЫРАЗИТЬ — тогда цикл не понадобится.

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

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

Как отсечь десятые без округления (12,39 превратить в 12,3)?

В коде: Результат = Цел(Число 10) / 10 — для положительных чисел. Для отрицательных добавьте обработку знака, так как Цел(-1,9) вернёт -1, а не -1. В запросе аналогично через ВЫРАЗИТЬ(Поле 10 КАК ЧИСЛО(15,0)) / 10 с проверкой на отрицательных значениях.

Влияет ли региональная настройка (запятая или точка) на округление?

На само округление — нет, Окр() работает с числом независимо от региональных настроек. Разделитель влияет только на строковое представление: Формат() вернёт «12,3» или «12.3» в зависимости от настроек сеанса. Для обмена файлами задавайте разделитель явно или передавайте числа, а не строки.