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