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

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

Как ограничить количество знаков после запятой в 1С

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

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

Типичный пример проблемы: в отчёте сумма выводится как 1234,5678, в документе цена хранится с четырьмя знаками, хотя по правилам учёта нужны два, а в печатной форме итог не сходится с суммой строк из-за разного округления. Ниже разобраны все рабочие способы: функция Окр(), форматная строка, свойство «Точность» у реквизитов, округление в запросах и в макетах печатных форм.

Различие между округлением значения и форматированием вывода

Главная ошибка новичков — путать форматирование с округлением. Форматная строка и функция Формат() изменяют только текстовое представление числа: само значение в переменной или базе остаётся прежним, со всеми знаками. Если потом это «красивое» число участвует в дальнейших расчётах, считается исходное значение, и итоги могут не сойтись с тем, что видит пользователь.

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

Округление в коде: функция Окр()

Встроенная функция Окр() — основной способ ограничить разрядность значения в программном коде. Синтаксис: Окр(Число; Разрядность; РежимОкругления). Второй параметр задаёт количество знаков после запятой, третий — правило округления и может принимать значения Округлить15как20 (стандартное арифметическое: 0,5 вверх) или Округлить15как10 (0,5 вниз).

Цена = Окр(ИсходнаяЦена; 2);                  // 123,4567 станет 123,46

СуммаБезКопеек = Окр(Сумма; 0); // округление до целых

Тысячи = Окр(Выручка; -3); // округление до тысяч

Сумма = Окр(Сумма; 2; Округление15как10); // 0,5 округляется вниз

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

bsl
Сумма = Окр(Количество * Цена; 2; Округление15как20);

Когда округлять в коде, а когда нельзя

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

Ограничение знаков при выводе: форматная строка

Когда нужно только красиво показать число, используйте функцию Формат() или свойство «Формат» у поля формы. Ключевой параметр — ЧДЦ (число десятичных знаков): Формат(Сумма; "ЧДЦ=2") вернёт строку с двумя знаками. Дополнительно полезны ЧС (сдвиг разрядов), ЧРД (разделитель дробной части), ЧРГ (разделитель групп) и ЧН (представление нуля).

СтрокаСуммы = Формат(Сумма; "ЧДЦ=2");           // 1 234,57

СтрокаТысяч = Формат(Сумма; "ЧДЦ=1; ЧС=-3"); // в тысячах с одним знаком

Представление = Формат(0; "ЧДЦ=2; ЧН=0,00"); // ноль как 0,00

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

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

Окр() в коде

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

Формат() и форматная строка

Меняет только отображение. Подходит для форм, отчётов, сообщений. Значение в данных остаётся полным.

Точность реквизита

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

Настройка точности реквизита в конфигураторе

Постоянное ограничение разрядности данных задаётся в свойствах реквизита. Откройте конфигуратор, найдите нужный реквизит документа, справочника или регистра, в палитре свойств разверните тип «Число» и установите параметры «Длина» и «Точность». Например, длина 15 и точность 2 означают: максимум 15 разрядов всего, из них 2 — после запятой. При записи значения платформа сама отсечёт лишние знаки.

Аналогично настраиваются ресурсы и измерения регистров накопления и сведений, а также общие определяемые типы — например, тип «ДенежнаяСумма» в типовых конфигурациях централизованно задаёт точность для всех денежных полей. Если в типовой конфигурации нужно изменить точность глобально, ищите именно определяемый тип, а не каждый реквизит по отдельности.

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

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

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

ВЫБРАТЬ

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

ВЫРАЗИТЬ(Продажи.КоличествоОборот КАК ЧИСЛО(15, 3)) КАК Количество

ИЗ

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

В СКД разрядность можно ограничить и без запроса: на закладке «Наборы данных» у поля задаётся тип, а на закладке «Настройки» для выбранного поля в свойстве «Оформление» указывается формат с ЧДЦ. Учтите, что оформление влияет только на показ, а итоги по группировкам СКД считает по полным значениям — при необходимости совпадения «строки и итога» приводите тип в самом запросе.

Знаки после запятой в печатных формах

В табличных макетах разрядность задаётся двумя способами. Первый — свойство «Формат» у ячейки макета: откройте макет, выделите ячейку с параметром и в палитре свойств пропишите ЧДЦ=2. Второй — программно, при заполнении параметра области: Параметры.Сумма = Формат(Сумма; "ЧДЦ=2"). Оба варианта меняют только печатное представление.

Частая претензия пользователей — «на печати копейки не сходятся с экраном». Причина почти всегда в том, что на форме документа стоит один формат, в макете — другой, а сами данные хранятся с бо́льшей точностью. Приведите к единому правилу: либо везде ЧДЦ=2, либо округляйте значения функцией Окр() ещё при проведении документа.

Типичные ошибки
01
Форматирование вместо округления: число выглядит с двумя знаками, но в расчётах участвует полное значение — итоги не сходятся с видимыми суммами.
02
Округление внутри цепочки вычислений: погрешность накапливается, и итог документа расходится с суммой строк на копейки.
03
Уменьшение точности реквизита без копии базы: при реструктуризации данные обрезаются необратимо.
04
Разные форматы на форме и в макете печати: пользователь видит одни цифры, на бумаге выходят другие.
05
Округление курса валют до двух знаков: при пересчёте крупных сумм возникает существенная ошибка — курсы хранят с 4 и более знаками.

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

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

Для проверки фактического хранимого значения используйте отладчик (посмотрите переменную до и после округления) или консоль запросов с выборкой поля без форматирования. Если на форме видно два знака, а в запросе четыре — вы настроили формат, а не данные.

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

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

Значение в базе через запрос
Норма

Количество знаков соответствует заданной точности реквизита

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

Хранятся лишние разряды — настроен только формат отображения

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

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

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

Расхождение на копейки — округление применено не ко всем строкам или к промежуточным расчётам

Печатная форма против экрана
Норма

Суммы на печати и на форме совпадают

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

Разные значения — форматы формы и макета различаются

Итог

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

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

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

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

Используйте Окр(Число; 0) — нулевая разрядность отбрасывает всю дробную часть по правилам арифметического округления. Если нужно всегда округлять вверх или вниз независимо от значения, используйте Цел(Число + 0,999...) для округления вверх или Цел(Число) для отсечения дробной части.

Почему после установки ЧДЦ=2 в расчётах всё равно выходят копейки с ошибкой?

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

Как ограничить знаки после запятой в отчёте на СКД без изменения запроса?

Откройте настройки отчёта, выберите нужное поле, в свойстве «Оформление» задайте формат с ЧДЦ=2. Это изменит только отображение. Если требуется, чтобы и итоги считались от округлённых значений, приведите поле к типу ЧИСЛО(15, 2) через ВЫРАЗИТЬ в запросе набора данных.

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

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

Что делать, если при уменьшении длины числа реструктуризация выдаёт ошибку?

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

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

Передайте отрицательную разрядность: Окр(Сумма; -3) округлит до тысяч, Окр(Сумма; -6) — до миллионов. Для отображения в отчётах удобнее форматная строка с параметром ЧС=-3, которая визуально сдвигает разряды без изменения значения.