Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
6.1 kB
1
Indexable
Never
Процедура РассчитатьНачисления (Регистратор, НаборЗаписей) Экспорт
	
	// РАСЧЕТ ОКЛАДА
	// Формула расчета: [Начальное значение оклада] / [Количество рабочих дней] * [Количество отработанных дней]

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