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

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

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

Использование функции КадровыйУчет.СотрудникиОрганизации

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

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

Рассмотрим пример кода, который формирует таблицу сотрудников:


// 1. Подготовим массив подразделений, по которым нужен отбор
МассивПодразделений = Новый Массив;
МассивПодразделений.Добавить(Справочники.ПодразделенияОрганизаций.НайтиПоНаименованию("Отдел продаж"));
МассивПодразделений.Добавить(Справочники.ПодразделенияОрганизаций.НайтиПоНаименованию("Склад"));

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

// 3. Заполняем ключевые параметры
ПараметрыПолучения.Организация      = Справочники.Организации.ПустаяСсылка(); // Если нужно по всем, или укажите конкретную
ПараметрыПолучения.Подразделение    = МассивПодразделений;
ПараметрыПолучения.НачалоПериода    = ТекущаяДатаСеанса();
ПараметрыПолучения.ОкончаниеПериода = ТекущаяДатаСеанса();

// Указываем, нужно ли включать уволенных (обычно для текущего списка - Ложь)
ПараметрыПолучения.ВключаяУволенныхНаНачалоПериода = Ложь;
ПараметрыПолучения.РаботникиПоДоговорамГПХ = Ложь; // Исключаем договорников, если нужны только штатные единицы

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

Нюансы настройки параметров отбора

Проанализируем структуру ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц. Несмотря на длинное название, это универсальный контейнер для условий поиска. Выясним важные моменты:

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

Дальнейшая работа с полученным списком

После того как мы получили список сотрудников (например, в переменной СписокСотрудников, который можно получить из колонки таблицы), мы можем передать его в функцию КадровыйУчет.КадровыеДанныеСотрудников, как и планировал автор темы. Это позволит получить ФИО, должности, оклады и прочую информацию одной операцией.

Посмотрим на пример совместного использования этих функций:


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

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

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

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

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

В ходе обсуждения на форуме выяснилось, что использование регистра ДанныеДляПодбораСотрудников или КадроваяИсторияСотрудников напрямую может привести к ошибкам. Рассмотрим причины:

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

Во-вторых, использование интервальных регистров (например, КадроваяИсторияСотрудниковИнтервальный) требует сложного построения условий на вхождение даты в интервал (Дата МЕЖДУ ДатаНачала И ДатаОкончания). Типовые функции КадровыйУчет уже содержат в себе всю эту логику, учитывают исправление документов («сторнирование» старых интервалов новыми) и права доступа RLS (Record Level Security).

В-третьих, параметр ТолькоРазрешенные (первый аргумент функций модуля КадровыйУчет) гарантирует, что программный код не нарушит права доступа текущего пользователя. Если у пользователя нет прав на просмотр сотрудников определенного филиала, функция их просто не вернет, что избавляет разработчика от необходимости вручную прописывать ограничения в запросах.

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

Если ваша задача подразумевает использование полученного списка сотрудников в другом большом запросе, рекомендуется использовать процедуру КадровыйУчет.СоздатьВТСотрудникиОрганизации. Она работает аналогично функции СотрудникиОрганизации, но не возвращает таблицу в память 1С, а создает временную таблицу в менеджере временных таблиц вашего запроса. Это значительно ускоряет работу системы при больших объемах данных.

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

← На главную