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

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

Как обрезать число в 1С: отсечение без округления

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

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

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

Ниже разобраны рабочие приёмы для встроенного языка 1С:Предприятие 8.3: отсечение дробной части, обрезка до заданного количества знаков, отбрасывание разрядов целой части и обрезка только при отображении. Каждый приём сопровождается примером кода и типичными ошибками.

Чем отсечение отличается от округления в 1С

Функция Окр(Число, Разрядность) округляет по математическим правилам: Окр(12,567; 2) вернёт 12,57, а Окр(12,565; 2) — 12,57 (при режиме округления по умолчанию «0,5 вверх»). То есть функция смотрит на отбрасываемую часть и может увеличить результат.

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

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

Функция Цел(): обрезка дробной части

Самый простой способ обрезать число до целого — функция Цел() (английский синоним Int()). Она возвращает целую часть числа, отбрасывая дробную: Цел(123,99) даст 123, Цел(5,01) — 5.

Пример в коде:

Цена = 1549,90;

ЦенаБезКопеек = Цел(Цена); // 1549

Для отрицательных чисел поведение нужно учитывать отдельно: Цел(-12,7) вернёт -12, то есть функция отбрасывает дробную часть в сторону нуля по модулю, а не «вниз» по числовой оси. Если для отрицательных значений нужен другой результат, добавьте проверку знака и скорректируйте логику.

Обрезка до заданного количества знаков после запятой

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

Функция ОбрезатьЧисло(Число, Знаков)

Множитель = Pow(10, Знаков);

Возврат Цел(Число * Множитель) / Множитель;

КонецФункции

Результат = ОбрезатьЧисло(12,56789, 2); // 12,56

Тот же приём работает для отбрасывания разрядов целой части — с отрицательным показателем степени. Чтобы обрезать число до сотен (12345 → 12300):

Результат = Цел(12345 / 100) * 100; // 12300

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

bsl
Функция ОбрезатьЧисло(Число, Знаков)
    Множитель = Pow(10, Знаков);
    Возврат Цел(Число * Множитель) / Множитель;
КонецФункции

Окр() с режимом округления как альтернатива

У функции Окр() есть третий параметр — режим округления из системного перечисления РежимОкругления. Значение РежимОкругления.Окр15как10 задаёт округление «0,5 вниз», но полноценного режима «всегда отбрасывать» в стандартной поставке нет. Поэтому для гарантированного отсечения надёжнее приём с Цел(), описанный выше.

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

Обрезка числа только при выводе: Формат()

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

Строка = Формат(12,56789, "ЧДЦ=2"); // "12,57" — с округлением

Строка2 = Формат(Цел(12,56789 * 100) / 100, "ЧДЦ=2"); // "12,56" — отсечение

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

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

Цел(Число)

Отсечение до целого. Подходит для отбрасывания копеек. Не работает для заданного числа знаков.

Цел(Число*М)/М

Отсечение до N знаков или разрядов. Универсальный способ, требует аккуратности с типами.

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

Математическое округление. Не подходит, если регламент требует именно отсечение.

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

Только отображение, значение не меняется. Округляет, а не отсекает.

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

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

Вторая ошибка — применение Цел() к строке. Функция работает с числами; если значение пришло из файла или формы в виде строки, сначала преобразуйте его через Число() или ОписаниеТипов, иначе получите ошибку исполнения. Строки с пробелами-разделителями разрядов и неразрывными пробелами перед преобразованием нужно очистить.

Третья ошибка — работа с квалификаторами числа в реквизитах. Если реквизит документа объявлен как «Число (15, 2)», то при записи значение всё равно будет приведено к двум знакам с округлением — независимо от того, как вы его обрезали в коде. Проверяйте точность реквизита в конфигураторе, если результат «возвращает» отброшенные знаки.

Типичные ошибки
01
Использовать Окр() там, где регламент требует отсечение — итоги расходятся с контрагентом на копейки.
02
Передавать строку в Цел() без преобразования через Число() — ошибка исполнения или неверный результат.
03
Забыть про точность реквизита: поле Число(15,2) само округлит значение при записи.
04
Ожидать от форматной строки ЧДЦ отсечения — она округляет при отображении.
Контрольные точки

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

Значение 12,999 после обрезки до 2 знаков
Норма

Получено 12,99

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

Получено 13,00 — сработало округление, а не отсечение

Отрицательное число -5,7 через Цел()
Норма

Результат -5, и это соответствует логике расчёта

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

Ожидался -6 — логика знака не учтена

Сумма документа после перепроведения
Норма

Итоги совпадают с расчётом по формуле

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

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

Проверка результата и отладка

Быстрый способ проверить поведение функции — окно «Вычислить выражение» (Shift+F9) в конфигураторе при отладке. Введите Цел(12,999 * 100) / 100 и убедитесь, что получается 12,99, а не 13. Для проверки без запуска отладчика удобна команда Сообщить() во временной процедуре.

При проверке денежных расчётов берите граничные значения: x,999, x,001, ровно половина копейки (x,005) и отрицательные суммы. Именно на них расходятся округление и отсечение. Если результат уходит в отчётность или обмен с внешней системой, сверьте несколько документов вручную с калькулятором по тем же правилам.

Порядок действий
  1. 1
    Определите, нужно ли изменить значение или только его отображение.
  2. 2
    Уточните регламент: требуется отсечение или математическое округление.
  3. 3
    Для отсечения примените Цел() или Цел(Число*Pow(10,N))/Pow(10,N).
  4. 4
    Проверьте точность реквизита, куда записывается результат.
  5. 5
    Протестируйте на граничных значениях: 0,999, 0,005, отрицательные числа.

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

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

Используйте функцию Цел(): Цел(1549,90) вернёт 1549. Если значение может быть отрицательным, учтите, что Цел(-5,7) даёт -5 — при необходимости добавьте обработку знака.

Чем Окр() отличается от Цел()?

Окр() округляет по математическим правилам с учётом отбрасываемой части и может увеличить результат. Цел() всегда просто отбрасывает дробную часть: Окр(12,99; 0) = 13, а Цел(12,99) = 12.

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

Умножьте на 100, примените Цел() и разделите на 100: Цел(12,567 * 100) / 100 = 12,56. Для другого числа знаков замените 100 на Pow(10, N).

Почему после обрезки в коде в документ записывается округлённое значение?

Проверьте квалификатор числа реквизита в конфигураторе. Если реквизит объявлен как Число(15,2), платформа при записи сама приведёт значение к двум знакам с округлением, независимо от вашей обрезки.

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

Да, но форматная строка ЧДЦ округляет, а не отсекает. Поэтому сначала обрежьте значение арифметически в локальную переменную, а затем выведите её через Формат() — исходные данные документа при этом не изменятся.

Как отбросить разряды целой части, например 12345 до 12300?

Разделите на нужный разряд, возьмите целую часть и умножьте обратно: Цел(12345 / 100) * 100 = 12300. Приём работает для любых степеней десяти.

Итог

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

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