Untitled

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

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

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

	Выборка = Запрос.Выполнить().Выбрать();
	
	Для Каждого Запись Из НаборЗаписейОсновныеНачисления Цикл
		СтруктураПоиска.НомерСтроки = Запись.НомерСтроки;
		
		Если Выборка.НайтиСледующий(СтруктураПоиска) Тогда
			Запись.Результат = 5000 * Выборка.ДнейФакт;
		КонецЕсли;
		
		Выборка.Сбросить();
	КонецЦикла;	               	
	
КонецПроцедуры

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