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

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

Как в 1С округлить число в меньшую сторону

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

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

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

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

Функция Цел(Число) возвращает целую часть переданного числа, просто отрезая всё, что находится после запятой. Никакого арифметического округления не происходит: и 3,1, и 3,9 превратятся в 3. Именно поэтому для положительных чисел Цел() полностью эквивалентна округлению в меньшую сторону.

Результат = Цел(15.78);   // 15

Результат = Цел(100.01); // 100

Результат = Цел(0.999); // 0

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

Учтите важный нюанс: Цел() отбрасывает дробную часть по направлению к нулю, а не строго вниз по числовой оси. Для отрицательных чисел Цел(-3.7) вернёт -3, хотя математическое округление в меньшую сторону дало бы -4. Если в данных возможны отрицательные значения, обработайте их отдельно (об этом ниже).

Округление в меньшую сторону до десятых, сотых и других разрядов

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

// Округление вниз до сотых (2 знака)

Цена = 199.999;

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

// Округление вниз до десятых (1 знак)

Вес = 12.567;

Результат = Цел(Вес * 10) / 10; // 12.5

Множитель выбирается по требуемой точности: 10 — для десятых, 100 — для сотых, 1000 — для тысячных. Логика проста: умножение «выносит» нужный разряд перед запятой, Цел() отсекает лишнее, деление возвращает масштаб.

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

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

// Использование:
Результат = ОкруглитьВниз(17.896, 2); // 17.89

Округление вниз до десятков, сотен и тысяч

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

// Округление вниз до сотен

Сумма = 47850;

Результат = Цел(Сумма / 100) * 100; // 47800

// Округление вниз до тысяч

Остаток = 129999;

Результат = Цел(Остаток / 1000) * 1000; // 129000

Общая формула выглядит так: Цел(Число / Шаг) Шаг, где Шаг — нужный разряд или вообще любой шаг округления. Например, округление вниз до ближайшего числа, кратного 50: Цел(Число / 50) 50. Значение 237 превратится в 200, а 249 — тоже в 200, потому что до следующего кратного значения не хватает единицы.

Этот же приём удобен для расчёта количества полных упаковок: Цел(КоличествоТовара / КоличествоВУпаковке) покажет, сколько целых упаковок можно отгрузить, а остаток от деления (%) — сколько единиц останется неупакованными.

Порядок действий
  1. 1
    Определите требуемый разряд округления: целые, десятые, сотые, десятки, тысячи или произвольный шаг
  2. 2
    Для округления вниз до мелких разрядов умножьте число на степень десяти, для крупных — разделите на шаг
  3. 3
    Примените функцию Цел() к промежуточному результату
  4. 4
    Верните масштаб обратной операцией: разделите или умножьте на тот же множитель
  5. 5
    Проверьте результат на граничных значениях: ровно на границе разряда, чуть ниже и чуть выше

Отличие от Окр() и когда какую функцию применять

Функция Окр(Число, Разрядность) выполняет арифметическое округление: до ближайшего значения с учётом следующего разряда. Окр(15.5) даст 16, Окр(15.4) — 15. Это не округление вниз, и подменять одно другим нельзя: при расчёте цен, скидок и количеств ошибка накапливается и искажает итоги документов.

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

Функция / приёмПример: 15.7Пример: 15.2Когда применять
Цел(Число)1515Отбросить дробную часть, округление вниз для положительных
Окр(Число, 0)1615Арифметическое округление до ближайшего
Цел(Число)+1 при наличии дробной части1616Округление вверх, например число упаковок

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

Цел(Число)

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

Цел(Число <em> N) / N

Округление вниз до заданного знака после запятой. Требует аккуратного выбора множителя

Цел(Число / Шаг) </em> Шаг

Округление вниз до десятков, сотен, тысяч или произвольного шага кратности

Окр(Число, Разрядность)

