Для корректной работы отчета необходимо внести изменения в справочник "СотрудникиОрганизаций":
в табличную часть "ЕжегодныеОтпуска" надо добавить реквизит "Период" (Тип:Дата) и вывести его на форму "ФормаВводаЕжегодныхОтпусков"
Эти изменения для отпусков, у которых со временем меняется количество дней, положенных сотруднику, например, с выслугой или инвалидностью.
Отпуск за вредность считается на основе табелей рабочего времени. У нас вредность отражается в программе вечерними часами (Справочник.КлассификаторИспользованияРабочегоВремени.РаботаВечерниеЧасы), но можно поменять в коде. Если время во вредности к явке больше или равно 0.5, то день учитывается в стаже для отпуска.
После формирования отчета можно сделать расшифровку поля "Сотрудник", откроется типовая справка по отпуску. Расшифровка поля "Вид ежегодного отпуска" откроет детализацию отпуска по рабочим годам и месяцам(имеет смысл для персонального отпуска и отпуска за вредность).
Перед формированием отчета в параметрах надо указать отпуск за вредность.
Тестирование: по 180 сотрудникам рассчитал за 8 минут. (1С клиент-серв)
Функция ИсходныеДанныеДляРасчетаОстатков - возвращает структуру данных, базу для расчета остатков отпусков.
В запрос добавил вывод поля "Период" из ТЧ ЕжегодныеОтпуска справочника "Сотрудники организаций". Далее в функции ЗаработанныеОтпуска эта дата анализируется, если есть и заполнена, естественно. Здесь необходимо заметить, что если у сотрудника меняется продолжительность отпуска, то необходимо указать всю историю изменений для корректной работы. Т.е. если раньше сотруднику было положенно 28 дней отпуска по основному ежегодному, и с какого - то времени - 30. То необходимо указать и 28, и 30 в ТЧ Ежегодные отпуска.
Функция ЗаработанныеОтпуска - формирует таблицу значений ТаблицаЗаработанныхДнейОтпусков. Колонки:
- Сотрудник;
- ВидЕжегодногоОтпуска;
- ДатаНачала - Начало рабочего года;
- ДатаОкончания - Окончание рабочего года;
- Период - Дата в рабочем месяце, с которой сотруднику положен отпуск за данный месяц (например 2,33 дня, если это основной ежегодный отпуск);
- КоличествоДнейЗаПериод - количество заработанных дней отпуска за данный месяц (рассчитывается делением общей продолжительности отпуска на 12 (месяцев));
Добавил колонку "РабочиеДни", сюда записываю число рабочих дней сотрудника в месяце по его графику, это необходимо для расчета отпуска за вредность.
Функция ОстаткиОтпусков - собственно, здесь происходит окончательное формирование таблицы по сотрудникам с конечными остатками по видам отпусков. Здесь же и проводится расчет остатков отпуска за вредность. Я дополняю таблицу ТаблицаЗаработанныхДнейОтпусков следующими данными: ДнейСтажа, которые высчитываются по регистру накопления РабочееВремяРаботниковОрганизаций, в котором часы вредности у нас указаны вечерними часами. День засчитывается в стаж,если во вредности было отработанно половина или более от рабочего дня. Сам расчет следующий: если по должности положено 14 дней отпуска за вредность, то за месяц выходит 14/12 = 1.17, это если дни стажа совпадают с количество рабочих дней в месяце, если дней стажа меньше, то и дней отпуска уже положено не 1.17, а 1.17/ЧислоРабочихДней*ДнейСтажа.
Ограничение: на данный момент ЧислоРабочихДней в месяце у сотрудника высчитываю запросом к регистру сведений ГрафикиРаботыПоВидамВремени на начало месяца. Соответственно, если у сотрудника была смена графика в течении месяца, то за данный месяц количество рабочих дней будет неверное.
UPD: в последних релизах ЗУП произошли изменения в общих модулях. Необходимо ОбщегоНазначения заменить на ОбщегоНазначенияЗК в модуле отчета во всех случаях обращения к функциям, процедурам этого модуля. Быстро сделать можно Ctrl-H или Правка - Заменить
Изменил расшифровку отпуска поля "Вид ежегодного отпуска", она показывала данные по первому сотруднику из отчета. На данный момент эту расшифровку перенес на поле "Сотрудник" ("Детализация отпусков"), сформирует справку по всем видам отпусков у данного сотрудника в разрезе месяцев.
Расшифровку отчета "Детализация отпусков" сделал более информативной.