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

Разработка и Конфигурация · 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.41515
15.61516
-15.4-15-15
-15.6-15-16
0.99901

Для отрицательных чисел поведение различается принципиально: Цел(-15.6) даёт -15 (движение к нулю), а математическое «вниз» дало бы -16. Если бизнес-логика требует именно округления в меньшую сторону (floor), одной функции Цел() недостаточно.

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

Цел() / Int()

Отбрасывает дробную часть к нулю. Подходит для выделения рублей из суммы, целых дней, индексов.

Окр(Число, 0)

Математическое округление до целого. Подходит для итоговых сумм, где важна арифметическая корректность.

Окр(Число, 0, РежимОкругления.Округление15как20)

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

Типовые сценарии использования

Разделение суммы на рубли и копейки

Классическая задача печатных форм — разложить сумму:

Сумма = 1234.56;

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

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

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

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

При расчёте числа коробов для отгрузки обычно нужно округление вверх: если требуется 10.2 упаковки, заказывают 11. Здесь Цел() применяют с проверкой остатка:

Количество = Цел(Требуется);

Если Требуется > Количество Тогда

Количество = Количество + 1;

КонецЕсли;

Для целых дней между датами аналогично: разность дат в секундах делится на 86400, затем берётся целая часть — Цел((ДатаКонец - ДатаНачало) / 86400).

Порядок действий: выделить рубли из суммы
  1. 1
    Сохраните исходную сумму в переменную типа Число с двумя знаками после запятой
  2. 2
    Получите рубли: Рубли = Цел(Сумма)
  3. 3
    Вычислите копейки: Копейки = Окр((Сумма - Рубли) * 100, 0)
  4. 4
    Проверьте результат на контрольном примере 1234.56 → 1234 и 56
  5. 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, но в цепочках расчётов накапливается погрешность представления, и «ровное» число может оказаться чуть меньше целого, давая результат на единицу меньше ожидаемого.

Типичные ошибки
01
Использование Цел() вместо Окр() для денежных сумм — итоги систематически занижаются
02
Передача NULL из запроса без ЕСТЬNULL — ошибка исполнения в момент расчёта
03
Ожидание floor-поведения для отрицательных чисел — Цел(-3.2) даёт -3, а не -4
04
Сравнение результата деления с целым без округления — погрешность представления ломает проверку

Проверка результата и контрольные примеры

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

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

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

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

Цел(15.6)
Норма

Возвращает 15

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

Возвращает 16 — значит в коде используется Окр()

Цел(-7.65)
Норма

Возвращает -7

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

Возвращает -8 — применена самописная функция floor

Цел(NULL) из запроса
Норма

Значение предварительно обработано через ЕСТЬNULL(Поле, 0)

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

Ошибка исполнения при расчёте

Копейки из суммы 0.29
Норма

((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 из запросов и погрешность представления дробей — три главных источника ошибок; проверяйте код на контрольных примерах.