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

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

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

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

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

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

Ошибка в выборе способа приводит к расхождениям в отчётах: например, Цел(10.9) вернёт 10, а Окр(10.9) — 11. В денежных расчётах такая разница накапливается и даёт расхождения с банковскими выписками и налоговыми регистрами, поэтому способ отбрасывания дробной части нужно выбирать осознанно.

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

Функция Цел(Число) возвращает целую часть числа, полностью отбрасывая дробную. Округления не происходит: Цел(15.99) даст 15, а Цел(15.01) — тоже 15. Это самый прямой ответ на вопрос, как убрать дробную часть в 1С без изменения значения в сторону увеличения или уменьшения.

Пример использования в коде:

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

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

Обратите внимание на поведение с отрицательными числами: Цел(-5.7) вернёт -5, то есть функция отбрасывает дробную часть по направлению к нулю, а не «вниз» по числовой оси. Если нужна математическая операция «вниз» (floor) или «вверх» (ceil), одной функции Цел() недостаточно — её комбинируют с проверкой знака или используют Окр() с последующей корректировкой.

bsl
Результат = Цел(123.75); // Результат = 123

Функция Окр() — округление до целого

Если дробную часть нужно не просто отбросить, а округлить по правилам арифметики, используйте Окр(Число, Разрядность). Вызов Окр(15.5, 0) вернёт 16, а Окр(15.4, 0) — 15. Второй параметр задаёт число знаков после запятой; ноль означает округление до целого.

Функция поддерживает и режим округления: Окр(Число, 0, РежимОкругления.Окр15как10) округляет 0,5 вниз, а РежимОкругления.Окр15как20 — вверх (режим по умолчанию). Это важно в расчётах, где правило округления закреплено методологией, например в кадровых или налоговых вычислениях.

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

// Округление вверх

НужноУпаковок = Цел(ВсегоШтук / ШтукВУпаковке);

Если НужноУпаковок * ШтукВУпаковке < ВсегоШтук Тогда

НужноУпаковок = НужноУпаковок + 1;

КонецЕсли;

Цел() или Окр() — что выбрать

Цел(Число)

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

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

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

Формат(Число, "ЧДЦ=0")

Только меняет отображение, значение в памяти не меняется. Подходит для отчётов и печатных форм, не подходит для дальнейших вычислений.

Как убрать дробную часть в запросе

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

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

Для денежных сумм в запросах часто используют обратную задачу — приведение к двум знакам: ВЫРАЗИТЬ(Сумма КАК ЧИСЛО(15, 2)). Это стандартный способ избавиться от «хвостов» вроде 123,450000001, возникающих после деления и умножения в вычислениях.

Форматирование: скрыть дробную часть при выводе

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

Тот же эффект достигается без кода — через свойство «Формат» у поля формы, колонки таблицы или ячейки макета. В палитре свойств в поле «Формат» указывают ЧДЦ=0 или выбирают параметры в конструкторе форматной строки. Это удобно для отчётов СКД: в настройках поля на вкладке «Оформление» задаётся тот же параметр.

Настройка разрядности реквизита в конфигураторе

Если дробная часть в принципе не нужна для какого-то реквизита — например, количество мест, этаж, число сотрудников — правильное решение на уровне конфигурации: в свойствах реквизита задать тип «Число» с точностью 0. Тогда платформа сама будет округлять вводимые значения до целых, и дробная часть не попадёт в базу.

Путь: откройте объект в конфигураторе (справочник, документ, регистр), найдите нужный реквизит, в палитре свойств установите «Длина» и «Точность». Точность 0 означает целое число. Для регистров накопления и сведений аналогичные свойства задаются у ресурсов и измерений числового типа.

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

Пошаговый выбор способа под задачу

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

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

Как выбрать действие

