В стандартной конфигурации УПП отсутствует отчет по больничным листам, который бы отражал все периоды больничных в разрезе сотрудников или подразделений.
Итак, наша задача создать такой отчет.
Все необходимые нам сведенья содержаться в регистре сведений «Состояния работников организаций».
Создаем новый внешний отчет и открываем схему компоновки данных. Добавляем новый набор данных – запрос и приступаем к его конструированию.
Следуя логике, нам нужны следующие данные: Сотрудник, Подразделение, Период, ПериодЗавершения и Состояние. Добавляем их в список поля и нажимаем ОК.
Теперь подумаем над ограничениями.
1. Сотрудник должен числиться в штате
2. Больничный должен попадать на указанный период
3. Необходимы отборы по сотруднику и/или подразделениям
4. Состояние сотрудника по регистру сведений должно относится именно к больничному листу (болеет, уход за ребенком, беременность и роды и т.д.)
Зададим все выше перечисленные условия через параметры и настройки отбора в отчете.
В итоге, наш запрос примет вид:
Параметры отчета:
Выбранные поля:
И условия отбора:
Сохраним и сформируем получившийся отчет:
Во-первых, пока что не очень красиво, без сортировки и соответствующего заголовка.
Во-вторых, нет полей для ввода параметров отбора в быстром доступе.
И самое главное – нет даты возврата!!!
Это особенность записи в регистры документов по больничным листам. Если по отпускам и командировкам проставляется дата возврата, то у больничных, увы и ах, нет.
Именно эту проблему и будем решать с помощью использования вложенного запроса.
Однако сначала «наведём красоту».
1. Добавим на форму панель быстрого выбора:
А) Откроем форму отчета – Форма- Вставить элемент управления – Табличное поле
Б) Свойства табличного поля – Данные – ОтчетОбъект – Компоновщик настроек – Настройки Параметры данных
2. Зададим «Другие настройки» отчета:
3. Зададим сортировку по полю «Сотрудник».
Теперь займемся самым главным – расчетом даты возврата.
Логично, что при смене состояния с одного в другое и происходит возврат, т.е. нам необходимо получить следующую за записью больничного листа запись по данному сотруднику из регистра сведений «СостоянияРаботниковОрганизаций».
Добавим в конструкторе запроса вложенный запрос с полями из того же регистра сведений: сотрудник и период.
Теперь добавим оба поля из вложенного запроса в «Поля» и перейдем на вкладку «Связи», чтобы прописать условия слияния основного запроса со вложенным.
Графы «Сотрудник» должны быть идентичны, а период из вложенного запроса должен превышать период основного.
Добавим в отчет вместо даты возврата, период из вложенного запроса, сохраним и посмотрим результат.
Результат:
Таким образом, получили в отчете строки, где каждый больничный дополнен всеми последующими сменами состояний сотрудника. Весьма нежелательный результат.
Как же добиться вывода одной, только самой первой строки по данному больничному? Использование условий «Первые N» или же «Без повторяющихся» как во вложенном так и в основном запросе – не помогает. Проблему решает «Группировка», в которой находим минимальное значение по полю «Период» из вложенного запроса.
Результат:
Для большей достоверности информации будем выводить дату на 1 день меньшую Период1, т.к. больничный завершается предыдущим днем с помощью функции «ДОБАВИТЬКДАТЕ» :
А также рассчитаем количество дней больничного через «РАЗНОСТЬДАТ»
Переименуем полученные поля в «Дата возврата» и «Дней», добавим их в «Выбранные поля» и сформируем отчет:
И опять получили немного неожиданный результат.
Доработаем поле группировка ещё раз, установив расчет минимума и по полю с количеством дней больничного, и по дате возврата:
ФОРМИРУЕМ ОТЧЕТ ПОСЛЕДНИЙ РАЗ:
Эврика!