Как получить сотрудников по подразделению с точными периодами работы в ЗУП 3.1

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

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

Проблема стандартного подхода

Когда мы используем метод КадровыйУчет.СоздатьВТСотрудникиОрганизации, система формирует временную таблицу сотрудников, работавших в указанном интервале. Однако, если сотрудник был переведен в подразделение 02.09, а вы запрашиваете данные с 01.08, метод вернет дату начала 02.09 (это корректно). Но если сотрудник уволился или перевелся 12.09, а период запроса установлен до 23.09, функция может вернуть дату окончания 23.09. Это происходит потому, что многие типовые функции предназначены для определения состояния сотрудника «на протяжении» периода, а не для фиксации границ самого кадрового состояния.

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

Шаг 1. Подготовка параметров и получение первичного списка

Для начала проанализируем структуру параметров, которые необходимы для инициализации поиска. Мы будем использовать менеджер временных таблиц, чтобы передавать данные между вызовами процедур общего модуля.


ПараметрыПолученияСотрудников = КадровыйУчет.ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц();
ПараметрыПолученияСотрудников.НачалоПериода    = ПериодНачало;
ПараметрыПолученияСотрудников.ОкончаниеПериода = ПериодОкончание;
ПараметрыПолученияСотрудников.Организация      = Организация;
ПараметрыПолученияСотрудников.Подразделение    = Подразделение;

Запрос = Новый Запрос();
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;

// Формируем базовую временную таблицу ВТСотрудникиОрганизации
КадровыйУчет.СоздатьВТСотрудникиОрганизации(Запрос.МенеджерВременныхТаблиц, Истина, ПараметрыПолученияСотрудников);

На данном этапе в МенеджерВременныхТаблиц уже существует таблица ВТСотрудникиОрганизации. Она содержит список сотрудников, которые хотя бы один день в указанном периоде числились в данном подразделении.

Шаг 2. Создание фильтра по периодам

Для того чтобы получить именно интервалы кадровой истории, нам нужно создать вспомогательную таблицу ВТСотрудникиПериоды. В ней мы укажем, для каких сотрудников и в каких границах мы хотим получить детализацию. Выясним причину, по которой это важно: без этой таблицы типовые механизмы БСП не смогут «понять», по каким объектам запрашивать срезы данных из регистров.


Запрос.Текст = 
"ВЫБРАТЬ
|	ВТ.Сотрудник КАК Сотрудник,
|	&НачалоПериода КАК ДатаНачала,
|	&ОкончаниеПериода КАК ДатаОкончания
|ПОМЕСТИТЬ ВТСотрудникиПериоды
|ИЗ
|	ВТСотрудникиОрганизации КАК ВТ";

Запрос.УстановитьПараметр("НачалоПериода", ПериодНачало);
Запрос.УстановитьПараметр("ОкончаниеПериода", ПериодОкончание);

// Важный момент: запрос необходимо выполнить, чтобы ВТ реально создалась в менеджере
Запрос.Выполнить();

Шаг 3. Получение реальных интервалов из кадровой истории

Теперь воспользуемся мощным инструментом ЗУП — модулем ЗарплатаКадрыПериодическиеРегистры. Метод СоздатьВТИмяРегистраПериоды позволяет «нарезать» периоды работы сотрудников на основании регистра КадроваяИсторияСотрудников (или его интервального аналога). Это позволит увидеть точную дату перевода из подразделения.

Рассмотрим подробнее настройки фильтра и построения:


// Описываем фильтр на основании созданной нами ранее таблицы периодов
ОписаниеФильтра = ЗарплатаКадрыПериодическиеРегистры.ОписаниеФильтраДляСоздатьВТИмяРегистра("ВТСотрудникиПериоды", "Сотрудник");

// Инициализируем стандартные параметры построения
ПараметрыПостроения = ЗарплатаКадрыПериодическиеРегистры.ПараметрыПостроенияДляСоздатьВТИмяРегистра();

// Вызываем процедуру формирования интервалов
// В результате в Менеджере ВТ появится таблица "ВТСотрудникиИнтервалы"
ЗарплатаКадрыПериодическиеРегистры.СоздатьВТИмяРегистраПериоды(
	"КадроваяИсторияСотрудников", 
	Запрос.МенеджерВременныхТаблиц, 
	Истина, 
	ОписаниеФильтра, 
	ПараметрыПостроения, 
	"ВТСотрудникиИнтервалы"
);

Шаг 4. Анализ и выгрузка результата

После выполнения процедур в таблице ВТСотрудникиИнтервалы будут содержаться записи по каждому изменению кадрового состояния. Нам остается лишь выбрать из нее данные, отфильтровав те записи, которые относятся к нашему подразделению (так как интервалы строятся по всей истории сотрудника в рамках заданного нами окна).


Запрос.Текст = 
"ВЫБРАТЬ
|	Интервалы.Сотрудник КАК Сотрудник,
|	Интервалы.ДатаНачала КАК ДатаНачала,
|	Интервалы.ДатаОкончания КАК ДатаОкончания,
|	Интервалы.Подразделение КАК Подразделение
|ИЗ
|	ВТСотрудникиИнтервалы КАК Интервалы
|ГДЕ
|	Интервалы.Подразделение = &НужноеПодразделение";

Запрос.УстановитьПараметр("НужноеПодразделение", Подразделение);

Результат = Запрос.Выполнить().Выгрузить();

Важные замечания:

  1. Менеджер временных таблиц: Ошибка Таблица не найдена "ВТСотрудникиПериоды" чаще всего возникает из-за того, что программист забывает вызвать Запрос.Выполнить() после текста с ПОМЕСТИТЬ. Помните, что создание текста запроса и его выполнение — разные операции.
  2. Интервальные регистры: В ЗУП 3 данные хранятся в «интервальных» регистрах (например, КадроваяИсторияСотрудниковИнтервальный). Использование типовых методов БСП автоматически выбирает наиболее оптимальный источник данных.
  3. Дата окончания: Если сотрудник продолжает работать в подразделении по сей день, дата окончания будет равна 31.12.3999 или концу периода запроса, в зависимости от настроек ПараметрыПостроения. Проанализируем ситуацию: если вам нужно вывести «по настоящее время», используйте функцию ЗарплатаКадрыОбщий.КонецВремен() для проверки.

Таким образом, мы разобрали, как получить не просто список людей, а детализированную таблицу их движений внутри подразделения. Этот метод является наиболее «чистым» с точки зрения архитектуры 1С:Предприятие 8.3, так как он опирается на стандартные механизмы конфигурации, что гарантирует корректность данных при обновлении системы.

← На главную