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