Разработка и Конфигурация · 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
Такой подход применяют при укрупнении цен до десятков или тысяч в прайсах, где правила запрещают округлять вверх, чтобы не завышать цену для клиента.
Функция ОбрезатьЧисло(Число, Знаков)
Множитель = Pow(10, Знаков);
Возврат Цел(Число * Множитель) / Множитель;
КонецФункцииОкр() с режимом округления как альтернатива
У функции Окр() есть третий параметр — режим округления из системного перечисления РежимОкругления. Значение РежимОкругления.Окр15как10 задаёт округление «0,5 вниз», но полноценного режима «всегда отбрасывать» в стандартной поставке нет. Поэтому для гарантированного отсечения надёжнее приём с Цел(), описанный выше.
Если задача — округлить, но строго в меньшую сторону (что эквивалентно отсечению для положительных чисел), можно вычесть небольшую поправку перед округлением, однако такой «трюк» хуже читается и чаще вызывает ошибки при сопровождении. Прямая конструкция с умножением, Цел() и делением предпочтительнее: её назначение очевидно любому разработчику, который будет поддерживать код.
Обрезка числа только при выводе: Формат()
Часто менять само значение не нужно — достаточно показать его в отчёте, печатной форме или строке сообщения с усечённой дробной частью. Для этого служит функция Формат() с форматной строкой:
Строка = Формат(12,56789, "ЧДЦ=2"); // "12,57" — с округлением
Строка2 = Формат(Цел(12,56789 * 100) / 100, "ЧДЦ=2"); // "12,56" — отсечение
Обратите внимание: параметр ЧДЦ (число десятичных знаков) в форматной строке округляет, а не отсекает. Если требуется именно отсечение при выводе, сначала обрежьте значение арифметически, а потом форматируйте. То же относится к свойству «Формат» полей формы и колонок табличных документов — оно управляет только отображением и округляет.
Сравнение вариантов
Отсечение до целого. Подходит для отбрасывания копеек. Не работает для заданного числа знаков.
Отсечение до N знаков или разрядов. Универсальный способ, требует аккуратности с типами.
Математическое округление. Не подходит, если регламент требует именно отсечение.
Только отображение, значение не меняется. Округляет, а не отсекает.
Типичные ошибки и ограничения
Первая частая ошибка — путаница между округлением и отсечением в денежных расчётах. Если в одном месте кода сумма округляется через Окр(), а в другом обрезается через Цел(), итоги документа и отчёта по нему разойдутся на копейки. Правило обработки дробной части должно быть единым в рамках одного расчёта и зафиксировано в комментарии или общей процедуре.
Вторая ошибка — применение Цел() к строке. Функция работает с числами; если значение пришло из файла или формы в виде строки, сначала преобразуйте его через Число() или ОписаниеТипов, иначе получите ошибку исполнения. Строки с пробелами-разделителями разрядов и неразрывными пробелами перед преобразованием нужно очистить.
Третья ошибка — работа с квалификаторами числа в реквизитах. Если реквизит документа объявлен как «Число (15, 2)», то при записи значение всё равно будет приведено к двум знакам с округлением — независимо от того, как вы его обрезали в коде. Проверяйте точность реквизита в конфигураторе, если результат «возвращает» отброшенные знаки.
Как проверить результат
Получено 12,99
Получено 13,00 — сработало округление, а не отсечение
Результат -5, и это соответствует логике расчёта
Ожидался -6 — логика знака не учтена
Итоги совпадают с расчётом по формуле
Копеечные расхождения между строками и итогом
Проверка результата и отладка
Быстрый способ проверить поведение функции — окно «Вычислить выражение» (Shift+F9) в конфигураторе при отладке. Введите Цел(12,999 * 100) / 100 и убедитесь, что получается 12,99, а не 13. Для проверки без запуска отладчика удобна команда Сообщить() во временной процедуре.
При проверке денежных расчётов берите граничные значения: x,999, x,001, ровно половина копейки (x,005) и отрицательные суммы. Именно на них расходятся округление и отсечение. Если результат уходит в отчётность или обмен с внешней системой, сверьте несколько документов вручную с калькулятором по тем же правилам.
- 1Определите, нужно ли изменить значение или только его отображение.
- 2Уточните регламент: требуется отсечение или математическое округление.
- 3Для отсечения примените Цел() или Цел(Число*Pow(10,N))/Pow(10,N).
- 4Проверьте точность реквизита, куда записывается результат.
- 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С делается через Цел() и арифметику со степенями десяти; Окр() и форматная строка округляют, а не обрезают. Перед внедрением проверьте регламент расчёта, точность реквизитов и поведение на граничных и отрицательных значениях.