gifts2017

6-НДФЛ из ЗУП 2.5 без проблем. Специальная обработка проведения документов. Методика

Опубликовал Сергей Власкин (vlaskin) в раздел Обработки - Обработка документов

Сдача 6-НДФЛ из ЗУП 2.5 с минимальными временными затратами. Специальная обработка проведения документов.

Все, кто пытался сформировать отчет 6-НДФЛ сталкивался с трудностями, возникающими в ЗУП 2.5 со снятой галкой в учетной политике "При начислении НДФЛ принимать удержанный как исчисленный":

  • Запрет на перепроведение выплат сотрудникам, если позже уже есть выплаты. Например нашли ошибку: не верно стоит дата получения дохода в отпуске или больничном, после исправления на верную нужно провести выплаты, что не представляется возможным.
  • При проведении выплаты межрасчетных начислений НДФЛ зачастую удерживается не этой выплаты, а с предыдущей. Например если человек уходит в отпуск в начале месяца и получет отпускные до зарплаты за предудущий месяц, то программа удерживает НДФЛ не с отпускных а с невыплаченной зарплаты, и 6-НДФЛ заполняется при этом не корректно.

Получается что 6-НДФЛ не получается сформировать в ЗУП 2.5 в общем случае без привлечения программистов.

Для решения указанных проблем предлагается следующая методика формирования отчета.

Во вложении обработка проведения документов, которую можно открыть в 1С ЗУП 2.5 через меню Файл-Открыть (или зарегистрировать во внешних обработках). Суть обработки в том, чтобы перепроводить документы не в хронологическом порядке:

  • Распроводятся документы по организации за указанный период. Для корректной работы обработки необходимо указывать период от начала квартала до последнего документа введенного в базу.
  • Проводятся сначала документы созданные в первом месяца квартала, но относящиеся к предудущему расчетному периоду в хронологической последовательности. Например выплаты за прошлый месяц.
  • Проводятся документы созданные в первом месяце квартала и относящиеся к расчетному периоду этого же месяца  в хронологической последовательности
  • Проводятся документы созданные в первом месяце квартала и относящиеся к расчетному периоду следующего месяца (если такие имеются)  в хронологической последовательности
  • Далее  второй месяц квартала, и так далее

Для такого метода существует требование, чтобы начиления были раньше выплат. Например если отпуск выплачивается 22.06, то дата документа начисления отпуска была 21.06, если выплата расчетных человеку при увольнении 22.06, то документ начисления зарплаты по нему, в котором расчитывается НДФЛ, был проведен 21.06, не смотря на то что программа предлагает провести его в конце месяца.

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

  • Снять с полной поддержки и сделать возможноть добавления новых объектов.
  • В параметры сеанса добавить НеПроверятьХронологиюУчетаУдержанногоНДФЛ тип Булево.
  • Включить редактирование Общих модулей:
    • ЗарплатаКВыплатеОрганизацийПереопределяемый
    • ПроведениеРасчетов
    • СтандартныеПодсистемыСервер
  • Внести изменения в модуль ЗарплатаКВыплатеОрганизацийПереопределяемый
