Компенсация за задержку выплаты заработной платы / Модуль менеджера

файл
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
	
#Область ПрограммныйИнтерфейс

// СтандартныеПодсистемы.Печать

// Заполняет список команд печати.
// 
// Параметры:
//   КомандыПечати - ТаблицаЗначений - состав полей см. в функции УправлениеПечатью.СоздатьКоллекциюКомандПечати.
//
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
	
КонецПроцедуры

// Конец СтандартныеПодсистемы.Печать

// СтандартныеПодсистемы.ВерсионированиеОбъектов

// Определяет настройки объекта для подсистемы ВерсионированиеОбъектов.
//
// Параметры:
//  Настройки - Структура - настройки подсистемы.
Процедура ПриОпределенииНастроекВерсионированияОбъектов(Настройки) Экспорт

КонецПроцедуры

// Конец СтандартныеПодсистемы.ВерсионированиеОбъектов

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

	ПроведениеСервер.ЗаписьДвиженийПоУчетам(Движения, СтруктураВидовУчета);
	
КонецПроцедуры

#Область ДляВызоваИзДругихПодсистем

// СтандартныеПодсистемы.УправлениеДоступом

// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа.
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
	Ограничение.Текст =
	"РазрешитьЧтениеИзменение
	|ГДЕ
	|	ДляВсехСтрок( ЗначениеРазрешено(ФизическиеЛица.ФизическоеЛицо, NULL КАК ИСТИНА)
	|	) И ЗначениеРазрешено(Организация)";
КонецПроцедуры

// Конец СтандартныеПодсистемы.УправлениеДоступом

#КонецОбласти

#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс

#Область ОбработчикиПравилРегистрации

// См. ЗарплатаКадрыРасширенныйСинхронизацияДанных.ШаблонОбработчика
Процедура ПриЗаполненииНастроекОбработчиковПравилРегистрации(Настройки) Экспорт
	ЗарплатаКадрыРасширенныйСинхронизацияДанных.ДляОтбораПоОрганизации(Настройки);
	ЗарплатаКадрыРасширенныйСинхронизацияДанных.ДляОбъектаСПрисоединеннымиФайлами(Настройки);
КонецПроцедуры

#КонецОбласти

// Возвращает описание состава документа
//
// Возвращаемое значение:
//  Структура - см. ЗарплатаКадрыСоставДокументов.НовоеОписаниеСоставаОбъекта.
Функция ОписаниеСоставаОбъекта() Экспорт
	
	МетаданныеДокумента = Метаданные.Документы.КомпенсацияЗаЗадержкуЗарплаты;
	Возврат ЗарплатаКадрыСоставДокументов.ОписаниеСоставаОбъектаПоМетаданнымФизическиеЛицаВТабличныхЧастях(МетаданныеДокумента);
	
КонецФункции

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Функция НДФЛ(Объект, ПараметрыРасчета) Экспорт
	
	УчетПрочихДоходов.РезультатРасчетаЗаполнитьНДФЛ(Объект, ПараметрыРасчета);
	ЗаполнитьНалогиСотрудников(ПараметрыРасчета);
	РассчитатьНДФЛ(Объект, ПараметрыРасчета);
	РезультатРасчета = ПараметрыРасчета.РезультатРасчета;
	
	Возврат РезультатРасчета;
	
КонецФункции

Процедура РассчитатьНДФЛ(Объект, ПараметрыРасчета)
	
	Если Не ПараметрыРасчета.РассчитатьНалогиИВзносы Тогда
		Возврат;
	КонецЕсли;

	УдаляемыеВТ = Новый Массив;
	
	УчетПрочихДоходов.СоздатьВТДляНДФЛИВзносов(Объект, ПараметрыРасчета, ПараметрыРасчета.МенеджерВременныхТаблиц, УдаляемыеВТ);
	
	Запрос = Новый Запрос;
	Запрос.МенеджерВременныхТаблиц = ПараметрыРасчета.МенеджерВременныхТаблиц;
		
	ДанныеДляНДФЛ = УчетПрочихДоходов.ДоходыНДФЛ(Объект, ПараметрыРасчета);

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

	ПараметрыРасчета.ОбновитьБухУчетНДФЛ = Истина;
	
	УчетПрочихДоходов.УдалитьВТ(Запрос.МенеджерВременныхТаблиц, УдаляемыеВТ);
	
	ЗаполнитьНалогиСотрудников(ПараметрыРасчета);
	
КонецПроцедуры

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

КонецПроцедуры

#Область ОбновлениеИнформационнойБазы

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

КонецПроцедуры

// Обработчик обновления
Процедура ЗаполнитьКатегориюДохода(ПараметрыОбновления = Неопределено) Экспорт

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

КонецПроцедуры

#КонецОбласти

#КонецОбласти

#КонецЕсли

Связанные материалы