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

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

Как отбросить дробную часть числа в 1С

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

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

Главная ловушка — перепутать отбрасывание дробной части с округлением. Функция Окр() округляет по математическим правилам: 15,7 превратится в 16, а 15,2 — в 15. Функция Цел() ведёт себя иначе: и 15,7, и 15,2 дадут ровно 15. Выбор неправильной функции в расчёте цен, количества упаковок или начислениях приводит к расхождениям в копейках и штуках, которые потом трудно отыскать.

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

Функция Цел() — основной способ отбросить дробную часть

Функция Цел() принимает один параметр — число (или выражение, результатом которого является число) — и возвращает его целую часть. Синтаксис предельно прост:

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

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

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

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

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

Функция работает с любыми числовыми выражениями, включая результаты деления, поля реквизитов и вычисляемые выражения:

ЦелыхУпаковок = Цел(КоличествоШтук / КоличествоВУпаковке);

ЦенаБезКопеек = Цел(Документ.СуммаОплаты);

1c
Результат = Цел(15,7); // 15 — дробная часть отброшена без округления

Отличие Цел() от Окр(): когда что использовать

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

Исходное числоЦел()Окр(число, 0)Комментарий
15,21515Результат совпадает
15,51516Окр округляет вверх
15,71516Разница в единицу
15,9991516Максимальное расхождение

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

Маршрут решения

Как выбрать функцию

Нужно узнать количество полных единиц (упаковок, дней, штук)Используйте Цел() — неполная часть отбрасывается
Нужно округлить сумму или цену до рублей по правилам арифметикиИспользуйте Окр(Сумма, 0)
Нужно округлить вверх до целого (например, сколько машин потребуется)Используйте конструкцию вида Цел(Число) + ?(Число > Цел(Число), 1, 0)
Нужно округлить до копеек или заданного разрядаИспользуйте Окр(Число, 2) с нужной разрядностью

Округление вверх и вниз: готовые конструкции

В платформе 1С нет отдельных функций Floor и Ceil в привычном виде, поэтому округление вверх и вниз собирается из Цел() и простой арифметики. Это стандартный приём, который встречается в типовых конфигурациях.

Округление вверх до целого (сколько машин, рейсов или упаковок потребуется, если неполная всё равно нужна):

Функция ОкруглитьВверх(Число)

ЦелаяЧасть = Цел(Число);

Возврат ?(Число > ЦелаяЧасть, ЦелаяЧасть + 1, ЦелаяЧасть);

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

Округление вниз для положительных чисел — это просто Цел(). Для смешанных данных, где возможны отрицательные значения, конструкцию лучше проверить на крайних случаях: -0,5, -1,9, 0, 1,9.

Отрицательные числа: тонкое место

С отрицательными числами интуитивное ожидание «отбросить дробную часть» может не совпасть с фактическим результатом. Для числа -15,7 «отбросить дробную часть» означает -15 (движение к нулю), а «округлить вниз» означает -16.

Перед использованием Цел() с потенциально отрицательными значениями выполните проверку в консоли кода или отладчике именно на вашей версии платформы:

Сообщить(Цел(-15,7)); // проверьте фактический результат

Сообщить(Цел(-15,2));

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

Функция ОтброситьДробнуюЧасть(Число)

Возврат ?(Число >= 0, Цел(Число), -Цел(-Число));

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

Такая обёртка делает поведение предсказуемым: -15,7 превратится в -15, а 15,7 — в 15, то есть дробная часть отсекается симметрично относительно нуля.

Отбрасывание дробной части в запросах

В языке запросов 1С тоже есть функция для этой задачи, но синтаксис отличается. В запросах доступны конструкции приведения типов и функция ВЫРАЗИТЬ, а также в ряде случаев — операции с приведением к числу меньшей разрядности.

Наиболее надёжный способ — привести число к типу Число с нулевой точностью:

ВЫБРАТЬ

ВЫРАЗИТЬ(Продажи.Количество / 2,7 КАК ЧИСЛО(15, 0)) КАК Результат

ИЗ

Документ.РеализацияТоваровУслуг.Товары КАК Продажи

Учтите важный нюанс: приведение к ЧИСЛО(15, 0) в запросе выполняет округление, а не отбрасывание дробной части — поведение аналогично Окр(). Если требуется именно отсечение, безопаснее вычислить значение в запросе сырьём, а дробную часть отбросить уже в коде после выборки, либо использовать целочисленное деление через ВЫРАЗИТЬ с последующей проверкой результата на тестовых данных.

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

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

