Как программно получить список работающих сотрудников в ЗУП 3.1

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

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

Способ 1. Простой запрос к регистру КадроваяИсторияСотрудников

Если задача стоит максимально просто — получить список сотрудников, у которых последним кадровым событием не является увольнение (для этого подойдёт модуль управления аккаунтами Яндекс 360 для ЗУП), мы можем обратиться к виртуальной таблице СрезПоследних регистра сведений КадроваяИсторияСотрудников. Проанализируем пример такого запроса:


ВЫБРАТЬ
    КадроваяИсторияСотрудниковСрезПоследних.Сотрудник КАК Сотрудник,
    КадроваяИсторияСотрудниковСрезПоследних.Должность КАК Должность,
    КадроваяИсторияСотрудниковСрезПоследних.Организация КАК Организация
ИЗ
    РегистрСведений.КадроваяИсторияСотрудников.СрезПоследних(&КонецПериода, ) КАК КадроваяИсторияСотрудниковСрезПоследних
ГДЕ
    КадроваяИсторияСотрудниковСрезПоследних.ВидСобытия <> ЗНАЧЕНИЕ(Перечисление.ВидыКадровыхСобытий.Увольнение)

Важные нюансы этого способа:

  1. Проблема временных переводов: Как показывает практика, если у сотрудника закончился срок временного перевода, в регистре кадровой истории может не появиться новой записи о "возврате" на старое место. Прямой запрос к срезу последних в этом случае может показать неактуальное подразделение или должность.
  2. События в один день: Если в один день зафиксировано несколько кадровых изменений, стандартный СрезПоследних может отработать некорректно без учета поля НомерСтроки или дополнительных фильтров.
  3. Рекомендация: Используйте этот метод только для простых оперативных проверок, где погрешность в деталях (подразделение/позиция) не критична.

Способ 2. Использование программного интерфейса (рекомендуемый)

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

Разберем по шагам процесс подготовки и вызова функции:


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

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

// 3. Вызываем функцию получения таблицы значений
// Первый параметр "ТолькоРаботающие" = Истина позволяет сразу отсечь уволенных
ТаблицаСотрудников = КадровыйУчет.SotrudnikiOgranizacii(Истина, ПараметрыПолучения);

Этот метод работает значительно быстрее и точнее прямого запроса, так как он оптимизирован на уровне платформы и учитывает специфику кадрового учета. Вы получаете готовую ТаблицаЗначений, которую можно использовать в коде.

Способ 3. Получение данных во временную таблицу для запроса

Если вам необходимо соединить список работающих сотрудников с другими данными (например, с вашим регистром или документами) внутри одного запроса, следует использовать менеджер временных таблиц. Выясним, как это реализовать:


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

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

// Теперь мы можем обратиться к таблице "ВТСотрудникиОрганизации" в тексте запроса
МойЗапрос.Текст = 
    "ВЫБРАТЬ
    |	ВТСотрудникиОрганизации.Сотрудник,
    |	ВТСотрудникиОрганизации.Подразделение,
    |	ВТСотрудникиОрганизации.Должность
    |ИЗ
    |	ВТСотрудникиОрганизации КАК ВТСотрудникиОрганизации";

Выборка = МойЗапрос.Выполнить().Выбрать();

Способ 4. Получение расширенных кадровых данных

Иногда требуется получить не только факт работы, но и специфические данные (например, ИНН, гражданство, паспортные данные) — для этого подойдёт обработка получения расширенных кадровых данных для ЗУП. Для этого проанализируем функцию КадровыйУчет.КадровыеДанныеСотрудников. Она особенно полезна, когда у вас уже есть список сотрудников, и вам нужно быстро "обогатить" его информацией на определенную дату.

Посмотрим на пример из практики:


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

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

Почему стоит использовать API вместо прямых запросов?

Подведем итог и выясним причины, по которым программный интерфейс КадровыйУчет является приоритетным:

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

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

← На главную