Процедура ПровестиВзаиморасчеты(Документ, Отказ, Заголовок, РегистрироватьТолькоНДФЛ = Ложь) Экспорт
	
	Если Не РегистрироватьТолькоНДФЛ Тогда
		
		ПроведениеРасчетов.ПроверитьХронологиюУчетаУдержанногоНДФЛ(Документ.Организация, Документ.Зарплата.ВыгрузитьКолонку("ФизЛицо"), Документ.Дата, Отказ, Заголовок);
		Если Отказ Тогда
			Возврат
		КонецЕсли;
		
		Для Каждого СтрокаЗарплаты Из Документ.Зарплата Цикл
				
			СтрокаДвижения = Документ.Движения.ВзаиморасчетыСРаботникамиОрганизаций.ДобавитьРасход();
			
			СтрокаДвижения.Период       		= Документ.Дата;
			
			СтрокаДвижения.Организация			= Документ.Организация;
			СтрокаДвижения.Физлицо		 		= СтрокаЗарплаты.Физлицо;
			СтрокаДвижения.ПериодВзаиморасчетов	= Документ.ПериодРегистрации;
			
			СтрокаДвижения.СуммаВзаиморасчетов	= СтрокаЗарплаты.Сумма;
			
			СтрокаДвижения.ХарактерВыплаты		= Документ.ХарактерВыплаты;
			СтрокаДвижения.Ведомость     		= Документ.Ссылка;
			СтрокаДвижения.СпособВыплаты		= Документ.СпособВыплаты; 
			
			Если Документ.СпособВыплаты = Перечисления.СпособыВыплатыЗарплаты.ЧерезКассу И СтрокаЗарплаты.ВыплаченностьЗарплаты = Перечисления.ВыплаченностьЗарплаты.Задепонировано Тогда
				
				СтрокаДвижения = Документ.Движения.ВзаиморасчетыСДепонентамиОрганизаций.ДобавитьПриход();
				
				СтрокаДвижения.Период				= Документ.Дата;
				
				СтрокаДвижения.Организация			= Документ.Организация;
				СтрокаДвижения.Физлицо		 		= СтрокаЗарплаты.Физлицо;
				СтрокаДвижения.Ведомость			= Документ.Ссылка;
				
				// Ресурсы
				СтрокаДвижения.Сумма				= СтрокаЗарплаты.Сумма + СтрокаЗарплаты.КомпенсацияЗаЗадержкуЗарплаты; 
				
			КонецЕсли;	
			
			СтрокаДвижения = Документ.Движения.СведенияОВыплатахРаботникамОрганизацийПоПлатежнымВедомостям.Добавить();
			
			СтрокаДвижения.ФизЛицо   = СтрокаЗарплаты.ФизЛицо;
			СтрокаДвижения.Ведомость = Документ.Ссылка;

		КонецЦикла;	
		
	КонецЕсли;
	
	// По регистру расчетов с бюджетом по НДФЛ
	ГоловнаяОрганизация = ОбщегоНазначенияЗК.ГоловнаяОрганизация(Документ.Организация);
// сергей (	
	//Если Документ.ХарактерВыплаты = Перечисления.ХарактерВыплатыЗарплаты.Зарплата Тогда
	//	ДатаНДФЛ = Макс(Документ.Дата, КонецМесяца(Документ.ПериодРегистрации));
	//Иначе
	//	ДатаНДФЛ = Документ.Дата;
	//КонецЕсли;
	Если ПараметрыСеанса.НеПроверятьХронологиюУчетаУдержанногоНДФЛ Тогда
        ДатаНДФЛ = Макс(Документ.Дата, КонецМесяца(Документ.ПериодРегистрации));
	Иначе	
		Если Документ.ХарактерВыплаты = Перечисления.ХарактерВыплатыЗарплаты.Зарплата Тогда
			ДатаНДФЛ = Макс(Документ.Дата, КонецМесяца(Документ.ПериодРегистрации));
		Иначе
			ДатаНДФЛ = Документ.Дата;
		КонецЕсли;
	КонецЕсли;	
// сергей )	
	
	СтруктураДокумента = Новый Структура;
	СтруктураДокумента.Вставить("ДатаНДФЛ", КонецДня(ДатаНДФЛ));
	СтруктураДокумента.Вставить("Ссылка", Документ.Ссылка);
	СтруктураДокумента.Вставить("Период", Документ.Дата);
	СтруктураДокумента.Вставить("ОбособленноеПодразделение", Документ.Организация);
	СтруктураДокумента.Вставить("Организация", ГоловнаяОрганизация);
	СтруктураДокумента.Вставить("ХарактерВыплаты", Документ.ХарактерВыплаты);
	
	ТекстТаблицыВыплаты = 
	"ВЫБРАТЬ
	|	ЗарплатаКВыплате.Физлицо КАК ФизЛицо,
	|	СУММА(ЗарплатаКВыплате.Сумма) КАК Сумма
	|ПОМЕСТИТЬ ВТВыплатыФизлицам
	|ИЗ
	|	Документ.ЗарплатаКВыплатеОрганизаций.Зарплата КАК ЗарплатаКВыплате
	|ГДЕ
	|	ЗарплатаКВыплате.Ссылка = &ДокументСсылка
	|	И (ЗарплатаКВыплате.Ссылка.СпособВыплаты = ЗНАЧЕНИЕ(Перечисление.СпособыВыплатыЗарплаты.ЧерезБанк)
	|			ИЛИ ЗарплатаКВыплате.ВыплаченностьЗарплаты = ЗНАЧЕНИЕ(Перечисление.ВыплаченностьЗарплаты.Выплачено)
	|			ИЛИ ЗарплатаКВыплате.ВыплаченностьЗарплаты = ЗНАЧЕНИЕ(Перечисление.ВыплаченностьЗарплаты.Задепонировано))
	|
	|СГРУППИРОВАТЬ ПО
	|	ЗарплатаКВыплате.Физлицо
	|
	|ИМЕЮЩИЕ
	|	СУММА(ЗарплатаКВыплате.Сумма) <> 0
	|
	|ИНДЕКСИРОВАТЬ ПО
	|	ФизЛицо";
	
	ПроведениеРасчетовПереопределяемый.СформироватьРасчетыПоНДФЛПриВыплате(СтруктураДокумента, ТекстТаблицыВыплаты, Документ.Движения.НДФЛРасчетыСБюджетом, Документ.Движения.РасчетыНалоговыхАгентовСБюджетомПоНДФЛ);
	
