Разработка и Конфигурация · 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 — для тысячных. Логика проста: умножение «выносит» нужный разряд перед запятой, Цел() отсекает лишнее, деление возвращает масштаб.
Такой подход часто применяется в ценообразовании, когда скидка или наценка даёт дробное значение, а итоговую цену нужно гарантированно не завысить. Также он востребован в расчётах с физическими величинами — объёмами, длинами, весами, где превышение фактического значения недопустимо.
Функция ОкруглитьВниз(Число, Разрядность)
Множитель = Pow(10, Разрядность);
Возврат Цел(Число * Множитель) / Множитель;
КонецФункции
// Использование:
Результат = ОкруглитьВниз(17.896, 2); // 17.89Округление вниз до десятков, сотен и тысяч
Зеркальная задача — округлить число в меньшую сторону до крупного разряда: до десятков, сотен, тысяч. Такое требуется, например, при планировании закупок кратно упаковкам или при формировании «грубых» плановых показателей. Приём тот же, но умножение заменяется делением.
// Округление вниз до сотен
Сумма = 47850;
Результат = Цел(Сумма / 100) * 100; // 47800
// Округление вниз до тысяч
Остаток = 129999;
Результат = Цел(Остаток / 1000) * 1000; // 129000
Общая формула выглядит так: Цел(Число / Шаг) Шаг, где Шаг — нужный разряд или вообще любой шаг округления. Например, округление вниз до ближайшего числа, кратного 50: Цел(Число / 50) 50. Значение 237 превратится в 200, а 249 — тоже в 200, потому что до следующего кратного значения не хватает единицы.
Этот же приём удобен для расчёта количества полных упаковок: Цел(КоличествоТовара / КоличествоВУпаковке) покажет, сколько целых упаковок можно отгрузить, а остаток от деления (%) — сколько единиц останется неупакованными.
- 1Определите требуемый разряд округления: целые, десятые, сотые, десятки, тысячи или произвольный шаг
- 2Для округления вниз до мелких разрядов умножьте число на степень десяти, для крупных — разделите на шаг
- 3Примените функцию Цел() к промежуточному результату
- 4Верните масштаб обратной операцией: разделите или умножьте на тот же множитель
- 5Проверьте результат на граничных значениях: ровно на границе разряда, чуть ниже и чуть выше
Отличие от Окр() и когда какую функцию применять
Функция Окр(Число, Разрядность) выполняет арифметическое округление: до ближайшего значения с учётом следующего разряда. Окр(15.5) даст 16, Окр(15.4) — 15. Это не округление вниз, и подменять одно другим нельзя: при расчёте цен, скидок и количеств ошибка накапливается и искажает итоги документов.
Выбор функции определяется бизнес-логикой. Если правило гласит «не превышать рассчитанное значение» — нужна Цел() с масштабированием. Если правило «округлить по арифметическим правилам» — Окр(). Если «гарантированно покрыть потребность» (например, количество упаковок для всего товара) — округление вверх через Цел() + 1 для нецелых значений.
| Функция / приём | Пример: 15.7 | Пример: 15.2 | Когда применять |
|---|---|---|---|
| Цел(Число) | 15 | 15 | Отбросить дробную часть, округление вниз для положительных |
| Окр(Число, 0) | 16 | 15 | Арифметическое округление до ближайшего |
| Цел(Число)+1 при наличии дробной части | 16 | 16 | Округление вверх, например число упаковок |
Сравнение вариантов
Округление вниз до целого для положительных чисел. Ограничение: для отрицательных усечёт к нулю, а не вниз
Округление вниз до заданного знака после запятой. Требует аккуратного выбора множителя
Округление вниз до десятков, сотен, тысяч или произвольного шага кратности
Не округление вниз, а арифметическое округление. Подходит, только если это требуется правилами учёта
Обработка отрицательных чисел
Главный подводный камень — отрицательные значения. Цел(-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, значения ровно на границе разряда.
После внедрения округления проверьте результат на контрольном наборе данных: положительные и отрицательные числа, значения на границе разряда, ноль, очень маленькие дроби. Сравните итоги тестового документа с рассчитанными вручную — расхождений быть не должно.
Как проверить результат
Результат 15
16 — значит использована Окр() или лишнее округление
-8 при строгом округлении вниз или -7 при усечении к нулю — в соответствии с принятым правилом
Знак и направление округления не соответствуют методологии
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 перед приведением типа. Проверяйте результат на граничных значениях и не меняйте правила округления в проведённых документах без согласования.