Как в отчете Потери рабочего времени учесть внутрисменные отсутствия в 1С:ERP и ЗУП

Программист 1С:ERP Управление предприятием Управленческий учет
← На главную

При работе с типовыми конфигурациями 1С:ERP и 1С:Зарплата и управление персоналом (ЗУП) многие специалисты сталкиваются с тем, что стандартный отчет «Потери рабочего времени» некорректно отображает или вовсе игнорирует внутрисменные отсутствия. Например, если сотрудник берет отпуск без сохранения оплаты (поможет проверка сотрудников на наличие прогулов и отсутствий в 1С:ЗУП) на 2-3 часа посреди рабочего дня, отчет может показать этот день как полностью отработанный или не вывести информацию о потере часов вовсе. Разберем, почему так происходит и как доработать отчет, чтобы он учитывал каждую минуту отсутствия.

Анализируем причину проблемы: почему типовой отчет «молчит»

Проанализируем архитектуру типового решения. Основная причина кроется в источнике данных. Типовой отчет строится на базе регистра сведений СостоянияСотрудников. Этот регистр предназначен для хранения информации о кадровых состояниях (Работа, Больничный, Отпуск) с точностью до дня.

Когда мы оформляем документ «Отпуск без сохранения оплаты» на часть дня (внутрисменное отсутствие), система фиксирует, что в этот день сотрудник и работал, и находился в отпуске. Однако в регистре СостоянияСотрудников на эту дату запись о состоянии «Работа» не прерывается. Программа считает, что раз человек хотя бы часть дня был на месте, его основное состояние — работа. Именно поэтому попытки добавить колонки в СКД через стандартные связи наборов данных приводят к пустым значениям или дублированию строк: система просто не видит «разрыва» в рабочем дне на уровне состояний.

Выясним, где на самом деле хранятся нужные нам часы. В подсистеме расчета зарплаты и учета времени для этого используется специализированный регистр накопления.

Шаг 1. Выбор правильного источника данных

Для решения задачи нам необходимо обратиться к регистру накопления ДанныеОперативногоУчетаРабочегоВремениСотрудников. Рассмотрим подробнее, почему именно он является ключевым:

Внутрисменные неявки фиксируются в этом регистре с измерением ВидДанных, принимающим значение ДанныеВнутрисменныхНеявок (это значение предопределенного перечисления ВидыДанныхУчетаВремени).

Шаг 2. Модификация запроса в схеме компоновки данных (СКД)

Рассмотрим, как правильно изменить запрос. Мы не рекомендуем полностью переписывать типовой отчет, так как он содержит сложные механизмы компоновки (иногда до 12 и более пакетов запросов) — для проверки корректности изменений подойдёт автоматическое тестирование кадровых процессов и отчетов в ЗУП. Вместо этого добавим новый набор данных или модифицируем существующий пакет, где собирается итоговая таблица для вывода.

Нам необходимо получить данные по отсутствиям. Пример текста запроса для нового набора данных:


ВЫБРАТЬ
    Данные.Сотрудник КАК Сотрудник,
    Данные.Период КАК Период,
    Данные.Регистратор КАК ДокументОснование,
    СУММА(ВЫБОР
            КОГДА Данные.ВидУчетаВремени = ЗНАЧЕНИЕ(Справочник.ВидыИспользованияРабочегоВремени.ОтпускНеоплачиваемыйПоРазрешениюРаботодателя)
                ТОГДА Данные.Часы
            ИНАЧЕ 0
        КОНЕЦ) КАК ЧасыВнутрисменногоОтпуска
ИЗ
    РегистрНакопления.ДанныеОперативногоУчетаРабочегоВремениСотрудников КАК Данные
ГДЕ
    Данные.ВидДанных = ЗНАЧЕНИЕ(Перечисление.ВидыДанныхУчетаВремени.ДанныеВнутрисменныхНеявок)
    И Данные.Период МЕЖДУ &НачалоПериода И &КонецПериода
СГРУППИРОВАТЬ ПО
    Данные.Сотрудник,
    Данные.Период,
    Данные.Регистратор

Обратите внимание: мы используем группировку по Периоду и Сотруднику, чтобы корректно соединить эти данные с основным набором данных отчета.

Шаг 3. Настройка связей наборов данных

После добавления нового запроса в СКД, перейдем на закладку «Связи наборов данных». Это критически важный этап, так как неправильная связь приведет к тому, что колонки будут пустыми (проблема, описанная в Сообщении 1 форума).

Настроим связи следующим образом:

  1. Источник связи: Основной набор данных (где информация о сотрудниках).
  2. Приемник связи: Наш новый набор данных с часами.
  3. Условие связи: Сотрудник = Сотрудник И Дата = Период.
  4. Параметры: Обязательно передайте параметры периода, чтобы запрос к регистру накопления выполнялся эффективно.

Важный момент: если внутрисменное отсутствие должно выводиться только там, где состояние сотрудника «Работа» (по версии регистра сведений), убедитесь, что в настройках выбранных полей колонка ЧасыВнутрисменногоОтпуска добавлена в нужную группировку.

Шаг 4. Почему нельзя менять состояние программно?

Разберем ситуацию, предложенную в Сообщении 6 форума: «Можно ли программно поменять состояние сотрудника на Отпуск, если часы отсутствия больше нуля?».

Мы настоятельно не рекомендуем этот путь. Проанализируем последствия:

Правильный подход — оставлять данные в регистрах как есть, но менять логику их сбора в самом отчете.

Шаг 5. Работа с группировками и ресурсами

Чтобы данные отображались корректно, перейдите на закладку «Ресурсы» в СКД. Добавьте поле ЧасыВнутрисменногоОтпуска и укажите выражение Сумма(ЧасыВнутрисменногоОтпуска).

В настройках отчета (вкладка «Настройки») проверьте, чтобы новое поле было выбрано в списке полей. Если вы хотите, чтобы внутрисменные часы суммировались с общими потерями, создайте вычисляемое поле, например, ОбщиеПотери = ПотериДни * 8 + ЧасыВнутрисменногоОтпуска (при условии 8-часового рабочего дня).

Резюме для реализации

Подведем итог наших действий. Чтобы отчет «Потери рабочего времени» в ERP 2.5 или ЗУП 3.1 начал видеть внутрисменки, выполним следующие шаги:

  1. Используем регистр ДанныеОперативногоУчетаРабочегоВремениСотрудников.
  2. Фильтруем по ВидДанных = ДанныеВнутрисменныхНеявок.
  3. Связываем данные по сотруднику и дате в СКД.
  4. Выводим результат как отдельный ресурс, не вмешиваясь в логику кадровых состояний.

Такой подход позволит вам получить точный и достоверный отчет, который удовлетворит требования бухгалтерии и отдела кадров, не нарушая при этом целостность алгоритмов расчета заработной платы.

← На главную