Untitled

mail@pastecode.io avatarunknown
plain_text
2 months ago
9.9 kB
0
Indexable
Never
Процедура РассчитатьНачисления (Регистратор, Движения, ОсновныеНачисления, ДополнительныеНачисления, ПериодРегистрации) Экспорт
	
	НаборЗаписей = Движения.ОсновныеНачисления;
	РассчитатьОсновныеНачисления(Регистратор, НаборЗаписей, ОсновныеНачисления, ПериодРегистрации);
	НаборЗаписей.Записать(, Истина); // Движения по окладу обязательно необходимо записать до расчета премии, т.к. сумма оклада составляет базу для премии
	
	ДопНаборЗаписей = Движения.ДополнительныеНачисления;
	РассчитатьДопНачисления(Регистратор, ДопНаборЗаписей, ДополнительныеНачисления, ПериодРегистрации);
	
КонецПроцедуры

Процедура РассчитатьОсновныеНачисления (Регистратор, НаборЗаписей, ОсновныеНачисления, ПериодРегистрации)
	
	// РАСЧЕТ ОКЛАДА
	// Формула расчета: [Начальное значение оклада] / [Количество рабочих дней] * [Количество отработанных дней]

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

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