Зуп получить подразделение сотрудника в запросе

Забудьте о сложных JOIN! Простой способ получить подразделение сотрудника в запросе за секунды. Экономьте нервы и время на отчетах.

Бесплатная консультация юриста

+7 (800) 302-87-29

Реклама jurik.ru

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

Где хранятся данные о подразделении сотрудника

В ЗУП 3.1 основные кадровые данные (подразделение, должность, дата приема и т.д.) хранятся в регистре сведений «КадроваяИсторияСотрудников». Это периодический регистр сведений с режимом «В пределах секунды», поэтому для получения актуальных данных нужно использовать срез последних.

Основные поля регистра:

  • Сотрудник — ссылка на справочник «Сотрудники»;
  • Подразделение — ссылка на справочник «ПодразделенияОрганизаций»;
  • Должность — ссылка на справочник «Должности»;
  • ВидСобытия — прием, перевод, увольнение и т.д.;
  • Организация — организация, в которой оформлен сотрудник.

Способ 1. Срез последних регистра «КадроваяИсторияСотрудников»

Классический вариант, получить подразделение на определенную дату через виртуальную таблицу среза последних:

ВЫБРАТЬ
	КадроваяИстория.Сотрудник КАК Сотрудник,
	КадроваяИстория.Подразделение КАК Подразделение,
	КадроваяИстория.Должность КАК Должность
ИЗ
	РегистрСведений.КадроваяИсторияСотрудников.СрезПоследних(&Период, ) КАК КадроваяИстория

Если нужно получить данные только по конкретным сотрудникам, передайте отбор в параметры виртуальной таблицы — это существенно ускорит запрос:

ВЫБРАТЬ
	КадроваяИстория.Сотрудник КАК Сотрудник,
	КадроваяИстория.Подразделение КАК Подразделение
ИЗ
	РегистрСведений.КадроваяИсторияСотрудников.СрезПоследних(
			&Период,
			Сотрудник В (&СписокСотрудников)) КАК КадроваяИстория

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

ГДЕ
	КадроваяИстория.ВидСобытия <> ЗНАЧЕНИЕ(Перечисление.ВидыКадровыхСобытий.Увольнение)

Способ 2. Стандартный механизм ЗУП — временная таблица «ВТКадровыеДанныеСотрудников»

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

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

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

Временная таблица ВТСотрудникиОрганизации уже содержит поле «Подразделение», что избавляет от необходимости писать соединения вручную.

Способ 3. Получение подразделения в отчете на СКД

При разработке отчета на системе компоновки данных удобно использовать срез последних с параметром периода, который СКД подставит автоматически:

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

Параметр «Период» добавьте на закладке «Параметры» настройки СКД и свяжите его со стандартным периодом отчета.

Способ 4. Подразделение на каждую дату периода

Если нужно знать, в каком подразделении сотрудник работал в каждый конкретный день (например, для отчета по табелю), используйте таблицу регистра напрямую с объединением по периодам:

ВЫБРАТЬ
	КадроваяИстория.Период КАК Период,
	КадроваяИстория.Сотрудник КАК Сотрудник,
	КадроваяИстория.Подразделение КАК Подразделение
ИЗ
	РегистрСведений.КадроваяИсторияСотрудников КАК КадроваяИстория
ГДЕ
	КадроваяИстория.Период МЕЖДУ &НачалоПериода И &КонецПериода

Типичные ошибки и рекомендации

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

Получить подразделение сотрудника в запросе в 1С:ЗУП можно несколькими способами. Для простых задач достаточно среза последних регистра сведений «КадроваяИсторияСотрудников», для сложных отчетов лучше использовать типовые процедуры общего модуля «КадровыйУчет». Главное — не забывать про периодичность регистра, уволенных сотрудников и совместителей, и тогда ваши запросы будут работать корректно и быстро.