КонецПроцедуры
  • Внести изменения в модуль ПроведениеРасчетов
Процедура ПроверитьХронологиюУчетаУдержанногоНДФЛ(Организация, Сотрудники, ДатаРегистрации, Отказ, Заголовок) Экспорт
// Сергей (
	Если ПараметрыСеанса.НеПроверятьХронологиюУчетаУдержанногоНДФЛ Тогда
		Возврат;
    КонецЕсли;
// Сергей )
	
	УпрощенныйУчетНДФЛ = ПроцедурыУправленияПерсоналом.ЗначениеУчетнойПолитикиПоПерсоналуОрганизации(глЗначениеПеременной("глУчетнаяПолитикаПоПерсоналуОрганизации"), Организация, "УпрощенныйУчетНДФЛ");
	Если УпрощенныйУчетНДФЛ Тогда
		Возврат
	КонецЕсли;
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("ДатаРегистрации", КонецДня(ДатаРегистрации));
	Запрос.УстановитьПараметр("Сотрудники", Сотрудники);
	Запрос.УстановитьПараметр("ОбособленноеПодразделение", Организация);
	Запрос.УстановитьПараметр("Организация", ОбщегоНазначенияЗК.ГоловнаяОрганизация(Организация));
	Запрос.Текст = 
	"ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	НДФЛРасчетыСБюджетом.Регистратор,
	|	ПРЕДСТАВЛЕНИЕССЫЛКИ(НДФЛРасчетыСБюджетом.Регистратор) КАК Описание
	|ИЗ
	|	РегистрНакопления.НДФЛРасчетыСБюджетом КАК НДФЛРасчетыСБюджетом
	|ГДЕ
	|	НДФЛРасчетыСБюджетом.ФизЛицо В(&Сотрудники)
	|	И НДФЛРасчетыСБюджетом.Организация = &Организация
	|	И НДФЛРасчетыСБюджетом.ОбособленноеПодразделение = &ОбособленноеПодразделение
	|	И НДФЛРасчетыСБюджетом.Период > &ДатаРегистрации
	|	И НДФЛРасчетыСБюджетом.ВидСтроки = ЗНАЧЕНИЕ(Перечисление.НДФЛРасчетыСБюджетомВидСтроки.Удержание)
	|	И НДФЛРасчетыСБюджетом.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)";
	Результат = Запрос.Выполнить();
	
	Если Результат.Пустой() Тогда
		Возврат
	КонецЕсли;
	
	Выборка = Результат.Выбрать();
	ОбщегоНазначенияЗК.ВывестиИнформациюОбОшибке("Выявлено нарушение хронологии в учете удержанного НДФЛ: в данных присутствуют будущие записи, произведенные документом(ами)", Отказ, Заголовок);		
	Пока Выборка.Следующий() Цикл
		ОбщегоНазначенияЗК.ВывестиИнформациюОбОшибке("", Отказ, Заголовок, Перечисления.ВидыСообщений.Информация, ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Новый Структура("Представление,Расшифровка", Выборка.Описание, Выборка.Регистратор)));		
	КонецЦикла;
	ОбщегоНазначенияЗК.ВывестиИнформациюОбОшибке("Чтобы провести текущий документ, необходимо отменить проведение указанных документов.", Отказ, Заголовок, Перечисления.ВидыСообщений.Информация);		

КонецПроцедуры
  • Внести изменения в модуль СтандартныеПодсистемыСервер
Функция УстановкаПараметровСеанса(ИменаПараметровСеанса) Экспорт
	
	Перем ТекстСообщения;
	
	// Параметры сеанса, инициализация которых требует обращения к одним и тем же данным
	// следует инициализировать сразу группой. Для того, чтобы избежать их повторной инициализации,
	// имена уже установленных параметров сеанса сохраняются в массиве УстановленныеПараметры
	УстановленныеПараметры = Новый Массив;
	
	Если ИменаПараметровСеанса = Неопределено Тогда
		ПараметрыСеанса.ПараметрыКлиентаНаСервере = Новый ФиксированноеСоответствие(Новый Соответствие);
		
		// Начальное выполнение на сервере перед запуском программы.
		ПередЗапускомПрограммы();
		Возврат УстановленныеПараметры;
		
	ИначеЕсли ИменаПараметровСеанса.Найти("ПараметрыКлиентаНаСервере") <> Неопределено Тогда
		
		ПараметрыСеанса.ПараметрыКлиентаНаСервере = Новый ФиксированноеСоответствие(Новый Соответствие);
		УстановленныеПараметры.Добавить("ПараметрыКлиентаНаСервере");
