Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
7.3 kB
2
Indexable
Never
Процедура РассчитатьНачисления (Регистратор) Экспорт
	
	РассчитатьОсновныеНачисления(Регистратор);			
	РассчитатьДопНачисления(Регистратор);	

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

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

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

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