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