Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
9.5 kB
0
Indexable
Never
Процедура РассчитатьНачисления(Регистратор, НаборЗаписей, Отказ) Экспорт
	
	// Определение курсов доллара и евро
	ЗапросКурсы = Новый Запрос;
	ЗапросКурсы.Текст =
	"ВЫБРАТЬ
	|	КурсыВалютСрезПоследних.Курс КАК Курс
	|ИЗ
	|	РегистрСведений.КурсыВалют.СрезПоследних(&ДатаСреза, Валюта.Код = 840) КАК КурсыВалютСрезПоследних
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	КурсыВалютСрезПоследних.Курс КАК Курс
	|ИЗ
	|	РегистрСведений.КурсыВалют.СрезПоследних(&ДатаСреза, Валюта.Код = 978) КАК КурсыВалютСрезПоследних";
	
	ЗапросКурсы.УстановитьПараметр("ДатаСреза", Регистратор.Дата);
	МассивРезультатов = ЗапросКурсы.ВыполнитьПакет();
	РезультатДоллар = МассивРезультатов[0];
	РезультатЕвро = МассивРезультатов[1];
	
	Если РезультатДоллар.Пустой() Или РезультатЕвро.Пустой() Тогда
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = "В регистре курсов валют должны быть заполнены курсы доллара и евро";
		Сообщение.Сообщить();
		
		Отказ = Истина;
		Возврат;
	КонецЕсли;
	
	Данные = РезультатДоллар.Выбрать();
	Данные.Следующий();
	КурсДоллара = Данные.Курс;
	
	Данные = РезультатЕвро.Выбрать();
	Данные.Следующий();
	КурсЕвро = Данные.Курс;
	
	// Формирование движений
	
	// РАСЧЕТ ОКЛАДА
	// Формула расчета: [Количество отработанных часов] * [Тарифная ставка]

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

	// РАСЧЕТ СВЕРХУРОЧНЫХ
	// Формула расчета: [Сумма базы (по всем начислениям)] / [Количество рабочих часов в базовом периоде] * [Количество сверхурочных часов] * 1.5	

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