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