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