Как получить должность сотрудника на дату отпуска в 1С:ЗУП 3.1?

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

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

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

Способ 1. Использование программного интерфейса БСП (Модуль «КадровыйУчет»)

Рекомендуемый и наиболее безопасный способ получения кадровых сведений в разработках для 1С:ЗУП 3.1 — использование стандартных функций программного интерфейса библиотеки кадрового учета. Это гарантирует корректность данных с учетом всех действующих кадровых приказов и изменений конфигурации при обновлениях.

Для получения актуальной должности на конкретную дату воспользуемся функцией КадровыйУчет.КадровыеДанныеСотрудников. Разберем пример кода:


МассивСотрудников = Новый Массив;
МассивСотрудников.Добавить(СсылкаНаСотрудника);

// Перечисляем необходимые поля через запятую
КадровыеДанные = "Должность, ДолжностьПоШтатномуРасписанию, Подразделение";

// Получаем таблицу значений с кадровыми данными
ТаблицаДанных = КадровыйУчет.КадровыеДанныеСотрудников(
    Истина, 
    МассивСотрудников, 
    КадровыеДанные, 
    ДатаНаКоторуюПолучаемДанные
);

Если ТаблицаДанных.Количество() > 0 Тогда
    СтрокаДанных = ТаблицаДанных[0];
    ДолжностьСотрудника = СтрокаДанных.Должность;
    ШтатнаяДолжность    = СтрокаДанных.ДолжностьПоШтатномуРасписанию;
    Подразделение       = СтрокаДанных.Подразделение;
КонецЕсли;

Рассмотрим параметры метода КадровыйУчет.КадровыеДанныеСотрудников подробнее:

  1. ТолькоПрошедшиеСобытия (Булево): если передано значение Истина, учитываются только кадровые события, вступившие в силу на указанную дату или ранее.
  2. Сотрудники (Ссылка или Массив): ссылка на элемент справочника Сотрудники или массив с несколькими сотрудниками.
  3. КадровыеДанные (Строка): список запрашиваемых полей через запятую. Полный перечень допустимых полей можно посмотреть в описании функции КадровыйУчетВнутренний.ЗапросВТКадровыеДанныеСотрудников. Популярные поля: Должность, ДолжностьПоШтатномуРасписанию, Подразделение, ВидЗанятости, Организация, ГрафикРаботы, ФОТ.
  4. Период (Дата): дата, на которую необходимо срезать кадровые данные (например, дата начала отпуска).

Если вам требуется получить должности для списка сотрудников на разные даты (например, реестр документов отпусков), используйте специализированную функцию:


// ТаблицаИсточников должна содержать колонки "Сотрудник" и "Период"
ТаблицаРезультат = КадровыйУчет.КадровыеДанныеСотрудниковПоТаблицеЗначений(
    Истина,
    ТаблицаИсточников,
    "Должность, Подразделение"
);

Способ 2. Формирование временной таблицы кадровых данных прямо в запросе

Если срез кадровых данных требуется получить внутри сложного запроса без предварительной выгрузки в код 1С, рекомендуется использовать программный механизм создания временной таблицы кадровых данных через менеджер временных таблиц.

Проанализируем шаги выполнения такого алгоритма:


МенеджерВТ = Новый МенеджерВременныхТаблиц;

// 1. Создаем структуру-описатель для формирования кадровых данных
ОписательВТ = КадровыйУчет.ОписательВременныхТаблицДляСоздатьВТКадровыеДанныеСотрудников(
    МенеджерВТ,
    "ВТ_СотрудникиИDates", // Имя ВТ с исходными сотрудниками и датами
    "Должность, Подразделение"
);

// 2. Вызываем процедуру генерации кадровых данных
КадровыйУчет.СоздатьВТКадровыеДанныеСотрудников(ОписательВТ);

// Теперь в МенеджерВТ добавлена временная таблица "ВТКадровыеДанныеСотрудников",
// которую можно связывать по полям Сотрудник и Период в основном запросе.

Способ 3. Прямое обращение к регистрам кадровой истории в запросе

Если по условиям архитектуры необходимо написать прямой запрос без использования общих модулей, обращаются к регистрам кадровой истории.

В конфигурации ЗУП 3.1 кадровые события хранятся в следующих регистрах сведений:

  1. РегистрСведений.КадроваяИсторияСотрудников — базовый периодический регистр кадровых сведений.
  2. РегистрСведений.КадроваяИсторияСотрудниковИнтервальный — служебный интервальный регистр, в котором записи имеют поля ДатаНачала и ДатаОкончания. Использование этого регистра существенно упрощает составление условий соединения в запросе.

Посмотрим на пример верного условия связи с интервальным регистром по дате отпуска:


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

Важные нюансы и подводные камни

При решении задачи обратите внимание на следующие нюансы:

  1. Различие между объектами «Сотрудник» и «Физическое лицо»: Одно физическое лицо в компании может быть оформлено по внутреннему совместительству. Запрос данных нужно всегда делать по ссылке на конкретного Сотрудника (справочник Сотрудники), а не по физическому лицу.
  2. Должность и Штатное расписание: Различайте поля Должность (ссылка на Справочник.Должности) и ДолжностьПоШтатномуРасписанию (ссылка на Справочник.ШтатноеРасписание). В зависимости от требований отчета или формы может потребоваться наименование позиции штатного расписания, а не просто название должности.
  3. Договоры ГПХ: Физические лица, работающие по договорам гражданско-правового характера, не принимаются в штат и не отображаются в регистрах кадровой истории. Прямые соединения с кадровой историей для таких сотрудников вернут значения NULL.
← На главную