gifts2017

Расчет дополнительного отпуска при увольнении из организации

Опубликовал Tania Moiseeva (CarrotM) в раздел Программирование - Практика программирования

Документ "УвольнениеИзОрганизации" (регламентированный) учет в ЗУП не позволяет без доработки конфигурации рассчитать остаток дополнительного отпуска.
Типовой механизм учитывает только основной ежегодный отпуск.

Для того, чтобы остаток дополнительного отпуска рассчитывался, необходимо внести изменения в общий модуль: ОстаткиОтпусков, привожу код с имзменениями:

Функция ОстатокОтпускаСотрудникаНаДату(Сотрудник, ДатаОстатков = '00010101', ЭтоРасчетПриУвольнении = Ложь, ПорядокРасчетаОсновногоОтпуска = Неопределено) Экспорт
    
    Если Не ЗначениеЗаполнено(Сотрудник) Тогда
        Возврат 0;
    КонецЕсли;
    
    Если Не ЗначениеЗаполнено(ДатаОстатков) Тогда
        ДатаОстатков = НачалоДня(ТекущаяДатаСеанса());
    КонецЕсли;
    //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    ТаблицаДанныхДоп = ОписаниеТаблицыДанных();
    
    Строка = ТаблицаДанныхДоп.Добавить();
    Строка.Сотрудник                            = Сотрудник;
    Строка.ДатаОстатков                            = НачалоДня(ДатаОстатков);
    Строка.ЭтоРасчетПриУвольнении                = ЭтоРасчетПриУвольнении;
    Если ЭтоРасчетПриУвольнении Тогда
        Если ПорядокРасчетаОсновногоОтпуска = Перечисления.ПорядокРасчетаОтпуска.ПоШестидневке Тогда
            Строка.ОтборПоВидуЕжегодногоОтпуска    = ОбщегоНазначенияЗК.ПолучитьЗначениеРеквизита(ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ОплатаПоСреднемуОтпШестидневка, "ВидЕжегодногоОтпуска");
        Иначе
            Строка.ОтборПоВидуЕжегодногоОтпуска    = ОбщегоНазначенияЗК.ПолучитьЗначениеРеквизита(ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.НайтиПоКоду("00099"), "ВидЕжегодногоОтпуска");
        КонецЕсли;
    КонецЕсли;
    
    РезультатДоп = ОстаткиОтпусков(ТаблицаДанныхДоп)[0];

    ОстатокДопОтпуска=РезультатДоп.ОстатокНаДату;
    
    //______________________________________________________________________________
    
    
    ТаблицаДанных = ОписаниеТаблицыДанных();
    
    Строка = ТаблицаДанных.Добавить();
    Строка.Сотрудник                            = Сотрудник;
    Строка.ДатаОстатков                            = НачалоДня(ДатаОстатков);
    Строка.ЭтоРасчетПриУвольнении                = ЭтоРасчетПриУвольнении;
    Если ЭтоРасчетПриУвольнении Тогда
        Если ПорядокРасчетаОсновногоОтпуска = Перечисления.ПорядокРасчетаОтпуска.ПоШестидневке Тогда
            Строка.ОтборПоВидуЕжегодногоОтпуска    = ОбщегоНазначенияЗК.ПолучитьЗначениеРеквизита(ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ОплатаПоСреднемуОтпШестидневка, "ВидЕжегодногоОтпуска");
        Иначе
            Строка.ОтборПоВидуЕжегодногоОтпуска    = ОбщегоНазначенияЗК.ПолучитьЗначениеРеквизита(ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ОплатаПоСреднемуОтпКалендарныеДни, "ВидЕжегодногоОтпуска");
        КонецЕсли;
    КонецЕсли;
    
    Результат = ОстаткиОтпусков(ТаблицаДанных)[0];
        
    ОстаткиВРазрезеРабочихЛетИВидовОтпусков = Новый Массив;
    Для Каждого РабочийГод Из Результат.ДанныеРасчета Цикл
        Если РабочийГод.ДоступноДляСписанияВЭтомГоду = 0 Тогда
            Продолжить;
        КонецЕсли;
        ОстаткиВРазрезеРабочихЛетИВидовОтпусков.Добавить(Новый Структура("ВидЕжегодногоОтпуска, ОсталосьДней, РабочийГодС, РабочийГодПо, ПоследнийРабочийГод",
            РабочийГод.ВидЕжегодногоОтпуска, РабочийГод.ДоступноДляСписанияВЭтомГоду, РабочийГод.ДатаНачала, РабочийГод.ДатаОкончания, РабочийГод.ПоследнийРабочийГод));
    КонецЦикла;
    
    //++++++++++++++++++++++++++++++++++++++++++Расчитаем Доп отпуск+Основной+++++++++++++++++
    
    Возврат Новый Структура("ОстатокНаДату, РабочийГодС, РабочийГодПо, Примечание, ОстаткиВРазрезеВидовОтпусков, ОстаткиВРазрезеРабочихЛетИВидовОтпусков",
        Результат.ОстатокНаДату+ОстатокДопОтпуска, Результат.РабочийГодС, Результат.РабочийГодПо, Результат.Примечание, Результат.ОстатокНаДатуПоВидамЕжегодныхОтпусков, ОстаткиВРазрезеРабочихЛетИВидовОтпусков);
        
        
    //________________________________________________________________________________________________    
КонецФункции

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Дмитрий Бухалов (Re:аниматор) 30.04.14 11:41
ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.НайтиПоКоду("00099")


А как быть, если у кого то нет основного начисления организации с кодом 00099?
2. CITRUM CITRUM (CITRUM) 30.04.14 16:41
А как быть с тем, что расчет при увольнении спишет Основной+Дополнительный только с основного отпуска? В итоге будет минус по основному и плюс по дополнительному. Понятно, что суммарно будет ноль, но выглядит все равно коряво.
3. Владимир Васильев (VladimirKHV) 07.05.14 06:19
Перемудрено, я просто закомментил

//Если ЭтоРасчетПриУвольнении Тогда
// Если ПорядокРасчетаОсновногоОтпуска = Перечисления.ПорядокРасчетаОтпуска.ПоШестидневке Тогда
// Строка.ОтборПоВидуЕжегодногоОтпуска = ОбщегоНазначения.ПолучитьЗначениеРеквизита(ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ОплатаПоСреднемуОтпШестидневка, "ВидЕжегодногоОтпуска");
// Иначе
// Строка.ОтборПоВидуЕжегодногоОтпуска = ОбщегоНазначения.ПолучитьЗначениеРеквизита(ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ОплатаПоСреднемуОтпКалендарныеДни, "ВидЕжегодногоОтпуска");
// КонецЕсли;
//КонецЕсли;

Т.е отключил отбор по только по основному отпуску, и он сам прекрасно считает остатки по всем видам отпусков

Можно даже по другому, в модулях форм документов увольнения и расчета при вызове функции 3 параметр поменять на ЛОЖЬ

Ну а потом, тем кто хочет (2) списывать раздельно, в модуле документа расчета, при обработке движений, вызвать функцию с ИСТИНА, получить количество дней основного, отнять от общего, получится дней дополнительного.