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

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

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

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

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

Основной инструмент — встроенная функция Окр(), которая округляет число до заданной разрядности по арифметическим правилам. Для отображения без изменения самого значения используется форматная строка, а в запросах доступна конструкция ВЫРАЗИТЬ с приведением к числу нужной точности. Важно понимать разницу: округление меняет значение, а форматирование меняет только его представление на экране или в печатной форме.

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

Как округлить до десятых функцией Окр в модуле

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

Третий параметр определяет режим округления. По умолчанию действует арифметическое округление (0.5 и выше — вверх), но можно явно указать РежимОкругления.Окр15как20 (значение 0.05 всегда вверх) или РежимОкругления.Окр15как10 (округление 0.05 вниз, по банковским правилам применяется редко). Для большинства прикладных задач достаточно режима по умолчанию.

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

1c
Цена = 187.456;
ЦенаОкругленная = Окр(Цена, 1); // 187.5

// С явным указанием режима
НормаРасхода = Окр(12.35, 1, РежимОкругления.Окр15как20); // 12.4

// Округление результата выражения
Итог = Окр(Количество * Цена / Объем, 1);

Обратите внимание: если второй параметр равен 0, число округляется до целых, а отрицательные значения округляют до десятков, сотен и так далее. Например, Окр(123.456, -1) даст 120. Случайная передача отрицательной разрядности — частая причина «исчезнувших» дробных частей.

Как округлить до десятых в запросе

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

Первый параметр типа — общая длина числа — должен быть достаточным, чтобы вместить целую часть и один знак после запятой. Если указать слишком маленькую длину, значение может быть обрезано или приведено к нулю при переполнении, поэтому для денежных и складских величин обычно указывают ЧИСЛО(15, 1) или больше.

1c
ВЫБРАТЬ
	ВЫРАЗИТЬ(Продажи.Количество КАК ЧИСЛО(15, 1)) КАК КоличествоОкр,
	ВЫРАЗИТЬ(Продажи.Сумма / Продажи.Количество КАК ЧИСЛО(15, 1)) КАК ЦенаОкр
ИЗ
	РегистрНакопления.Продажи КАК Продажи

Важное ограничение: приведение типа в запросе работает только с числовыми выражениями. Если поле имеет составной тип или строковый тип, сначала нужно убедиться, что значение приводимо к числу, иначе результат будет NULL или вызовет ошибку выполнения запроса.

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

Как показать одну цифру после запятой без изменения значения

Не всегда требуется реально округлять число. Если задача — только вывести значение с одним знаком после запятой в отчёте, на форме или в сообщении пользователю, используется функция Формат() с параметром ЧДЦ (число десятичных знаков): Формат(123.456, "ЧДЦ=1") вернёт строку «123,5».

Ключевое отличие от Окр(): исходное значение в переменной или реквизите не меняется. Это важно для расчётов, где промежуточная точность должна сохраняться, а округление нужно только «на бумаге». Если же округлить значение до десятых и потом продолжить с ним расчёты, накопленная погрешность может дать расхождение в итогах.

Три способа округления: что выбрать

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

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

ВЫРАЗИТЬ(... КАК ЧИСЛО(15, 1))

Единственный способ округлить прямо в запросе. Требует достаточной общей длины числа.

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

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

Для полей ввода на форме аналогичный эффект даёт свойство «Формат» элемента формы или параметр ЧДЦ в форматной строке ячейки табличного документа. В макетах печатных форм формат часто задаётся прямо в свойствах параметра, что избавляет от лишнего кода.

Как настроить точность реквизита в конфигураторе

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

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

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

Округление цен и сумм в типовых конфигурациях

В типовых решениях (УТ, ERP, Бухгалтерия) точность цен и сумм обычно определяется настройками валюты и разрядности цен, а не ручным округлением. Например, для цен может быть задано два знака после запятой по умолчанию, и изменить отображение до десятых можно через настройки разрядности в параметрах учёта — без доработки кода.

Если требуется округлять цены до десятых при установке через обработку или загрузку из файла, округление выполняется в коде обработки функцией Окр(Цена, 1) перед записью. При загрузке из Excel или CSV проверяйте, что разделитель дробной части распознан корректно: значение, прочитанное как строка, перед округлением нужно преобразовать в число.

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

Самый быстрый способ проверить поведение функции — выполнить выражение в консоли кода или через команду «Вычислить выражение» (Shift+F9) в отладчике. Введите Окр(2.45, 1) и убедитесь, что результат соответствует ожиданиям выбранного режима округления.

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

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

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

Значение после Окр(Число, 1)
Норма

Один знак после запятой, значение изменено арифметически

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

Два и более знаков — округление не применилось или применён только формат

Результат ВЫРАЗИТЬ в запросе
Норма

Поле содержит число с одним десятичным знаком

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

NULL или ноль — проверьте тип исходного поля и длину ЧИСЛО

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

Суммы строк и НДС пересчитаны от округлённой цены

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

Копеечные расхождения между строками и итогом

Типичные ошибки и ограничения

Самая распространённая ошибка — путать округление и форматирование. Разработчик применяет Формат(), видит на экране «123,5» и считает задачу решённой, но в базе и в последующих расчётах остаётся исходное значение 123.456. Если значение должно быть округлено физически — используйте только Окр() или приведение типа.

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

Типичные ошибки
01
Использование Формат() вместо Окр() — в базе остаётся неокруглённое значение, отчёты расходятся
02
Отрицательная разрядность в Окр() по ошибке — число округляется до десятков вместо десятых
03
Малая длина в ВЫРАЗИТЬ(... КАК ЧИСЛО(5, 1)) — крупные значения обрезаются или обнуляются
04
Округление цены после расчёта суммы — копеечные расхождения между строками и итогом документа
05
Округление на каждом шаге вычислений — накопленная погрешность в итогах

Ещё одно ограничение касается строковых данных: Окр() работает только с числами. Если значение пришло из внешнего источника строкой, сначала преобразуйте его через Число() с обработкой возможной ошибки, иначе получите исключение «Преобразование значения к типу Число не может быть выполнено».

Итог

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

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

Частые вопросы об округлении до десятых в 1С

Чем отличается Окр(Число, 1) от Формат(Число, "ЧДЦ=1")?

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

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

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

Почему Окр(2.45, 1) иногда даёт неожиданный результат?

Так проявляется двоичное представление дробных чисел: 2.45 в памяти хранится с небольшой погрешностью, и значение на границе 0.05 может округлиться не так, как ожидается. Если критично поведение на границе, явно задавайте третий параметр — РежимОкругления.Окр15как20 или Окр15как10.

Как округлить значение в табличной части документа перед записью?

В модуле объекта или в обработке заполнения пройдите циклом по строкам табличной части и присвойте реквизиту округлённое значение: Строка.Количество = Окр(Строка.Количество, 1). После этого пересчитайте зависимые суммы, чтобы итоги соответствовали округлённым значениям.

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

Да. В макете печатной формы для числового параметра задайте форматную строку с параметром ЧДЦ=1 в свойствах ячейки, либо при выводе используйте Формат(Значение, "ЧДЦ=1"). Данные в документе при этом не изменятся.

Что делать, если после округления в отчёте появились расхождения с итогами?

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