помогите изменить формулу расчета среднего заработка для отпускных в ЗиК
03.12.2008
09:50
#1
помогите пожалуста!!! изменить формулу расчета среднего заработка для отпускных в ЗиК, что и где поменять,
Именения в формуле в связи с законодательством.
формула раньше К=(29,4 дн.*M)+(Д1*1,4+Д2*1,4+...).
формула нужна сейчас К=(29,4 дн.*M)+(29,4/Кнд1*Котр1+29,4/Кнд2*Котр2...).
релиз Зик 2.70.281 Правда его нельзя обновить нестандартный,РСЗдО заменить только программно.
Именения в формуле в связи с законодательством.
формула раньше К=(29,4 дн.*M)+(Д1*1,4+Д2*1,4+...).
формула нужна сейчас К=(29,4 дн.*M)+(29,4/Кнд1*Котр1+29,4/Кнд2*Котр2...).
релиз Зик 2.70.281 Правда его нельзя обновить нестандартный,РСЗдО заменить только программно.
03.12.2008
10:38
#2
Но ведь можно сравнить конфигурации и просто взять, то что нужно
Это ведь не просто формула, а целая процедура.
Это ведь не просто формула, а целая процедура.
03.12.2008
11:21
#3
А нельзя как нибуть узнать в какой процедуре все это расчитывается, пробовал найти неполучилось(документ расчет среднего зароботка отпускных/средний заработок/кнопка заполнить/функция ЗаполнитьТабличнуюЧасть()/ а далее уходит кудато в глобальный модуль), пожалуйста подскажите новичку, запарился
03.12.2008
13:21
#5
А что за "ТаблицаДанныхОСреднем"?, как я понял из неё берутся все данные, но уже расчитанные или нет?
03.12.2008
14:16
#6
может быть кто нибудь сталкивался с такой проблемой, или разместите пожалуйста код функции "Функция глСуммаСреднегоЗаработкаОтпуска"(...)главный модуль из релиза ЗИК вышедшего после января 2008 года.
03.12.2008
16:33
#7
"релиз 285, последний
//******************************************************************************
// глСуммаСреднегоЗаработка(Сотрудник,НачалоСобытия,ТаблицаДанныхОСреднем)
//
// Параметры:
// СписокПараметров - список значений содержащий данные необходимые для расчета суммы среднего заработка
//
// Возвращаемое значение:
// Число - размер заработка
//
// Описание:
//
Функция глСуммаСреднегоЗаработка(Сотрудник,НачалоСобытия,ТаблицаДанныхОСреднемПарам,РасчетныйПериод) Экспорт
Перем ТаблицаДанныхОСреднем;
ТаблицаДанныхОСреднемПарам.Выгрузить(ТаблицаДанныхОСреднем);
// определим под какой из порядков попала оплата:
ПорядокРасчетаСреднегоЗаработка = глПолучитьПорядокРасчетаСреднегоЗаработка(НачалоСобытия);
СуммаСреднегоЗаработка = 0;
Если ТаблицаДанныхОСреднем.КоличествоСтрок() > 0 Тогда
СписокМесяцев = СоздатьОбъект("СписокЗначений");
ВсегоРазмерЗаработка = 0;
ВсегоДнейОтработано = 0;
ВсегоФактОтработано = 0;
РазмерГодовойПремии = 0;
РазмерПрочихПремий = 0;
РазмерГодовойПремииПропорцион = 0;
РазмерПрочихПремийПропорцион = 0;
ТаблицаДанныхОСреднем.Свернуть("ВидСтроки,Месяц","РазмерРаспределения,ДнейОтработано,ОтработаноФактически");
ТаблицаДанныхОСреднем.ВыбратьСтроки();
Пока ТаблицаДанныхОСреднем.ПолучитьСтроку() = 1 Цикл
ВидСтроки = ТаблицаДанныхОСреднем.ВидСтроки;
Если (ВидСтроки = Перечисление.ВидСтрокиСреднегоЗаработка.Заработок) или (ВидСтроки = Перечисление.ВидСтрокиСреднегоЗаработка.НадбавкаЗаКвалификационныйРазряд)
или (ВидСтроки = Перечисление.ВидСтрокиСреднегоЗаработка.ЗаработокНеИндексируемый) Тогда
ВсегоРазмерЗаработка = ВсегоРазмерЗаработка + ТаблицаДанныхОСреднем.РазмерРаспределения;
Если ВидСтроки = Перечисление.ВидСтрокиСреднегоЗаработка.Заработок Тогда
ВсегоДнейОтработано = ВсегоДнейОтработано + ТаблицаДанныхОСреднем.ДнейОтработано;
ВсегоФактОтработано = ВсегоФактОтработано + ТаблицаДанныхОСреднем.ОтработаноФактически;
ДатаМесяца = глДатаПоСтроке(ТаблицаДанныхОСреднем.Месяц);
Если СписокМесяцев.НайтиЗначение(ДатаМесяца) = 0 Тогда
СписокМесяцев.ДобавитьЗначение(ДатаМесяца);
КонецЕсли;
КонецЕсли;
ИначеЕсли ВидСтроки = Перечисление.ВидСтрокиСреднегоЗаработка.ПремияГодовая Тогда // начислено по итогам работы за 12 месяцев
РазмерГодовойПремии = РазмерГодовойПремии + ТаблицаДанныхОСреднем.РазмерРаспределения
ИначеЕсли ВидСтроки = Перечисление.ВидСтрокиСреднегоЗаработка.ПремияЕдиновременная Тогда // премии по итогам работы за несколько месяцев
КоличествоМесяцевПремии = СокрЛП(СтрЗаменить(НРег(ТаблицаДанныхОСреднем.Месяц),"за",""""));
КоличествоМесяцевПремии = Макс(Число(КоличествоМесяцевПремии),1);
РазмерПрочихПремий = РазмерПрочихПремий + ?(КоличествоМесяцевПремии > РасчетныйПериод,ТаблицаДанныхОСреднем.РазмерРаспределения / КоличествоМесяцевПремии * РасчетныйПериод,ТаблицаДанныхОСреднем.РазмерРаспределения)
ИначеЕсли ВидСтроки = Перечисление.ВидСтрокиСреднегоЗаработка.ПремияГодоваяПропорциональная Тогда
РазмерГодовойПремииПропорцион = РазмерГодовойПремииПропорцион + ТаблицаДанныхОСреднем.РазмерРаспределения
ИначеЕсли ВидСтроки = Перечисление.ВидСтрокиСреднегоЗаработка.ПремияЕдиновременнаяПропорциональная Тогда // премии по итогам работы за несколько месяцев
КоличествоМесяцевПремии = СокрЛП(СтрЗаменить(НРег(ТаблицаДанныхОСреднем.Месяц),"за",""""));
КоличествоМесяцевПремии = Макс(Число(КоличествоМесяцевПремии),1);
РазмерПрочихПремийПропорцион = РазмерПрочихПремийПропорцион + ?(КоличествоМесяцевПремии > РасчетныйПериод,ТаблицаДанныхОСреднем.РазмерРаспределения / КоличествоМесяцевПремии * РасчетныйПериод,ТаблицаДанныхОСреднем.РазмерРаспределения)
КонецЕсли;
КонецЦикла;
Если ВсегоДнейОтработано > 0 тогда
МесяцевРасчетногоПериода = СписокМесяцев.РазмерСписка();
Режим = ?(глГрафикСуммированногоУчета(Сотрудник,НачалоСобытия) = 0,"Дней","Часов");
глСообщениеТрассировки(глСообщенияТрассировки, "Итоговые данные о заработке:", 0, 1);
глСообщениеТрассировки(глСообщенияТрассировки, "в расчетный период включено " + МесяцевРасчетногоПериода + " " + глФормаМножественногоЧисла("месяц","месяца","месяцев",МесяцевРасчетногоПериода), 0, 1);
глСообщениеТрассировки(глСообщенияТрассировки, "за расчетный период отработано по графику " + ВсегоДнейОтработано + " " + НРег(Режим), 0, 0);
глСообщениеТрассировки(глСообщенияТрассировки, "за расчетный период отработано фактически " + ВсегоФактОтработано + " " + НРег(Режим), 0, 0);
глСообщениеТрассировки(глСообщенияТрассировки, "за расчетный период отработано " + ВсегоДнейОтработано + " " + НРег(Режим), 0, 0);
глСообщениеТрассировки(глСообщенияТрассировки, "основной заработок составил _П01", 0, 0, ВсегоРазмерЗаработка, "Ч15.2");
глСообщениеТрассировки(глСообщенияТрассировки, "премии по итогам года составили _П01", 0, 0, РазмерГодовойПремии , "Ч15.2");
глСообщениеТрассировки(глСообщенияТрассировки, "премии пропорциональные по итогам года составили _П01", 0, 0, РазмерГодовойПремииПропорцион, "Ч15.2");
глСообщениеТрассировки(глСообщенияТрассировки, "сумма месячных частей прочих премий составила _П01", 0, 0, РазмерПрочихПремий , "Ч15.2");
глСообщениеТрассировки(глСообщенияТрассировки, "сумма месячных частей прочих пропорциональных премий составила _П01", 0,-1, РазмерПрочихПремийПропорцион, "Ч15.2");
глСообщениеТрассировки(глСообщенияТрассировки, "Норма отработанного времени (" + НРег(Режим) + ") составила:", 0, 0);
Если РазмерПрочихПремий + РазмерГодовойПремии + РазмерГодовойПремииПропорцион + РазмерПрочихПремийПропорцион = 0 Тогда
ПриведеннаяСуммаПремий = 0
Иначе
ВсегоНормаДней = 0;
СписокМесяцев.Сортировать();
Для Сч = 1 По МесяцевРасчетногоПериода Цикл
ДатаМесяца = СписокМесяцев.ПолучитьЗначение(Сч);
НормаДнейЧасов = глНормаДнейЧасовЗаПериод(Сотрудник,НачМесяца(ДатаМесяца),КонМесяца(ДатаМесяца),Режим);
ВсегоНормаДней = ВсегоНормаДней + НормаДнейЧасов;
глСообщениеТрассировки(глСообщенияТрассировки, "за _П01: "+НормаДнейЧасов, 0, ?(Сч = 1,1,?(Сч = МесяцевРасчетногоПериода,-1,0)), ДатаМесяца, "ДММММГГГГ");
КонецЦикла;
Если МесяцевРасчетногоПериода = 1 Тогда
глСообщениеТрассировки(глСообщенияТрассировки, """", 0, -1);
КонецЕсли;
Если ВсегоНормаДней = 0 Тогда
Если глРежимТрассировки = 1 Тогда
глСообщениеТрассировки(глСообщенияТрассировки, "Заполните рабочий календарь сотрудника за месяцы, предшествующие событию!", 1, 1);
Иначе
глДобавитьСообщение(глОбработчикСообщений, "Заполните рабочий календарь сотрудника за месяцы, предшествующие событию!", Сотрудник, , );
КонецЕсли;
ПриведеннаяСуммаПремий = 0;
Иначе
ДоляОтработанногоВремени = Мин(ВсегоДнейОтработано / ВсегоНормаДней,1);
// если старый порядок, то пропорциональные премии все равно приводим к отработанному времени
ПриведеннаяСуммаПремий = ДоляОтработанногоВремени * (РазмерПрочихПремий + ?(ПорядокРасчетаСреднегоЗаработка > 0,0,РазмерПрочихПремийПропорцион)
+ РасчетныйПериод * (РазмерГодовойПремии + ?(ПорядокРасчетаСреднегоЗаработка > 0,0,РазмерГодовойПремииПропорцион)) / 12) ;
глСообщениеТрассировки(глСообщенияТрассировки, "Доля отработанного времени за расчетный период составила: _П01", 0, 0, ДоляОтработанногоВремени, "Ч25.20");
глСообщениеТрассировки(глСообщенияТрассировки, "Сумма премий, приведенных к отработанному времени составила: _П01", 0, 0, ПриведеннаяСуммаПремий, "Ч15.2");
КонецЕсли;
Если ПорядокРасчетаСреднегоЗаработка > 0 Тогда // добавим пропорциональные премии как есть (у них уже учтены отработанные дни)
ПропорцПремии = РазмерПрочихПремийПропорцион + РасчетныйПериод * РазмерГодовойПремииПропорцион / 12 ;
ПриведеннаяСуммаПремий = ПриведеннаяСуммаПремий + ПропорцПремии;
глСообщениеТрассировки(глСообщенияТрассировки, "Сумма учитываемых за расчетный период пропорциональных премий составила: _П01", 0, 0, ПропорцПремии, "Ч15.2");
КонецЕсли;
КонецЕсли;
глСообщениеТрассировки(глСообщенияТрассировки, "Общая сумма учитываемых за расчетный период премий составила: _П01", 0, -1, ПриведеннаяСуммаПремий, "Ч15.2");
глСообщениеТрассировки(глСообщенияТрассировки, "Делимое для получения среднедневного заработка: _П01", 0, 0, ВсегоРазмерЗаработка + ПриведеннаяСуммаПремий, "Ч15.2");
Если (ВсегоФактОтработано > 0) и (ПорядокРасчетаСреднегоЗаработка > 0) Тогда
СуммаСреднегоЗаработка = (ВсегоРазмерЗаработка + ПриведеннаяСуммаПремий) / ВсегоФактОтработано;
глСообщениеТрассировки(глСообщенияТрассировки, "Сумма заработка приводится к фактически отработанным дням(часам): _П01", 0, 0, ВсегоФактОтработано, "Ч15.2");
ИначеЕсли ВсегоДнейОтработано > 0 тогда
СуммаСреднегоЗаработка = (ВсегоРазмерЗаработка + ПриведеннаяСуммаПремий) / ВсегоДнейОтработано;
глСообщениеТрассировки(глСообщенияТрассировки, "Сумма заработка приводится к количеству дней(часов) по графику: _П01", 0, 0, ВсегоДнейОтработано, "Ч15.2");
Иначе
СуммаСреднегоЗаработка = 0;
КонецЕсли;
Иначе
глСообщениеТрассировки(глСообщенияТрассировки, "За расчетный период не отработано ни одного дня!", 0, 0);
КонецЕсли;
КонецЕсли;
Возврат СуммаСреднегоЗаработка;
КонецФункции // глСуммаСреднегоЗаработка
//******************************************************************************
// глСуммаСреднегоЗаработкаОтпуска(Сотрудник,НачалоСобытия,ТипРасчетаОтпуска,ТипРасчетаДополнительногоОтпуска,ТаблицаДанныхОСреднем)
//
// Параметры:
//
//
// Возвращаемое значение:
// Список значений содержащий суммы среднего заработка (их будет две в случае дополнительного отпуска)
//
// Описание:
//
Функция глСуммаСреднегоЗаработкаОтпуска(Сотрудник,НачалоСобытия,ТипРасчетаОтпуска,ТипРасчетаДополнительногоОтпуска,ТаблицаДанныхОСреднемПарам,РасчетныйПериод,ИспользоватьСреднеЧасовойЗаработок=0) Экспорт
Перем ТаблицаДанныхОСреднем;
ТаблицаДанныхОСреднемПарам.Выгрузить(ТаблицаДанныхОСреднем);
// определим под какой из порядков попал отпуск:
ПорядокРасчетаСреднегоЗаработка = глПолучитьПорядокРасчетаСреднегоЗаработка(НачалоСобытия);
СуммаСреднегоЗаработка = 0;
СуммаСреднегоЗаработкаДополнительного = 0;
Если ТаблицаДанныхОСреднем.КоличествоСтрок() > 0 Тогда
СписокМесяцев = СоздатьОбъект("СписокЗначений");
ВсегоРазмерЗаработка = 0;
ВсегоДнейОтработано = 0;
ВсегоФактОтработано = 0;
ВсегоДнейОтпуска = 0;
ВсегоДнейДополнительного = 0;
ВсегоДнейПоШестидневке = 0;
ВсегоКалендарныхДней = 0;
РазмерГодовойПремии = 0;
РазмерПрочихПремий = 0;
РазмерГодовойПремииПропорцион = 0;
РазмерПрочихПремийПропорцион = 0;
ТаблицаДанныхОСреднем.Свернуть("ВидСтроки,Месяц","РазмерРаспределения,ДнейОтработано,ОтработаноФактически,ДнейОтработаноПоШестидневке,ДнейОтработаноКалендарных");
ТаблицаДанныхОСреднем.ВыбратьСтроки();
Пока ТаблицаДанныхОСреднем.ПолучитьСтроку() = 1 Цикл
ВидСтроки = ТаблицаДанныхОСреднем.ВидСтроки;
Если (ВидСтроки = Перечисление.ВидСтрокиСреднегоЗаработка.Заработок) или (ВидСтроки = Перечисление.ВидСтрокиСреднегоЗаработка.НадбавкаЗаКвалификационныйРазряд)
или (ВидСтроки = Перечисление.ВидСтрокиСреднегоЗаработка.ЗаработокНеИндексируемый) Тогда
ВсегоРазмерЗаработка = ВсегоРазмерЗаработка + ТаблицаДанныхОСреднем.РазмерРаспределения;
Если ВидСтроки = Перечисление.ВидСтрокиСреднегоЗаработка.Заработок Тогда
ВсегоДнейОтработано = ВсегоДнейОтработано + ТаблицаДанныхОСреднем.ДнейОтработано;
ВсегоФактОтработано = ВсегоФактОтработано + ТаблицаДанныхОСреднем.ОтработаноФактически;
ВсегоДнейПоШестидневке = ВсегоДнейПоШестидневке + ТаблицаДанныхОСреднем.ДнейОтработаноПоШестидневке;
ВсегоКалендарныхДней = ВсегоКалендарныхДней + ТаблицаДанныхОСреднем.ДнейОтработаноКалендарных;
ВсегоДнейОтпуска = ВсегоДнейОтпуска + ?(ТипРасчетаОтпуска = Перечисление.ТипРасчетаОтпуска.ПоШестидневке,ТаблицаДанныхОСреднем.ДнейОтработаноПоШестидневке,ТаблицаДанныхОСреднем.ДнейОтработаноКалендарных);
ВсегоДнейДополнительного = ВсегоДнейДополнительного + ?(ТипРасчетаДополнительногоОтпуска = Перечисление.ТипРасчетаОтпуска.ПоШестидневке,ТаблицаДанныхОСреднем.ДнейОтработаноПоШестидневке,ТаблицаДанныхОСреднем.ДнейОтработаноКалендарных);
ДатаМесяца = глДатаПоСтроке(ТаблицаДанныхОСреднем.Месяц);
Если СписокМесяцев.НайтиЗначение(ДатаМесяца) = 0 Тогда
СписокМесяцев.ДобавитьЗначение(ДатаМесяца);
КонецЕсли;
КонецЕсли;
ИначеЕсли ВидСтроки = Перечисление.ВидСтрокиСреднегоЗаработка.ПремияГодовая Тогда // начислено по итогам работы за 12 месяцев
РазмерГодовойПремии = РазмерГодовойПремии + ТаблицаДанныхОСреднем.РазмерРаспределения
ИначеЕсли ВидСтроки = Перечисление.ВидСтрокиСреднегоЗаработка.ПремияЕдиновременная Тогда // премии по итогам работы за несколько месяцев
КоличествоМесяцевПремии = СокрЛП(СтрЗаменить(НРег(ТаблицаДанныхОСреднем.Месяц),"за",""""));
КоличествоМесяцевПремии = Макс(Число(КоличествоМесяцевПремии),1);
РазмерПрочихПремий = РазмерПрочихПремий + ?(КоличествоМесяцевПремии > РасчетныйПериод,ТаблицаДанныхОСреднем.РазмерРаспределения / КоличествоМесяцевПремии * РасчетныйПериод,ТаблицаДанныхОСреднем.РазмерРаспределения)
ИначеЕсли ВидСтроки = Перечисление.ВидСтрокиСреднегоЗаработка.ПремияГодоваяПропорциональная Тогда
РазмерГодовойПремииПропорцион = РазмерГодовойПремииПропорцион + ТаблицаДанныхОСреднем.РазмерРаспределения
ИначеЕсли ВидСтроки = Перечисление.ВидСтрокиСреднегоЗаработка.ПремияЕдиновременнаяПропорциональная Тогда // премии по итогам работы за несколько месяцев
КоличествоМесяцевПремии = СокрЛП(СтрЗаменить(НРег(ТаблицаДанныхОСреднем.Месяц),"за",""""));
КоличествоМесяцевПремии = Макс(Число(КоличествоМесяцевПремии),1);
РазмерПрочихПремийПропорцион = РазмерПрочихПремийПропорцион + ?(КоличествоМесяцевПремии > РасчетныйПериод,ТаблицаДанныхОСреднем.РазмерРаспределения / КоличествоМесяцевПремии * РасчетныйПериод,ТаблицаДанныхОСреднем.РазмерРаспределения)
КонецЕсли;
КонецЦикла;
Если (ВсегоДнейОтработано > 0) или (ВсегоДнейОтпуска > 0) или (ВсегоДнейДополнительного > 0) тогда
МесяцевРасчетногоПериода = СписокМесяцев.РазмерСписка();
СуммированноеВремя = глГрафикСуммированногоУчета(Сотрудник,НачалоСобытия);
СуммированноеВремя = ?( ИспользоватьСреднеЧасовойЗаработок =1,СуммированноеВремя,0);
Режим = ?(СуммированноеВремя = 0,"Дней","Часов");
глСообщениеТрассировки(глСообщенияТрассировки, "Итоговые данные о заработке:", 0, 1);
глСообщениеТрассировки(глСообщенияТрассировки, "в расчетный период включено " + МесяцевРасчетногоПериода + " " + глФормаМножественногоЧисла("месяц","месяца","месяцев",МесяцевРасчетногоПериода), 0, 1);
глСообщениеТрассировки(глСообщенияТрассировки, "за расчетный период отработано по графику " + ВсегоДнейОтработано + " " + НРег(Режим), 0, 0);
глСообщениеТрассировки(глСообщенияТрассировки, "за расчетный период отработано фактически " + ВсегоФактОтработано + " " + НРег(Режим), 0, 0);
Если СуммированноеВремя = 0 Тогда
глСообщениеТрассировки(глСообщенияТрассировки, "по календарю шестидневной недели на отработанное время приходится " + ВсегоДнейПоШестидневке + " " + НРег(Режим), 0, 0);
глСообщениеТрассировки(глСообщенияТрассировки, "календарных "+НРег(Режим)+" на отработанное время приходится " + ВсегоКалендарныхДней, 0, 0);
КонецЕсли;
глСообщениеТрассировки(глСообщенияТрассировки, "основной заработок составил _П01", 0, 0, ВсегоРазмерЗаработка, "Ч15.2");
глСообщениеТрассировки(глСообщенияТрассировки, "премии по итогам года составили _П01", 0, 0, РазмерГодовойПремии , "Ч15.2");
глСообщениеТрассировки(глСообщенияТрассировки, "премии пропорциональные по итогам года составили _П01", 0, 0, РазмерГодовойПремииПропорцион, "Ч15.2");
глСообщениеТрассировки(глСообщенияТрассировки, "сумма месячных частей прочих премий составила _П01", 0, 0, РазмерПрочихПремий , "Ч15.2");
глСообщениеТрассировки(глСообщенияТрассировки, "сумма месячных частей прочих пропорциональных премий составила _П01", 0, -1, РазмерПрочихПремийПропорцион, "Ч15.2");
глСообщениеТрассировки(глСообщенияТрассировки, "Норма отработанного времени (" + НРег(Режим) + ") составила:", 0, 0);
Если РазмерПрочихПремий + РазмерГодовойПремии + РазмерГодовойПремииПропорцион + РазмерПрочихПремийПропорцион = 0 Тогда
ПриведеннаяСуммаПремий = 0
Иначе
ВсегоНормаДней = 0;
Для Сч = 1 По МесяцевРасчетногоПериода Цикл
ДатаМесяца = СписокМесяцев.ПолучитьЗначение(Сч);
НормаДнейЧасов = глНормаДнейЧасовЗаПериод(Сотрудник,НачМесяца(ДатаМесяца),КонМесяца(ДатаМесяца),Режим);
ВсегоНормаДней = ВсегоНормаДней + НормаДнейЧасов;
глСообщениеТрассировки(глСообщенияТрассировки, "за _П01: "+НормаДнейЧасов, 0, ?(Сч = 1,1,?(Сч = МесяцевРасчетногоПериода,-1,0)), ДатаМесяца, "ДММММГГГГ");
КонецЦикла;
Если МесяцевРасчетногоПериода = 1 Тогда
глСообщениеТрассировки(глСообщенияТрассировки, """", 0, -1);
КонецЕсли;
Если ВсегоНормаДней = 0 Тогда
Если глРежимТрассировки = 1 Тогда
глСообщениеТрассировки(глСообщенияТрассировки, "Заполните рабочий календарь сотрудника за месяцы, предшествующие отпуску!", 1, 1);
Иначе
глДобавитьСообщение(глОбработчикСообщений, "Заполните рабочий календарь сотрудника за месяцы, предшествующие отпуску!", Сотрудник, , );
КонецЕсли;
ПриведеннаяСуммаПремий = 0;
Иначе
ДоляОтработанногоВремени = Мин(ВсегоДнейОтработано / ВсегоНормаДней,1);
// если старый порядок, то пропорциональные премии все равно приводим к отработанному времени
ПриведеннаяСуммаПремий = ДоляОтработанногоВремени * (РазмерПрочихПремий+?(ПорядокРасчетаСреднегоЗаработка > 0,0,РазмерПрочихПремийПропорцион) +
РасчетныйПериод * (РазмерГодовойПремии + ?(ПорядокРасчетаСреднегоЗаработка > 0,0,РазмерГодовойПремииПропорцион))/ 12) ;
глСообщениеТрассировки(глСообщенияТрассировки, "Доля отработанного времени за расчетный период составила: _П01", 0, 0, ДоляОтработанногоВремени, "Ч25.20");
глСообщениеТрассировки(глСообщенияТрассировки, "Сумма премий, приведенных к отработанному времени составила: _П01", 0, 0, ПриведеннаяСуммаПремий, "Ч15.2");
КонецЕсли;
Если ПорядокРасчетаСреднегоЗаработка > 0 Тогда // добавим пропорциональные премии как есть (у них уже учтены отработанные дни)
ПропорцПремии = РазмерПрочихПремийПропорцион + РасчетныйПериод * РазмерГодовойПремииПропорцион / 12 ;
ПриведеннаяСуммаПремий = ПриведеннаяСуммаПремий + ПропорцПремии;
глСообщениеТрассировки(глСообщенияТрассировки, "Сумма учитываемых за расчетный период пропорциональных премий составила: _П01", 0, 0, ПропорцПремии, "Ч15.2");
КонецЕсли;
КонецЕсли;
глСообщениеТрассировки(глСообщенияТрассировки, "Общая сумма учитываемых за расчетный период премий составила: _П01", 0, -1, ПриведеннаяСуммаПремий, "Ч15.2");
глСообщениеТрассировки(глСообщенияТрассировки, "Делимое для получения среднедневного заработка: _П01", 0, 0, ВсегоРазмерЗаработка + ПриведеннаяСуммаПремий, "Ч15.2");
Если СуммированноеВремя = 0 Тогда
Если ВсегоДнейОтпуска > 0 тогда
СуммаСреднегоЗаработка = (ВсегоРазмерЗаработка + ПриведеннаяСуммаПремий) / ВсегоДнейОтпуска;
глСообщениеТрассировки(глСообщенияТрассировки, "Сумма заработка приводится к количеству дней: _П01", 0, 0, ВсегоДнейОтпуска, "Ч15.2");
Иначе
СуммаСреднегоЗаработка = 0;
КонецЕсли;
Если ВсегоДнейДополнительного > 0 тогда
СуммаСреднегоЗаработкаДополнительного = (ВсегоРазмерЗаработка + ПриведеннаяСуммаПремий) / ВсегоДнейДополнительного;
КонецЕсли;
Иначе
Если (ВсегоФактОтработано > 0) и (ПорядокРасчетаСреднегоЗаработка > 0) Тогда
СуммаСреднегоЗаработка = (ВсегоРазмерЗаработка + ПриведеннаяСуммаПремий) / ВсегоФактОтработано;
глСообщениеТрассировки(глСообщенияТрассировки, "Сумма заработка приводится к фактически отработанным дням: _П01", 0, 0, ВсегоФактОтработано, "Ч15.2");
ИначеЕсли ВсегоДнейОтработано > 0 тогда
СуммаСреднегоЗаработка = (ВсегоРазмерЗаработка + ПриведеннаяСуммаПремий) / ВсегоДнейОтработано;
глСообщениеТрассировки(глСообщенияТрассировки, "Сумма заработка приводится к количеству дней по графику: _П01", 0, 0, ВсегоДнейОтработано, "Ч15.2");
Иначе
СуммаСреднегоЗаработка = 0;
КонецЕсли;
СуммаСреднегоЗаработкаДополнительного = СуммаСреднегоЗаработка;
КонецЕсли;
Иначе
глСообщениеТрассировки(глСообщенияТрассировки, "За расчетный период не отработано ни одного дня!", 0, 0);
КонецЕсли;
КонецЕсли;
СписокСумм = СоздатьОбъект("СписокЗначений");
СписокСумм.ДобавитьЗначение(СуммаСреднегоЗаработка, "СуммаСреднегоЗаработка");
СписокСумм.ДобавитьЗначение(СуммаСреднегоЗаработкаДополнительного, "СуммаСреднегоЗаработкаДополнительного");
Возврат СписокСумм;
КонецФункции // глСуммаСреднегоЗаработкаОтпуска
//******************************************************************************
...
//******************************************************************************
//******************************************************************************
// ПолучитьКоличествоДнейОтпускаПосле060108()
//
// Параметры:
//
// Возвращаемое значение:
// Количество дней отпуска
//
// Описание:
// В функцию всегда передаются даты одного месяца
// МассивДней[] содержит субботы и воскресенья, помеченные 1 как входящие в отрезок, чтобы их не учитывать как пропуски
Функция ПолучитьКоличествоДнейОтпускаПосле060108(МассивДней[], ДатаНачала, ДатаОкончания, КалендарьОтпуска, ГрафикРаботы,НачалоРП)
День = 0;
ДнейДляОтп = 0;
КалендарныхДнейОтработано = 0;
КалендарныхДнейВМесяце = ДатаОкончания - ДатаНачала +1;
РасчетПоШестидневке = ?(КалендарьОтпуска = Календари.Шестидневка,1,0);
ИндНачала = НомерДняПериода(НачалоРП,ДатаНачала);
ИндОкончания = НомерДняПериода(НачалоРП,ДатаОкончания);
инд = ИндНачала - 1;
Пока инд < ИндОкончания Цикл
инд = инд + 1;
День = МассивДней[инд];
Если День = "Х" тогда
Продолжить;
КонецЕсли;
Если РасчетПоШестидневке = 0 Тогда
//считаем календариные дни приходящиеся на период работы, затем посчитаем дни отпуска,
КалендарныхДнейОтработано = КалендарныхДнейОтработано + День;
Иначе
//для шестидневки надо получить дни по календарю, это и будут дни отпуска
ДатаДня = ДатаНачала + (инд - ИндНачала);
ДатаНачалаОтрезка = ДатаДня;
ЕстьОтрезок = 0;
Пока (День <> 0) и (инд + 1 <= ИндОкончания) Цикл
ЕстьОтрезок = 1;
инд = инд + 1;
День = МассивДней[инд];
ДатаДня = ДатаНачала + (инд - ИндНачала);
КонецЦикла;
Если (День <> 0) и (инд + 1 > ИндОкончания) Тогда
ЕстьОтрезок = 1;
КонецЕсли;
ДатаОкончанияОтрезка = ?(День <> 0, ДатаДня, ДатаДня-1);
Если ЕстьОтрезок = 1 тогда
НадоПересчитать = ?((ДатаНачалаОтрезка = ДатаНачала) и (ДатаОкончанияОтрезка = ДатаОкончания),0,1);
Если НадоПересчитать = 1 тогда
ДнейДляОтп = ДнейДляОтп + КалендарьОтпуска.Дней(ДатаНачалаОтрезка, ДатаОкончанияОтрезка);
Иначе
ДнейДляОтп = КалендарьОтпуска.Дней(ДатаНачалаОтрезка, ДатаОкончанияОтрезка);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если РасчетПоШестидневке = 0 Тогда
//для расчета по календарным дням
Если КалендарныхДнейОтработано = КалендарныхДнейВМесяце Тогда
ДнейДляОтп = 29.4;
ИначеЕсли КалендарныхДнейОтработано >0 Тогда
ДнейДляОтп = Окр(29.4 / КалендарныхДнейВМесяце * КалендарныхДнейОтработано,2);
КонецЕсли;
КонецЕсли;
Возврат ДнейДляОтп;
КонецФункции // ПолучитьКоличествоДнейОтпускаПосле060108
//******************************************************************************"
//******************************************************************************
// глСуммаСреднегоЗаработка(Сотрудник,НачалоСобытия,ТаблицаДанныхОСреднем)
//
// Параметры:
// СписокПараметров - список значений содержащий данные необходимые для расчета суммы среднего заработка
//
// Возвращаемое значение:
// Число - размер заработка
//
// Описание:
//
Функция глСуммаСреднегоЗаработка(Сотрудник,НачалоСобытия,ТаблицаДанныхОСреднемПарам,РасчетныйПериод) Экспорт
Перем ТаблицаДанныхОСреднем;
ТаблицаДанныхОСреднемПарам.Выгрузить(ТаблицаДанныхОСреднем);
// определим под какой из порядков попала оплата:
ПорядокРасчетаСреднегоЗаработка = глПолучитьПорядокРасчетаСреднегоЗаработка(НачалоСобытия);
СуммаСреднегоЗаработка = 0;
Если ТаблицаДанныхОСреднем.КоличествоСтрок() > 0 Тогда
СписокМесяцев = СоздатьОбъект("СписокЗначений");
ВсегоРазмерЗаработка = 0;
ВсегоДнейОтработано = 0;
ВсегоФактОтработано = 0;
РазмерГодовойПремии = 0;
РазмерПрочихПремий = 0;
РазмерГодовойПремииПропорцион = 0;
РазмерПрочихПремийПропорцион = 0;
ТаблицаДанныхОСреднем.Свернуть("ВидСтроки,Месяц","РазмерРаспределения,ДнейОтработано,ОтработаноФактически");
ТаблицаДанныхОСреднем.ВыбратьСтроки();
Пока ТаблицаДанныхОСреднем.ПолучитьСтроку() = 1 Цикл
ВидСтроки = ТаблицаДанныхОСреднем.ВидСтроки;
Если (ВидСтроки = Перечисление.ВидСтрокиСреднегоЗаработка.Заработок) или (ВидСтроки = Перечисление.ВидСтрокиСреднегоЗаработка.НадбавкаЗаКвалификационныйРазряд)
или (ВидСтроки = Перечисление.ВидСтрокиСреднегоЗаработка.ЗаработокНеИндексируемый) Тогда
ВсегоРазмерЗаработка = ВсегоРазмерЗаработка + ТаблицаДанныхОСреднем.РазмерРаспределения;
Если ВидСтроки = Перечисление.ВидСтрокиСреднегоЗаработка.Заработок Тогда
ВсегоДнейОтработано = ВсегоДнейОтработано + ТаблицаДанныхОСреднем.ДнейОтработано;
ВсегоФактОтработано = ВсегоФактОтработано + ТаблицаДанныхОСреднем.ОтработаноФактически;
ДатаМесяца = глДатаПоСтроке(ТаблицаДанныхОСреднем.Месяц);
Если СписокМесяцев.НайтиЗначение(ДатаМесяца) = 0 Тогда
СписокМесяцев.ДобавитьЗначение(ДатаМесяца);
КонецЕсли;
КонецЕсли;
ИначеЕсли ВидСтроки = Перечисление.ВидСтрокиСреднегоЗаработка.ПремияГодовая Тогда // начислено по итогам работы за 12 месяцев
РазмерГодовойПремии = РазмерГодовойПремии + ТаблицаДанныхОСреднем.РазмерРаспределения
ИначеЕсли ВидСтроки = Перечисление.ВидСтрокиСреднегоЗаработка.ПремияЕдиновременная Тогда // премии по итогам работы за несколько месяцев
КоличествоМесяцевПремии = СокрЛП(СтрЗаменить(НРег(ТаблицаДанныхОСреднем.Месяц),"за",""""));
КоличествоМесяцевПремии = Макс(Число(КоличествоМесяцевПремии),1);
РазмерПрочихПремий = РазмерПрочихПремий + ?(КоличествоМесяцевПремии > РасчетныйПериод,ТаблицаДанныхОСреднем.РазмерРаспределения / КоличествоМесяцевПремии * РасчетныйПериод,ТаблицаДанныхОСреднем.РазмерРаспределения)
ИначеЕсли ВидСтроки = Перечисление.ВидСтрокиСреднегоЗаработка.ПремияГодоваяПропорциональная Тогда
РазмерГодовойПремииПропорцион = РазмерГодовойПремииПропорцион + ТаблицаДанныхОСреднем.РазмерРаспределения
ИначеЕсли ВидСтроки = Перечисление.ВидСтрокиСреднегоЗаработка.ПремияЕдиновременнаяПропорциональная Тогда // премии по итогам работы за несколько месяцев
КоличествоМесяцевПремии = СокрЛП(СтрЗаменить(НРег(ТаблицаДанныхОСреднем.Месяц),"за",""""));
КоличествоМесяцевПремии = Макс(Число(КоличествоМесяцевПремии),1);
РазмерПрочихПремийПропорцион = РазмерПрочихПремийПропорцион + ?(КоличествоМесяцевПремии > РасчетныйПериод,ТаблицаДанныхОСреднем.РазмерРаспределения / КоличествоМесяцевПремии * РасчетныйПериод,ТаблицаДанныхОСреднем.РазмерРаспределения)
КонецЕсли;
КонецЦикла;
Если ВсегоДнейОтработано > 0 тогда
МесяцевРасчетногоПериода = СписокМесяцев.РазмерСписка();
Режим = ?(глГрафикСуммированногоУчета(Сотрудник,НачалоСобытия) = 0,"Дней","Часов");
глСообщениеТрассировки(глСообщенияТрассировки, "Итоговые данные о заработке:", 0, 1);
глСообщениеТрассировки(глСообщенияТрассировки, "в расчетный период включено " + МесяцевРасчетногоПериода + " " + глФормаМножественногоЧисла("месяц","месяца","месяцев",МесяцевРасчетногоПериода), 0, 1);
глСообщениеТрассировки(глСообщенияТрассировки, "за расчетный период отработано по графику " + ВсегоДнейОтработано + " " + НРег(Режим), 0, 0);
глСообщениеТрассировки(глСообщенияТрассировки, "за расчетный период отработано фактически " + ВсегоФактОтработано + " " + НРег(Режим), 0, 0);
глСообщениеТрассировки(глСообщенияТрассировки, "за расчетный период отработано " + ВсегоДнейОтработано + " " + НРег(Режим), 0, 0);
глСообщениеТрассировки(глСообщенияТрассировки, "основной заработок составил _П01", 0, 0, ВсегоРазмерЗаработка, "Ч15.2");
глСообщениеТрассировки(глСообщенияТрассировки, "премии по итогам года составили _П01", 0, 0, РазмерГодовойПремии , "Ч15.2");
глСообщениеТрассировки(глСообщенияТрассировки, "премии пропорциональные по итогам года составили _П01", 0, 0, РазмерГодовойПремииПропорцион, "Ч15.2");
глСообщениеТрассировки(глСообщенияТрассировки, "сумма месячных частей прочих премий составила _П01", 0, 0, РазмерПрочихПремий , "Ч15.2");
глСообщениеТрассировки(глСообщенияТрассировки, "сумма месячных частей прочих пропорциональных премий составила _П01", 0,-1, РазмерПрочихПремийПропорцион, "Ч15.2");
глСообщениеТрассировки(глСообщенияТрассировки, "Норма отработанного времени (" + НРег(Режим) + ") составила:", 0, 0);
Если РазмерПрочихПремий + РазмерГодовойПремии + РазмерГодовойПремииПропорцион + РазмерПрочихПремийПропорцион = 0 Тогда
ПриведеннаяСуммаПремий = 0
Иначе
ВсегоНормаДней = 0;
СписокМесяцев.Сортировать();
Для Сч = 1 По МесяцевРасчетногоПериода Цикл
ДатаМесяца = СписокМесяцев.ПолучитьЗначение(Сч);
НормаДнейЧасов = глНормаДнейЧасовЗаПериод(Сотрудник,НачМесяца(ДатаМесяца),КонМесяца(ДатаМесяца),Режим);
ВсегоНормаДней = ВсегоНормаДней + НормаДнейЧасов;
глСообщениеТрассировки(глСообщенияТрассировки, "за _П01: "+НормаДнейЧасов, 0, ?(Сч = 1,1,?(Сч = МесяцевРасчетногоПериода,-1,0)), ДатаМесяца, "ДММММГГГГ");
КонецЦикла;
Если МесяцевРасчетногоПериода = 1 Тогда
глСообщениеТрассировки(глСообщенияТрассировки, """", 0, -1);
КонецЕсли;
Если ВсегоНормаДней = 0 Тогда
Если глРежимТрассировки = 1 Тогда
глСообщениеТрассировки(глСообщенияТрассировки, "Заполните рабочий календарь сотрудника за месяцы, предшествующие событию!", 1, 1);
Иначе
глДобавитьСообщение(глОбработчикСообщений, "Заполните рабочий календарь сотрудника за месяцы, предшествующие событию!", Сотрудник, , );
КонецЕсли;
ПриведеннаяСуммаПремий = 0;
Иначе
ДоляОтработанногоВремени = Мин(ВсегоДнейОтработано / ВсегоНормаДней,1);
// если старый порядок, то пропорциональные премии все равно приводим к отработанному времени
ПриведеннаяСуммаПремий = ДоляОтработанногоВремени * (РазмерПрочихПремий + ?(ПорядокРасчетаСреднегоЗаработка > 0,0,РазмерПрочихПремийПропорцион)
+ РасчетныйПериод * (РазмерГодовойПремии + ?(ПорядокРасчетаСреднегоЗаработка > 0,0,РазмерГодовойПремииПропорцион)) / 12) ;
глСообщениеТрассировки(глСообщенияТрассировки, "Доля отработанного времени за расчетный период составила: _П01", 0, 0, ДоляОтработанногоВремени, "Ч25.20");
глСообщениеТрассировки(глСообщенияТрассировки, "Сумма премий, приведенных к отработанному времени составила: _П01", 0, 0, ПриведеннаяСуммаПремий, "Ч15.2");
КонецЕсли;
Если ПорядокРасчетаСреднегоЗаработка > 0 Тогда // добавим пропорциональные премии как есть (у них уже учтены отработанные дни)
ПропорцПремии = РазмерПрочихПремийПропорцион + РасчетныйПериод * РазмерГодовойПремииПропорцион / 12 ;
ПриведеннаяСуммаПремий = ПриведеннаяСуммаПремий + ПропорцПремии;
глСообщениеТрассировки(глСообщенияТрассировки, "Сумма учитываемых за расчетный период пропорциональных премий составила: _П01", 0, 0, ПропорцПремии, "Ч15.2");
КонецЕсли;
КонецЕсли;
глСообщениеТрассировки(глСообщенияТрассировки, "Общая сумма учитываемых за расчетный период премий составила: _П01", 0, -1, ПриведеннаяСуммаПремий, "Ч15.2");
глСообщениеТрассировки(глСообщенияТрассировки, "Делимое для получения среднедневного заработка: _П01", 0, 0, ВсегоРазмерЗаработка + ПриведеннаяСуммаПремий, "Ч15.2");
Если (ВсегоФактОтработано > 0) и (ПорядокРасчетаСреднегоЗаработка > 0) Тогда
СуммаСреднегоЗаработка = (ВсегоРазмерЗаработка + ПриведеннаяСуммаПремий) / ВсегоФактОтработано;
глСообщениеТрассировки(глСообщенияТрассировки, "Сумма заработка приводится к фактически отработанным дням(часам): _П01", 0, 0, ВсегоФактОтработано, "Ч15.2");
ИначеЕсли ВсегоДнейОтработано > 0 тогда
СуммаСреднегоЗаработка = (ВсегоРазмерЗаработка + ПриведеннаяСуммаПремий) / ВсегоДнейОтработано;
глСообщениеТрассировки(глСообщенияТрассировки, "Сумма заработка приводится к количеству дней(часов) по графику: _П01", 0, 0, ВсегоДнейОтработано, "Ч15.2");
Иначе
СуммаСреднегоЗаработка = 0;
КонецЕсли;
Иначе
глСообщениеТрассировки(глСообщенияТрассировки, "За расчетный период не отработано ни одного дня!", 0, 0);
КонецЕсли;
КонецЕсли;
Возврат СуммаСреднегоЗаработка;
КонецФункции // глСуммаСреднегоЗаработка
//******************************************************************************
// глСуммаСреднегоЗаработкаОтпуска(Сотрудник,НачалоСобытия,ТипРасчетаОтпуска,ТипРасчетаДополнительногоОтпуска,ТаблицаДанныхОСреднем)
//
// Параметры:
//
//
// Возвращаемое значение:
// Список значений содержащий суммы среднего заработка (их будет две в случае дополнительного отпуска)
//
// Описание:
//
Функция глСуммаСреднегоЗаработкаОтпуска(Сотрудник,НачалоСобытия,ТипРасчетаОтпуска,ТипРасчетаДополнительногоОтпуска,ТаблицаДанныхОСреднемПарам,РасчетныйПериод,ИспользоватьСреднеЧасовойЗаработок=0) Экспорт
Перем ТаблицаДанныхОСреднем;
ТаблицаДанныхОСреднемПарам.Выгрузить(ТаблицаДанныхОСреднем);
// определим под какой из порядков попал отпуск:
ПорядокРасчетаСреднегоЗаработка = глПолучитьПорядокРасчетаСреднегоЗаработка(НачалоСобытия);
СуммаСреднегоЗаработка = 0;
СуммаСреднегоЗаработкаДополнительного = 0;
Если ТаблицаДанныхОСреднем.КоличествоСтрок() > 0 Тогда
СписокМесяцев = СоздатьОбъект("СписокЗначений");
ВсегоРазмерЗаработка = 0;
ВсегоДнейОтработано = 0;
ВсегоФактОтработано = 0;
ВсегоДнейОтпуска = 0;
ВсегоДнейДополнительного = 0;
ВсегоДнейПоШестидневке = 0;
ВсегоКалендарныхДней = 0;
РазмерГодовойПремии = 0;
РазмерПрочихПремий = 0;
РазмерГодовойПремииПропорцион = 0;
РазмерПрочихПремийПропорцион = 0;
ТаблицаДанныхОСреднем.Свернуть("ВидСтроки,Месяц","РазмерРаспределения,ДнейОтработано,ОтработаноФактически,ДнейОтработаноПоШестидневке,ДнейОтработаноКалендарных");
ТаблицаДанныхОСреднем.ВыбратьСтроки();
Пока ТаблицаДанныхОСреднем.ПолучитьСтроку() = 1 Цикл
ВидСтроки = ТаблицаДанныхОСреднем.ВидСтроки;
Если (ВидСтроки = Перечисление.ВидСтрокиСреднегоЗаработка.Заработок) или (ВидСтроки = Перечисление.ВидСтрокиСреднегоЗаработка.НадбавкаЗаКвалификационныйРазряд)
или (ВидСтроки = Перечисление.ВидСтрокиСреднегоЗаработка.ЗаработокНеИндексируемый) Тогда
ВсегоРазмерЗаработка = ВсегоРазмерЗаработка + ТаблицаДанныхОСреднем.РазмерРаспределения;
Если ВидСтроки = Перечисление.ВидСтрокиСреднегоЗаработка.Заработок Тогда
ВсегоДнейОтработано = ВсегоДнейОтработано + ТаблицаДанныхОСреднем.ДнейОтработано;
ВсегоФактОтработано = ВсегоФактОтработано + ТаблицаДанныхОСреднем.ОтработаноФактически;
ВсегоДнейПоШестидневке = ВсегоДнейПоШестидневке + ТаблицаДанныхОСреднем.ДнейОтработаноПоШестидневке;
ВсегоКалендарныхДней = ВсегоКалендарныхДней + ТаблицаДанныхОСреднем.ДнейОтработаноКалендарных;
ВсегоДнейОтпуска = ВсегоДнейОтпуска + ?(ТипРасчетаОтпуска = Перечисление.ТипРасчетаОтпуска.ПоШестидневке,ТаблицаДанныхОСреднем.ДнейОтработаноПоШестидневке,ТаблицаДанныхОСреднем.ДнейОтработаноКалендарных);
ВсегоДнейДополнительного = ВсегоДнейДополнительного + ?(ТипРасчетаДополнительногоОтпуска = Перечисление.ТипРасчетаОтпуска.ПоШестидневке,ТаблицаДанныхОСреднем.ДнейОтработаноПоШестидневке,ТаблицаДанныхОСреднем.ДнейОтработаноКалендарных);
ДатаМесяца = глДатаПоСтроке(ТаблицаДанныхОСреднем.Месяц);
Если СписокМесяцев.НайтиЗначение(ДатаМесяца) = 0 Тогда
СписокМесяцев.ДобавитьЗначение(ДатаМесяца);
КонецЕсли;
КонецЕсли;
ИначеЕсли ВидСтроки = Перечисление.ВидСтрокиСреднегоЗаработка.ПремияГодовая Тогда // начислено по итогам работы за 12 месяцев
РазмерГодовойПремии = РазмерГодовойПремии + ТаблицаДанныхОСреднем.РазмерРаспределения
ИначеЕсли ВидСтроки = Перечисление.ВидСтрокиСреднегоЗаработка.ПремияЕдиновременная Тогда // премии по итогам работы за несколько месяцев
КоличествоМесяцевПремии = СокрЛП(СтрЗаменить(НРег(ТаблицаДанныхОСреднем.Месяц),"за",""""));
КоличествоМесяцевПремии = Макс(Число(КоличествоМесяцевПремии),1);
РазмерПрочихПремий = РазмерПрочихПремий + ?(КоличествоМесяцевПремии > РасчетныйПериод,ТаблицаДанныхОСреднем.РазмерРаспределения / КоличествоМесяцевПремии * РасчетныйПериод,ТаблицаДанныхОСреднем.РазмерРаспределения)
ИначеЕсли ВидСтроки = Перечисление.ВидСтрокиСреднегоЗаработка.ПремияГодоваяПропорциональная Тогда
РазмерГодовойПремииПропорцион = РазмерГодовойПремииПропорцион + ТаблицаДанныхОСреднем.РазмерРаспределения
ИначеЕсли ВидСтроки = Перечисление.ВидСтрокиСреднегоЗаработка.ПремияЕдиновременнаяПропорциональная Тогда // премии по итогам работы за несколько месяцев
КоличествоМесяцевПремии = СокрЛП(СтрЗаменить(НРег(ТаблицаДанныхОСреднем.Месяц),"за",""""));
КоличествоМесяцевПремии = Макс(Число(КоличествоМесяцевПремии),1);
РазмерПрочихПремийПропорцион = РазмерПрочихПремийПропорцион + ?(КоличествоМесяцевПремии > РасчетныйПериод,ТаблицаДанныхОСреднем.РазмерРаспределения / КоличествоМесяцевПремии * РасчетныйПериод,ТаблицаДанныхОСреднем.РазмерРаспределения)
КонецЕсли;
КонецЦикла;
Если (ВсегоДнейОтработано > 0) или (ВсегоДнейОтпуска > 0) или (ВсегоДнейДополнительного > 0) тогда
МесяцевРасчетногоПериода = СписокМесяцев.РазмерСписка();
СуммированноеВремя = глГрафикСуммированногоУчета(Сотрудник,НачалоСобытия);
СуммированноеВремя = ?( ИспользоватьСреднеЧасовойЗаработок =1,СуммированноеВремя,0);
Режим = ?(СуммированноеВремя = 0,"Дней","Часов");
глСообщениеТрассировки(глСообщенияТрассировки, "Итоговые данные о заработке:", 0, 1);
глСообщениеТрассировки(глСообщенияТрассировки, "в расчетный период включено " + МесяцевРасчетногоПериода + " " + глФормаМножественногоЧисла("месяц","месяца","месяцев",МесяцевРасчетногоПериода), 0, 1);
глСообщениеТрассировки(глСообщенияТрассировки, "за расчетный период отработано по графику " + ВсегоДнейОтработано + " " + НРег(Режим), 0, 0);
глСообщениеТрассировки(глСообщенияТрассировки, "за расчетный период отработано фактически " + ВсегоФактОтработано + " " + НРег(Режим), 0, 0);
Если СуммированноеВремя = 0 Тогда
глСообщениеТрассировки(глСообщенияТрассировки, "по календарю шестидневной недели на отработанное время приходится " + ВсегоДнейПоШестидневке + " " + НРег(Режим), 0, 0);
глСообщениеТрассировки(глСообщенияТрассировки, "календарных "+НРег(Режим)+" на отработанное время приходится " + ВсегоКалендарныхДней, 0, 0);
КонецЕсли;
глСообщениеТрассировки(глСообщенияТрассировки, "основной заработок составил _П01", 0, 0, ВсегоРазмерЗаработка, "Ч15.2");
глСообщениеТрассировки(глСообщенияТрассировки, "премии по итогам года составили _П01", 0, 0, РазмерГодовойПремии , "Ч15.2");
глСообщениеТрассировки(глСообщенияТрассировки, "премии пропорциональные по итогам года составили _П01", 0, 0, РазмерГодовойПремииПропорцион, "Ч15.2");
глСообщениеТрассировки(глСообщенияТрассировки, "сумма месячных частей прочих премий составила _П01", 0, 0, РазмерПрочихПремий , "Ч15.2");
глСообщениеТрассировки(глСообщенияТрассировки, "сумма месячных частей прочих пропорциональных премий составила _П01", 0, -1, РазмерПрочихПремийПропорцион, "Ч15.2");
глСообщениеТрассировки(глСообщенияТрассировки, "Норма отработанного времени (" + НРег(Режим) + ") составила:", 0, 0);
Если РазмерПрочихПремий + РазмерГодовойПремии + РазмерГодовойПремииПропорцион + РазмерПрочихПремийПропорцион = 0 Тогда
ПриведеннаяСуммаПремий = 0
Иначе
ВсегоНормаДней = 0;
Для Сч = 1 По МесяцевРасчетногоПериода Цикл
ДатаМесяца = СписокМесяцев.ПолучитьЗначение(Сч);
НормаДнейЧасов = глНормаДнейЧасовЗаПериод(Сотрудник,НачМесяца(ДатаМесяца),КонМесяца(ДатаМесяца),Режим);
ВсегоНормаДней = ВсегоНормаДней + НормаДнейЧасов;
глСообщениеТрассировки(глСообщенияТрассировки, "за _П01: "+НормаДнейЧасов, 0, ?(Сч = 1,1,?(Сч = МесяцевРасчетногоПериода,-1,0)), ДатаМесяца, "ДММММГГГГ");
КонецЦикла;
Если МесяцевРасчетногоПериода = 1 Тогда
глСообщениеТрассировки(глСообщенияТрассировки, """", 0, -1);
КонецЕсли;
Если ВсегоНормаДней = 0 Тогда
Если глРежимТрассировки = 1 Тогда
глСообщениеТрассировки(глСообщенияТрассировки, "Заполните рабочий календарь сотрудника за месяцы, предшествующие отпуску!", 1, 1);
Иначе
глДобавитьСообщение(глОбработчикСообщений, "Заполните рабочий календарь сотрудника за месяцы, предшествующие отпуску!", Сотрудник, , );
КонецЕсли;
ПриведеннаяСуммаПремий = 0;
Иначе
ДоляОтработанногоВремени = Мин(ВсегоДнейОтработано / ВсегоНормаДней,1);
// если старый порядок, то пропорциональные премии все равно приводим к отработанному времени
ПриведеннаяСуммаПремий = ДоляОтработанногоВремени * (РазмерПрочихПремий+?(ПорядокРасчетаСреднегоЗаработка > 0,0,РазмерПрочихПремийПропорцион) +
РасчетныйПериод * (РазмерГодовойПремии + ?(ПорядокРасчетаСреднегоЗаработка > 0,0,РазмерГодовойПремииПропорцион))/ 12) ;
глСообщениеТрассировки(глСообщенияТрассировки, "Доля отработанного времени за расчетный период составила: _П01", 0, 0, ДоляОтработанногоВремени, "Ч25.20");
глСообщениеТрассировки(глСообщенияТрассировки, "Сумма премий, приведенных к отработанному времени составила: _П01", 0, 0, ПриведеннаяСуммаПремий, "Ч15.2");
КонецЕсли;
Если ПорядокРасчетаСреднегоЗаработка > 0 Тогда // добавим пропорциональные премии как есть (у них уже учтены отработанные дни)
ПропорцПремии = РазмерПрочихПремийПропорцион + РасчетныйПериод * РазмерГодовойПремииПропорцион / 12 ;
ПриведеннаяСуммаПремий = ПриведеннаяСуммаПремий + ПропорцПремии;
глСообщениеТрассировки(глСообщенияТрассировки, "Сумма учитываемых за расчетный период пропорциональных премий составила: _П01", 0, 0, ПропорцПремии, "Ч15.2");
КонецЕсли;
КонецЕсли;
глСообщениеТрассировки(глСообщенияТрассировки, "Общая сумма учитываемых за расчетный период премий составила: _П01", 0, -1, ПриведеннаяСуммаПремий, "Ч15.2");
глСообщениеТрассировки(глСообщенияТрассировки, "Делимое для получения среднедневного заработка: _П01", 0, 0, ВсегоРазмерЗаработка + ПриведеннаяСуммаПремий, "Ч15.2");
Если СуммированноеВремя = 0 Тогда
Если ВсегоДнейОтпуска > 0 тогда
СуммаСреднегоЗаработка = (ВсегоРазмерЗаработка + ПриведеннаяСуммаПремий) / ВсегоДнейОтпуска;
глСообщениеТрассировки(глСообщенияТрассировки, "Сумма заработка приводится к количеству дней: _П01", 0, 0, ВсегоДнейОтпуска, "Ч15.2");
Иначе
СуммаСреднегоЗаработка = 0;
КонецЕсли;
Если ВсегоДнейДополнительного > 0 тогда
СуммаСреднегоЗаработкаДополнительного = (ВсегоРазмерЗаработка + ПриведеннаяСуммаПремий) / ВсегоДнейДополнительного;
КонецЕсли;
Иначе
Если (ВсегоФактОтработано > 0) и (ПорядокРасчетаСреднегоЗаработка > 0) Тогда
СуммаСреднегоЗаработка = (ВсегоРазмерЗаработка + ПриведеннаяСуммаПремий) / ВсегоФактОтработано;
глСообщениеТрассировки(глСообщенияТрассировки, "Сумма заработка приводится к фактически отработанным дням: _П01", 0, 0, ВсегоФактОтработано, "Ч15.2");
ИначеЕсли ВсегоДнейОтработано > 0 тогда
СуммаСреднегоЗаработка = (ВсегоРазмерЗаработка + ПриведеннаяСуммаПремий) / ВсегоДнейОтработано;
глСообщениеТрассировки(глСообщенияТрассировки, "Сумма заработка приводится к количеству дней по графику: _П01", 0, 0, ВсегоДнейОтработано, "Ч15.2");
Иначе
СуммаСреднегоЗаработка = 0;
КонецЕсли;
СуммаСреднегоЗаработкаДополнительного = СуммаСреднегоЗаработка;
КонецЕсли;
Иначе
глСообщениеТрассировки(глСообщенияТрассировки, "За расчетный период не отработано ни одного дня!", 0, 0);
КонецЕсли;
КонецЕсли;
СписокСумм = СоздатьОбъект("СписокЗначений");
СписокСумм.ДобавитьЗначение(СуммаСреднегоЗаработка, "СуммаСреднегоЗаработка");
СписокСумм.ДобавитьЗначение(СуммаСреднегоЗаработкаДополнительного, "СуммаСреднегоЗаработкаДополнительного");
Возврат СписокСумм;
КонецФункции // глСуммаСреднегоЗаработкаОтпуска
//******************************************************************************
...
//******************************************************************************
//******************************************************************************
// ПолучитьКоличествоДнейОтпускаПосле060108()
//
// Параметры:
//
// Возвращаемое значение:
// Количество дней отпуска
//
// Описание:
// В функцию всегда передаются даты одного месяца
// МассивДней[] содержит субботы и воскресенья, помеченные 1 как входящие в отрезок, чтобы их не учитывать как пропуски
Функция ПолучитьКоличествоДнейОтпускаПосле060108(МассивДней[], ДатаНачала, ДатаОкончания, КалендарьОтпуска, ГрафикРаботы,НачалоРП)
День = 0;
ДнейДляОтп = 0;
КалендарныхДнейОтработано = 0;
КалендарныхДнейВМесяце = ДатаОкончания - ДатаНачала +1;
РасчетПоШестидневке = ?(КалендарьОтпуска = Календари.Шестидневка,1,0);
ИндНачала = НомерДняПериода(НачалоРП,ДатаНачала);
ИндОкончания = НомерДняПериода(НачалоРП,ДатаОкончания);
инд = ИндНачала - 1;
Пока инд < ИндОкончания Цикл
инд = инд + 1;
День = МассивДней[инд];
Если День = "Х" тогда
Продолжить;
КонецЕсли;
Если РасчетПоШестидневке = 0 Тогда
//считаем календариные дни приходящиеся на период работы, затем посчитаем дни отпуска,
КалендарныхДнейОтработано = КалендарныхДнейОтработано + День;
Иначе
//для шестидневки надо получить дни по календарю, это и будут дни отпуска
ДатаДня = ДатаНачала + (инд - ИндНачала);
ДатаНачалаОтрезка = ДатаДня;
ЕстьОтрезок = 0;
Пока (День <> 0) и (инд + 1 <= ИндОкончания) Цикл
ЕстьОтрезок = 1;
инд = инд + 1;
День = МассивДней[инд];
ДатаДня = ДатаНачала + (инд - ИндНачала);
КонецЦикла;
Если (День <> 0) и (инд + 1 > ИндОкончания) Тогда
ЕстьОтрезок = 1;
КонецЕсли;
ДатаОкончанияОтрезка = ?(День <> 0, ДатаДня, ДатаДня-1);
Если ЕстьОтрезок = 1 тогда
НадоПересчитать = ?((ДатаНачалаОтрезка = ДатаНачала) и (ДатаОкончанияОтрезка = ДатаОкончания),0,1);
Если НадоПересчитать = 1 тогда
ДнейДляОтп = ДнейДляОтп + КалендарьОтпуска.Дней(ДатаНачалаОтрезка, ДатаОкончанияОтрезка);
Иначе
ДнейДляОтп = КалендарьОтпуска.Дней(ДатаНачалаОтрезка, ДатаОкончанияОтрезка);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если РасчетПоШестидневке = 0 Тогда
//для расчета по календарным дням
Если КалендарныхДнейОтработано = КалендарныхДнейВМесяце Тогда
ДнейДляОтп = 29.4;
ИначеЕсли КалендарныхДнейОтработано >0 Тогда
ДнейДляОтп = Окр(29.4 / КалендарныхДнейВМесяце * КалендарныхДнейОтработано,2);
КонецЕсли;
КонецЕсли;
Возврат ДнейДляОтп;
КонецФункции // ПолучитьКоличествоДнейОтпускаПосле060108
//******************************************************************************"
Вопросы по Бюджетированию 1С:Предприятие 8.1 (8.1.12.101) УПП1.2 (1.2.17.3)минусовое агентское вознаграждение
Читают тему
(гостей: 1)