Почему не округляется расчетное начисление при переходе на ЗУП 3.1 и как настроить округление копеек в большую сторону?

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

При переходе с программы «1С:Зарплата и управление персоналом» устаревшей редакции 2.5 на современную редакцию 3.1 пользователи часто сталкиваются с неприятным явлением: при расчете документов (например, при увольнении или начислении зарплаты) суммы некоторых доплат начинают расходиться на одну копейку. Бухгалтеры бьют тревогу и утверждают, что перенос данных выполнен некорректно. На самом деле причина кроется в изменении математического движка расчета и архитектуры конфигурации. В этой статье мы подробно разберем, почему возникают такие расхождения, и рассмотрим практические способы настройки формул в ЗУП 3.1 для точного округления копеек в большую сторону.

Выясняем причину: почему плывут копейки между ЗУП 2.5 и ЗУП 3.1

Для начала проанализируем ситуацию на конкретном примере. Предположим, у нас есть начисление «Доплата за разъездной характер работы». В ЗУП 2.5 для него был выбран жестко зашитый способ расчета «Процентом» (без редактируемой формулы). Пользователь установил размер доплаты равным 40 % от расчетной базы. База начисления составила 6023,81 руб.

Давайте посмотрим, как считает программа в обеих редакциях:

  1. В ЗУП 2.5: расчет производится по внутренним алгоритмам кода. Программа вычисляет: 40 / 100 * 6023,81 = 2409,524. На выходе мы получаем округленную сумму 2409,53 руб. (округление произошло в большую сторону).
  2. В ЗУП 3.1: после переноса данных предопределенный способ «Процентом» отсутствует. Начисление рассчитывается по формуле: ДоплатаЗаРазъезднойХарактерРаботы / 100 * РасчетнаяБаза. Программа вычисляет то же самое выражение: 40 / 100 * 6023,81 = 2409,524. Однако на выходе получается 2409,52 руб. Число округляется по классическим правилам математики (так как третья цифра после запятой «4» меньше «5», округление идет в меньшую сторону).

Многие пользователи ошибочно думают, что ЗУП 3.1 «просто отбрасывает» копейки. На самом деле ЗУП 3.1 считает математически верно, а вот в ЗУП 2.5 промежуточные округления показателей базы или коэффициентов часто приводили к завышению результата на копейку. Чтобы сгладить этот переход и удовлетворить требования бухгалтерии («хотим расчет точно как в 2.5»), нам потребуется скорректировать формулу начисления.

Решение 1. Округление в большую сторону через масштабирование и функцию Цел()

Попытка применить стандартную функцию Окр() напрямую к формуле вида Окр(ДоплатаЗаРазъезднойХарактерРаботы / 100 * РасчетнаяБаза, 2) не принесет результата, поскольку эта функция работает по общепринятым математическим правилам и все равно округлит 2409,524 до 2409,52.

В ЗУП 3.1 нет готовой функции для принудительного округления вверх (аналога математического потолка Ceiling). Но мы можем обойти это ограничение, используя тернарный оператор ?() и функцию выделения целой части числа Цел(). Основная идея заключается в том, чтобы перевести копейки в целые числа (умножить на 100), проверить наличие дробной части и, если она есть, прибавить единицу, после чего вернуть результат в исходный масштаб.

Рассмотрим по шагам, как составить такую формулу:

  1. Определим наше базовое выражение вычисления доплаты: ДоплатаЗаРазъезднойХарактерРаботы / 100 * РасчетнаяБаза. Для удобства назовем его Выражение.
  2. Умножим результат на 100, чтобы сдвинуть запятую на два знака вправо: (Выражение) * 100.
  3. Сравним полученное число с его целой частью. Если число уже целое (например, копеек ровно 52, дробной части нет), мы оставляем его как есть. Если есть остаток (например, 52.4 копейки), то мы отсекаем дробную часть функцией Цел() и принудительно прибавляем 1 копейку.
  4. Всю конструкцию делим обратно на 100.

В редакторе формул начисления это будет выглядеть следующим образом:


?(Цел(ДоплатаЗаРазъезднойХарактерРаботы / 100 * РасчетнаяБаза * 100) = ДоплатаЗаРазъезднойХарактерРаботы / 100 * РасчетнаяБаза * 100, ДоплатаЗаРазъезднойХарактерРаботы / 100 * РасчетнаяБаза * 100, Цел(ДоплатаЗаРазъезднойХарактерРаботы / 100 * РасчетнаяБаза * 100) + 1) / 100

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

Давайте проверим работоспособность формулы на нашем примере:

Решение 2. Математический сдвиг через прибавление константы

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

Чтобы принудительно округлить любое дробное число с точностью до 2 знаков после запятой в большую сторону, достаточно прибавить к нему микро-смещение, равное 0.0049 (или чуть меньше, например 0.00499), а затем выполнить обычное математическое округление до двух знаков.

Посмотрим, как будет выглядеть эта формула в ЗУП 3.1:

Окр(ДоплатаЗаРазъезднойХарактерРаботы / 100 * РасчетнаяБаза + 0.0049, 2)

Давайте проанализируем, как работает этот метод на конкретных цифрах:

Этот способ значительно короче, проще в настройке и работает так же безотказно, как и первый вариант.

Настройка точности показателей и округления в программе

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

  1. Перейдите в меню Настройка, затем выберите пункт Расчет зарплаты.
  2. Проверьте параметры пересчета тарифных ставок. Если при пересчете месячного оклада в часовую ставку получается бесконечная дробь, программа может округлить ее до копеек. Это приведет к погрешности при умножении на количество отработанных часов.
  3. Если вам требуется скорректировать точность вычисления стоимости часа непосредственно в формуле начисления, вы можете явно ограничить или расширить точность показателя СтоимостьЧаса с помощью функции Окр, например: Окр(СтоимостьЧаса, 2) * ВремяВЧасах или наоборот, использовать неокругленное значение.

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

← На главную