Разработка и Конфигурация · 9 мин
Как взять целую часть числа в 1С
Как получить целую часть числа в 1С: функции Цел() и Int(), округление через Окр(), отбрасывание дробной части, работа с отрицательными числами и типичные ошибки.
Во встроенном языке 1С целая часть числа получается одной строкой кода — функцией Цел() или её английским синонимом Int(). Обе функции отбрасывают дробную часть без округления: Цел(15.78) вернёт 15, а Цел(-3.2) вернёт -3. Это отличает их от функции округления Окр(), которая работает по математическим правилам.
Задача возникает постоянно: при расчёте количества упаковок, разбиении суммы на рубли и копейки, вычислении целых дней между датами, формировании номеров и индексов. Неправильный выбор между отбрасыванием дробной части и округлением приводит к расхождениям в копейках, которые потом сложно найти в учёте.
Материал охватывает встроенный язык 1С (тонкий, толстый и веб-клиент), применимо к платформам 8.2 и 8.3. Примеры можно проверить в любой конфигурации через консоль кода или обработку.
Функции Цел() и Int(): базовый синтаксис
Функция принимает один параметр — число или выражение, приводимое к числу, и возвращает его целую часть. Дробная часть просто отсекается, знак числа сохраняется:
Результат = Цел(125.94); // 125
Результат = Цел(0.99); // 0
Результат = Цел(-7.65); // -7
Результат = Int(42.5); // 42 — английский синоним
Обе формы полностью взаимозаменяемы, выбор зависит от стандартов разработки в вашем проекте. В типовых конфигурациях чаще встречается русский вариант Цел().
Если передать строку, содержащую число, платформа попытается выполнить неявное преобразование. Надёжнее преобразовать явно через Число(), предварительно убедившись, что строка не пустая и не содержит лишних символов — иначе получите ошибку выполнения.
Отбрасывание дробной части против округления
Ключевой вопрос — что именно вам нужно: отсечь дробь или округлить. Цел() всегда движется к нулю, а Окр() округляет по правилам арифметики. Для положительных чисел разница видна сразу: Окр(15.6, 0) = 16, Цел(15.6) = 15.
| Выражение | Цел() | Окр(x, 0) |
|---|---|---|
| 15.4 | 15 | 15 |
| 15.6 | 15 | 16 |
| -15.4 | -15 | -15 |
| -15.6 | -15 | -16 |
| 0.999 | 0 | 1 |
Для отрицательных чисел поведение различается принципиально: Цел(-15.6) даёт -15 (движение к нулю), а математическое «вниз» дало бы -16. Если бизнес-логика требует именно округления в меньшую сторону (floor), одной функции Цел() недостаточно.
Сравнение вариантов
Отбрасывает дробную часть к нулю. Подходит для выделения рублей из суммы, целых дней, индексов.
Математическое округление до целого. Подходит для итоговых сумм, где важна арифметическая корректность.
Округление всегда вверх от 0.5. Используется в специфических расчётах, например при начислениях.
Типовые сценарии использования
Разделение суммы на рубли и копейки
Классическая задача печатных форм — разложить сумму:
Сумма = 1234.56;
Рубли = Цел(Сумма); // 1234
Копейки = Окр((Сумма - Рубли) * 100, 0); // 56
Обратите внимание: копейки вычисляются через Окр(), а не через Цел(), иначе из-за особенностей двоичного представления дробных чисел можно получить 55 вместо 56.
Расчёт количества упаковок и целых дней
При расчёте числа коробов для отгрузки обычно нужно округление вверх: если требуется 10.2 упаковки, заказывают 11. Здесь Цел() применяют с проверкой остатка:
Количество = Цел(Требуется);
Если Требуется > Количество Тогда
Количество = Количество + 1;
КонецЕсли;
Для целых дней между датами аналогично: разность дат в секундах делится на 86400, затем берётся целая часть — Цел((ДатаКонец - ДатаНачало) / 86400).
- 1Сохраните исходную сумму в переменную типа Число с двумя знаками после запятой
- 2Получите рубли: Рубли = Цел(Сумма)
- 3Вычислите копейки: Копейки = Окр((Сумма - Рубли) * 100, 0)
- 4Проверьте результат на контрольном примере 1234.56 → 1234 и 56
- 5Прогоните граничные значения: 0.01, 0.99, отрицательную сумму
Особенности отрицательных чисел и округление вниз
Функция Цел() для отрицательных значений работает как усечение к нулю, что не всегда совпадает с ожиданиями. Если по логике расчёта -3.2 должно превратиться в -4 (округление вниз, floor), напишите вспомогательную функцию:
Функция ОкруглитьВниз(Число)
Результат = Цел(Число);
Если Число < 0 И Число <> Результат Тогда
Результат = Результат - 1;
КонецЕсли;
Возврат Результат;
КонецФункции
Округление вверх (ceil) строится зеркально: для положительных нецелых чисел добавляется единица. Такие обёртки удобно разместить в общем модуле, чтобы не дублировать логику по конфигурации.
Проверка, является ли число целым
Обратная задача — узнать, есть ли у числа дробная часть. Решение строится на сравнении числа с его целой частью:
Если Число = Цел(Число) Тогда
// число целое
КонецЕсли;
Альтернатива — остаток от деления: Число % 1 = 0. Оба способа равнозначны. Учитывайте, что числа с плавающей точкой могут хранить погрешность: значение, которое выглядит как 5, внутри может быть 4.9999999. Для денежных величин используйте тип с фиксированной точностью (Число с заданной разрядностью), а не результат деления без округления.
Частые ошибки и ограничения
Первая ошибка — передача в Цел() нечислового значения. Передача строки «12,5» с запятой, NULL из запроса или Неопределено приведёт к ошибке исполнения. Перед вызовом проверяйте тип через ТипЗнч() и обрабатывайте NULL через ЕСТЬNULL() в запросах.
Вторая ошибка — ожидание округления там, где его нет. Разработчик пишет Цел(СуммаНДС) и получает заниженный налог, потому что 118.49 превращается в 118, а не в 118.49 с округлением до 118 по правилам. Для денег почти всегда нужен Окр().
Третья ловушка — применение Цел() к результату деления без контроля точности. Выражение Цел(10 / 3) корректно даст 3, но в цепочках расчётов накапливается погрешность представления, и «ровное» число может оказаться чуть меньше целого, давая результат на единицу меньше ожидаемого.
Проверка результата и контрольные примеры
После внедрения кода прогоните его на эталонном наборе значений: положительное с дробью меньше 0.5, больше 0.5, ровно 0.5, ноль, отрицательное целое, отрицательное дробное. Результаты сверьте с таблицей из раздела про округление.
Быстрая проверка без изменения конфигурации — через консоль кода или внешнюю обработку: введите выражение и выполните его. Это безопасно, так как не затрагивает данные информационной базы.
Как проверить результат
Возвращает 15
Возвращает 16 — значит в коде используется Окр()
Возвращает -7
Возвращает -8 — применена самописная функция floor
Значение предварительно обработано через ЕСТЬNULL(Поле, 0)
Ошибка исполнения при расчёте
((0.29 - Цел(0.29)) * 100) с Окр() даёт 29
Цел() вместо Окр() даёт 28 из-за погрешности представления
FAQ
Чем Цел() отличается от Int() в 1С?
Ничем, это синонимы одной встроенной функции. Int() — английский вариант для конфигураций, разрабатываемых на английском синтаксисе языка. Результат и поведение идентичны.
Как округлить число до целого в большую сторону?
Возьмите Цел(Число) и добавьте 1, если исходное число больше полученной целой части. Либо используйте Окр(Число, 0, РежимОкругления.Округление15как20), если порог 0.5 вас устраивает.
Можно ли применить Цел() к значению из запроса?
В языке запросов 1С есть аналогичная функция — в выражении запроса используйте конструкцию с приведением или обрабатывайте результат уже в коде после выборки. Обязательно обернуть поле в ЕСТЬNULL(), иначе Цел() получит NULL и завершится ошибкой.
Почему Цел(0.29 100) даёт 28 вместо 29?
Дробные числа хранятся в двоичном виде с погрешностью: 0.29 100 внутри может быть 28.999999. Отбрасывание дробной части даёт 28. Решение — сначала округлить: Окр(0.29 * 100, 0), а Цел() применять только там, где отсечение действительно требуется.
Как проверить, что число делится нацело?
Используйте оператор остатка: Если Число % Делитель = 0 Тогда — делится без остатка. Это надёжнее, чем сравнивать Число / Делитель с Цел(Число / Делитель), где мешает погрешность представления.
Работает ли Цел() со строкой «123.45»?
Платформа попытается неявно преобразовать строку в число, но строка с запятой, пробелами или буквами вызовет ошибку. Надёжнее явно преобразовать через Число() после очистки строки, заменив запятую на точку и удалив неразрывные пробелы.
Что важно запомнить
Цел() и Int() отбрасывают дробную часть к нулю без округления. Для денежных сумм и математического округления используйте Окр(). Отрицательные числа, NULL из запросов и погрешность представления дробей — три главных источника ошибок; проверяйте код на контрольных примерах.