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