При переходе с программы «1С:Зарплата и управление персоналом» устаревшей редакции 2.5 на современную редакцию 3.1 пользователи часто сталкиваются с неприятным явлением: при расчете документов (например, при увольнении или начислении зарплаты) суммы некоторых доплат начинают расходиться на одну копейку. Бухгалтеры бьют тревогу и утверждают, что перенос данных выполнен некорректно. На самом деле причина кроется в изменении математического движка расчета и архитектуры конфигурации. В этой статье мы подробно разберем, почему возникают такие расхождения, и рассмотрим практические способы настройки формул в ЗУП 3.1 для точного округления копеек в большую сторону.
Для начала проанализируем ситуацию на конкретном примере. Предположим, у нас есть начисление «Доплата за разъездной характер работы». В ЗУП 2.5 для него был выбран жестко зашитый способ расчета «Процентом» (без редактируемой формулы). Пользователь установил размер доплаты равным 40 % от расчетной базы. База начисления составила 6023,81 руб.
Давайте посмотрим, как считает программа в обеих редакциях:
40 / 100 * 6023,81 = 2409,524. На выходе мы получаем округленную сумму 2409,53 руб. (округление произошло в большую сторону).ДоплатаЗаРазъезднойХарактерРаботы / 100 * РасчетнаяБаза. Программа вычисляет то же самое выражение: 40 / 100 * 6023,81 = 2409,524. Однако на выходе получается 2409,52 руб. Число округляется по классическим правилам математики (так как третья цифра после запятой «4» меньше «5», округление идет в меньшую сторону).Многие пользователи ошибочно думают, что ЗУП 3.1 «просто отбрасывает» копейки. На самом деле ЗУП 3.1 считает математически верно, а вот в ЗУП 2.5 промежуточные округления показателей базы или коэффициентов часто приводили к завышению результата на копейку. Чтобы сгладить этот переход и удовлетворить требования бухгалтерии («хотим расчет точно как в 2.5»), нам потребуется скорректировать формулу начисления.
Попытка применить стандартную функцию Окр() напрямую к формуле вида Окр(ДоплатаЗаРазъезднойХарактерРаботы / 100 * РасчетнаяБаза, 2) не принесет результата, поскольку эта функция работает по общепринятым математическим правилам и все равно округлит 2409,524 до 2409,52.
В ЗУП 3.1 нет готовой функции для принудительного округления вверх (аналога математического потолка Ceiling). Но мы можем обойти это ограничение, используя тернарный оператор ?() и функцию выделения целой части числа Цел(). Основная идея заключается в том, чтобы перевести копейки в целые числа (умножить на 100), проверить наличие дробной части и, если она есть, прибавить единицу, после чего вернуть результат в исходный масштаб.
Рассмотрим по шагам, как составить такую формулу:
ДоплатаЗаРазъезднойХарактерРаботы / 100 * РасчетнаяБаза. Для удобства назовем его Выражение.(Выражение) * 100.Цел() и принудительно прибавляем 1 копейку.В редакторе формул начисления это будет выглядеть следующим образом:
?(Цел(ДоплатаЗаРазъезднойХарактерРаботы / 100 * РасчетнаяБаза * 100) = ДоплатаЗаРазъезднойХарактерРаботы / 100 * РасчетнаяБаза * 100, ДоплатаЗаРазъезднойХарактерРаботы / 100 * РасчетнаяБаза * 100, Цел(ДоплатаЗаРазъезднойХарактерРаботы / 100 * РасчетнаяБаза * 100) + 1) / 100
Важное примечание: Обратите внимание, что в формульном редакторе 1С необходимо использовать именно функцию Цел, а не Целое. Использование недопустимых идентификаторов приведет к ошибке проверки формулы: «Не удалось найти показатель по идентификатору».
Давайте проверим работоспособность формулы на нашем примере:
40 / 100 * 6023,81 = 2409,524.240952,4.Цел(240952,4) (что дает 240952) числу 240952,4? Нет, они не равны.240952 + 1 = 240953.2409,53 руб. Проблема решена!Если предыдущая формула кажется вам слишком громоздкой и трудной для чтения, мы можем применить другой изящный математический прием. Мы можем искусственно сместить округляемое значение в большую сторону перед вызовом стандартной функции Окр().
Чтобы принудительно округлить любое дробное число с точностью до 2 знаков после запятой в большую сторону, достаточно прибавить к нему микро-смещение, равное 0.0049 (или чуть меньше, например 0.00499), а затем выполнить обычное математическое округление до двух знаков.
Посмотрим, как будет выглядеть эта формула в ЗУП 3.1:
Окр(ДоплатаЗаРазъезднойХарактерРаботы / 100 * РасчетнаяБаза + 0.0049, 2)
Давайте проанализируем, как работает этот метод на конкретных цифрах:
2409,524. Прибавляем константу: 2409,524 + 0.0049 = 2409,5289. Округляем до двух знаков после запятой с помощью Окр(..., 2). Так как третья цифра теперь «8» (больше либо равна 5), программа округляет число вверх и выдает 2409,53.2409,520. Прибавляем константу: 2409,520 + 0.0049 = 2409,5249. Округляем до 2 знаков после запятой. Третья цифра после запятой — «4» (меньше 5), поэтому округление происходит в меньшую сторону, и мы получаем исходные 2409,52 без лишней накрученной копейки.Этот способ значительно короче, проще в настройке и работает так же безотказно, как и первый вариант.
Иногда копейки при расчетах «плывут» из-за того, что в формулах используются показатели, значения которых предварительно округляются до стандартных двух знаков после запятой, хотя должны рассчитываться с большей точностью (например, тарифные ставки или стоимость часа). Перед тем как изменять формулу самого начисления, рекомендуем проверить следующие настройки программы:
СтоимостьЧаса с помощью функции Окр, например: Окр(СтоимостьЧаса, 2) * ВремяВЧасах или наоборот, использовать неокругленное значение.Таким образом, комбинируя гибкий формульный движок 1С:ЗУП 3.1 с математическими методами смещения и масштабирования, вы сможете легко добиться полного совпадения расчетов с историческими данными из ЗУП 2.5 и успешно сдать всю необходимую отчетность без ручных корректировок в документах.