Поведение функции на граничных значениях
Норма

Цел(15,5) = 15, Цел(15,999) = 15, Цел(15) = 15

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

Значение 15,5 превращается в 16 — значит, где-то применяется округление

Отрицательные числа
Норма

Результат соответствует ожидаемой логике (к нулю или вниз — по требованию задачи)

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

Поведение на отрицательных числах не проверялось вовсе

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

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

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

Накапливаются расхождения в копейках между строками и итогом

Практические сценарии применения

Расчёт целых упаковок и остатка

Классическая задача склада: из количества штук и нормы упаковки получить число полных упаковок и остаток поштучно. Здесь Цел() работает в паре с оператором остатка от деления:

ПолныхУпаковок = Цел(КоличествоШтук / ВУпаковке);

ОстатокШтук = КоличествоШтук % ВУпаковке;

Оператор % (остаток от деления) — удобное дополнение: он сразу даёт «дробную часть» в натуральных единицах, без ручного вычитания.

Целая часть суммы и копейки отдельно

Иногда сумму нужно разложить на рубли и копейки, например для печатных форм с прописью:

Рубли  = Цел(Сумма);

Копейки = Окр((Сумма - Рубли) * 100, 0);

Здесь Цел() отсекает копейки, а разность с последующим умножением выделяет дробную часть. Окр() в конце защищает от погрешностей двоичного представления дробных чисел — без него вместо 99 копеек можно получить 98 из-за особенностей хранения чисел с плавающей точкой.

Извлечение только дробной части

Обратная задача — получить саму дробную часть, отбросив целую:

ДробнаяЧасть = Число - Цел(Число); // для 15,7 получим примерно 0,7

Помните о погрешности представления дробных чисел: сравнивать такую дробную часть с нулём напрямую нельзя, используйте сравнение с малым порогом, например ДробнаяЧасть > 0,0001.

Типичные ошибки
01
Использование Окр() вместо Цел() при подсчёте полных упаковок — в результате 15,7 упаковки считается как 16, и склад планирует несуществующий товар
02
Вызов Цел(Число) без присвоения результата — переменная не меняется, а разработчик уверен, что дробная часть отброшена
03
Применение Цел() к денежным суммам вместо Окр() — систематическое занижение итогов и расхождения с бухгалтерией
04
Сравнение дробной части с нулём напрямую (ДробнаяЧасть = 0) — из-за погрешности представления чисел условие может не сработать
05
Отсутствие проверки поведения на отрицательных числах — неожиданный результат в корректировках и сторно

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

Быстрее всего проверить поведение функции — через консоль кода (внешнюю обработку) или окно «Вычислить выражение» в отладчике (Shift+F9). Введите выражение Цел(ВашеЧисло) и посмотрите результат на реальных данных.

Для отладки расчётов в документах полезно временно выводить промежуточные значения через Сообщить(): исходное число, результат Цел(), результат Окр() — и сравнивать. Так сразу видно, какая функция даёт нужное поведение.

Если расчёт участвует в проведении документов, после замены функции перепроведите тестовый комплект документов на копии базы и сверьте итоги до и после. Изменение логики округления влияет на все ранее проведённые документы при их перепроведении.

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

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

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

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

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

Цел() просто отсекает дробную часть: Цел(15,9) = 15. Окр(15,9, 0) округлит до 16. Расхождение возникает на всех числах с дробной частью 0,5 и выше.

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

Готовой функции нет, используйте конструкцию: ЦелаяЧасть = Цел(Число); Результат = ?(Число > ЦелаяЧасть, ЦелаяЧасть + 1, ЦелаяЧасть). Так 15,1 станет 16, а ровно 15 останется 15.

Как получить только дробную часть числа?

Вычтите из числа его целую часть: ДробнаяЧасть = Число - Цел(Число). При сравнении результата с нулём используйте порог вида 0,0001 из-за погрешности представления дробных чисел.

Работает ли Цел() с отрицательными числами?

Работает, но поведение для отрицательных значений стоит проверить в вашей версии платформы через консоль кода. Для гарантированного отсечения к нулю используйте обёртку: ?(Число >= 0, Цел(Число), -Цел(-Число)).

Можно ли отбросить дробную часть прямо в запросе?

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

Почему после Цел() переменная не изменилась?

Функция возвращает новое значение и не меняет аргумент. Запись Цел(Число) без присвоения ничего не делает. Правильно: Число = Цел(Число).