Исправление ошибки вычисления суммы удержанного НДФЛ в ЗиК 320-322


При заполнении таблицы ДоходыВычетыНалогиСотрудников в функции глобального модуля глСобратьДанныеДляНДФЛ2011() есть ошибка при вычислении колонки "НУ1" (суммы удержанного НДФЛ для целей налогового учёта).
Данная статься посвящена её исправлению.

Иллюстрация ошибки:

Допустим, сотрудник принят на работу в январе 2012 года. Согласно иллюстрации (Журнал) за январь НДФЛ исчисленный = 283 руб, НДФЛ удержанный = 0 руб. В феврале произошла выплата з/п за январь, и была начислена з/п за февраль. Мы видим, что за февраль  НДФЛ исчисленный = 494 руб, НДФЛ удержанный = 777 руб.

А что же нам возвращает глСобратьДанныеДляНДФЛ2011()? Результат мы видим в иллюстрации (ТаблицаНалогов), и в строке за февраль чудесным образом оказывается сумма 1060 руб., вместо правильных 777 руб.

Чем это нам грозит?

Во-первых, эта ошибка будет являтся причиной неправльного распределения сумм перечисленного НДФЛ в документе «Перечисление НДФЛ в бюджет РФ» по методу «по удержанному».

Во-вторых, это явится причиной неправльного формирования справок 2-НДФЛ, если сотрудник, например, в марте 2012 года будет переведён в подразделение с другим ОКАТО/КПП (в итоге по одной справке будет НДФЛ излишне удержанный, по другой — недоудержанный).

Как исправить?

Идём в функцию глСобратьДанныеДляНДФЛ2011(), почти в конец, и наблюдаем такой кусок кода:

        Налог13уВсего = ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(НомерСтрокиСотрудника+12,10);

        Для Сч = 1 По 12 Цикл

            СтрокаМесяца=НомерСтрокиСотрудника+Сч;

            Налог13и = ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаМесяца,4);
           
Налог13у = ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаМесяца,10);
            Если
Сч>1 Тогда
               
Налог13и = Макс(0,Налог13и ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаМесяца1,4));
               
Налог13у = Макс(0,Налог13у ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаМесяца1,10));
            КонецЕсли;

            Налог13у = Макс(Налог13и,Налог13у); // учтем ситуацию, когда в месяце удержали больше чем начислили
           
Налог13у = Мин(Налог13у,Налог13уВсего);
           
Налог13уВсего = Налог13уВсего Налог13у;

            Если Сч>1 Тогда
               
Налог13у = Налог13у + ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаМесяца1,«НУ1»);
            КонецЕсли;

            ДоходыВычетыНалогиСотрудников.УстановитьЗначение(СтрокаМесяца,«НУ1»,Налог13у);

        КонецЦикла;

 

Смешивать при суммировании нарастающим итогом суммы НДФЛ удержанного и исчисленного плохая идея, не правда ли? Но и превышение суммы исчисленного НДФЛ над суммой удержанного НДФЛ тоже надо учесть. Как же сделать правильно? Ну, например, я предлагаю так:

        Налог13уВсего = ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(НомерСтрокиСотрудника+12,10);

        Налог13у_пред=0;

        Для Сч = 1 По 12 Цикл

            СтрокаМесяца=НомерСтрокиСотрудника+Сч;

            Налог13и_нараст = ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаМесяца,4);
           
Налог13у_нараст = ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаМесяца,10);

            Если Сч>1 Тогда
               
Налог13у_тек = Макс(0,Налог13у_нараст ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаМесяца1,10));
            Иначе
               
Налог13у_тек=Налог13у_нараст;
            КонецЕсли;

            Налог13у_тек = Мин(Налог13у_тек,Налог13уВсего);
           
Налог13уВсего = Налог13уВсего Налог13у_тек;

            Если Сч>1 Тогда
               
Налог13у_тек = Налог13у_тек + Налог13у_пред;
            КонецЕсли;
           
Налог13у_пред=Налог13у_тек;
           
