Разработка и Конфигурация · 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
Обратите внимание: функция не изменяет исходную переменную, а возвращает новое значение. Типичная ошибка новичка — написать Цел(Количество); и ожидать, что переменная Количество изменится. Правильно: Количество = Цел(Количество); или присвоение результата другой переменной.
Функция работает с любыми числовыми выражениями, включая результаты деления, поля реквизитов и вычисляемые выражения:
ЦелыхУпаковок = Цел(КоличествоШтук / КоличествоВУпаковке);
ЦенаБезКопеек = Цел(Документ.СуммаОплаты);
Результат = Цел(15,7); // 15 — дробная часть отброшена без округленияОтличие Цел() от Окр(): когда что использовать
Эти две функции решают разные задачи, и подмена одной другой — самая частая причина ошибок в расчётах. Окр(Число, Разрядность) округляет по математическим правилам до указанного разряда, а Цел() просто отсекает дробную часть.
| Исходное число | Цел() | Окр(число, 0) | Комментарий |
|---|---|---|---|
| 15,2 | 15 | 15 | Результат совпадает |
| 15,5 | 15 | 16 | Окр округляет вверх |
| 15,7 | 15 | 16 | Разница в единицу |
| 15,999 | 15 | 16 | Максимальное расхождение |
Выбор зависит от бизнес-логики. Если считаете, сколько полных упаковок поместится в заказ — нужна Цел(), потому что неполная упаковка не считается. Если округляете сумму до рублей для печати — обычно нужна Окр(), чтобы не занижать итог.
Как выбрать функцию
Округление вверх и вниз: готовые конструкции
В платформе 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.
Проверка результата и отладка
Быстрее всего проверить поведение функции — через консоль кода (внешнюю обработку) или окно «Вычислить выражение» в отладчике (Shift+F9). Введите выражение Цел(ВашеЧисло) и посмотрите результат на реальных данных.
Для отладки расчётов в документах полезно временно выводить промежуточные значения через Сообщить(): исходное число, результат Цел(), результат Окр() — и сравнивать. Так сразу видно, какая функция даёт нужное поведение.
Если расчёт участвует в проведении документов, после замены функции перепроведите тестовый комплект документов на копии базы и сверьте итоги до и после. Изменение логики округления влияет на все ранее проведённые документы при их перепроведении.
- 1Определите, что именно нужно: отбросить дробную часть, округлить или округлить вверх
- 2Для отбрасывания используйте Цел(Число) с обязательным присвоением результата
- 3Проверьте поведение на граничных значениях: 15,5, 15,999, отрицательные числа
- 4Для денежных сумм согласуйте правило округления с методологией учёта
- 5Протестируйте на копии базы и сверьте итоги документов
Что важно запомнить
Дробную часть в 1С отбрасывает функция Цел(Число) — без округления. Окр() округляет по правилам арифметики и не заменяет Цел(). Результат функции нужно присваивать, отрицательные числа — проверять, а в денежных расчётах выбор функции согласовывать с правилами учёта.
Частые вопросы
Чем Цел() отличается от Окр(Число, 0)?
Цел() просто отсекает дробную часть: Цел(15,9) = 15. Окр(15,9, 0) округлит до 16. Расхождение возникает на всех числах с дробной частью 0,5 и выше.
Как округлить число вверх до целого в 1С?
Готовой функции нет, используйте конструкцию: ЦелаяЧасть = Цел(Число); Результат = ?(Число > ЦелаяЧасть, ЦелаяЧасть + 1, ЦелаяЧасть). Так 15,1 станет 16, а ровно 15 останется 15.
Как получить только дробную часть числа?
Вычтите из числа его целую часть: ДробнаяЧасть = Число - Цел(Число). При сравнении результата с нулём используйте порог вида 0,0001 из-за погрешности представления дробных чисел.
Работает ли Цел() с отрицательными числами?
Работает, но поведение для отрицательных значений стоит проверить в вашей версии платформы через консоль кода. Для гарантированного отсечения к нулю используйте обёртку: ?(Число >= 0, Цел(Число), -Цел(-Число)).
Можно ли отбросить дробную часть прямо в запросе?
Приведение ВЫРАЗИТЬ(Значение КАК ЧИСЛО(15, 0)) в запросе округляет, а не отсекает дробную часть. Если нужно именно отсечение, надёжнее обработать значения функцией Цел() в коде после выполнения запроса.
Почему после Цел() переменная не изменилась?
Функция возвращает новое значение и не меняет аргумент. Запись Цел(Число) без присвоения ничего не делает. Правильно: Число = Цел(Число).