Не округление вниз, а арифметическое округление. Подходит, только если это требуется правилами учёта

Обработка отрицательных чисел

Главный подводный камень — отрицательные значения. Цел(-15.3) возвращает -15, то есть число увеличивается, а не уменьшается. Если в расчётах возможны отрицательные суммы (возвраты, корректировки, сторно), простое применение Цел() даст результат, противоположный ожидаемому.

Для строгого округления в меньшую сторону независимо от знака используйте проверку: если число отрицательное и имеет дробную часть, от результата Цел() нужно отнять единицу.

Функция ОкруглитьВнизСтрого(Число)

ЦелоеЧисло = Цел(Число);

Если Число < 0 И Число <> ЦелоеЧисло Тогда

Возврат ЦелоеЧисло - 1;

Иначе

Возврат ЦелоеЧисло;

КонецЕсли;

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

// ОкруглитьВнизСтрого(-15.3) = -16

// ОкруглитьВнизСтрого(15.7) = 15

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

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

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

ВЫБРАТЬ

ВЫРАЗИТЬ(Товары.Количество / Товары.ВУпаковке - 0.5 КАК ЧИСЛО(15, 0)) КАК ПолныхУпаковок

ИЗ

Документ.Реализация.Товары КАК Товары

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

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

Если округлённое значение участвует в дальнейших расчётах (цена × количество, сумма НДС), округляйте один раз на раннем этапе и дальше используйте уже округлённое значение. Повторное округление промежуточных результатов — частый источник копеечных расхождений между документами и отчётами.
ПЗ
Практическое замечание

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

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

Третья группа ошибок связана с масштабированием: неверный множитель (10 вместо 100), потеря обратного деления, округление уже округлённого значения. Все они хорошо выявляются тестированием на граничных данных: 0.999, 1.001, -0.5, значения ровно на границе разряда.

Типичные ошибки
01
Использовать Окр() вместо Цел() — значения с дробной частью от 0.5 округлятся вверх, итоги завысятся
02
Применить Цел() к отрицательным числам без корректировки — результат уйдёт к нулю, а не вниз
03
Забыть обратное деление после Цел(Число * 100) — результат окажется в сто раз больше
04
Округлять промежуточные значения в цепочке расчётов — накапливаются копеечные расхождения между документами и отчётами
05
Округлять в запросе через ВЫРАЗИТЬ(КАК ЧИСЛО(N,0)) без вычитания 0.5 — получится арифметическое округление, а не округление вниз

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

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

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

Цел(15.99) в отладчике
Норма

Результат 15

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

16 — значит использована Окр() или лишнее округление

Значение -7.2 после обработки
Норма

-8 при строгом округлении вниз или -7 при усечении к нулю — в соответствии с принятым правилом

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

Знак и направление округления не соответствуют методологии

Округление до сотых: 199.999
Норма

199.99

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

200 или 19999 — ошибка в множителе или пропущено обратное деление

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

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

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

Копеечные расхождения с отчётами и взаиморасчётами

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

Есть ли в 1С готовая функция округления в меньшую сторону?

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

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

Цел() всегда отбрасывает дробную часть: 15.9 станет 15. Окр() округляет арифметически до ближайшего значения: 15.9 станет 16, а 15.4 — 15. Для округления строго в меньшую сторону подходит только Цел().

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

Используйте конструкцию Цел(Цена * 100) / 100. Например, из 199.999 получится 199.99. Убедитесь, что дальнейшие расчёты суммы документа используют уже округлённую цену, иначе итоги не сойдутся с построчными значениями.

Как посчитать количество полных упаковок товара?

Разделите общее количество на количество в упаковке и примените Цел(): Цел(Количество / ВУпаковке). Остаток неполной упаковки получается операцией остатка от деления: Количество % ВУпаковке.

Как округлить вниз в запросе, если там нет функции Цел()?

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

Опасно ли менять способ округления в работающей базе?

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

Итог

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

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