Как и многие на предприятиях с большим числом сотрудников, я столкнулся с проблемой корректного заполнения отчетности 6-НДФЛ на базе с конфигурацией УПП 1.3.77.2
Причем в упрощенном порядке учета документов (принимать исчисленный НДФЛ как удержанный), который у нас использовался, абсолютно неправильно заполнялся раздел 2 (о чем и предупреждали пользователей функционала ЗУП-2.5), а переход на стандартный порядок учета оказался невозможен по причине множества косяков в зарплатной части базы: начиная от нарушения порядка документов и пустых полей дат выплаты до более сложных проблем.
Штатные и найденные в сети обработки также не помогли в экспериментах на пробной базе, к примеру, потому, что установлен запрет на перепроведение документов с ручными исправлениями, обнаружились и более странные вещи, вроде отсутствия записей по ставке 35% в табличной части НДФЛ, при их наличии (правильном) в движениях регистра. Имела место также смена кодов ОКТМО обособленных подразделений с ошибочных на правильные, в течение года, но как оказалось позже, это не так страшно.
В конечном счете, число проблем превысило критический уровень, и бухгалтера отказались править базу, да и вообще это не лучшая идея - править документы, по которым уже выплачена зарплата.
В результате, потратив примерно неделю времени, я написал и отладил свой алгоритм заполнения показателей.
Приложенные к статье коды надо использовать следующим образом:
1. В общем модуле "ЗаполнениеРегламентированнойОтчетности" найти и переименовать процедуру "РасчетПоказателей_6НДФЛ_2016Кв1" например в "РасчетПоказателей_6НДФЛ_2016Кв1_стандарт", просто чтобы сохранить её на всякий случай.
2. Вставить прямо за штатной процедурой приведенные в статье коды. С пространством имен они не пересекаются, других процедур общих модулей не вызывают (кроме банальной ОбщегоНазначенияЗК.ПолучитьЗначенияРеквизитов), и никак на повлияют на работу других процедур общего модуля.
3. Собственно на этом можно сохранить конфигурацию, обновить конфигурацию базы данных и проверять, что получилось, заполнив отчет 6НДФЛ за 1-ый или 2-ой квартал.
В нашем случае, это происходит корректно, по мнению бухгалтерии. Хотя бы потому, что начисленный налог идет с оборотом 68.1 - 70 сч., и потому, что даты и суммы в разделе 2 соответствуют требованиям отчетности.
Примечания:
1. Зарплата за 31.12.2015 не попадает в отчет, согласно известному мнению, что это может привести к задвоению декларирования НДФЛ, однако, при желании, коды можно подправить (производить начальный отбор с декабря), и включить это в раздел 2, при этом не включая в суммы раздела 1, как рекомендуется.
2. Процедура расчета может без изменений быть использована для отчета за 2-ой, 3-ий, 4-ый кварталы, так-как, согласно рекомендациям, несмотря на то, что в раздел 1 идут суммы нарастающим итогом, в раздел 2 войдут только начисления, полученные за последние 3 месяца отчетного периода.
3. Каждый вид документа обрабатывается отдельно, и в частности, нет обработчика документа "НачислениеДивидендовОрганизаций", за отсутствием у нас таковых. Остальное общепринятое в начислении доходов, есть.
4. Данные раздела 2 сгруппированы по датам начисления, выплаты и удержания, чтобы не делать его слишком длинным. некоторые группы показателей по дате содержат начисление дохода (графа 130), но удержание налога (140)=0, и это нормально, так по некоторым видам документов (к примеру, разовых начислений), налог может не насчитываться (или насчитываться позже, в начислении зарплаты) по разным причинам, включая действие вычетов.
5. По зарплате на конец периода (например, 31.12.2016), выплаченной в следующем месяце, в разделе 1 налог считается исчисленным, но не удержанным. Впрочем, убрав одно условие по дате, которое нетрудно найти в главной процедуре, по желанию пользователя его всегда можно перевести в удержанные. В разделе 2 зарплата, начисленная в конце периода всегда отображается.
6. В коды включен ряд сообщений и процедур для проверки, которые закомментарены, и нужны только для отладки конкретной базы. Во вставке есть также отчет по разделу 2 (со ссылками на документы), который не вызывается, но в принципе, может пригодиться. Макет к нему прилагается в виде .mxl
Коды не содержат длинных запросов и легко поддаются отладке и модификации. При желании, можно использовать как движения регистров, так и данные конкретных проведенных документов.
Если у пользователя в базе косяки, принципиально отличные от наших, он легко может использовать набор представленных функций и процедур, как детский конструктор для своего варианта расчета.
Фрагмент прилагаемых кодов - часть основной процедуры заполнения:
//--------------------------------- замена штатной процедуры расчета ----------------------------------
Процедура РасчетПоказателей_6НДФЛ_2016Кв1(НачалоПериода, ОкончаниеПериода, Организация, ОбособленноеПодразделение, ОписаниеТаблиц, ПодробныеДанные = Ложь)
Перем ТЗДок, стр1, стр2, ТЗ1, ТЗ2, числоФизлиц, СуммаНачисления, СуммаВычетов, СуммаНалога;
Если ОбособленноеПодразделение <> Справочники.ПодразделенияОрганизаций.ПустаяСсылка() Тогда
КодОКТМО = ОбособленноеПодразделение.КодПоОКТМО;
Иначе
КодОКТМО = "";
КонецЕсли;
//ПоказатьДокументыНалогаПоПодразделению(ОбособленноеПодразделение, НачалоПериода, ОкончаниеПериода);
ТЗ1 = новый ТаблицаЗначений();
ТЗ1.Колонки.Добавить("Ссылка");
ТЗ1.Колонки.Добавить("Физлицо");
ТЗ1.Колонки.Добавить("СуммаДохода");
ТЗ1.Колонки.Добавить("СуммаВычета");
ТЗ1.Колонки.Добавить("СуммаНалога");
ТЗ1.Колонки.Добавить("ДатаНачисления");
ТЗ1.Колонки.Добавить("ДатаВыплаты");
ТЗ1.Колонки.Добавить("ДатаУдержания");
ТЗ1.Колонки.Добавить("Ставка");
ТЗДок = ПолучитьСписокДокументовДляНДФЛ(ДобавитьМесяц(НачалоПериода,-1), ОкончаниеПериода, Организация);
// Отбор по обособленному - далее, в больничном, отпуске на вкладке НДФЛ, в запрплате на основной вкладке
ТЗ4 = ВыбратьДокументыПоРегиструДоходов(НачалоПериода, ОкончаниеПериода, Организация, ОбособленноеПодразделение);
ТЗ4.Свернуть("Регистратор");
// Это очень важно! Есть документы зарплат без начислений, но с НДФЛ
ДобратьДокументыПоРегиструНалога(ТЗ4, НачалоПериода, ОкончаниеПериода, Организация, ОбособленноеПодразделение);
ТЗ4.Свернуть("Регистратор");
Для каждого стр2 из ТЗ4 цикл // Вариант выбора из ТЗДок или ТЗ4 (регистры)
дата1 = стр2.Регистратор.Дата;
док1 = стр2.Регистратор;
Если ТипЗнч(док1) = ТипЗнч(Документы.НачислениеЗарплатыРаботникамОрганизаций.ПустаяСсылка()) Тогда
ВыбратьДанныеПоЗарплатеНДФЛ(док1, КодОКТМО, ТЗ1);
ИначеЕсли ТипЗнч(док1) = ТипЗнч(Документы.НачислениеПоБольничномуЛисту.ПустаяСсылка()) Тогда
ВыбратьДанныеПоБольничномуНДФЛ(док1, КодОКТМО, ТЗ1);
ИначеЕсли ТипЗнч(док1) = ТипЗнч(Документы.НачислениеОтпускаРаботникамОрганизаций.ПустаяСсылка()) Тогда
ВыбратьДанныеПоОтпускуНДФЛ(док1, КодОКТМО, ТЗ1);
ИначеЕсли ТипЗнч(док1) = ТипЗнч(Документы.РегистрацияРазовыхНачисленийРаботниковОрганизаций.ПустаяСсылка()) Тогда
ВыбратьДанныеПоРазовымНДФЛ(док1, КодОКТМО, ТЗ1);
ИначеЕсли ТипЗнч(док1) = ТипЗнч(Документы.ОплатаПраздничныхИВыходныхДнейОрганизаций.ПустаяСсылка()) Тогда
ВыбратьДанныеПоОплатеПраздничныхНДФЛ(док1, КодОКТМО, ТЗ1);
ИначеЕсли ТипЗнч(док1) = ТипЗнч(Документы.РасчетПриУвольненииРаботникаОрганизаций.ПустаяСсылка()) Тогда
ВыбратьДанныеПоРасчетПриУвольненииНДФЛ(док1, КодОКТМО, ТЗ1);
ИначеЕсли ТипЗнч(док1) = ТипЗнч(Документы.ОплатаПоСреднемуЗаработку.ПустаяСсылка()) Тогда
ВыбратьДанныеПоОплатеПоСреднемуНДФЛ(док1, КодОКТМО, ТЗ1);
ИначеЕсли ТипЗнч(док1) = ТипЗнч(Документы.РегистрацияПростоевРаботниковОрганизаций.ПустаяСсылка()) Тогда
ВыбратьДанныеПоРегистрацияПростоевНДФЛ(док1, КодОКТМО, ТЗ1);
ИначеЕсли ТипЗнч(док1) = ТипЗнч(Документы.ОплатаСверхурочныхЧасов.ПустаяСсылка()) Тогда
ВыбратьДанныеПоОплатеСверхурочныхНДФЛ(док1, КодОКТМО, ТЗ1);
Иначе
Сообщить("Нет обработчика документов типа "+док1);
КонецЕсли;
КонецЦикла;
//Проверки
//НайтиДокументыВнеСписка(ТЗ1, НачалоПериода, ОкончаниеПериода, Организация, ОбособленноеПодразделение);
//ВывестиОтчетПоДокументамРаздела2(ТЗ1, НачалоПериода, ОкончаниеПериода);
....
стр2.П000020013001 = стр1.СуммаДохода; // Сумма фактически полученного дохода
стр2.П000020014001 = стр1.СуммаНалога; // Сумма удержанного налога
КонецЕсли;
КонецЦикла;
КонецЕсли;
Сообщить("Число физлиц "+строка(числоФизлиц));
Сообщить("Сумма дохода "+строка(суммаНачисления));
Сообщить("Сумма вычетов "+строка(суммаВычетов));
Сообщить("Сумма налога "+строка(суммаНалога));
КонецПроцедуры
// ibs конец вставки ==================================================================================
И последнее: форма отчета 6-НДФЛ в последнем релизе УПП 1.3.77.2 содержит ошибку, возникающую при выборе значения в поле подразделения. Для её исправления надо в отчете "РегламентированныйОтчет6НДФЛ" в модуле формы "ФормаОтчета2016кв1" в процедуре ОбособленноеПодразделениеНачалоВыбораИзСписка после ИначеЕсли найти вызов метода СписокВыбора.Добавить и второй параметр записать как "Выборка.Ссылка.Наименование", как показано на рисунке: