Как программно получить рабочие и выходные дни с количеством часов в 1С:ЗУП 3.1?

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом
← На главную

При разработке отчетов или автоматизации расчетов в конфигурации «Зарплата и управление персоналом, редакция 3.1» часто возникает задача получения детальной информации о рабочем времени сотрудников. Нам необходимо знать не только общее количество часов за месяц, но и распределение этих часов по дням (включая выходные) с учетом графиков работы, ставок и фактически отработанного времени. Рассмотрим подробно, как реализовать эту задачу программными методами.

Понимание структуры хранения данных о времени

Прежде чем приступать к написанию кода, проанализируем, где 1С:ЗУП хранит информацию о времени. В системе существует разделение на плановое и фактическое время. Плановое время — это то, как сотрудник должен работать согласно своему графику. Фактическое время — это то, что зафиксировано в табелях и документах-отклонениях (больничные, отпуска).

Для плановых данных ключевым является РегистрСведений.ГрафикиРаботыПоВидамВремени. Именно этот регистр содержит «развернутую» информацию из справочника ГрафикиРаботыСотрудников. Если мы просто обратимся к справочнику, нам придется самостоятельно вычислять циклы графика, учитывать праздники и переносы, что крайне трудозатратно. Регистр же хранит уже готовые цифры по каждому дню.

Учет приоритетности: Индивидуальные графики

Разберем важный нюанс: в ЗУП 3.1 существует иерархия графиков. Если на сотрудника введен документ «Индивидуальный график», то данные общего графика из кадрового приказа игнорируются. Для программного получения корректных плановых данных мы должны соблюдать следующий алгоритм:

  1. Проверить наличие данных в РегистрСведений.ДанныеИндивидуальныхГрафиковСотрудников за искомый период.
  2. Если данных в индивидуальном графике нет, обратиться к РегистрСведений.ГрафикиРаботыПоВидамВремени.

Рассмотрим ситуацию с количеством ставок. Проанализируем, как программа обрабатывает работу на полставки (0.5). Если в настройках графика указано «Неполное рабочее время», то в регистре ГрафикиРаботыПоВидамВремени часы уже будут уменьшены. Однако, если график общий для всех, а ставка просто указана в кадровом документе, нам придется программно умножать полученные из графика часы на коэффициент ставки из регистра РегистрСведений.КадроваяИсторияСотрудников.

Использование программного интерфейса (API) системы

Вместо того чтобы писать сложные запросы вручную, выясним, какие стандартные механизмы предлагает платформа. В ЗУП 3.1 реализован мощный программный интерфейс в общих модулях. Наиболее полезным для нашей задачи является модуль КадровыйУчет и его методы для работы с графиками.

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


// Пример вызова метода для получения данных графика
ПараметрыПолучения = КадровыйУчет.ПараметрыПолученияДанныхГрафика();
ПараметрыПолучения.Период = ПериодРегистрации;
ПараметрыПолучения.Сотрудники = МассивСотрудников;

ДанныеГрафиков = КадровыйУчет.ПолучитьДанныеГрафика(ПараметрыПолучения);

Этот метод удобен тем, что он внутри себя уже учитывает все «подводные камни»: и индивидуальные графики, и праздничные дни по производственному календарю. На выходе мы получаем таблицу значений, где по каждому сотруднику и по каждой дате указаны виды времени (Явка, Ночные и т.д.) и количество часов. Для готового анализа и сверки графиков с табелем можно использовать отчет по графикам и видам рабочего времени сотрудников.

Получение фактических часов работы

Если задача стоит в получении уже отработанного времени (факта), нам следует обратиться к другому источнику. Основным является РегистрНакопления.ДанныеОперативногоУчетаРабочегоВремениСотрудников. Этот регистр аккумулирует информацию из всех первичных документов: табелей, актов приемки выполненных работ, документов межрасчетных выплат.

Проанализируем структуру этого регистра. В нем фиксируются измерения Сотрудник, ВидИспользованияРабочегоВремени и ресурс Часы. Чтобы получить данные по дням, нам необходимо выполнять запрос к основной таблице регистра с условием по периоду.

Практический пример запроса к графикам

Рассмотрим ситуацию, когда нам нужно получить данные через запрос (например, для использования в схеме компоновки данных или в сложной выборке). Нам потребуется соединить таблицу сотрудников с их графиками. Обратите внимание на важность фильтрации по видам времени, чтобы не получить «кашу» из явки, ночных и общего времени.


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

В данном примере мы выбираем только Явку и Ночные. Если для какой-то даты запись в регистре отсутствует или значение равно 0, значит, этот день является выходным по данному графику.

Работа с производственным календарем

Выясним причину, по которой данные могут не выбираться. Часто программисты забывают, что графики в 1С жестко привязаны к производственному календарю. Если в системе не заполнен календарь на текущий год, регистры сведений по графикам будут пустыми. Перед выполнением программных расчетов рекомендуется добавить проверку заполнения календаря. Это можно сделать через запрос к РегистрСведений.ДанныеПроизводственногоКалендаря.

Алгоритм объединения Плана и Факта

Для решения задачи из сообщения №9 (план для будущего, факт для прошлого), мы рекомендуем использовать следующий алгоритм:

  1. Определить точку разделения (обычно ТекущаяДата() или конец последнего рассчитанного месяца).
  2. Для дат меньше точки разделения — выполнять запрос к Регистру Накопления «Данные оперативного учета рабочего времени сотрудников».
  3. Для дат больше или равных точке разделения — выполнять запрос к Регистру Сведений «Графики работы по видам времени» (с учетом индивидуальных графиков).
  4. Объединить результаты (UNION ALL) в одну временную таблицу для последующего вывода в отчет.

При получении часов важно помнить про Виды использования рабочего времени. В 1С:ЗУП рабочим временем считается не только «Явка» (Я). Сюда могут входить «Работа в праздничные и выходные» (РВ), «Командировка» (К) и другие виды. Если ваша задача — получить все рабочие часы, обязательно учитывайте свойство РабочееВремя в справочнике ВидыИспользованияРабочегоВремени. При необходимости сопоставления плановых и фактических часов по дням без ручной разработки можно воспользоваться отчетом для анализа фактического присутствия сотрудников.

Таким образом, мы проанализировали основные механизмы получения данных о времени в ЗУП 3.1. Использование встроенных функций общих модулей является наиболее надежным способом, так как оно гарантирует корректный учет всех кадровых нюансов и настроек программы.

← На главную