Для расчета нам нужны такие значения: ставка ЕСВ с работника, минимальная зарплата, максимальная база налогообложения ЕСВ, ставки НДФЛ (1 и 2 предел), ставка военного сбора.
Из-за особенностей расчета взносов и удержаний НДФЛ было сформулировано три основные формулы в зависимости от размера суммы "на руки".
Напомним еще раз общий принцип расчета ЗП (упрощенный):
Из суммы всех начислений первым делом удерживается единый социальный взнос (ЕСВ). Для оклада в большинстве случаев он равен 3.6% (Примечание. Размеры всех ставок, пределов и т.д. указаны по состоянию на 01.08.14). Максимальный верхний предел ЗП, с которого удерживается ЕСВ = 17 минимальных зарплат (20706 грн на 01.08.14).
После удержания ЕСВ считаем базу для удержания НДФЛ (налог на доходы физлиц). Она равна общей сумме начислений за минусом удержанного ЕСВ. Сумму, меньше чем 10 минимальных зарплат, облагаем по ставке 15%. Все, что выше - по ставке 17%. (10 мин ЗП = 12180 грн. на 01.08.14)
Военный сбор не уменьшает базу НДФЛ и удерживается со всей суммы начислений в размере 1,5%.
Таким образом, у нас возможны три варианта формулы.
Первый вариант - база НДФЛ не превышает 10 минимальных зарплат (12180 грн)
Второй вариант - официальная ЗП не превышает максимальную базу (20706 грн)
Третий вариант - официальная ЗП превышает максимальную базу (20706 грн)
Собственно текст самой функции:
Функция ПосчитатьЗПОтОбратного(СуммаБрутто, БазовыйМесяц) //Ставки налогов по состоянию на 01.08.2014 Мин10 = ПолучитьМинимальнуюЗарплату(БазовыйМесяц)*10; //1218*10 МаксБазаЕСВ = ПолучитьМаксБазу(БазовыйМесяц); //20706 СтавкаЕСВ = ПолучитьСтавкуНалога(БазовыйМесяц,Справочники.Налоги.ЕСВРаботники); //0,036 СтавкаВоенногоСбора = 0.015; СтавкаНДФЛ1Предел = 0.15; СтавкаНДФЛ2Предел = 0.17; //1. БазаНДФЛ до 10Мин, т.е. ЗПГрязная <= 10Мин/(1-СтавкаЕСВ) //2. ЗП < МаксБаза //3. Все остальнон Предел2 = МаксБазаЕСВ*(1-СтавкаЕСВ-СтавкаВоенногоСбора-СтавкаНДФЛ2Предел*(1-СтавкаЕСВ))+(СтавкаНДФЛ2Предел-СтавкаНДФЛ1Предел)*Мин10; Если СуммаБрутто <= Мин10 / (1-СтавкаЕСВ) Тогда ЗП = СуммаБрутто/(1-СтавкаВоенногоСбора-СтавкаНДФЛ1Предел-СтавкаЕСВ*(1-СтавкаНДФЛ1Предел)); ИНачеЕсли СуммаБрутто <= Предел2 Тогда ЗП = (СуммаБрутто-(СтавкаНДФЛ2Предел-СтавкаНДФЛ1Предел)*Мин10)/(1-СтавкаВоенногоСбора-СтавкаЕСВ-СтавкаНДФЛ2Предел*(1-СтавкаЕСВ)); Иначе ЗП = (СуммаБрутто-(СтавкаНДФЛ2Предел-СтавкаНДФЛ1Предел)*Мин10+МаксБазаЕСВ*СтавкаЕСВ*(1-СтавкаНДФЛ2Предел))/(1-СтавкаВоенногоСбора-СтавкаНДФЛ2Предел) КонецЕсли; Возврат ЗП; КонецФункции
В качестве входных параметров указываем сумму, которую сотрудник должен получить на руки (СуммаБрутто) и месяц для расчета ставок, пределов и т.д.
Функции "ПолучитьМинимальнуюЗарплату", "ПолучитьСтавкуНалога" не указываю, так как функция была написана под специализированное решение. Формулы проверены на реальных числах.