gifts2017

Для специалиста 1С : Работаем с АшиПками, релиз 281 и 282 1С 7.7 "БухУчет" , Украина, 2011 г. Дополнение.

Опубликовал Damian (Damian) в раздел Программирование - Практика программирования

Выявлена ошибка в расчете НДФЛ.
Она проявляется, когда есть две ставки налогов - 15 и 17 %.

В продолжение темы от kompas-dm (http://infostart.ru/public/81660/) столкнулся с такой бедой:

Заказчик утверждает, что при расчете НДФЛ в случае, если начисленная зарплата превышает макимальную сумму, которая может облагаться ЕСВ (на 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. Не спрашивайте меня, где это люди такую официальную зарплату получают, самому завидно, блин :)

 


См. также

Подписаться Добавить вознаграждение

Комментарии

1. buhkiller (buhkiller@mail.ru) 24.02.11 23:35
:D Таких больших белых зп две сотни на всю страну.
2. script Мальчинко (script) 25.02.11 01:18
Такие ЗП получают гос. служащие на гос. предприятиях.
Я не шучу - отвечаю за свои слова. Имею клииентов - гос. предприятия. ЗП в 26 000 для глав. буха нормальное дело.
Правда человек на одном месте должен отсидеть более 10 лет.

По-поводу расчета все верно. Это правильный алгоритм, который 1С почему то упорно игнорирует.
Правда для этого есть основания, но это тема отдельного разговора.
И это еще не все ошибки.... в новых релизах в ЗП. Добавьте в поле Мат помощь ВР суммы, проведите документ, посмотрите проводки по 651 ЕСВ ФОТ и посмотрите Свод отчислений в фонды - будете удивлены.
3. Дмитрий Литовченко (kompas-dm) 25.02.11 09:52
(0)И что ВЫ дополнили .... Эта ошибка выялена ранее здесь
4. Сергей (sipoju) 25.02.11 12:01
Хоть разница между рассчетом в 1С и этим не большая, но переписал под Ваш вариант
Он кстати был описан в одном из выпусков журнала ДТ-КТ с ссылкой на письмо ГНАУ
5. Damian (Damian) 25.02.11 18:22
kompas-dm пишет:
(0)И что ВЫ дополнили .... Эта ошибка выялена ранее здесь

Уважаемый kompas-dm! Я нисколько не претендую на Ваше первенство в этом вопросе. Просто Ваш алгоритм в примере, который был предоставлен заказчиком, терял где-то 3 гривны с копейками. Для бухгалтера это было неприемлимо. Поэтому пришлось доработать.
6. Сергей Ляшенко (Analitik) 02.03.11 13:04
Такой способ расчета явно и однозначно (что подтверждается всеми специалистами, кроме ДПА) противоречит Налоговому кодексу Украины.
Но в любом случае проблема решается установкой Предела = не 9410.00, а 9410.00 - (9410.00 * 3,6%) и все!!!
Тем более, что это полностью соответствует параноидальным рекомендациям ДПА для параноидальных бухгалтеров (т.е. берем по максимуму, если же конечно у Вас в штате нет специальных категорий работников)
7. Damian (Damian) 03.03.11 23:00
Вскрылась незначительная, но неприятная ошибка в алгоритме, когда сумма начислений не превышает максимальную базу, облагаемую ЕСВ при начислении аванса:
- если человеку не начисляется аванс (нет суммы), то при попытке вычислить КоэфЕснВпределе=СуммаВпределе/(ОблагаемаяБаза+вычеты) возникает ошибка "Деление на 0". Решается установкой дополнительной проверки равенства нулю на весь блок кода.
Общий код, приведенный в публикации, поправил.
8. Алекс Печер (Боромир) 05.03.11 23:43
И это еще не все...
Не учтено, если в сумму начислений входят Больничные с предприятия и Больничный Соцстраха...
там отнимать 2% ЕСВ. :)
P.S. - Еще учесть Договора ГПХ
9. Сергей Ляшенко (Analitik) 06.03.11 11:20
Боромир! Да тут и учитывать ничего из предложенного Вами не нужно и алгоритмы строить тоже.
Если рассчитывать не в соответствии с Налоговым кодексом, а в соответствии с ДПА, то еще небольшое увеличение налога и то в очень и без того редих случаях (по сравнению с предложенным мною вариантом), не будет являться нарушением.
Договора ГПХ в Бухгалтерии вообще не предусмотрены (кстати единый с договоров не приводит к уменьшению базы НДФЛ и этот алгоритм именно поэтому будет их рассчитывать неправильно).
В любом случае сотрудник имеет право в конце года пересчитать налоги (если ему очень нужны будут эти пару гривень :))
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа