gifts2017

1001-ый способ без проблем сдать отчет 6-НДФЛ

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

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

Как и многие на предприятиях с большим числом сотрудников, я столкнулся с проблемой корректного заполнения отчетности 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" в процедуре ОбособленноеПодразделениеНачалоВыбораИзСписка после ИначеЕсли найти вызов метода СписокВыбора.Добавить и второй параметр записать как "Выборка.Ссылка.Наименование", как показано на рисунке:

Исправление ошибки

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Вставка в общий модуль ЗаполнениеРегламентрированнойОтчетности.rar
.rar 8,33Kb
01.06.16
32
.rar 8,33Kb 32 Скачать

См. также

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

Комментарии

1. Irina Bondarenko (iris_reda) 06.07.16 04:55
При попытке расшифровать выдает ошибку инициализации

{Отчет.Расшифровка6НДФЛ.МодульОбъекта(94)}: Ошибка при вызове метода контекста (Инициализировать)
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных);
по причине:
Ошибка компоновки данных
по причине:
Ошибка инициализации
по причине:
Не найдено поле замены "ФизЛицо"
2. Анна Кузилина (Anna_Valenty) 21.07.16 09:45
Тоже самое ...
При попытке расшифровать выдает ошибку инициализации

{Отчет.Расшифровка6НДФЛ.МодульОбъекта(94)}: Ошибка при вызове метода контекста (Инициализировать)
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных);
по причине:
Ошибка компоновки данных
по причине:
Ошибка инициализации
по причине:
Не найдено поле замены "ФизЛицо"
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа