Untitled

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

	// Данные могут вводиться задним числом, значит необходимо сформировать сторно записи
	СторноЗаписи = Движения.ОсновныеНачисления.ПолучитьДополнение();
	Для Каждого Сторно Из СторноЗаписи Цикл
		Движение = Движения.ОсновныеНачисления.Добавить();
		ЗаполнитьЗначенияСвойств(Движение, Сторно);
		Движение.ПериодРегистрации = Сторно.ПериодРегистрацииСторно;
		Движение.ПериодДействияНачало = Сторно.ПериодДействияНачалоСторно;
		Движение.ПериодДействияКонец = Сторно.ПериодДействияКонецСторно;
		Движение.Сторно = Истина;
	КонецЦикла;
	
	// Запись рабочего набора записей
	Движения.ОсновныеНачисления.Записать();
	
	// Окончательный расчет данных в регистре
	Расчет.РассчитатьНачисления(Ссылка, Движения.ОсновныеНачисления);
	
КонецПроцедуры