1С ЗиК 7.7 -- неиспользованные дни отпуска

Новая тема
Добрый день!
Подскажите, пожалуйста, ведется ли в программе автоматический учет количества неиспользованных дней отпуска у сотрудника? Если нет, то как можно эти дни посчитать?
"Расчет дней компенсации за неиспользованный отпуск
в приказе об увольнении (ЗиК)

Процедура для автоматического заполнения поля
"дни компенсации" в документе "Приказ об увольнении"
типовой конфигурации "Зарплата и Кадры. Редакция 2.3"
(проверено в релизе 283) .

В новой версии:
- учитываются исправления, сторнирования и
 пересечения документов-отклонений;
- учитываются все периоды, исключаемые из стажа для
 подсчета отпуска по статье 121 ТК (прогулы, отпуска
 по уходу за ребенком, отпуска за свой счет).

Инструкция:
1. Вставить текст процедуры СчитатьДниКомпенсации()
  в модуль формы документа ПриказОбУвольнении.
2. Вставить вызов процедуры СчитатьДниКомпенсации() в:
  - текст процедуры ВводНового() модуля формы;
  - реквизит диалога Сотрудник;
  - реквизит диалога ДатаУвольнения.

Antia



//            
// Нормативная база.
// Трудовой Кодекс РФ (от 30.12.2001 № 197-ФЗ) (далее - ТК)
// Правила об очередных и дополнительных отпусках (утв. Народным Комиссариатом Труда СССР
// 30.04.1930 № 169) (далее - Правила)
Процедура СчитатьДниКомпенсации()

ПриказОПриеме = глПриказПоСотруднику(Сотрудник, ДатаУвольнения, "ПриказОПриемеНаРаботу");
Если ПустоеЗначение(ПриказОПриеме) = 0 Тогда
ДатаПриема = ПриказОПриеме.ДатаПриема;
Иначе        
Компенсация = 1;
ДнейКомпенсацииОтпускавФорме = 0;    
Возврат;
КонецЕсли;
                       
ДнейПрогулов = 0;
ДнейОтпускаПоУходу = 0;
ДнейОтпускаЗаСвойСчет = 0;
ДнейОтпуска7 = 0;
ДнейОтпуска6 = 0;
Календарь7 = СоздатьОбъект("Календарь.ДляРасчетаОтпускаПоКалендДням");
Календарь6 = СоздатьОбъект("Календарь.Шестидневка");          
ОтпускЗаСвойСчет = СоздатьОбъект("ТаблицаЗначений");
ОтпускЗаСвойСчет.НоваяКолонка("Год","Число");
ОтпускЗаСвойСчет.НоваяКолонка("Дни","Число");
                                             
// Все нужные для расчета дни собираем по данным ЖЗ с учетом реквизита Сторно. Это
// позволит учесть исправления, сторнирования и пересечения документов-отклонений.
ЖЗ = СоздатьОбъект("ЖурналРасчетов.Зарплата");
ЖЗ.ВыбратьЗаписиПоОбъекту(Сотрудник, ЖЗ.НачалоПериодаПоДате(ДатаПриема), ЖЗ.КонецПериодаПоДате(ДатаУвольнения));
Пока ЖЗ.ПолучитьЗапись() = 1 Цикл            

Если ЖЗ.ВидРасч = ВидРасчета.ОтпускОчередной Тогда
Если ЖЗ.Документ.ТипРасчетаОтпуска = Перечисление.ТипРасчетаОтпуска.ПоКалендарнымДням Тогда
ДнейОтпуска7 = ДнейОтпуска7 + Календарь7.Дней(ЖЗ.ДатаНачала, ЖЗ.ДатаОкончания) * ?(ЖЗ.Сторно = 1, -1, 1);
ИначеЕсли ЖЗ.Документ.ТипРасчетаОтпуска = Перечисление.ТипРасчетаОтпуска.ПоШестидневке Тогда
ДнейОтпуска6 = ДнейОтпуска6 + Календарь6.Дней(ЖЗ.ДатаНачала, ЖЗ.ДатаОкончания) * ?(ЖЗ.Сторно = 1, -1, 1);
КонецЕсли;

ИначеЕсли ЖЗ.ВидРасч = ВидРасчета.Невыход Тогда
Если ЖЗ.Документ.ПричинаОтсутствия = Перечисление.ПричинаОтсутствия.Прогул Тогда
ДнейПрогулов = ДнейПрогулов + (ЖЗ.ДатаОкончания - ЖЗ.ДатаНачала + 1) * ?(ЖЗ.Сторно = 1, -1, 1);
КонецЕсли;

// По старой редакции ТК из отпускного стажа исключались отпуска за свой счет
// продолжительностью более 7 дней (в терминологии ЗиК - "долгосрочные"). Теперь это
// правило не действует и остается его только закомментировать...
//ИначеЕсли ЖЗ.ВидРасч = ВидРасчета.ОтпускЗаСвойСчетДолгосрочный Тогда
// ДнейОтпускаЗаСвойСчет = ДнейОтпускаЗаСвойСчет + (ЖЗ.ДатаОкончания - ЖЗ.ДатаНачала + 1) * ?(ЖЗ.Сторно = 1, -1, 1);

// Для каждого отпуска за свой счет определяем рабочий год, к которому он относятся,
// и сохраняем в ТЗ для дальнейшей обработки
ИначеЕсли (ЖЗ.ВидРасч = ВидРасчета.ОтпускЗаСвойСчетДолгосрочный) или
 (ЖЗ.ВидРасч = ВидРасчета.ОтпускЗаСвойСчетКраткосрочный) Тогда

