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

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

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

Почему прямой запрос к регистру «Кадровая история сотрудников» — это ошибка

Рассмотрим ситуацию, с которой начинают многие разработчики. Кажется логичным написать простой запрос к виртуальной таблице СрезПоследних регистра сведений КадроваяИсторияСотрудников. Однако в ЗУП 3.1 этот метод таит в себе серьезные опасности. Проанализируем причины, по которым такой код может вернуть неверные данные:

  1. Интервальная архитектура: В отличие от старых версий программ 1С, в ЗУП 3.1 данные хранятся в так называемых интервальных регистрах. Система автоматически поддерживает целостность цепочки событий (прием, перевод, увольнение). Прямой запрос к одному регистру не учитывает данные из вспомогательных структур, таких как ДанныеОрганизационныхИзмененийСотрудников.
  2. Временные переводы: Это самая критичная точка. Если сотрудник переведен в другое подразделение временно (например, на месяц), то в основном регистре кадровой истории фиксируется только начало перевода. По истечении срока сотрудник должен «вернуться» в старое подразделение автоматически. Прямой запрос по срезу последних по-прежнему будет показывать временное подразделение даже после даты окончания перевода, так как новой записи в регистре просто не создается.
  3. Документы-исправления: В ЗУП реализован механизм исправлений (ссылка «Исправить» внизу документа). При этом создаются новые записи на те же периоды. Обычный запрос без учета специфики вытеснения и периодов действия может выбрать «перекрытую» запись.

Посмотрим на пример неправильного кода, который часто встречается в «быстрых» разработках:


// НЕПРАВИЛЬНЫЙ ПРИМЕР
Запрос.Текст = 
    "ВЫБРАТЬ
    |    КадроваяИсторияСотрудниковСрезПоследних.Подразделение КАК Подразделение
    |ИЗ
    |    РегистрСведений.КадроваяИсторияСотрудников.СрезПоследних(&Дата, Сотрудник = &Сотрудник) КАК КадроваяИсторияСотрудниковСрезПоследних";

Важно: Никогда не используйте подобные конструкции для получения кадровых данных в ЗУП 3.1, если не хотите получить жалобы от расчетчиков на неверное распределение затрат или ошибки в табеле.

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

Разберем основной инструмент, который рекомендует фирма «1С» для получения информации о сотрудниках. Это программный интерфейс (API), сосредоточенный в общем модуле КадровыйУчет. Функция КадровыеДанныеСотрудников позволяет получить любые сведения — от подразделения и должности до паспортных данных и стажа — одним эффективным запросом.

Рассмотрим синтаксис этой функции:


Результат = КадровыйУчет.КадровыеДанныеСотрудников(
    ТолькоРазрешенные, 
    СписокСотрудников, 
    КадровыеДанные, 
    ДатаПолученияДанных, 
    ПоляОтбораПериодическихДанных, 
    ФормироватьСПериодичностьДень
);

Проанализируем параметры подробнее:

Рассмотрим пример получения подразделения для списка сотрудников:


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

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

Для Каждого СтрокаДанных Из ТаблицаДанных Цикл
    Если ЗначениеЗаполнено(СтрокаДанных.Подразделение) Тогда
        Сообщить("Сотрудник работает в: " + СтрокаДанных.Подразделение);
    КонецЕсли;
КонецЦикла;

Альтернативные методы для разных задач

Иногда использование громоздкой таблицы излишне. Выясним, какие еще методы модуля КадровыйУчет могут нам пригодиться:

1. Получение данных по одному сотруднику

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


ДанныеСотрудника = КадровыйУчет.ЗначенияКадровыхДанныхСотрудника(СотрудникСсылка, НужнаяДата, "Подразделение, Должность");
Подразделение = ДанныеСотрудника.Подразделение;

2. Специализированная проверка принадлежности подразделению

В актуальных версиях ЗУП 3.1 часто встречается функция КадровыйУчет.СотрудникВПодразделении. Она возвращает Булево (Истина/Ложь) и идеально подходит для условий в алгоритмах распределения или загрузки данных из внешних систем.

Как получить норму часов за месяц (ответ на дополнительный вопрос)

В процессе работы с табелем часто возникает необходимость узнать норму часов сотрудника за период. Проанализируем, как это сделать правильно. В ЗУП 3.1 норма зависит от графика работы, который может быть как общим для подразделения, так и индивидуальным для конкретного человека.

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


Период = Новый СтандартныйПериод;
Период.ДатаНачала = НачалоМесяца(ТекущаяДата());
Период.ДатаОкончания = КонецМесяца(ТекущаяДата());

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

// Получаем таблицу с данными графиков
ТаблицаНормы = ГрафикиРаботыСотрудников.ДанныеГрафиковРаботы(МассивСотрудников, Период);

Для Каждого СтрокаНормы Из ТаблицаНормы Цикл
    Сообщить("Норма часов: " + СтрокаНормы.ОсновноеЗначение); // Часы по графику
    Сообщить("Норма дней: " + СтрокаНормы.ДополнительноеЗначение); // Дни по графику
КонецЦикла;

Обратите внимание: Типовой метод ДанныеГрафиковРаботы автоматически учитывает приоритеты. Если на сотрудника введен документ Индивидуальный график, система возьмет цифры из него. Если нет — из основного графика, назначенного в кадровых документах.

Подведем итоги

Мы проанализировали подходы к получению кадровой информации в современной версии ЗУП и пришли к следующим выводам:

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

← На главную