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