В продолжение темы от
Заказчик утверждает, что при расчете НДФЛ в случае, если начисленная зарплата превышает макимальную сумму, которая может облагаться ЕСВ (на 01.01.2011 это 14115.00 грн), то в таком случае суммой, которая облагается НДФЛ по ставке 17% должна быть сумма превышения за вычетом разницы между максимальной суммой обложения ЕСВ и пределом НДФЛ, умноженной на ставку налога ЕСВ.
По-моему, как-то сумбурно объяснил, лучше поясню на примере (пример выдан заказчиком).
Максимальная сумма для обложения ЕСВ = 14115.00 грн
Предел НДФЛ = 9410.00 грн
Начислено сотруднику = 28950.00 грн
Считаем:
1. 9410.00 - (9410.00 * 3,6%) = 9071.24
2. 28950.00 - 9410.00 = 19540.00
3. 19540.00 - [(14115.00 - 9410.00) * 3,6%] = 19370.62
4. (9071.24 * 15%) + (19370.62 * 17%) = 4653.70 - это сумма подоходного налога.
Для реализации вышесказанного пришлось маленько дописать код, который предложил kompas-dm
// определим максимальную базу, с которой удерживается ЕСВ
НалогЕСВ = СоздатьОбъект("Справочник.НалогиОтчисления");
НалогЕСВ.НайтиПоКоду("ЕдиныйВзнос");
Если ПустоеЗначение(НалогЕСВ) = 1 Тогда
ПараметрБазы = НалогЕСВ.Дополнительно.Получить(КонецПериода);
Если Найти(ПараметрБазы,"Макс. база") > 0 Тогда
СимволРавно = Найти(ПараметрБазы,"=");
МаксимальнаяБазаЕСВ = Число(Сред(ПараметрБазы,СимволРавно + 1));
Иначе
МаксимальнаяБазаЕСВ = 999999999999.99;
КонецЕсли;
Иначе
МаксимальнаяБазаЕСВ = 999999999999.99;
КонецЕсли;
// если начисленная ЗП превышает максимум обложения ЕСВ, то считать надо не так (по утверждению заказчика)
// в этом случае ЕСВ должно удерживаться только с разницы между максимальной суммой,
// которая облагается ЕСВ и пределом НДФЛ
НачисленоВсего = ОблагаемаяБаза + Вычеты;
Если (НачисленоВсего <= МаксимальнаяБазаЕСВ) Тогда
// при расчете аванса НачисленоВсего может равняться нулю, следовательно, выскочит
// ошибка "Деление на 0". Предупредим этот нюанс :)
Если НачисленоВсего <> 0 Тогда
ПределНДФЛ = ноНДФЛ.Предел.Получить(КонецПериода);
СуммаВпределе= Мин(НачисленоВсего,ПределНДФЛ);
КоэфЕснВпределе=СуммаВпределе/(НачисленоВсего); // здесь "опасный" участок
КоЭфЕСнЗаПределом =1-КоэфЕснВпределе;
ЕСНвПределе=окр(вычеты* КоэфЕснВпределе,2);
ЕСНзаПределом=вычеты-ЕСНвПределе;
Подоходный15= окр((Мин(НачисленоВсего,ПределНДФЛ)-ЕСНвПределе)*ноНДФЛ.Ставка.Получить(КонецПериода),2);
Подоходный17=окр((Макс(НачисленоВсего-ПределНДФЛ,0)-ЕСНзаПределом)*ноНДФЛ2.Ставка.Получить(КонецПериода),2);
Подоходный=Подоходный15+Подоходный17;
КонецЕсли;
Иначе
// получим пределы и ставки
ПределНДФЛ = ноНДФЛ.Предел.Получить(КонецПериода);
Ставка15 = ноНДФЛ.Ставка.Получить(КонецПериода);
Ставка17 = ноНДФЛ2.Ставка.Получить(КонецПериода);
СтавкаЕСВ = ноЕСВСотр.Ставка.Получить(КонецПериода);
// начинаем считать
База15 = ПределНДФЛ - (ПределНДФЛ * СтавкаЕСВ);
База15 = Окр(База15,2);
СуммаПревышения = НачисленоВсего - ПределНДФЛ;
База17 = СуммаПревышения - СтавкаЕСВ * (МаксимальнаяБазаЕСВ - ПределНДФЛ);
База17 = Окр(База17,2);
Подоходный15 = Ставка15 * База15;
Подоходный17 = Ставка17 * База17;
Подоходный15 = Окр(Подоходный15,2);
Подоходный17 = Окр(Подоходный17,2);
Подоходный = Подоходный15 + Подоходный17;
КонецЕсли;
Этот код вставляется в документе "Начисление ЗП" в модуле формы документа в процедуре РассчитатьСтроку() вместо вот этого куска:
// с 2011 года по схеме
ПределНДФЛ = ноНДФЛ.Предел.Получить(КонецПериода);
Подоходный = Мин(ОблагаемаяБаза,ПределНДФЛ)*ноНДФЛ.Ставка.Получить(КонецПериода) +
Макс(ОблагаемаяБаза-ПределНДФЛ, 0)*ноНДФЛ2.Ставка.Получить(КонецПериода);
PS. Не спрашивайте меня, где это люди такую официальную зарплату получают, самому завидно, блин :)