Предопределенная процедура. Предопределенная процедура
Скачать 41 Kb.
|
//****************************************************************************** // Предопределенная процедура // Процедура ПровестиРасчет() // если запись исправлена или фиксирована, то ее не рассчитываем Если (Исправлена=1) или (Фиксирована=1) Тогда глСообщениеТрассировки(глСообщенияТрассировки, "" + ?(Исправлена=1,"Результат записи исправлен вручную","Запись фиксирована") + ". Расчет не проводился.", , 1); Возврат КонецЕсли; СтрокаПервыхЧасов = 0; СтрокаОстальныхЧасов = 0; Документ.ВыбратьСтроки(); Пока Документ.ПолучитьСтроку()=1 Цикл Если (Документ.Сотрудник=Объект) и (Документ.ТипЧасов=Перечисление.ТипыЧасов.Сверхурочные15) Тогда СтрокаПервыхЧасов = Документ.НомерСтроки КонецЕсли; Если (Документ.Сотрудник=Объект) и (Документ.ТипЧасов=Перечисление.ТипыЧасов.Сверхурочные20) Тогда СтрокаОстальныхЧасов = Документ.НомерСтроки КонецЕсли; КонецЦикла; Если (СтрокаПервыхЧасов = 0) и (СтрокаОстальныхЧасов = 0) Тогда Если глРежимТрассировки = 1 Тогда глСообщениеТрассировки(глСообщенияТрассировки, "В документе """+глПредставлениеДокумента(Документ)+""" - не найдены записи ""отработано сверхурочных часов"" по сотруднику "+Объект+". Расчет не проводился.", , 1); Иначе глДобавитьСообщение(глОбработчикСообщений, "В документе """+глПредставлениеДокумента(Документ)+""" - не найдены записи ""отработано сверхурочных часов"" по сотруднику "+Объект+". Расчет не проводился.", Документ, , ); КонецЕсли; Результат = 0; Возврат КонецЕсли; Валюта = Объект.ВалютаОклада; ТекстВВалюте = ?(Валюта.Выбран()=1," (в валюте: "+Валюта+")","руб."); Если Документ.ПолнотаВводаДанных = 1 Тогда // подробные данные глСообщениеТрассировки(глСообщенияТрассировки, "В документе введены подробные данные об отработанном за месяц времени - будут учтены все изменения расчетных данных работника в течение _П01.", 0, 1, ДатаОкончания, "ДММММГГГГ"); ТаблицаРеквизитов = глПолучитьТаблицуИсторииРеквизитов(Объект,ДатаНачала,ДатаОкончания,"Оклад,ФормаТруда,ГрафикРаботы"); КоличествоСтрок = ТаблицаРеквизитов.КоличествоСтрок(); Если КоличествоСтрок > 1 Тогда ВсегоНачислено = 0; ВсегоЧасов = 0; Для Номер = 1 по КоличествоСтрок Цикл ТаблицаРеквизитов.ПолучитьСтрокуПоНомеру(Номер); СледующаяДата = ?(Номер<КоличествоСтрок,ТаблицаРеквизитов.ПолучитьЗначение(Номер+1,"Дата")-1,ДатаОкончания); // т.к. значений может быть несколько, берем последнее значение на дату Если (Номер < КоличествоСтрок) и (ТаблицаРеквизитов.Дата >= ?(Номер<КоличествоСтрок,ТаблицаРеквизитов.ПолучитьЗначение(Номер + 1, "Дата"), ДатаОкончания)) Тогда Продолжить КонецЕсли; НачальнаяДата = ТаблицаРеквизитов.Дата; глСообщениеТрассировки(глСообщенияТрассировки, "Расчет ведется за период с _П01 по _П02", 0, 1, НачальнаяДата, "ДДДММММГГГГ", СледующаяДата, "ДДДММММГГГГ"); Если глФормаТрудаПоТарифуОкладу(ТаблицаРеквизитов.ФормаТруда)="Оклад" Тогда // расчет "часовой ставки" // если график работы не выбран используем основной график, установленный в константе ГрафикРаботы = ТаблицаРеквизитов.ГрафикРаботы; Если ПустоеЗначение(ГрафикРаботы)=1 Тогда глСообщениеТрассировки(глСообщенияТрассировки, "График работы сотрудника на _П01 не задан! Будет использоваться основной график предприятия.", 0, 1, СледующаяДата, "ДДДММММГГГГ"); ГрафикРаботы = Константа.ОсновнойГрафик; КонецЕсли; Если ПустоеЗначение(ГрафикРаботы)=1 Тогда Если глРежимТрассировки = 1 Тогда глСообщениеТрассировки(глСообщенияТрассировки, "Основной график работы предприятия не задан!", 1, 0); Иначе глДобавитьСообщение(глОбработчикСообщений, "Основной график работы предприятия не задан!", , , ); КонецЕсли; Результат = 0; Возврат КонецЕсли; ТарифСотрудника = глПолучитьСуммуИзРеквизита(ТаблицаРеквизитов.Оклад,СледующаяДата)/глПолучитьСреднемесячноеКолвоЧасов(ГрафикРаботы,СледующаяДата); Иначе ТарифСотрудника = глПолучитьСуммуИзРеквизита(ТаблицаРеквизитов.Оклад,СледующаяДата); КонецЕсли; Часов15 = 0; Часов20 = 0; Если СтрокаПервыхЧасов > 0 Тогда Документ.ПолучитьСтрокуПоНомеру(СтрокаПервыхЧасов); Для Сч = ДатаЧисло(НачальнаяДата) По ДатаЧисло(СледующаяДата) Цикл ЧасовВДне = Документ.ПолучитьАтрибут("КолвоЧасов"+глДополнитьСтроку(Сч,2)); Часов15 = Часов15 + ЧасовВДне; КонецЦикла; КонецЕсли; Если СтрокаОстальныхЧасов > 0 Тогда Документ.ПолучитьСтрокуПоНомеру(СтрокаОстальныхЧасов); Для Сч = ДатаЧисло(НачальнаяДата) По ДатаЧисло(СледующаяДата) Цикл Часов20 = Часов20 + Документ.ПолучитьАтрибут("КолвоЧасов"+глДополнитьСтроку(Сч,2)); КонецЦикла; КонецЕсли; ВсегоЧасов = ВсегоЧасов + Часов15 + Часов20; ПоТарифу = (Часов15*Константа.КоэффициентОплатыСверхУрочныхЧасовНачальный +Часов20*Константа.КоэффициентОплатыСверхУрочныхЧасовПоследующих) *ТарифСотрудника; ПоТарифуВРублях = ПоТарифу; Если (Валюта.Выбран() = 1) и (ПоТарифуВРублях > 0) Тогда Кратность = Валюта.Кратность.Получить(СледующаяДата); ПоТарифуВРублях = ПоТарифуВРублях * Валюта.Курс.Получить(СледующаяДата) / ?(Кратность=0,1,Кратность); КонецЕсли; глСообщениеТрассировки(глСообщенияТрассировки, "По состоянию на _П01: часовой тариф сотрудника составил _П02 "+ТекстВВалюте, 0, 0, СледующаяДата, "ДДДММММГГГГ",ТарифСотрудника, "Ч15.2"); глСообщениеТрассировки(глСообщенияТрассировки, "Отработано часов: " + (Часов15+Часов20) +", сумма к начислению: _П01 "+ТекстВВалюте+?(ПоТарифуВРублях = ПоТарифу,""," или в рублях - _П02"), 0, 0, ПоТарифу, "Ч15.2",ПоТарифуВРублях, "Ч15.2"); ВсегоНачислено = ВсегоНачислено + ПоТарифуВРублях; КонецЦикла; Результат = ВсегоНачислено; Часы = ВсегоЧасов; Возврат Иначе Часов15 = 0; Часов20 = 0; Если СтрокаПервыхЧасов > 0 Тогда Документ.ПолучитьСтрокуПоНомеру(СтрокаПервыхЧасов); Для Сч = ДатаЧисло(ДатаНачала) По ДатаЧисло(ДатаОкончания) Цикл Часов15 = Часов15 +Документ.ПолучитьАтрибут("КолвоЧасов"+глДополнитьСтроку(Сч,2)) ; КонецЦикла; КонецЕсли; Если СтрокаОстальныхЧасов > 0 Тогда Документ.ПолучитьСтрокуПоНомеру(СтрокаОстальныхЧасов); Для Сч = ДатаЧисло(ДатаНачала) По ДатаЧисло(ДатаОкончания) Цикл Часов20 = Часов20 + Документ.ПолучитьАтрибут("КолвоЧасов"+глДополнитьСтроку(Сч,2)); КонецЦикла; КонецЕсли; КонецЕсли; Иначе глСообщениеТрассировки(глСообщенияТрассировки, "В документе указаны только суммарные данные об отработанном за месяц времени - все расчетные данные работника будут учтены по состоянию на _П01.", 0, 1, ДатаОкончания, "ДДДММММГГГГ"); ТаблицаРеквизитов = глПолучитьТаблицуИсторииРеквизитов(Объект,НачМесяца(ДатаНачала),КонМесяца(ДатаОкончания),"СостояниеФизлица,Оклад,ФормаТруда,ГрафикРаботы"); ТаблицаРеквизитов.Свернуть("Дата", ""); // исключим таким образом несколько значений на одну дату Если ТаблицаРеквизитов.КоличествоСтрок() > 1 Тогда глДобавитьСообщение(глОбработчикСообщений, "У сотрудника "+Объект+" в "+ОписательПериода(ДатаОкончания) + " изменялись расчетные данные (оклад или график работы)! Введите подробные данные об отработанном времени.", Документ, , ); КонецЕсли; Часов15 = 0; Часов20 = 0; Если СтрокаПервыхЧасов > 0 Тогда Документ.ПолучитьСтрокуПоНомеру(СтрокаПервыхЧасов); Часов15 = Часов15 + Документ.ВсегоЧасов; КонецЕсли; Если СтрокаОстальныхЧасов > 0 Тогда Документ.ПолучитьСтрокуПоНомеру(СтрокаОстальныхЧасов); Часов20 = Часов20 + Документ.ВсегоЧасов; КонецЕсли; КонецЕсли; Если глФормаТрудаПоТарифуОкладу(Объект.ФормаТруда.Получить(ДатаОкончания))="Оклад" Тогда // расчет "часовой ставки" // если график работы не выбран используем основной график, установленный в константе ГрафикРаботы = Объект.ГрафикРаботы.Получить(ДатаОкончания); Если ПустоеЗначение(ГрафикРаботы)=1 Тогда глСообщениеТрассировки(глСообщенияТрассировки, "График работы сотрудника на _П01 не задан! Будет использоваться основной график предприятия.", 0, 1, ДатаОкончания, "ДДДММММГГГГ"); ГрафикРаботы = Константа.ОсновнойГрафик; КонецЕсли; Если ПустоеЗначение(ГрафикРаботы)=1 Тогда Если глРежимТрассировки = 1 Тогда глСообщениеТрассировки(глСообщенияТрассировки, "Основной график работы предприятия не задан!", 1, 0); Иначе глДобавитьСообщение(глОбработчикСообщений, "Основной график работы предприятия не задан!", , , ); КонецЕсли; Возврат КонецЕсли; ТарифСотрудника = глПолучитьСуммуИзРеквизита(Объект.Оклад.Получить(ДатаОкончания),ДатаОкончания)/глПолучитьСреднемесячноеКолвоЧасов(ГрафикРаботы,ДатаОкончания); Иначе ТарифСотрудника = глПолучитьСуммуИзРеквизита(Объект.Оклад.Получить(ДатаОкончания),ДатаОкончания); КонецЕсли; глСообщениеТрассировки(глСообщенияТрассировки, "По состоянию на _П01: часовой тариф сотрудника составил _П02 "+ТекстВВалюте, 0, 0, ДатаОкончания, "ДДДММММГГГГ",ТарифСотрудника, "Ч15.2"); ПоТарифу = (Часов15 *Константа.КоэффициентОплатыСверхУрочныхЧасовНачальный +Часов20 *Константа.КоэффициентОплатыСверхУрочныхЧасовПоследующих) *ТарифСотрудника; ПоТарифуВРублях = ПоТарифу; Если (Валюта.Выбран() = 1) и (ПоТарифуВРублях > 0) Тогда Кратность = Валюта.Кратность.Получить(ДатаОкончания); ПоТарифуВРублях = ПоТарифуВРублях * Валюта.Курс.Получить(ДатаОкончания) / ?(Кратность=0,1,Кратность); КонецЕсли; ВсегоЧасов = Часов15 + Часов20; глСообщениеТрассировки(глСообщенияТрассировки, "Всего отработано праздничных часов: "+ВсегоЧасов+", сумма к начислению: _П01 "+ТекстВВалюте+?(ПоТарифуВРублях = ПоТарифу,""," или в рублях - _П02"), 0, 0, ПоТарифу, "Ч15.2",ПоТарифуВРублях, "Ч15.2"); Результат = ПоТарифуВРублях; Часы = ВсегоЧасов; КонецПроцедуры // ПровестиРасчет |