При разработке отчетов или автоматизации расчетов в конфигурации «Зарплата и управление персоналом, редакция 3.1» часто возникает задача получения детальной информации о рабочем времени сотрудников. Нам необходимо знать не только общее количество часов за месяц, но и распределение этих часов по дням (включая выходные) с учетом графиков работы, ставок и фактически отработанного времени. Рассмотрим подробно, как реализовать эту задачу программными методами.
Прежде чем приступать к написанию кода, проанализируем, где 1С:ЗУП хранит информацию о времени. В системе существует разделение на плановое и фактическое время. Плановое время — это то, как сотрудник должен работать согласно своему графику. Фактическое время — это то, что зафиксировано в табелях и документах-отклонениях (больничные, отпуска).
Для плановых данных ключевым является РегистрСведений.ГрафикиРаботыПоВидамВремени. Именно этот регистр содержит «развернутую» информацию из справочника ГрафикиРаботыСотрудников. Если мы просто обратимся к справочнику, нам придется самостоятельно вычислять циклы графика, учитывать праздники и переносы, что крайне трудозатратно. Регистр же хранит уже готовые цифры по каждому дню.
Разберем важный нюанс: в ЗУП 3.1 существует иерархия графиков. Если на сотрудника введен документ «Индивидуальный график», то данные общего графика из кадрового приказа игнорируются. Для программного получения корректных плановых данных мы должны соблюдать следующий алгоритм:
РегистрСведений.ДанныеИндивидуальныхГрафиковСотрудников за искомый период.РегистрСведений.ГрафикиРаботыПоВидамВремени.Рассмотрим ситуацию с количеством ставок. Проанализируем, как программа обрабатывает работу на полставки (0.5). Если в настройках графика указано «Неполное рабочее время», то в регистре ГрафикиРаботыПоВидамВремени часы уже будут уменьшены. Однако, если график общий для всех, а ставка просто указана в кадровом документе, нам придется программно умножать полученные из графика часы на коэффициент ставки из регистра РегистрСведений.КадроваяИсторияСотрудников.
Вместо того чтобы писать сложные запросы вручную, выясним, какие стандартные механизмы предлагает платформа. В ЗУП 3.1 реализован мощный программный интерфейс в общих модулях. Наиболее полезным для нашей задачи является модуль КадровыйУчет и его методы для работы с графиками.
Посмотрим на пример использования функции, которая позволяет получить таблицу данных графика:
// Пример вызова метода для получения данных графика
ПараметрыПолучения = КадровыйУчет.ПараметрыПолученияДанныхГрафика();
ПараметрыПолучения.Период = ПериодРегистрации;
ПараметрыПолучения.Сотрудники = МассивСотрудников;
ДанныеГрафиков = КадровыйУчет.ПолучитьДанныеГрафика(ПараметрыПолучения);
Этот метод удобен тем, что он внутри себя уже учитывает все «подводные камни»: и индивидуальные графики, и праздничные дни по производственному календарю. На выходе мы получаем таблицу значений, где по каждому сотруднику и по каждой дате указаны виды времени (Явка, Ночные и т.д.) и количество часов. Для готового анализа и сверки графиков с табелем можно использовать отчет по графикам и видам рабочего времени сотрудников.
Если задача стоит в получении уже отработанного времени (факта), нам следует обратиться к другому источнику. Основным является РегистрНакопления.ДанныеОперативногоУчетаРабочегоВремениСотрудников. Этот регистр аккумулирует информацию из всех первичных документов: табелей, актов приемки выполненных работ, документов межрасчетных выплат.
Проанализируем структуру этого регистра. В нем фиксируются измерения Сотрудник, ВидИспользованияРабочегоВремени и ресурс Часы. Чтобы получить данные по дням, нам необходимо выполнять запрос к основной таблице регистра с условием по периоду.
Рассмотрим ситуацию, когда нам нужно получить данные через запрос (например, для использования в схеме компоновки данных или в сложной выборке). Нам потребуется соединить таблицу сотрудников с их графиками. Обратите внимание на важность фильтрации по видам времени, чтобы не получить «кашу» из явки, ночных и общего времени.
ВЫБРАТЬ
Графики.Дата КАК Дата,
Графики.Сотрудник КАК Сотрудник,
Графики.ВидУчетаВремени КАК ВидВремени,
Графики.ОсновноеЗначение КАК Часы
ИЗ
РегистрСведений.ГрафикиРаботыПоВидамВремени КАК Графики
ГДЕ
Графики.Дата МЕЖДУ &НачалоПериода И &КонецПериода
И Графики.ГрафикРаботы = &ВыбранныйГрафик
И (Графики.ВидУчетаВремени = ЗНАЧЕНИЕ(Справочник.ВидыИспользованияРабочегоВремени.Явка)
ИЛИ Графики.ВидУчетаВремени = ЗНАЧЕНИЕ(Справочник.ВидыИспользованияРабочегоВремени.Ночные))
В данном примере мы выбираем только Явку и Ночные. Если для какой-то даты запись в регистре отсутствует или значение равно 0, значит, этот день является выходным по данному графику.
Выясним причину, по которой данные могут не выбираться. Часто программисты забывают, что графики в 1С жестко привязаны к производственному календарю. Если в системе не заполнен календарь на текущий год, регистры сведений по графикам будут пустыми. Перед выполнением программных расчетов рекомендуется добавить проверку заполнения календаря. Это можно сделать через запрос к РегистрСведений.ДанныеПроизводственногоКалендаря.
Для решения задачи из сообщения №9 (план для будущего, факт для прошлого), мы рекомендуем использовать следующий алгоритм:
ТекущаяДата() или конец последнего рассчитанного месяца).При получении часов важно помнить про Виды использования рабочего времени. В 1С:ЗУП рабочим временем считается не только «Явка» (Я). Сюда могут входить «Работа в праздничные и выходные» (РВ), «Командировка» (К) и другие виды. Если ваша задача — получить все рабочие часы, обязательно учитывайте свойство РабочееВремя в справочнике ВидыИспользованияРабочегоВремени. При необходимости сопоставления плановых и фактических часов по дням без ручной разработки можно воспользоваться отчетом для анализа фактического присутствия сотрудников.
Таким образом, мы проанализировали основные механизмы получения данных о времени в ЗУП 3.1. Использование встроенных функций общих модулей является наиболее надежным способом, так как оно гарантирует корректный учет всех кадровых нюансов и настроек программы.