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

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

Как найти целую часть числа в 1С

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

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

Ключевая ошибка новичков — путать отсечение дробной части с математическим округлением. Функция Цел(2.9) вернёт 2, а не 3. Если требуется округление по правилам арифметики, используется другая функция — Окр(). Понимание разницы между этими двумя механизмами определяет корректность расчётов, особенно в денежных и количественных показателях.

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

Что такое целая часть числа и чем она отличается от округления

Целая часть числа — это значение, которое остаётся после удаления дробной составляющей без применения правил округления. Для числа 7,83 целая часть равна 7, для числа −3,6 в контексте функции Цел() результат будет −3, потому что отсечение идёт в сторону нуля, а не в сторону минус бесконечности.

Округление работает иначе: Окр(7,83, 0) даст 8, потому что дробная часть больше половины. Поэтому перед выбором функции нужно ответить на вопрос: что требуется по смыслу задачи — отбросить «лишнее» (например, сколько полных коробов поместится) или округлить до ближайшего целого (например, при расчёте суммы в рублях без копеек).

Функция Цел(): синтаксис и поведение

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

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

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

Результат = Цел(-4.3); // -4

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

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

Если передать в функцию строку, дату или значение другого нечислового типа, будет вызвана ошибка времени выполнения. Поэтому данные из внешних источников (файлы, обмены, пользовательский ввод) перед вызовом стоит приводить к числу через Число() или проверять тип.

1c
Значение = "12,7"; ЧислоИзСтроки = Число(Значение); ЦелаяЧасть = Цел(ЧислоИзСтроки); // 12

Окр() против Цел(): когда какую функцию выбирать

Функция Окр(Число, Разрядность) округляет по арифметическим правилам до указанной разрядности. При разрядности 0 результат — ближайшее целое. Это принципиально другой результат для значений вроде 2,5 и выше.

Исходное числоЦел(Число)Окр(Число, 0)Комментарий
5,255Результаты совпадают
5,756Окр округляет вверх
5,556Граничный случай
−5,7−5−6Цел идёт к нулю, Окр — от нуля
0,901Частая ошибка при расчёте количества

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

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

Цел(Число)

Отсекает дробную часть в сторону нуля. Подходит для подсчёта полных единиц: коробов, дней, лет. Не округляет.

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

Арифметическое округление до целого. Подходит для сумм и коэффициентов. Для 0,5 и выше даёт результат на единицу больше, чем Цел.

ВЫРАЗИТЬ в запросе

Приведение к ЧИСЛО(x, 0) округляет, а не отсекает. Подходит, когда расчёт нужен на стороне СУБД без обхода выборки.

Как получить целую часть в запросе 1С

В языке запросов нет прямого аналога функции Цел(). Стандартный приём — приведение типа через конструкцию ВЫРАЗИТЬ:

ВЫБРАТЬ

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

ИЗ

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

Важное ограничение: приведение ЧИСЛО(15, 0) выполняет округление, а не отсечение. Значение 4,6 превратится в 5. Если в запросе требуется именно отсечение, применяют приём с вычитанием дробной части или обрабатывают результат уже в коде после выборки.

Практический вариант отсечения в запросе — вычесть 0,5 и округлить вверх для положительных значений, но такие конструкции усложняют чтение запроса. В большинстве прикладных задач проще выгрузить данные и применить Цел() в цикле обхода выборки.

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

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

Классическая задача склада: сколько полных коробов по 12 единиц можно собрать из остатка 100 штук. Здесь нужно именно отсечение:

КоличествоКоробов = Цел(Остаток / ЕдиницВКоробе); // Цел(100 / 12) = 8

Остаток сверх полных коробов при этом вычисляется через операцию остатка от деления: Остаток % ЕдиницВКоробе — в данном примере это 4 штуки.

Полные годы и дни

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

ПолныхЛет = Цел((ТекущаяДата - ДатаРождения) / (365.25 * 86400));

Здесь Цел() гарантирует, что неполный год не будет засчитан — это соответствует бытовому и кадровому пониманию возраста.

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

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

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

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

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

