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