РабочийГод = 0;
Пока ДобавитьМесяц(ДатаПриема, РабочийГод * 12) - 1 < ЖЗ.ДатаНачала Цикл  
РабочийГод = РабочийГод + 1;
КонецЦикла;          
ДатаНачалаРабочегоГода = ДобавитьМесяц(ДатаПриема, РабочийГод * 12) - 1;

ОтпускЗаСвойСчет.НоваяСтрока();
ОтпускЗаСвойСчет.Год = РабочийГод;
ОтпускЗаСвойСчет.Дни = (Мин(ДатаНачалаРабочегоГода, ЖЗ.ДатаОкончания) - ЖЗ.ДатаНачала + 1) * ?(ЖЗ.Сторно = 1, -1, 1);
Если ЖЗ.ДатаОкончания > ДатаНачалаРабочегоГода Тогда
ОтпускЗаСвойСчет.НоваяСтрока();
ОтпускЗаСвойСчет.Год = РабочийГод + 1;
ОтпускЗаСвойСчет.Дни = (ЖЗ.ДатаОкончания - ДатаНачалаРабочегоГода) * ?(ЖЗ.Сторно = 1, -1, 1);
КонецЕсли;  

КонецЕсли;  

КонецЦикла;  
   
// Определяем за каждый рабочий год число дней отпуска за свой счет. Из отпускного стажа
// будут исключены дни свыше 14 за рабочий год
// (ТК, ст.121 в ред. от 22.07.2008)
ОтпускЗаСвойСчет.Свернуть("Год","Дни");
ОтпускЗаСвойСчет.ВыбратьСтроки();
Пока ОтпускЗаСвойСчет.ПолучитьСтроку() = 1 Цикл    
Если ОтпускЗаСвойСчет.Дни > 14 Тогда            
// В редакции ТК от 30.06.2006 отпуск за свой счет, превышающий 14 дней,
// полностью исключался из отпускного стажа. Устарело, закомментируем.
//ДнейОтпускаЗаСвойСчет = ДнейОтпускаЗаСвойСчет + ОтпускЗаСвойСчет.Дни;
ДнейОтпускаЗаСвойСчет = ДнейОтпускаЗаСвойСчет + ОтпускЗаСвойСчет.Дни - 14;
КонецЕсли;  
КонецЦикла;          
       
// Отпуска по уходу за ребенком определяем по СостояниюФизлица
СостояниеФизлица = СоздатьОбъект("Периодический");
СостояниеФизлица.ИспользоватьОбъект("СостояниеФизлица", Сотрудник);
СостояниеФизлица.ВыбратьЗначения(ДатаПриема, ДатаУвольнения + 1);
ПредыдущаяДата = ПолучитьПустоеЗначение("Дата");
Пока СостояниеФизлица.ПолучитьЗначение() = 1 Цикл  
Если ПустоеЗначение(ПредыдущаяДата) = 0 Тогда    
ДнейОтпускаПоУходу = ДнейОтпускаПоУходу + СостояниеФизлица.ДатаЗнач - ПредыдущаяДата;
КонецЕсли;  
Если (СостояниеФизлица.Значение = Перечисление.СостояниеФизлица.ВременноНеРаботает) и
(СостояниеФизлица.ТекущийДокумент().Вид() = "ОтпускПоУходуЗаРебенком") Тогда  
ПредыдущаяДата = СостояниеФизлица.ДатаЗнач;
Иначе
ПредыдущаяДата = ПолучитьПустоеЗначение("Дата");
КонецЕсли;  
КонецЦикла;

// Исключаем из стажа для подсчета отпуска прогулы, отпуска по уходу за ребенком,
// отпуска за свой счет (ТК, ст.121)
ДатаПриема = ДатаПриема + ДнейПрогулов + ДнейОтпускаПоУходу + ДнейОтпускаЗаСвойСчет;
                   
// Определяем количество полностью отработанных месяцев
Месяцев = 0;
Пока ДобавитьМесяц(ДатаПриема, Месяцев) <= ДатаУвольнения + 1 Цикл  
Месяцев = Месяцев + 1;
КонецЦикла;
Месяцев = Месяцев - 1;    

// Если работник отработал 11 месяцев, то отпуск предоставляется за полный год
// (Правила, п.28)
Если Месяцев % 12 = 11  Тогда  
Месяцев = Месяцев + 1;
КонецЕсли;        

// Если оставшиеся сверх полных месяцев дни составляют не менее половины месяца,
// то округляем их до полного месяца (Правила, п.35). Половиной месяца считаем 15 дней.
Если ДатаУвольнения - ДобавитьМесяц(ДатаПриема,Месяцев) + 1 >= 15  Тогда  
Месяцев = Месяцев + 1;
КонецЕсли;                      
               
// Вычитаем использованные ранее дни отпуска
ДнейКомпенсацииОтпуска = Месяцев*28/12 - ДнейОтпуска7 - ДнейОтпуска6*28/24;        

Если ДнейКомпенсацииОтпуска < 0 тогда
Компенсация = 2;
Иначе
Компенсация = 1;
КонецЕсли;
ДнейКомпенсацииОтпускавФорме = ДнейКомпенсацииОтпуска * ?(Компенсация > 1, -1, 1);

КонецПроцедуры // СчитатьДниКомпенсации
//

"
Спасибо.
Помог найти несколько ошибок в "ручных" расчетах.
Читают тему
(гостей: 1)

Быстрый переход