Порядок действий
  1. 1
    Определите, что требуется по смыслу: отсечение дробной части или арифметическое округление
  2. 2
    Для отсечения используйте Цел(Число), для округления — Окр(Число, 0)
  3. 3
    Проверьте тип входного значения: строки и даты предварительно преобразуйте
  4. 4
    Прогоните граничные значения: 0,9; 2,5; −3,7 — и сверьте результат с ожиданиями
  5. 5
    Если расчёт в запросе, помните, что ВЫРАЗИТЬ к ЧИСЛО(x, 0) округляет, а не отсекает

Типичные ошибки и ограничения

Самая распространённая ошибка — использовать Цел() там, где учётная политика требует округления. Например, при расчёте количества к отгрузке значение 2,9 упаковки превратится в 2, и клиент недополучит товар, хотя планировалось округление до 3.

Вторая группа ошибок связана с отрицательными числами. Разработчик, привыкший к функции floor в других языках, ожидает от Цел(−3,2) значение −4, а получает −3. В расчётах задолженностей и корректировок это даёт систематическое расхождение на единицу.

Третья проблема — передача нечисловых данных. Значение NULL из запроса, пустая строка или дата приведут к исключению. Перед вызовом стоит либо проверять тип, либо использовать конструкцию Попытка...Исключение при обработке внешних данных.

Типичные ошибки
01
Использование Цел() вместо Окр() для сумм — итоги занижаются на величину дробной части
02
Ожидание округления вниз для отрицательных чисел — Цел(-3,7) возвращает -3, а не -4
03
Передача строки или NULL без преобразования — ошибка времени выполнения
04
Использование ВЫРАЗИТЬ(... КАК ЧИСЛО(x,0)) в запросе как замены Цел() — приведение округляет, а не отсекает
05
Деление без проверки делителя на ноль перед вызовом Цел(А/Б)

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

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

Для быстрой проверки удобно использовать внешнюю обработку с консолью кода или команду «Вычислить выражение» в конфигураторе при отладке (Shift+F9). Это позволяет увидеть фактическое значение без запуска всей бизнес-логики.

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

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

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

Цел(2,9)
Норма

Результат 2 — отсечение работает корректно

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

Результат 3 — используется округление, а не Цел

Цел(-4,6)
Норма

Результат -4 — отсечение в сторону нуля

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

Результат -5 — ожидание floor, функция работает иначе

Поведение в запросе
Норма

ВЫРАЗИТЬ к ЧИСЛО(x,0) даёт округление, это учтено в логике

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

Запросные итоги расходятся с расчётом в коде на граничных значениях

FAQ

Чем Цел() отличается от Окр() в 1С?

Цел() отбрасывает дробную часть в сторону нуля без округления: Цел(5,9) = 5. Окр(Число, 0) округляет по арифметическим правилам: Окр(5,9, 0) = 6. Выбор зависит от смысла задачи: отсечение для полных единиц, округление для сумм и коэффициентов.

Как получить целую часть отрицательного числа?

Функция Цел() для отрицательных чисел отсекает дробную часть в сторону нуля: Цел(−7,8) = −7. Если нужно округление вниз (до −8), используйте конструкцию вида: Результат = Цел(Число) - ?(Число < Цел(Число), 1, 0) или предварительно обработайте знак через модуль числа.

Как найти целую часть числа в запросе 1С?

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

Что вернёт Цел(), если передать строку или NULL?

Будет вызвана ошибка времени выполнения — функция работает только с числовым типом. Строку предварительно преобразуйте через Число(), а значения NULL из запросов замените через ЕСТЬNULL(Поле, 0) ещё на этапе запроса.

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

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

Можно ли использовать Цел() для расчёта сумм в рублях без копеек?

Технически можно, но обычно это не соответствует учётной методике: суммы принято округлять арифметически через Окр(Сумма, 0), а не отсекать. Использование Цел() для денежных величин приведёт к систематическому занижению итогов и расхождениям с отчётностью.

Итог

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

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