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