Разработка и Конфигурация · 11 мин
Как округлить число в большую сторону в 1С
Как в 1С округлить число в большую сторону с помощью Окр, Цел и ЦЕЛОЕ. Примеры кода, округление до целого и до нужного разряда, типичные ошибки.
Во встроенном языке 1С нет отдельной функции «округлить вверх», как в Excel (ОКРУГЛВВЕРХ). Стандартная функция Окр() округляет по математическим правилам: 2,4 превратится в 2, а 2,6 — в 3. Поэтому для гарантированного округления в большую сторону применяют комбинацию функций Цел() (или ЦЕЛОЕ()) с проверкой дробной части либо приём с добавлением 0,5 и последующим округлением.
Задача округления вверх встречается постоянно: расчёт количества упаковок, когда товар отгружается только целыми коробами; определение числа рейсов транспорта; округление сумм до целых рублей в платёжных документах; расчёт страховых запасов на складе. Во всех этих случаях округление «вниз» приведёт к нехватке товара или занижению суммы, поэтому важно выбрать правильный способ.
Ниже разобраны рабочие приёмы на встроенном языке 1С и в языке запросов, с примерами кода, проверкой результата и разбором типичных ошибок. Приёмы одинаково работают в конфигурациях на управляемых и обычных формах, в тонком, толстом и веб-клиенте.
Чем округление вверх отличается от стандартного Окр()
Функция Окр(Число, Разрядность) выполняет арифметическое округление: дробная часть меньше 0,5 отбрасывается, 0,5 и больше — увеличивает целую часть на единицу. Это подходит для денежных сумм, но не для расчёта количества, где любая дробная часть означает «нужна ещё одна единица».
Округление вверх (к ceiling в других языках) означает: любое число с ненулевой дробной частью увеличивается до следующего целого. Например, 4,01 → 5, 4,99 → 5, а 4,0 остаётся 4. Именно такое поведение нужно при расчёте упаковок: если на заказ требуется 4,01 короба, отгрузить придётся 5.
| Исходное число | Окр(Число, 0) | Округление вверх | Округление вниз (Цел) |
|---|---|---|---|
| 4,0 | 4 | 4 | 4 |
| 4,01 | 4 | 5 | 4 |
| 4,5 | 5 | 5 | 4 |
| 4,99 | 5 | 5 | 4 |
Способ 1: Цел() с проверкой дробной части
Функция Цел(Число) (английский синоним Int) отбрасывает дробную часть, всегда округляя к нулю. Если к результату прибавить единицу в случаях, когда дробная часть была, получится округление вверх.
Функция ОкруглитьВверх(Число)
ЦелаяЧасть = Цел(Число);
Если Число > ЦелаяЧасть Тогда
Возврат ЦелаяЧасть + 1;
Иначе
Возврат ЦелаяЧасть;
КонецЕсли;
КонецФункции
Такую функцию удобно разместить в общем модуле, чтобы вызывать её из любого места конфигурации. Условие Число > ЦелаяЧасть корректно работает и для положительных чисел: дробная часть есть — добавляем единицу, нет — возвращаем как есть.
Компактный однострочный вариант через тернарный оператор:
Результат = ?(Число = Цел(Число), Цел(Число), Цел(Число) + 1);
Способ 2: приём с добавлением 0,5 и Окр()
Лаконичный трюк, часто встречающийся в типовых конфигурациях: прибавить к числу 0,5 и применить обычное округление. Любая дробная часть после добавления 0,5 «перешагнёт» порог арифметического округления.
Результат = Окр(Число + 0.5, 0);
Проверка границ: 4,0 + 0,5 = 4,5, Окр даст 5 — но правильный ответ для округления вверх равен 4! Это ключевое ограничение приёма: он некорректно обрабатывает целые числа, завышая результат на единицу. Поэтому чистый вариант с Окр(Число + 0.5) применим только там, где целые значения исключены или завышение допустимо.
Корректная версия приёма — с предварительной проверкой:
Если Число = Цел(Число) Тогда
Результат = Число;
Иначе
Результат = Окр(Число + 0.5, 0);
КонецЕсли;
Способ 3: округление вверх до нужного разряда
Иногда округлить нужно не до целого, а до десятых, сотых или, наоборот, до десятков и сотен (например, до целой тысячи в бюджете). Общий приём: сдвинуть разряд делением, округлить вверх до целого, затем вернуть масштаб умножением.
// Округление вверх до сотых (2 знака после запятой)
Результат = ОкруглитьВверх(Число * 100) / 100;
// Округление вверх до сотен
Результат = ОкруглитьВверх(Число / 100) * 100;
Пример: требуется округлить 12,34 вверх до десятых. Умножаем на 10 → 123,4; округляем вверх → 124; делим на 10 → 12,4. Аналогично 1250 при округлении вверх до тысяч даст 2000, а ровно 1000 останется 1000 (при корректной проверке целочисленности внутри функции).
Функция ОкруглитьВверхДоРазряда(Число, Разряд)
Множитель = Pow(10, Разряд);
Сдвинутое = Число * Множитель;
Целое = Цел(Сдвинутое);
Если Сдвинутое > Целое Тогда
Целое = Целое + 1;
КонецЕсли;
Возврат Целое / Множитель;
КонецФункцииОкругление вверх в запросах 1С
В языке запросов нет функции Цел(), но есть приведение типов: конструкция ВЫРАЗИТЬ(Значение КАК ЧИСЛО(15, 0)) отбрасывает дробную часть арифметическим округлением, а не усечением. Поэтому надёжный способ округления вверх в запросе — прибавить 0,5 и привести тип, либо использовать вычисление через разность.
ВЫБРАТЬ
ВЫРАЗИТЬ(&Число + 0.5 КАК ЧИСЛО(15, 0)) КАК ОкругленоВверх
У этого приёма то же ограничение, что и у Окр(Число + 0.5): ровно целые значения завышаются. Если это критично, используйте конструкцию ВЫБОР с проверкой: сравните исходное значение с приведённым и добавьте корректировку.
ВЫБОР
КОГДА &Число = ВЫРАЗИТЬ(&Число КАК ЧИСЛО(15, 0))
ТОГДА ВЫРАЗИТЬ(&Число КАК ЧИСЛО(15, 0))
ИНАЧЕ ВЫРАЗИТЬ(&Число + 0.5 КАК ЧИСЛО(15, 0))
КОНЕЦ
Если запрос сложный и логика округления нетривиальна, часто проще выгрузить результат в таблицу значений и обработать её в коде встроенного языка уже готовой функцией из общего модуля. Это упрощает отладку и повторное использование.
Сравнение вариантов
Универсальный и точный способ в коде; корректно обрабатывает целые значения. Требует написания функции или условия
Самая короткая запись, но завышает ровно целые числа на единицу — подходит только при гарантированной дробности
Единственный вариант внутри запроса без постобработки; требует конструкции ВЫБОР для точной обработки целых
Удобно при сложной логике и отладке; не подходит, если округление нужно прямо в итогах запроса
Практический пример: расчёт количества упаковок
Типовой сценарий: в документе «Заказ покупателя» менеджер указывает количество в штуках, а поставщик отгружает товар только коробами по 12 штук. Нужно рассчитать число коробов так, чтобы товара хватило.
КоличествоШтук = 250;
ШтукВКоробе = 12;
КоробовТочно = КоличествоШтук / ШтукВКоробе; // 20,833...
КоробовКЗаказу = ОкруглитьВверх(КоробовТочно); // 21
Проверка результата: 21 × 12 = 252 штуки, что покрывает заказ в 250 штук. Если бы применили обычный Окр(), получилось бы 21 — совпадение случайное; при 244 штуках Окр() дал бы 20 коробов (240 штук), и 4 штук заказчику не хватило бы.
- 1Определите, где в алгоритме требуется округление вверх, и зафиксируйте правило с ответственным за учёт
- 2Добавьте функцию ОкруглитьВверх в общий модуль (например, модуль работы с числами)
- 3Замените вызовы Окр() на новую функцию в нужных местах
- 4Протестируйте граничные значения: целое число, число чуть больше целого, число с дробью 0,99
- 5Проверьте отчёты и печатные формы, которые используют изменённый расчёт
Проверка результата и границы применения
После внедрения проверьте работу функции на контрольном наборе значений: целое (10 → 10), чуть больше целого (10,001 → 11), значение с половиной (10,5 → 11), близкое к следующему целому (10,999 → 11). Все четыре случая должны давать ожидаемый результат.
Отдельно проверьте отрицательные числа, если они теоретически возможны в данных, и очень большие значения — при умножении на 100 или 1000 для сдвига разрядов возможна потеря точности из-за ограниченной разрядности типа Число. В типовых конфигурациях длина числа обычно ограничена метаданными реквизита, поэтому сверяйте разрядность с определением поля.
Не применяйте округление вверх к денежным суммам без согласования: в бухгалтерском и налоговом учёте действуют свои правила округления, и самовольное завышение сумм в документах приведёт к расхождениям с контрагентами и отчётностью. Округление вверх уместно для количеств, таров, рейсов, смен — там, где дробная единица физически невозможна.
Как проверить результат
Результат равен исходному (10 → 10)
Результат увеличился на единицу (10 → 11) — ошибка в логике
Результат 11
Результат 10 — применено обычное округление вместо округления вверх
Количество упаковок × штук в упаковке ≥ заказанного количества
Итогового количества не хватает на отгрузку
Частые вопросы
Есть ли в 1С готовая функция округления вверх, как ОКРУГЛВВЕРХ в Excel?
Нет, во встроенном языке 1С отдельной функции ceiling нет. Используют комбинацию Цел() с проверкой дробной части, приём Окр(Число + 0.5) с дополнительной проверкой или собственную функцию в общем модуле.
Чем Цел() отличается от Окр()?
Цел() просто отбрасывает дробную часть (усечение), а Окр() округляет арифметически: 4,7 через Цел() даст 4, через Окр() — 5. Для округления вверх Цел() используют как основу, добавляя единицу при наличии дробной части.
Как округлить вверх до двух знаков после запятой?
Умножьте число на 100, округлите вверх до целого любым из описанных способов, затем разделите на 100. Например, 12,341 → 1234,1 → 1235 → 12,35.
Работает ли округление вверх в СКД и вычисляемых полях?
В выражениях СКД доступны функции языка выражений, где есть Окр и возможность приведения типов. Приём с добавлением 0,5 и ВЫРАЗИТЬ работает, но для точной обработки целых значений надёжнее вычислять поле в запросе с конструкцией ВЫБОР.
Что делать с отрицательными числами?
Для отрицательных значений Цел(-4,3) уже возвращает -4, что больше исходного, то есть добавлять единицу не нужно. Если логика требует симметричного округления «от нуля», обрабатывайте отрицательные числа отдельной веткой условия и обязательно тестируйте этот случай.
Можно ли округлить вверх прямо в печатной форме, не меняя данные документа?
Да, если печатная форма строится программно, примените функцию округления к параметрам области перед выводом. Учтите, что значения на печати тогда будут отличаться от данных в документе — это нужно согласовать с пользователями, чтобы избежать вопросов при сверке.
Что важно запомнить
Отдельной функции округления вверх в 1С нет: используйте Цел() с проверкой дробной части или аккуратный приём Окр(Число + 0.5) с защитой от завышения целых значений. В запросах применяйте ВЫРАЗИТЬ с конструкцией ВЫБОР. Всегда тестируйте граничные значения и не меняйте правила округления в закрытых периодах.