Налог13у_тек = Макс(Налог13и_нараст,Налог13у_тек); // учтем ситуацию, когда в месяце удержали больше чем начислили

            ДоходыВычетыНалогиСотрудников.УстановитьЗначение(СтрокаМесяца,«НУ1»,Налог13у_тек);

        КонецЦикла;

 P.S.  Для тех, кто боится «промахнуться», прилагаю текстовый файл с полным содержимым исправленной функции глобального модуля глСобратьДанныеДляНДФЛ2011().  Для установки идём на начало функции глСобратьДанныеДляНДФЛ2011(), переименовываем её в глСобратьДанныеДляНДФЛ2011_старая(), а всё содержимое прилагаемого текстового файла копируем перед строчкой глСобратьДанныеДляНДФЛ2011_старая(), и всё, сохраняем конфигурацию

Внимание! Перед внесением изменений в конфигурацию крайне настоятельно рекомендую делать бэкап.

32 Comments

  1. leosoft

    Спасибо за информацию — будем смотреть!

    Reply
  2. TrinitronOTV

    спасибо за эту информацию

    Reply
  3. rom-x

    информация пригодилась, за нее спасибо!

    Reply
  4. infostar81

    Спасибо! Столкнулись с этой ошибкой.

    Reply
  5. OleGazz

    огромнейшее спасибо за статью, но я надеюсь 1с сама должна это исправить в последующих релизах….

    Reply
  6. andrewks

    (5) в последнее время 1с не балует вниманием 7-ку, заметьте, очень многий функционал для учёта изменений в законодательстве реализуется в сильно урезанном, по сравнению с ЗУПом, виде.

    да и ошибка довольно специфическая, многих она просто не затрагивает. посмотрим, время покажет

    Reply
  7. NPMar

    Ничего себе! Не сталкивалась с такой ошибкой. Большое спасибо автору! Тем более, что не обязательно скачивать файл, вернее иметь один балл для его скачивания. Обязательно + !

    Reply
  8. 2011b11

    Спасибо автору за подробное описание проблемы и решение этой проблемы, очень понятно написано, даже мне не программисту, а простому бухгалтеру немного разбирающемуся в конфигурации, ещё раз большое спасибо и + Вам большой.

    Reply
  9. kazna2011

    RE:

    При заполнении таблицы ДоходыВычетыНалогиСотрудников в функции глобального модуля глСобратьДанныеДляНДФЛ2011() есть ошибка при вычислении колонки «НУ1» (суммы удержанного НДФЛ для целей налогового учёта).

    Данная статься посвящена её исправлению.

    Спасибо за инфу!

    Reply
  10. Pin

    Да, ну вы даете. Всех делов-то:

    //Налог13уВсего = ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(НомерСтрокиСотрудника+12,10);

    Для Сч = 1 По 12 Цикл

    СтрокаМесяца=НомерСтрокиСотрудника+Сч;

    Налог13и = ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаМесяца,21);

    Налог13у = ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаМесяца,10);

    ДоходыВычетыНалогиСотрудников.УстановитьЗначение(СтрокаМесяца,«НУ1»,Мин(Налог13у,Налог13и));

    КонецЦикла;

    И заметьте, приведенный в самой публикации вариант не будет работать для случаев, когда налог исчисленный уменьшался задним числом — добавили вычет и т.п., т.к. налог исчисленный в 4-й колонке берется из журнала расчетов. Да и в самом регистре НДФЛ налог исчисленный берется не из 4-й колонки. Приведенный же вариант в указанных случаях работает.

    И дополнение в раздел «Чем это нам грозит»: грозит тем, что в некоторых месяцах в отчетах по НДФЛ удержанный налог окажется больше исчисленного.

    Reply
  11. andrewks

    (10) «грозит тем, что в некоторых месяцах в отчетах по НДФЛ удержанный налог окажется больше исчисленного. »

    в каких именно? ты невнимательно изучил код от 1С, он к концу прохода выравнивает суммы.

    насчёт 21-й колонки — во-первых, это не ко мне, 4-ю колонку использует в своём алгоритме 1С, я лишь исправил их алгоритм от ошибок. ты же (это во-вторых) предлагаешь изменить методологию расчёта колонки НУ1. и, в-третьих, с чего должна изменяться сумма удержанного НДФЛ при изменении налога исчисленного задним числом?

    Reply
  12. andrewks

    и, кстати, по поводу возможности использования 21-й колонки — я уже пробовал её использовать в своей разработке Распределение и контроль НДФЛ вместо 4-й, ничего не вышло, ибо в некоторых ситуациях сумма рассчитывалась неверно. если вспомню, в каких именно ситуациях, сообщу дополнительно

    Reply
  13. andrewks

    (10) а с переходящими отпусками тут будет вообще полный швах

    Reply
  14. Pin

    (11) Прежде чем спорить, хотелось бы понять о чем.

    Я себе так понимаю задачу, которую 1С ставили перед собой в описываемом случае:

    такой подход основывается на положениях НК РФ и подтверждается письмом ФНС от 19 октября 2011 г. N ЕД-3-3/3432@, в котором сказано: «… ежемесячное перечисление в бюджет суммы, превышающей сумму фактически удержанного из доходов физических лиц налога на доходы физических лиц, не является налогом. В таком случае налоговому агенту следует обратиться в налоговый орган с заявлением о возврате на расчетный счет организации суммы, не являющейся налогом на доходы физических лиц и ошибочно перечисленной в бюджетную систему Российской Федерации.»

    Отсюда, по-моему, и желание 1С «причесать» налоговый регистр так, чтобы ни в одном из месяцев удержанный налог не превышал исчисленный на данный момент, т.е. чтобы общая сумма удержанного налога (нар. итог до тек. месяца) не превышала сумму налога исчисленного, т.к. все что еще не начислено, то и не налог вовсе (с ПФР по этому поводу давно уже не спорим, так чего ж тут-то?)!

    В связи с вышеизложенным, никакой попытки «изменить методологию расчёта» за собой не вижу, а лишь решаю задачу, поставленную тем, кто её нормально решить так и не смог. Многочисленные тесты показывают, что приведенное мною здесь решение работает. Вы бы попробовали, прежде чем ругаться-то? Ведь и в Вашем примере мое решение в феврале дает 777 руб. налога удержанного.

    «С чего должна изменяться сумма удержанного НДФЛ при изменении налога исчисленного задним числом?» Не должна. Но может. И Вам объяснили из-за чего.

    А по поводу использования 21 колонки — да, действительно, при распределении уплат её использовать нельзя, т.к. вы распределяете уплаты, которые, как почему-то считают в 1С, фактически производили из итоговой суммы 4-й колонки ежемесячно (на самом деле и это не так, но это тема не этого спора). А вот при заполнении регистра НДФЛ используется 21-я, т.к. только она учитывает все изменения исчисленного налога (содержит в себе актуальное значение, в отличии от 4-й и 7-й). Не путайте пож-та себя и других.

    И определитесь уже в с предметом спора.

    «а с переходящими отпусками тут будет вообще полный швах » как было так и останется. А то что швах, не спорю. Но это вопрос религии. Верите метод. отделу 1С — получите «швах». Но вам же никто не мешает и другой подход применить. Такой, к примеру.

    Кстати, и сама 1С не настаивает на учете отпусков по периоду действия. И всех-то делов 0(ноль) на О(буква О) поменять. Но это уже совсем другая история…

    Reply
  15. Pin

    (12) Можете не утруждаться. Я прекрасно знаю в каких ситуациях у Вас были связанные с этим ошибки. И с чем они связаны тоже.

    Для себя же можете повозиться с этим, чтобы уяснить, наконец, разницу между 4-й и 21-й колонками.

    Reply
  16. andrewks

    (14) уважаемый, я, по-моему, не давал повода обращаться ко мне в таком тоне. и ругаться я нигде не ругался, не надо мне приписывать того, чего нет.

    я просто справедливо указал на то, что ваше решение описанной ошибки является отходом от методологии формирования колонки «НУ1», принятой у 1С, что можно увидеть на примерах:

    1. сотрудник только устроился на работу в текущем году

    2. сотрудник отправлен в отпуск, приходящийся полностью или частично на месяца, отличные от месяца начисления

    3. возможно, в каких-то ещё ситуациях, не было времени и желания изучать более подробно

    в итоге картина может быть весьма плачевной, например, в документе Распределения перечисленного НДФЛ по методу «по удержанному» будет распределено по сотруднику (в ситуациях 1 и 2) меньше, чем с него было реально удержано, или вообще ничего на него не распределено.

    моё решение — это именно исправление ошибки, без изменения методологии формирования колонки «НУ1».

    и не надо считать себя умнее всех, все мы люди, и каждый имеет своё мнение. если кто-то решает использовать методологию по отпускным, отличную от принятой по умолчанию в 1С — пожалуйста, на это, как вы абсолютно справедливо заметили, существуют соответствующие разработки.

    Reply
  17. Pin

    (16)

    в итоге картина может быть весьма плачевной, например, в документе Распределения перечисленного НДФЛ по методу «по удержанному» будет распределено по сотруднику (в ситуациях 1 и 2) меньше, чем с него было реально удержано, или вообще ничего на него не распределено.

    Неправда ваша. В указанных Вами случаях, уж не знаю что Вы понимаете под «распределено», но удержано в регистрах НДФЛ у меня столько же сколько и начислено (за исключением приема на работу — там во 2-м месяце удерживается за 1-й и 2-й, если выплат в 1-м месяце не было), а это как Вы знаете и есть «НУ1«. Что при этом может «не распределиться» ведомо только Вам. Я Вашим распределением не пользуюсь. При используемых мною способах распределения все распределяется правильно.

    «вообще ничего на него не распределено» может быть только в одном случае — в месяце сотруднику либо ничего не начислено, либо не удержано.

    Откуда проистекают Ваши заблуждения я вообще понять не могу. Очевидно, Вы не попробовали то, что Вам предложили, прежде чем предполагать что это «не работает», и тем более как это «не работает».

    Reply
  18. Pin

    Протестировав Ваш алгоритм на случайных наборах входных данных пришла к выводу, что он может быть записан как:

    //Налог13уВсего = ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(НомерСтрокиСотрудника+12,10);

    Для Сч = 1 По 12 Цикл

    СтрокаМесяца=НомерСтрокиСотрудника+Сч;

    Налог13и = ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаМесяца,4);

    Налог13у = ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаМесяца,10);

    ДоходыВычетыНалогиСотрудников.УстановитьЗначение(СтрокаМесяца,«НУ1»,Макс(Налог13у,Налог13и));

    КонецЦикла;

    Вот Вам xls-Файл для тестирования. Понажимайте F9, чтобы убедиться.

    Reply
  19. andrewks

    (17) я весьма даже попробовал, я даже накатил ваш «патч» на тестовую базу на 100 сотров, и сразу выявил описываемую картину.

    т.е. человек, например, принят на работу в феврале, НДФЛ исчисл = 1300, НДФЛ удерж = 0, формируя документ распределения уплаты по методу «по удержанному» (хоть по штатному и глючному 1с-овскому алгоритму, хоть по улучшенному моему) за период февраль месяц, получаем гольный ноль, хотя зарплата, естественно, выплачена 14го марта, и НДФЛ, как положено, перечислен 14-го марта. примерно то же самое и в случае с отпуском, но там не ноль, а просто сумма меньше, чем надо. в итоге НДФЛ, удержанный и перечисленный с отпускных дяди Пети, «размазывается» по всем сотрам, по дяде Пете недоплата, по остальным переплаты.

    так что предлагаю Вам самому попробовать ваш «патч» в действии на реальных базах, вместо того, чтобы удивляться, что и откуда у меня проистекает.

    я обе своих разработки (эту и по распределению) опробовал на 7 юриках с общей численностью народа более 300 чел, с разными хитрыми ситуациями типа переходящих отпусков и больничных, принятий на работу в декабре, перемещений сотрудников между подразделениями с разными ОКАТО, неполных и излишних перечислений НДФЛ, и т.д. всё причёсано и отлажено, сдана и корректно принята годовая отчётность

    Reply
  20. andrewks

    (17) прошу прощения, что обращался как к особе мужского пола, только сейчас посмотрел Вашу личку

    Reply
  21. andrewks

    (18) весьма сомнительно, могут быть нюансы. но в понедельник погоняю на тестовой базе, отпишусь

    Reply
  22. Pin

    (19) Я правильно понимаю, что в Вашем примере перечисляют НДФЛ в бюджет по исчисленному, а распределяют по удержанному?

    «формируя документ распределения уплаты по методу «по удержанному» (хоть по штатному и глючному 1с-овскому алгоритму, хоть по улучшенному моему) за период февраль месяц, получаем гольный ноль, хотя зарплата, естественно, выплачена 14го марта».

    Это как раз тот пример о котором я устала уже повторять. Если вы за принятого в феврале сотрудника перечислили 14 марта 1300 руб., то на каком основании вы сумму, перечисленную 14 марта, распределяете по сотрудникам «по удержанному»?

    Если Вы так так хорошо понимаете логику 1С, то должны бы уяснить, что порядок распределения в Вашем примере:

    -«по исчисленному», если вы 14 марта перечислили за принятого на работу 1300 руб., т.к. эти 1300 руб. вы взяли из НДФЛ исч.

    -«по удержанному», если вы 14 марта перечислили за принятого на работу 0 руб., т.к. НДФЛ уд =0.

    На мой взгляд, совершенно логично при распределении «по удержанному» за февраль получить «голый ноль», т.к. НДФЛ удерж в феврале «голый ноль» по рассматриваемому сотруднику.

    Объясните мне зачем распределять «по удержанному» налог, собранный по НДФЛ исчисл, где, кстати, могли сидеть и отрицательные суммы (еще один источник расхождений при последующем распределении «по удержанному»)?

    И еще вопрос. «я даже накатил ваш «патч» … выявил описываемую картину». А в регистре НДФЛ за период март месяц, какую сумму НДФЛ удержанного Вы получили по принятому сотруднику?

    Reply
  23. andrewks

    (18) погонял на тестовой базе. результат отработки данного алгоритма совпадает с моим почти во всех случаях, но не во всех. в одном случае картина получается разная: когда в текущем месяце сумма исчисленного НДФЛ отрицательная. в этом случае мой алгоритм даёт сумму НДФЛ уд. по этому сотруднику = 0, и сумма НДФЛ уд. выравнивается в след.месяце, где НДФЛ исчисл. >0. ваш — даёт сразу в этом месяце минусовой НДФЛ уд., что, в общем-то, неверно, ибо если сотрудник продолжает работать, и по нему «текут» суммы НДФЛ исч. и уд, то тогда вопросов нет, всё в итоге складывается корректно, а вот если сотрудник уволен (и минус получился в последний отработанный месяц), или минус пришёлся на декабрь — тут нарушается порядок возврата сотруднику излишне удержанного НДФЛ. т.е. цифры-то красивые получаются, а порядок возврата нарушен.

    Reply
  24. Pin
    Reply
  25. rdv

    всем привет, кто нибудь смотрел 323 релиз, как там. иправлена данная ошибка ?

    Reply
  26. andrewks

    (25) нет

    Reply
  27. andrewks

    (24) «Мне вообще не понятен теперь смысл появления колонки НУ1 у 1С» в ЗиК столько тёмных пятен, что иногда аж страшно становится — что и откуда берётся 🙂

    поэтому я и не склоняюсь к изменению штатного поведения — непонятно потом, где и что боком вылезет

    Reply
  28. rdv

    (27) То, что иногда страшно становиться, то это точно, 5 юрлиц, три на упрощенке с льготами, плюс иносранцы 🙂

    Reply
  29. Pin

    (25) В затрагиваемых местах тексты модулей не поменялись.

    (27) А пока что штатное поведение «боком вылазит»

    Reply
  30. rdv

    (29) Отлично просто, пока бухи не жалуются, менять ничего ну буду )

    Reply
  31. EgorGGG

    Конфигурацию придется снимать с поддержки ведь так?

    Reply
  32. andrewks

    (31) в 7-ке нет такого понятия. просто, если конфа в остальном типовая, после обновления данный «патч» нужно будет накатить заново

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *