Выплата бывшим сотрудникам / Сохраняемый средний заработок / Модуль формы

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

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

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

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура НачалоПриИзменении(Элемент)
	
	РассчитатьКоличествоДнейНаСервере();
	РассчитатьСуммуНачислено();
	
КонецПроцедуры

&НаКлиенте
Процедура ОкончаниеПриИзменении(Элемент)
	
	РассчитатьКоличествоДнейНаСервере();
	РассчитатьСуммуНачислено();
	
КонецПроцедуры

&НаКлиенте
Процедура СреднийЗаработокПриИзменении(Элемент)
	
	РассчитатьСуммуНачислено();
	
КонецПроцедуры

&НаКлиенте
Процедура ВыходноеПособиеПриИзменении(Элемент)
	
	РассчитатьСуммуНачислено();
	
КонецПроцедуры

&НаКлиенте
Процедура УчитыватьПраздничныеДниПриИзменении(Элемент)
	УчитыватьПраздничныеДниПриИзмененииНаСервере();
	РассчитатьСуммуНачислено()
КонецПроцедуры

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

#Область ОбработчикиКомандФормы

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

&НаКлиенте
Процедура Отмена(Команда)
	
	Закрыть();	
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура РассчитатьСуммуНачислено()
	
	Праздники = ?(ЭтоСреднечасовойЗаработок, КоличествоПраздниковВЧасах, КоличествоПраздников);
	Начислено = СреднийЗаработок * КоличествоДней + ?(УчитыватьПраздничныеДни, СреднийЗаработок * Праздники, 0) - ВыходноеПособие
	
КонецПроцедуры

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

&НаСервере
Процедура УстановитьСвойстваЭлементовФормы()
	
	ОбщееКоличествоДней = КоличествоДней;
	
	МассивШаблонов = Новый Массив;
	МассивШаблонов.Добавить(НСтр("ru = '%1 дней'"));
	МассивШаблонов.Добавить(НСтр("ru = '%1 дней, из них %2 праздничных'"));
	МассивШаблонов.Добавить(НСтр("ru = '%1 дней, из них %2 праздничный'"));
	МассивШаблонов.Добавить(НСтр("ru = '%1 часов'"));
	МассивШаблонов.Добавить(НСтр("ru = '%1 часов и %2 праздничных дней'"));
	МассивШаблонов.Добавить(НСтр("ru = '%1 часов и %2 праздничный день'"));
	
	ИндексШаблона = 0;
	Если УчитыватьПраздничныеДни И КоличествоПраздников > 0 Тогда
		ИндексШаблона = ИндексШаблона + 1;
		Если КоличествоПраздников = 1 Тогда 
			ИндексШаблона = ИндексШаблона + 1;
		КонецЕсли;
		
		ОбщееКоличествоДней = КоличествоДней + КоличествоПраздников; 
	КонецЕсли;

	Если ЭтоСреднечасовойЗаработок Тогда
		ИндексШаблона = ИндексШаблона + 3;
		
		ОбщееКоличествоДней = КоличествоДней;
	КонецЕсли;
	
	Представление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(МассивШаблонов[ИндексШаблона], ОбщееКоличествоДней, КоличествоПраздников);

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

&НаСервере
Процедура УчитыватьПраздничныеДниПриИзмененииНаСервере()
	Если УчитыватьПраздничныеДни Тогда
		РассчитатьКоличествоДнейНаСервере();
	КонецЕсли;
	УстановитьСвойстваЭлементовФормы();
КонецПроцедуры

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

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