// Сергей (
	ИначеЕсли ИменаПараметровСеанса.Найти("НеПроверятьХронологиюУчетаУдержанногоНДФЛ") <> Неопределено Тогда
		
		ПараметрыСеанса.НеПроверятьХронологиюУчетаУдержанногоНДФЛ = Ложь;
		УстановленныеПараметры.Добавить("НеПроверятьХронологиюУчетаУдержанногоНДФЛ");
// Сергей )
	КонецЕсли;
	
	Обработчики = Новый Соответствие;
	ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия(
		"СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииОбработчиковУстановкиПараметровСеанса");
	
	Для каждого Обработчик Из ОбработчикиСобытия Цикл
		Обработчик.Модуль.ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики);
	КонецЦикла;
	
	ОбработчикиСобственные = ОбщегоНазначенияПереопределяемый.ОбработчикиИнициализацииПараметровСеанса();
	
	Для Каждого Запись Из ОбработчикиСобственные Цикл
		Обработчики.Вставить(Запись.Ключ, Запись.Значение);
	КонецЦикла;
	
	// массив с ключами параметров сеанса
	// задаются начальным словом в имени параметра сеанса и символом "*"
	ПараметрыСеансаКлючи = Новый Массив;
	
	Для Каждого Запись Из Обработчики Цикл
		Если Найти(Запись.Ключ, "*") > 0 Тогда
			КлючПараметра = СокрЛП(Запись.Ключ);
			ПараметрыСеансаКлючи.Добавить(Лев(КлючПараметра, СтрДлина(КлючПараметра)-1));
		КонецЕсли;
	КонецЦикла;
	
	Для каждого ИмяПараметра Из ИменаПараметровСеанса Цикл
		Если УстановленныеПараметры.Найти(ИмяПараметра) <> Неопределено Тогда
			Продолжить;
		КонецЕсли;
		Обработчик = Обработчики.Получить(ИмяПараметра);
		Если Обработчик <> Неопределено Тогда
			Если Не ОбщегоНазначения.ПроверитьИмяЭкспортнойПроцедуры(Обработчик, ТекстСообщения) Тогда
				ВызватьИсключение ТекстСообщения;
			КонецЕсли;
			
			Выполнить Обработчик + "(ИмяПараметра, УстановленныеПараметры)";
			Продолжить;
		КонецЕсли;
		Для Каждого ИмяКлючаПараметра Из ПараметрыСеансаКлючи Цикл
			Если Лев(ИмяПараметра, СтрДлина(ИмяКлючаПараметра)) = ИмяКлючаПараметра Тогда
				Обработчик = Обработчики.Получить(ИмяКлючаПараметра+"*");
				Если Не ОбщегоНазначения.ПроверитьИмяЭкспортнойПроцедуры(Обработчик, ТекстСообщения) Тогда
					ВызватьИсключение ТекстСообщения;
				КонецЕсли;
				Выполнить Обработчик + "(ИмяПараметра, УстановленныеПараметры)";
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	
	Возврат УстановленныеПараметры;
	
КонецФункции

Все изменения помечены как "\\ Сергей".

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

Наименование Файл Версия Размер
Отдельно обработка проведения 31
.epf 9,46Kb
11.10.16
31
.epf 9,46Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Руслан Эскин (Anesk) 05.10.16 20:36
Создал аналогичную для себя. Но сейчас новый релиз вышел, который учитывает взаиморасчеты
2. Роман Ложкин (webester) 06.10.16 09:29
Это че серьезно за 1$m можно скачать актуальный cf ЗУП? Как мило ;)
3. Оksja Ts (oksja) 19.10.16 05:38
Огромный респект за идею!!! Вот уж действительно всё гениальное просто. Предложенный в статье способ проведения документов наиболее приближен к естественной хронологии учета и поэтому 2й раздел приобретает более правильный вид. Я бы сказала что это одна из немногих действительно ценных публикаций по теме 6ндфл на инфостарте. С разрешения автора могу опубликовать адаптированную мной обработку для бюджетной зарплаты с небольшими улучшениями. Ещё раз спасибо!