Нужно просто отбросить дробную часть в кодеИспользуйте Цел(Число)
Нужно округлить до целого по правилам арифметикиИспользуйте Окр(Число, 0) с нужным режимом округления
Нужно округлить всегда вверх или всегда внизКомбинируйте Цел() с проверкой остатка и прибавлением единицы
Дробная часть мешает только при выводе в отчёт или печатную формуЗадайте ЧДЦ=0 в формате поля или используйте Формат()
Дробная часть не должна храниться в базе вообщеУстановите точность 0 у реквизита в конфигураторе, предварительно сделав копию базы
Обработка идёт в запросеПримените ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15, 0)) — учтите, что это округление, а не отсечение
Порядок действий
  1. 1
    Определите, где должна исчезнуть дробная часть: в расчёте, в хранимых данных или только при отображении
  2. 2
    Для расчёта выберите Цел() или Окр() и проверьте результат на граничных значениях: 0.5, 0.9, -1.5
  3. 3
    Для отображения задайте ЧДЦ=0 в формате поля или функции Формат()
  4. 4
    Для хранения измените точность реквизита на копии базы и проверьте реструктуризацию
  5. 5
    После изменений прогоните контрольный пример и сверьте итоги отчётов до и после

Типичные ошибки и контроль результата

Самая частая ошибка — ожидание от Цел() округления. Разработчик пишет Цел(Сумма), ожидая 11 из 10.9, получает 10 и обнаруживает расхождение с контрольной суммой только при сверке отчётов. Вторая типичная ошибка — применение Формат() и последующее использование результата в расчётах: функция возвращает строку, и дальнейшая арифметика либо падает с ошибкой преобразования, либо работает через неявное преобразование, что трудно отлаживать.

Отдельная группа ошибок связана с отрицательными числами и границей 0,5. Проверяйте поведение выбранной функции на значениях -1.5, -0.5, 0.5, 1.5 — именно на них расходятся отсечение, арифметическое округление и округление «вниз». В денежных расчётах дополнительно проверяйте, не образуется ли после отбрасывания копеек расхождение итоговой суммы с суммой строк.

Типичные ошибки
01
Использование Цел() там, где нужно округление: 10.9 превращается в 10, итоги расходятся с контрольными суммами
02
Применение Формат() к значению, которое потом участвует в расчётах: функция возвращает строку, а не число
03
Ожидание, что ВЫРАЗИТЬ в запросе отбросит дробную часть: на самом деле выполняется округление, 10.7 станет 11
04
Изменение точности реквизита в рабочей базе без копии: округление при реструктуризации необратимо
05
Игнорирование отрицательных значений: Цел(-5.7) даёт -5, а не -6, что ломает логику при возвратах и сторно
Контрольные точки

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

Значение 10.9 после обработки
Норма

Цел() даёт 10, Окр(,0) даёт 11 — соответствует выбранному правилу

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

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

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

Результат соответствует задуманному правилу для сторно и возвратов

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

Знак или направление округления не учтены, суммы возвратов искажены

Сумма строк после округления против итога документа
Норма

Итог сходится или расхождение осознанно отнесено на отдельную строку

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

Накопленная разница в копейках уходит в никуда

Отображение в печатной форме
Норма

Дробная часть скрыта, при этом данные в базе не изменились

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

Изменилось само хранимое значение, хотя требовалось только оформление

Ответы на частые вопросы

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

Цел() отбрасывает дробную часть без округления: Цел(10.9) = 10. Окр(Число, 0) округляет по арифметическим правилам: Окр(10.9, 0) = 11, а Окр(10.4, 0) = 10. Выбор зависит от того, нужно ли округление или требуется именно отсечение хвоста.

Как округлить число всегда в большую сторону?

Готовой функции «вверх» во встроенном языке нет. Используйте приём: Результат = Цел(Число); если Результат < Число, прибавьте 1. Для отрицательных чисел логику проверки нужно зеркально скорректировать.

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

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

Как убрать копейки только в печатной форме, не меняя данные?

Задайте у поля макета или колонки отчёта формат ЧДЦ=0 либо выводите значение через Формат(Сумма, "ЧДЦ=0"). Значение в базе останется с копейками, изменится только отображение.

Почему после изменения точности реквизита суммы в отчётах изменились?

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

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

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

Итог

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

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