Выплата бывшим сотрудникам / Модуль объекта

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

#Область ОбработчикиСобытий

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

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

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

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

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

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

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

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

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

Функция ДанныеТаблицыПоИдентификаторам(Таблица, ИмяПоляИдентификатора, Идентификаторы)
	
	ПустаяТаблица = Таблица.СкопироватьКолонки();
	ИндексированныеСтроки = СтрокиТаблицыПоИдентификаторам(Таблица, ИмяПоляИдентификатора);
	
	ДанныеТаблицыПоИдентификаторам = Новый Соответствие;
	Для Каждого Идентификатор Из Идентификаторы Цикл
		ДанныеИдентификатора = ПустаяТаблица.Скопировать();
		СтрокиТаблицы = ИндексированныеСтроки[Идентификатор];
		Если СтрокиТаблицы <> Неопределено Тогда
			ОбщегоНазначенияКлиентСервер.ДополнитьТаблицу(СтрокиТаблицы, ДанныеИдентификатора);
		КонецЕсли;
		ДанныеТаблицыПоИдентификаторам.Вставить(Идентификатор, ДанныеИдентификатора);
	КонецЦикла;
	
	Возврат ДанныеТаблицыПоИдентификаторам;
	
КонецФункции

Функция СтрокиТаблицыПоИдентификаторам(Таблица, ИмяПоляИдентификатора)
	
	ИндексированныеСтроки = Новый Соответствие;
	Для Каждого СтрокаТаблицы Из Таблица Цикл
		Ключ = СтрокаТаблицы[ИмяПоляИдентификатора];
		Если ИндексированныеСтроки[Ключ] = Неопределено Тогда
			ИндексированныеСтроки.Вставить(Ключ, Новый Массив);
		КонецЕсли;
		ИндексированныеСтроки[Ключ].Добавить(СтрокаТаблицы);
	КонецЦикла;
	
	Возврат ИндексированныеСтроки;
	
КонецФункции

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

#Иначе
ВызватьИсключение НСтр("ru = 'Недопустимый вызов объекта на клиенте.'");
#КонецЕсли

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