Разработка и Конфигурация · 10 мин
Как округлить число до целого в 1С
Как округлить число до целого в 1С: функции Окр, Цел, Int, округление в запросах и формулах печатных форм, примеры кода и типичные ошибки.
Округление до целого числа — одна из самых частых задач при работе с 1С: оно встречается в расчётах цен, количества товара, начислениях зарплаты и формировании печатных форм. Платформа 1С:Предприятие предлагает несколько способов округления, и они не взаимозаменяемы: одни функции округляют по математическим правилам, другие просто отбрасывают дробную часть, а третьи меняют только отображение числа, не трогая само значение.
Главная функция для округления во встроенном языке — Окр(), которая работает по правилам арифметического округления. Для отбрасывания дробной части используется Цел() (в английском синтаксисе — Int()). В запросах применяются собственные конструкции: ВЫРАЗИТЬ с приведением типа и функция ОКРУГЛИТЬ недоступна — вместо неё используется приведение к числу с нужной разрядностью.
Прежде чем писать код, важно определить, какое именно округление требуется: математическое (0,5 и больше — вверх), отсечение дробной части, округление всегда вверх или всегда вниз. От этого зависит выбор функции и корректность финансовых расчётов.
Функция Окр() — математическое округление
Функция Окр() — основной инструмент округления во встроенном языке 1С. Синтаксис: Окр(ИсходноеЧисло, Разрядность). Для округления до целого второй параметр равен нулю. Функция работает по стандартным арифметическим правилам: дробная часть от 0,5 и выше округляется вверх, меньше 0,5 — вниз.
Примеры использования:
Результат = Окр(15.49, 0); // 15
Результат = Окр(15.5, 0); // 16
Результат = Окр(15.51, 0); // 16
Результат = Окр(-7.5, 0); // -8
Результат = Окр(123.456, 2); // 123.46 (до сотых)
Обратите внимание на отрицательные числа: Окр(-7.5, 0) вернёт -8, то есть округление идёт «от нуля». Если бизнес-логика требует другого поведения для отрицательных значений (например, в корректировочных документах), это нужно обрабатывать отдельно.
Разрядность может быть и отрицательной: Окр(1234, -2) округлит до сотен и вернёт 1200. Это полезно, когда требуется округлить сумму до десятков или сотен рублей.
Функция Цел() — отбрасывание дробной части
Функция Цел() (в английском варианте — Int()) не округляет, а просто отсекает дробную часть. Для положительных чисел результат совпадает с округлением вниз, для отрицательных — с округлением вверх (к нулю).
Результат = Цел(15.9); // 15
Результат = Цел(15.1); // 15
Результат = Цел(-7.9); // -7
Типичное применение — расчёт количества полных упаковок, полных лет или целых частей при разложении суммы. Например, если нужно узнать, сколько полных коробов поместится в заказ, «честное» округление даст неверный результат, а Цел() — корректный.
Округление всегда вверх или всегда вниз
Встроенных функций «округлить вверх» и «округлить вниз» в языке 1С нет, но они легко собираются из комбинации Цел() и проверки дробной части. Такие варианты нужны, например, при расчёте количества тарных мест (нельзя заказать 2,3 паллеты — нужно 3) или при начислениях, где правила требуют округления в пользу сотрудника.
Округление вверх до целого:
Функция ОкруглитьВверх(Число)
ЦелаяЧасть = Цел(Число);
Если Число > ЦелаяЧасть Тогда
Возврат ЦелаяЧасть + 1;
Иначе
Возврат ЦелаяЧасть;
КонецЕсли;
КонецФункции
Округление вниз для положительных чисел — это просто Цел(Число). Для универсального варианта, работающего и с отрицательными значениями, можно использовать конструкцию вида Окр(Число - 0.5, 0) для округления вниз и Окр(Число + 0.5, 0) — вверх, но вариант с явной проверкой дробной части читается понятнее и не даёт сюрпризов на граничных значениях.
- 1Определите правило: математическое, отсечение, всегда вверх или всегда вниз
- 2Для математического используйте Окр(Число, 0)
- 3Для отсечения дробной части используйте Цел(Число)
- 4Для округления вверх добавьте проверку дробной части к Цел()
- 5Проверьте поведение на граничных значениях: 0.5, -0.5, целых числах
- 6Прогоните расчёт на реальных данных и сверьте итоги с эталоном
Округление в запросах
В языке запросов 1С функций Окр и Цел нет. Округление выполняется через приведение типа: конструкция ВЫРАЗИТЬ(Поле КАК Число(15, 0)) приводит значение к числу без дробной части, при этом применяется арифметическое округление — аналогично Окр().
ВЫБРАТЬ
ВЫРАЗИТЬ(Продажи.СуммаОборот КАК ЧИСЛО(15, 0)) КАК СуммаЦелая,
ВЫРАЗИТЬ(Продажи.КоличествоОборот / 12 КАК ЧИСЛО(10, 0)) КАК СреднееЦелое
ИЗ
РегистрНакопления.Продажи.Обороты КАК Продажи
Если нужно именно отсечение дробной части, а не округление, в запросе придётся пойти на ухищрение: например, вычесть 0,5 перед приведением типа для положительных чисел. Такие приёмы снижают читаемость запроса, поэтому нередко разумнее выгрузить результат и округлить уже в коде.
Учитывайте, что приведение типа в запросе выполняется на уровне СУБД, и на очень больших выборках дополнительные вычисления могут влиять на скорость выполнения. По возможности округляйте уже сгруппированные итоги, а не каждую строку детальных данных.
Округление без изменения значения: формат и представление
Иногда округлять само число не нужно — достаточно показать пользователю целое значение, сохранив точные данные для дальнейших расчётов. Для этого служит функция Формат() и свойство «Формат» у полей форм и печатных макетов.
СтрокаДляВывода = Формат(1234.56, "ЧДЦ=0"); // "1 235"
Параметр ЧДЦ=0 задаёт ноль знаков после запятой, при этом отображение округляется по арифметическим правилам. В макетах табличных документов тот же эффект даёт установка формата в свойствах ячейки или параметра. Это правильный подход для отчётов: итоги внизу отчёта тогда сходятся с суммой точных значений, а не с суммой округлённых строк.
Типичная проблема — когда округляют каждую строку, а потом суммируют: копейки «уезжают», и итог не сходится с проводками. Правило простое: округляйте либо только на этапе отображения, либо на финальном шаге расчёта, но не в середине цепочки вычислений.
Проверка результата и граничные случаи
После внедрения округления проверьте поведение на граничных значениях: ровно 0,5, значения чуть ниже и выше половины, отрицательные числа, ноль и уже целые числа. Удобно вывести тестовую таблицу через Сообщить() или в отладчике, чтобы убедиться, что выбранная функция ведёт себя так, как ожидает бизнес-логика.
Для денежных расчётов дополнительно сверьте итоги: сумма округлённых значений может отличаться от округлённой суммы. Если требование — чтобы сумма частей равнялась итогу, применяется распределение погрешности: разницу добавляют к последней или к самой большой строке. Такое встречается, например, при распределении скидки по позициям чека.
Если округление применяется в регламентированных расчётах (зарплата, налоги), ориентируйтесь на правила, зашитые в типовой конфигурации: там порядок округления определён методологически, и самостоятельная его замена почти наверняка приведёт к расхождениям с отчётностью.
Как проверить результат
Возвращает 1
Возвращает 0 — использована другая функция или неверная разрядность
Возвращает 15
Возвращает 16 — перепутано с Окр()
Расхождение известно и обработано
Копеечные расхождения всплывают в отчётах случайно
Поведение соответствует правилам расчёта
Сторно округляется не в ту сторону
Итог и ответы на частые вопросы
Выбор способа округления в 1С сводится к трём вопросам: нужно ли математическое округление или отсечение, где выполняется расчёт (код, запрос или отображение) и как обрабатывать граничные и отрицательные значения. В большинстве случаев достаточно Окр(Число, 0), Цел(Число) и ВЫРАЗИТЬ(... КАК Число(15, 0)) в запросах.
Что важно запомнить
Окр(Число, 0) — математическое округление до целого, Цел(Число) — отсечение дробной части, ВЫРАЗИТЬ(... КАК Число(15, 0)) — округление в запросе, Формат() с ЧДЦ=0 — округление только при отображении. Округляйте на финальном этапе расчёта и проверяйте граничные значения.
Чем отличается Окр() от Цел() в 1С?
Окр() округляет по арифметическим правилам: 15,5 превратится в 16. Цел() просто отбрасывает дробную часть: 15,9 станет 15. Для отрицательных чисел Цел() отбрасывает дробь в сторону нуля, а Окр() округляет от нуля.
Как округлить число до целого в запросе 1С?
Используйте приведение типа: ВЫРАЗИТЬ(Поле КАК ЧИСЛО(15, 0)). При этом применяется арифметическое округление, аналогичное функции Окр(). Отдельной функции округления в языке запросов нет.
Как округлить всегда в большую сторону?
Возьмите целую часть через Цел(Число) и прибавьте 1, если исходное число больше своей целой части. Альтернатива — Окр(Число + 0.5, 0), но вариант с явной проверкой понятнее и надёжнее на граничных значениях.
Можно ли округлить число только для отображения, не меняя значение?
Да. Используйте Формат(Число, "ЧДЦ=0") при выводе строкой или задайте формат в свойствах поля формы либо ячейки макета. Само значение останется точным, что важно для корректных итогов в отчётах.
Почему после округления не сходятся итоги документа?
Обычно причина в том, что округляется каждая строка, а затем округлённые значения суммируются — накапливается погрешность. Округляйте итоговую сумму или распределяйте разницу по строкам осознанно, например добавляя её к последней позиции.
Как округлить до десятков или сотен?
Передайте в Окр() отрицательную разрядность: Окр(Число, -1) округлит до десятков, Окр(Число, -2) — до сотен. Например, Окр(1234, -2) вернёт 1200.