Как правильно округлить число в 1С: подробное руководство по функциям и форматам

Программист 1С v8.3 (Управляемые формы)
← На главную

В процессе разработки в системе «1С:Предприятие» программисты часто сталкиваются с задачей округления чисел. На первый взгляд простая операция — превратить 1 399,99 в 1 400,00 — таит в себе несколько подводных камней, связанных с типами данных, региональными настройками и правилами бухгалтерского учета. В этой статье мы подробно разберем, как правильно работать с функцией Окр(), как преобразовывать строки в числа и как управлять визуальным представлением данных.

Преобразование строки в число: борьба с невидимыми символами

Прежде чем приступать к округлению, мы должны убедиться, что работаем именно с числовым типом данных. В 1С часто возникает ситуация, когда сумма приходит в виде строки, например, из текстового файла или поля ввода. Рассмотрим пример: "1 399,99".

Если мы просто применим функцию Число(), система может выдать ошибку «Преобразование значения к типу Число не может быть выполнено». Разберем ситуацию подробнее: в 1С при выводе чисел часто используется неразрывный пробел (символ с кодом 160) в качестве разделителя разрядов. Обычная функция Число() не понимает пробелы внутри строки.

Проанализируем шаги, которые необходимо выполнить для корректного преобразования:

  1. Удалить все обычные пробелы.
  2. Удалить все неразрывные пробелы (Символы.НПП).
  3. Заменить запятую на точку (в зависимости от настроек, но 1С обычно понимает системный разделитель).

Посмотрим на пример кода, который решает эту задачу надежно:


// Очищаем строку от разделителей групп разрядов
СтрокаСуммы = "1 399,99";
ЧистаяСтрока = СтрЗаменить(СтрокаСуммы, Символы.НПП, ""); // Удаляем неразрывные пробелы
ЧистаяСтрока = СтрЗаменить(ЧистаяСтрока, " ", ""); // Удаляем обычные пробелы
ЧисловоеЗначение = Число(ЧистаяСтрока);

Работа с функцией Окр(): параметры и разрядность

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

Параметр Разрядность: он определяет количество знаков после запятой.

Рассмотрим ситуацию автора вопроса: нужно получить 1400 из 1399,99. Если мы хотим округлить именно до сотен, то разрядность должна быть -2. Если же нам нужно просто ближайшее целое, разрядность будет 0.

Пример кода для разных сценариев:


ИсходноеЧисло = 1399.99;

// Округление до целого (результат 1400)
Результат1 = Окр(ИсходноеЧисло, 0);

// Округление до сотен (результат 1400)
Результат2 = Окр(ИсходноеЧисло, -2);

// Округление до тысяч (результат 1000)
Результат3 = Окр(ИсходноеЧисло, -3);

Режимы округления: математическое против бухгалтерского

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

  1. РежимОкругления.Окр15как20 — это привычное нам со школы арифметическое округление. Число 1.5 станет 2.
  2. РежимОкругления.Окр15как10 — это так называемое «банковское» округление. Если округляемая часть равна ровно 0.5, число округляется до ближайшего четного. То есть 1.5 станет 2, но 2.5 тоже станет 2!

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

Отображение результата: функция Формат()

Часто пользователи путают значение числа и его представление на экране. Если вы округлили число 1399.99 до 1400, в интерфейсе оно может отобразиться просто как «1 400». Но бухгалтерия часто требует формат «1 400.00» (с двумя нулями). Функция Окр() не добавляет нули в визуальное отображение, она меняет математическую суть числа.

Для красивого вывода мы используем функцию Формат(). Разберем по шагам создание форматной строки:


ЧислоПослеОкругления = 1400;
// ЧЦ=15 - общая длина числа
// ЧДЦ=2 - всегда показывать 2 знака после запятой
// ЧГ=3,0 - разделять группы разрядов через 3 знака, но не использовать пробел в конце
СтрокаДляВывода = Формат(ЧислоПослеОкругления, "ЧЦ=15; ЧДЦ=2; ЧГ=3,0");
// Результат будет "1400,00"

Альтернативные способы округления

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

Проанализируем ситуацию: нам нужно округлить 1.1 до 2. Пример логики:


ЧислоДляОкругления = 1.1;
Результат = Цел(ЧислоДляОкругления) + ?(ЧислоДляОкругления = Цел(ЧислоДляОкругления), 0, 1);

Также в сообщениях форума упоминался метод Окр(Число + 0.5, 0, 0). Это старый «хакерский» прием из времен, когда языки программирования не имели встроенных режимов округления. В современной среде 1С:Предприятие 8 использовать его не рекомендуется, так как штатная функция Окр() полностью покрывает все потребности и работает корректно с отрицательными числами.

Почему «другие суммы будут рассчитываться неправильно»?

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

Золотое правило программиста 1С: выполняйте все промежуточные расчеты с максимальной точностью (например, до 3 или 4 знаков), а округляйте до 2 знаков только конечный результат, который идет в проводки или печатные формы.

Итог решения задачи

Чтобы успешно решить задачу из обсуждения, нам нужно объединить все знания в один надежный алгоритм. Допустим, у нас есть строка "1 399,99" и мы хотим получить число 1400 с выводом двух нулей.


// 1. Подготовка строки
ВходныеДанные = "1 399,99";
Стр = СтрЗаменить(ВходныеДанные, Символы.НПП, "");
Стр = СтрЗаменить(Стр, ",", "."); // На всякий случай заменяем разделитель

// 2. Преобразование и округление
ЧислоЗначение = Число(Стр);
ОкругленноеЧисло = Окр(ЧислоЗначение, 0); // Округляем до целого

// 3. Форматирование для пользователя
ИтоговыйТекст = Формат(ОкругленноеЧисло, "ЧДЦ=2"); 
// В ИтоговыйТекст будет "1 400,00"

Теперь мы разобрали все нюансы и готовы к реализации корректного округления в любой конфигурации 1С.

← На главную