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