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

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

Как округлить сумму в 1С: способы и настройки

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

Округление сумм в 1С встречается повсюду: при расчёте цен со скидкой, начислении НДС, формировании печатных форм и выгрузке данных. Ошибка в одну копейку способна разорвать сверку с контрагентом или остановить выгрузку в банк, поэтому важно понимать, какие инструменты округления есть в платформе и где они применяются.

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

Функция Окр() — основной инструмент в коде

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

// Округление до копеек

СуммаОкр = Окр(1234.567, 2); // 1234.57

// Округление до целых рублей

СуммаРуб = Окр(1234.567, 0); // 1235

// Округление до сотен рублей

СуммаСотни = Окр(1234.567, -2); // 1200

Третий параметр принимает значения системного перечисления РежимОкругления: Окр15как10 (0.5 округляется вниз) и Окр15как20 (0.5 округляется вверх, это значение по умолчанию). Разница заметна на суммах, где дробная часть ровно равна пяти в отбрасываемом разряде.

Окр(10.5, 0, РежимОкругления.Окр15как10); // 10

Окр(10.5, 0, РежимОкругления.Окр15как20); // 11

1c
Функция ОкруглитьСумму(Знач Сумма, Знач Точность = 2) Экспорт
	Возврат Окр(Сумма, Точность, РежимОкругления.Окр15как20);
КонецФункции

Округление вверх и вниз: Цел() и собственные формулы

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

Округление вверх до целого: Результат = Цел(Число) + ?(Число > Цел(Число), 1, 0). Округление вниз: достаточно Цел(Число) — функция отбрасывает дробную часть. Для округления вверх до копеек сначала умножают на 100, применяют приём, затем делят обратно.

// Вверх до копеек

СуммаВверх = (Цел(Сумма 100) + ?(Сумма 100 > Цел(Сумма * 100), 1, 0)) / 100;

// Вниз до копеек

СуммаВниз = Цел(Сумма * 100) / 100;

Округление только при отображении: форматная строка

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

Ключевой параметр — ЧДЦ (число десятичных знаков). Например, Формат(Сумма, "ЧДЦ=0") выведет сумму без копеек, а Формат(Сумма, "ЧДЦ=2; ЧРГ=' '") — с двумя знаками и разделением групп разрядов пробелом. В макетах печатных форм формат задаётся в свойствах параметра области.

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

Округление в типовых конфигурациях без программирования

В типовых решениях часть округлений настраивается пользователем. В «1С:Управление торговлей» и «1С:Комплексная автоматизация» для цен номенклатуры доступны правила округления: в настройках вида цен задаётся порядок округления (до копеек, до рубля, до десятков рублей) и направление — по арифметическим правилам, всегда вверх или всегда вниз. Это удобно для розничных цен с «красивыми» окончаниями.

В «1С:Зарплата и управление персоналом» точность расчётов регулируется настройками учётной политики, а округление сумм к выплате — параметрами ведомостей. В бухгалтерских конфигурациях суммы НДС округляются автоматически по правилам, заложенным в типовой алгоритм, и вмешиваться в них вручную не следует.

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

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

Как выбрать способ

Нужно округлить значение в расчёте перед записьюИспользуйте Окр() с нужной разрядностью и режимом
Нужно только красиво показать число в форме или печатиПримените форматную строку ЧДЦ, данные не трогайте
Речь о ценах номенклатуры в типовой конфигурацииНастройте правило округления в виде цен
Нужно гарантированно вверх или внизИспользуйте Цел() с арифметическим приёмом

Типичные ошибки и копеечные расхождения

Самая частая ошибка — округлять итог документа вместо строк. Если округлить каждую строку, а потом сложить, сумма почти всегда отличается от округлённого итога. Правильный порядок: сначала определить, что является «источником истины» (обычно строки документа), округлить их, а итог считать как сумму уже округлённых значений.

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

Третья типичная ситуация — сравнение чисел после округления. Из-за особенностей двоичного представления дробных чисел результат вычислений может быть не ровно 0.1, а 0.099999…, и прямое сравнение на равенство даст ложь. Сравнивайте с допуском: Модуль(А - Б) < 0.005 или сравнение после Окр() обоих значений.

Типичные ошибки
01
Округление итога вместо строк — копеечные расхождения с контрагентом
02
Разная разрядность Окр() в одной цепочке расчёта — не сходится НДС
03
Сравнение дробных чисел через равенство — ложные результаты условий
04
Округление форматной строкой в документе для налоговой — видимые строки не бьются с итогом
05
Самописное округление поверх типового механизма — сбои после обновления конфигурации

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

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

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

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

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

Итог документа против суммы строк
Норма

Итог равен сумме округлённых строк до копейки

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

Разница в копейках между итогом и строками

Значение 0.5 в отбрасываемом разряде
Норма

Округляется согласно выбранному режиму

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

Результат зависит от случайных факторов или не соответствует режиму

Печатная форма для контрагента
Норма

Видимые строки сходятся с итогом и НДС

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

Ручной пересчёт строк даёт другую сумму

Отрицательные суммы (возвраты)
Норма

Округление симметрично положительным

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

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

FAQ: частые вопросы об округлении в 1С

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

Окр() округляет по математическим правилам до заданной разрядности, включая дробные разряды и разряды выше целых. Цел() просто отбрасывает дробную часть и всегда возвращает целое число: Цел(9.99) = 9, тогда как Окр(9.99, 0) = 10.

Как округлить сумму до рублей без копеек в печатной форме?

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

Почему после округления итог не сходится на копейку?

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

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

Штатной функции «вверх» нет. Используйте приём: Цел(Число) + ?(Число > Цел(Число), 1, 0) для целых, предварительно умножив на 100 для копеек. В видах цен типовых конфигураций направление «вверх» задаётся настройкой.

Влияет ли режим Окр15как10 на обычные суммы?

Режим срабатывает только когда отбрасываемая часть — ровно половина единицы младшего разряда (например, 10.5 при округлении до целых). На все остальные значения оба режима действуют одинаково, поэтому для большинства расчётов подходит режим по умолчанию Окр15как20.

Нужно ли округлять НДС вручную в типовой конфигурации?

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

Итог

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

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