Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
14 kB
0
Indexable
Never
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
	
	// ДВИЖЕНИЯ ПО РЕГИСТРУ ОСНОВНЫЕ НАЧИСЛЕНИЯ
	
	Движения.ОсновныеНачисления.Записывать = Истина;
	
	// Запрос для формирования рабочего набора записей
	// Согласно условию оклад может быть многократно изменен и необходимо учесть эти изменения, 
	// поэтому для вида расчета Оклад формируется объединение двух запросов,
	// первый - это изменения оклада за период действия, второй - значение оклада на начало периода действия
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник,
	|	НачислениеЗарплатыОсновныеНачисления.Подразделение КАК Подразделение,
	|	НачислениеЗарплатыОсновныеНачисления.ДатаНачала КАК ПериодДействияНачало,
	|	НачислениеЗарплатыОсновныеНачисления.ДатаОкончания КАК ПериодДействияКонец,
	|	НАЧАЛОПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.Ссылка.Дата, МЕСЯЦ) КАК ПериодРегистрации,
	|	НачислениеЗарплатыОсновныеНачисления.ВидРасчета КАК ВидРасчета,
	|	НачислениеЗарплатыОсновныеНачисления.НомерСтроки КАК НомерСтроки
	|ПОМЕСТИТЬ ВТ_ДанныеПоОкладу
	|ИЗ
	|	Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления
	|ГДЕ
	|	НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка
	|	И НачислениеЗарплатыОсновныеНачисления.ВидРасчета = &ВидРасчетаОклад
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВТ_ДанныеПоОкладу.Сотрудник КАК Сотрудник,
	|	ВТ_ДанныеПоОкладу.Подразделение КАК Подразделение,
	|	ВТ_ДанныеПоОкладу.ПериодДействияНачало КАК ПериодДействияНачало,
	|	ВТ_ДанныеПоОкладу.ПериодДействияКонец КАК ПериодДействияКонец,
	|	ВТ_ДанныеПоОкладу.ПериодРегистрации КАК ПериодРегистрации,
	|	МАКСИМУМ(СведенияОСотрудниках.Период) КАК МаксимальныйПериод,
	|	ВТ_ДанныеПоОкладу.ВидРасчета КАК ВидРасчета,
	|	ВТ_ДанныеПоОкладу.НомерСтроки КАК НомерСтроки
	|ПОМЕСТИТЬ ВТ_ДанныеПоОкладуСМаксПериодом
	|ИЗ
	|	ВТ_ДанныеПоОкладу КАК ВТ_ДанныеПоОкладу
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках КАК СведенияОСотрудниках
	|		ПО ВТ_ДанныеПоОкладу.Сотрудник = СведенияОСотрудниках.Сотрудник
	|			И ВТ_ДанныеПоОкладу.Подразделение = СведенияОСотрудниках.Подразделение
	|			И ВТ_ДанныеПоОкладу.ПериодДействияНачало >= СведенияОСотрудниках.Период
	|
	|СГРУППИРОВАТЬ ПО
	|	ВТ_ДанныеПоОкладу.ПериодДействияКонец,
	|	ВТ_ДанныеПоОкладу.ПериодРегистрации,
	|	ВТ_ДанныеПоОкладу.Сотрудник,
	|	ВТ_ДанныеПоОкладу.Подразделение,
	|	ВТ_ДанныеПоОкладу.ПериодДействияНачало,
	|	ВТ_ДанныеПоОкладу.ВидРасчета,
	|	ВТ_ДанныеПоОкладу.НомерСтроки
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВТ_ДанныеПоОкладу.Сотрудник КАК Сотрудник,
	|	ВТ_ДанныеПоОкладу.Подразделение КАК Подразделение,
	|	СведенияОСотрудниках.Оклад КАК Параметр,
	|	СведенияОСотрудниках.Период КАК ПериодДействияНачало,
	|	ВТ_ДанныеПоОкладу.ПериодДействияКонец КАК ПериодДействияКонец,
	|	ВТ_ДанныеПоОкладу.ПериодРегистрации КАК ПериодРегистрации,
	|	ВТ_ДанныеПоОкладу.ВидРасчета КАК ВидРасчета,
	|	ВТ_ДанныеПоОкладу.НомерСтроки КАК НомерСтроки
	|ИЗ
	|	ВТ_ДанныеПоОкладу КАК ВТ_ДанныеПоОкладу
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках КАК СведенияОСотрудниках
	|		ПО ВТ_ДанныеПоОкладу.Сотрудник = СведенияОСотрудниках.Сотрудник
	|			И ВТ_ДанныеПоОкладу.Подразделение = СведенияОСотрудниках.Подразделение
	|			И ВТ_ДанныеПоОкладу.ПериодДействияНачало < СведенияОСотрудниках.Период
	|			И ВТ_ДанныеПоОкладу.ПериодДействияКонец >= СведенияОСотрудниках.Период
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	ВТ_ДанныеПоОкладуСМаксПериодом.Сотрудник,
	|	ВТ_ДанныеПоОкладуСМаксПериодом.Подразделение,
	|	СведенияОСотрудниках.Оклад,
	|	ВТ_ДанныеПоОкладуСМаксПериодом.ПериодДействияНачало,
	|	ВТ_ДанныеПоОкладуСМаксПериодом.ПериодДействияКонец,
	|	ВТ_ДанныеПоОкладуСМаксПериодом.ПериодРегистрации,
	|	ВТ_ДанныеПоОкладуСМаксПериодом.ВидРасчета,
	|	ВТ_ДанныеПоОкладуСМаксПериодом.НомерСтроки
	|ИЗ
	|	ВТ_ДанныеПоОкладуСМаксПериодом КАК ВТ_ДанныеПоОкладуСМаксПериодом
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОСотрудниках КАК СведенияОСотрудниках
	|		ПО ВТ_ДанныеПоОкладуСМаксПериодом.Сотрудник = СведенияОСотрудниках.Сотрудник
	|			И ВТ_ДанныеПоОкладуСМаксПериодом.Подразделение = СведенияОСотрудниках.Подразделение
	|			И ВТ_ДанныеПоОкладуСМаксПериодом.МаксимальныйПериод = СведенияОСотрудниках.Период
	|
	|УПОРЯДОЧИТЬ ПО
	|	ПериодДействияНачало
	|ИТОГИ ПО
	|	НомерСтроки
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	НачислениеЗарплатыОсновныеНачисления.Сотрудник КАК Сотрудник,
	|	НачислениеЗарплатыОсновныеНачисления.Подразделение КАК Подразделение,
	|	НАЧАЛОПЕРИОДА(НачислениеЗарплатыОсновныеНачисления.Ссылка.Дата, МЕСЯЦ) КАК ПериодРегистрации,
	|	ВЫБОР
	|		КОГДА НачислениеЗарплатыОсновныеНачисления.ВидРасчета = &ВидРасчетаПремия
	|			ТОГДА НачислениеЗарплатыОсновныеНачисления.Параметр
	|		ИНАЧЕ 0
	|	КОНЕЦ КАК Параметр,
	|	НачислениеЗарплатыОсновныеНачисления.ВидРасчета КАК ВидРасчета,
	|	НачислениеЗарплатыОсновныеНачисления.ДатаНачала КАК ПериодДействияНачало,
	|	НачислениеЗарплатыОсновныеНачисления.ДатаОкончания КАК ПериодДействияКонец,
	|	ВЫБОР
	|		КОГДА НачислениеЗарплатыОсновныеНачисления.ВидРасчета = &ВидРасчетаПроизвольнаяСумма
	|			ТОГДА НачислениеЗарплатыОсновныеНачисления.Параметр
	|		ИНАЧЕ 0
	|	КОНЕЦ КАК Результат
	|ИЗ
	|	Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления
	|ГДЕ
	|	НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка
	|	И НачислениеЗарплатыОсновныеНачисления.ВидРасчета <> &ВидРасчетаОклад";
	
	Запрос.УстановитьПараметр("Ссылка", Ссылка);
	Запрос.УстановитьПараметр("ВидРасчетаОклад", ПланыВидовРасчета.ОсновныеНачисления.Оклад);
	Запрос.УстановитьПараметр("ВидРасчетаПремия", ПланыВидовРасчета.ОсновныеНачисления.Премия);	
	Запрос.УстановитьПараметр("ВидРасчетаПроизвольнаяСумма", ПланыВидовРасчета.ОсновныеНачисления.ПроизвольнаяСумма);	
	
	Результаты = Запрос.ВыполнитьПакет();                                                      	
	
	ВыборкаИтоги = Результаты[2].Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
	Движение = Неопределено;
	Пока ВыборкаИтоги.Следующий() Цикл
		ЭтоСледующаяЗапись = Ложь;	
		Выборка = ВыборкаИтоги.Выбрать();
		Пока Выборка.Следующий() Цикл
			Если ЭтоСледующаяЗапись Тогда
				//Переопределяем окончание периода действия для прошлой записи набора
				Движение.ПериодДействияКонец = Выборка.ПериодДействияНачало-1;
			КонецЕсли;
			
			Движение = Движения.ОсновныеНачисления.Добавить();
			ЗаполнитьЗначенияСвойств(Движение, Выборка);
			ЭтоСледующаяЗапись = Истина;
		КонецЦикла;
	КонецЦикла;
	
	Выборка = Результаты[3].Выбрать();
	Пока Выборка.Следующий() Цикл
		Движение = Движения.ОсновныеНачисления.Добавить();
		ЗаполнитьЗначенияСвойств(Движение, Выборка);
	КонецЦикла;
	
	// Запись рабочего набора записей
	Движения.Записать();
	
	// Окончательный расчет данных в регистре
	Расчет.РассчитатьНачисления(Ссылка, Движения.ОсновныеНачисления);		
	
	// ДВИЖЕНИЯ ПО РЕГИСТРУ РАСЧЕТЫ С СОТРУДНИКАМИ
	Движения.РасчетыССотрудниками.Записывать = Истина;
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ОсновныеНачисления.Сотрудник,
	|	ОсновныеНачисления.ВидРасчета,
	|	СУММА(ОсновныеНачисления.Результат) КАК Сумма,
	|	ОсновныеНачисления.Подразделение
	|ИЗ
	|	РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления
	|ГДЕ
	|	ОсновныеНачисления.Регистратор = &Регистратор
	|
	|СГРУППИРОВАТЬ ПО
	|	ОсновныеНачисления.Сотрудник,
	|	ОсновныеНачисления.ВидРасчета,
	|	ОсновныеНачисления.Подразделение";
	
	Запрос.УстановитьПараметр("Регистратор", Ссылка);
	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		Движение = Движения.РасчетыССотрудниками.Добавить();
		Движение.Период = Дата;
		ЗаполнитьЗначенияСвойств(Движение, Выборка);
	КонецЦикла;        	
	
КонецПроцедуры