Суть проблемы:
У сотрудника Булатова Игоря Виленовича оклад 16 000 руб.
На него введены два исполнительных листа по 25% каждый на одного и того же получателя через почту России. Один по достижении предела – задолженность по алиментам. Второй по достижении 18 лет ребенку.
Оба исполнительных листа введены двумя разными документами.
При расчете зарплаты сумма удержания по каждому исполнительному листу составляет 3 480,00 руб.
Но сумма почтовых сборов не соответствует ожиданиям!
На текущий момент тарифы почты России выглядят следующим образом:
При расчете почтового сбора должна учитываться общая сумма удержаний 6 960 * 2% + 190 = 329,20 – то есть на каждого по 164,60. Это меньше чем результат расчета программы.
Допустим, что расчет выполняется по каждому документу отдельно – 3 480 * 4% + 90 = 229,20. Это больше чем результат расчета программы.
Оказалось, что программа использовала для расчета общую сумму удержания, а вот тариф, соответствующий одному документу в отдельности – 6 960 * 4% + 90 = 368,40 – как раз 184,20 на документ.
Подобная ситуация возможна в случае, когда несколько исполнительных листов в сумме соответствуют одному тарифу, а каждый из них по отдельности – другому.
Подобная ошибка наблюдается в версиях ЗУП 3.1.13.188 и 3.1.13.219.
Как исправить:
Подвох оказался в общем модуле Исполнительный листы - Процедура РассчитатьВознагражденияПлатежныхАгентов.
При определении тарифа разработчики предусмотрели проверку, которая останавливает процедуру поиска, если тариф уже найден:
Если Тариф <> Неопределено Тогда
Продолжить;
КонецЕсли;
Пока Выборка.Следующий() Цикл
Тариф = Новый Структура("Процент, Сумма, МинимальнаяСумма, МаксимальнаяСумма");
ЗаполнитьЗначенияСвойств(Тариф, Выборка);
Если Выборка.СуммаУдержанияОборот <= Выборка.Порог Или Выборка.Порог = 0 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Но в случае, описанном выше – тариф для одного документа не подходит для расчета общих почтовых сборов. Так этот код следует заменить на:
Пока Выборка.Следующий() Цикл
Тариф = Новый Структура("Процент, Сумма, МинимальнаяСумма, МаксимальнаяСумма");
ЗаполнитьЗначенияСвойств(Тариф, Выборка);
Если СуммаУдержанияОборот <= Выборка.Порог Или Выборка.Порог = 0 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Здесь при изменении общей сумме удержания происходит замена тарифа почтового сбора. Это не сильно увеличит время расчета, но позволит сэкономить несколько нервных клеток :).