При работе с типовыми конфигурациями 1С:ERP и 1С:Зарплата и управление персоналом (ЗУП) многие специалисты сталкиваются с тем, что стандартный отчет «Потери рабочего времени» некорректно отображает или вовсе игнорирует внутрисменные отсутствия. Например, если сотрудник берет отпуск без сохранения оплаты (поможет проверка сотрудников на наличие прогулов и отсутствий в 1С:ЗУП) на 2-3 часа посреди рабочего дня, отчет может показать этот день как полностью отработанный или не вывести информацию о потере часов вовсе. Разберем, почему так происходит и как доработать отчет, чтобы он учитывал каждую минуту отсутствия.
Проанализируем архитектуру типового решения. Основная причина кроется в источнике данных. Типовой отчет строится на базе регистра сведений СостоянияСотрудников. Этот регистр предназначен для хранения информации о кадровых состояниях (Работа, Больничный, Отпуск) с точностью до дня.
Когда мы оформляем документ «Отпуск без сохранения оплаты» на часть дня (внутрисменное отсутствие), система фиксирует, что в этот день сотрудник и работал, и находился в отпуске. Однако в регистре СостоянияСотрудников на эту дату запись о состоянии «Работа» не прерывается. Программа считает, что раз человек хотя бы часть дня был на месте, его основное состояние — работа. Именно поэтому попытки добавить колонки в СКД через стандартные связи наборов данных приводят к пустым значениям или дублированию строк: система просто не видит «разрыва» в рабочем дне на уровне состояний.
Выясним, где на самом деле хранятся нужные нам часы. В подсистеме расчета зарплаты и учета времени для этого используется специализированный регистр накопления.
Для решения задачи нам необходимо обратиться к регистру накопления ДанныеОперативногоУчетаРабочегоВремениСотрудников. Рассмотрим подробнее, почему именно он является ключевым:
Часы, который нам и нужно вывести в отчет.Внутрисменные неявки фиксируются в этом регистре с измерением ВидДанных, принимающим значение ДанныеВнутрисменныхНеявок (это значение предопределенного перечисления ВидыДанныхУчетаВремени).
Рассмотрим, как правильно изменить запрос. Мы не рекомендуем полностью переписывать типовой отчет, так как он содержит сложные механизмы компоновки (иногда до 12 и более пакетов запросов) — для проверки корректности изменений подойдёт автоматическое тестирование кадровых процессов и отчетов в ЗУП. Вместо этого добавим новый набор данных или модифицируем существующий пакет, где собирается итоговая таблица для вывода.
Нам необходимо получить данные по отсутствиям. Пример текста запроса для нового набора данных:
ВЫБРАТЬ
Данные.Сотрудник КАК Сотрудник,
Данные.Период КАК Период,
Данные.Регистратор КАК ДокументОснование,
СУММА(ВЫБОР
КОГДА Данные.ВидУчетаВремени = ЗНАЧЕНИЕ(Справочник.ВидыИспользованияРабочегоВремени.ОтпускНеоплачиваемыйПоРазрешениюРаботодателя)
ТОГДА Данные.Часы
ИНАЧЕ 0
КОНЕЦ) КАК ЧасыВнутрисменногоОтпуска
ИЗ
РегистрНакопления.ДанныеОперативногоУчетаРабочегоВремениСотрудников КАК Данные
ГДЕ
Данные.ВидДанных = ЗНАЧЕНИЕ(Перечисление.ВидыДанныхУчетаВремени.ДанныеВнутрисменныхНеявок)
И Данные.Период МЕЖДУ &НачалоПериода И &КонецПериода
СГРУППИРОВАТЬ ПО
Данные.Сотрудник,
Данные.Период,
Данные.Регистратор
Обратите внимание: мы используем группировку по Периоду и Сотруднику, чтобы корректно соединить эти данные с основным набором данных отчета.
После добавления нового запроса в СКД, перейдем на закладку «Связи наборов данных». Это критически важный этап, так как неправильная связь приведет к тому, что колонки будут пустыми (проблема, описанная в Сообщении 1 форума).
Настроим связи следующим образом:
Сотрудник = Сотрудник И Дата = Период.Важный момент: если внутрисменное отсутствие должно выводиться только там, где состояние сотрудника «Работа» (по версии регистра сведений), убедитесь, что в настройках выбранных полей колонка ЧасыВнутрисменногоОтпуска добавлена в нужную группировку.
Разберем ситуацию, предложенную в Сообщении 6 форума: «Можно ли программно поменять состояние сотрудника на Отпуск, если часы отсутствия больше нуля?».
Мы настоятельно не рекомендуем этот путь. Проанализируем последствия:
СостоянияСотрудников используется не только для отчетов, но и для расчета зарплаты.Правильный подход — оставлять данные в регистрах как есть, но менять логику их сбора в самом отчете.
Чтобы данные отображались корректно, перейдите на закладку «Ресурсы» в СКД. Добавьте поле ЧасыВнутрисменногоОтпуска и укажите выражение Сумма(ЧасыВнутрисменногоОтпуска).
В настройках отчета (вкладка «Настройки») проверьте, чтобы новое поле было выбрано в списке полей. Если вы хотите, чтобы внутрисменные часы суммировались с общими потерями, создайте вычисляемое поле, например, ОбщиеПотери = ПотериДни * 8 + ЧасыВнутрисменногоОтпуска (при условии 8-часового рабочего дня).
Подведем итог наших действий. Чтобы отчет «Потери рабочего времени» в ERP 2.5 или ЗУП 3.1 начал видеть внутрисменки, выполним следующие шаги:
ДанныеОперативногоУчетаРабочегоВремениСотрудников.ВидДанных = ДанныеВнутрисменныхНеявок.Такой подход позволит вам получить точный и достоверный отчет, который удовлетворит требования бухгалтерии и отдела кадров, не нарушая при этом целостность алгоритмов расчета заработной платы.