Как правильно вывести подразделение сотрудника в отчете ЗУП 3.1

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

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

Почему нельзя просто обратиться к справочнику Сотрудники

В отличие от более простых конфигураций, ЗУП спроектирована так, чтобы хранить историю изменений каждого сотрудника. Один и тот же человек может в начале месяца работать в одном подразделении, а в конце — в другом. Именно поэтому Подразделение, Должность, ГрафикРаботы и Оклад вынесены в регистры сведений. Простой запрос к справочнику Сотрудники даст вам только ссылку на объект, ФИО и общие сведения, но не актуальное место работы на конкретную дату.

Способ 1: Использование типового программного механизма (Рекомендуемый)

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

Рассмотрим пример использования этого метода, чтобы получить данные, как в отчете по сотрудникам (прием, увольнение, отпуска, больничный и командировка), непосредственно в модуле отчета:


// Подготовим структуру необходимых полей
НужныеПоля = "Сотрудник,Подразделение,Должность";

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

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

Преимущества этого метода: он автоматически обрабатывает ситуации, когда сотрудник работает по внутреннему совместительству или имеет несколько кадровых событий в один день.

Способ 2: Работа с интервальными регистрами сведений

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

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

Разберем пример запроса к интервальному регистру (если данные некорректны после миграции, может потребоваться редактирование движений в регистрах документа «Перенос данных»):


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

Важный нюанс: при работе с интервалами необходимо проверять условие Активность = ИСТИНА, чтобы не захватить отмененные или исправленные записи.

Способ 3: Автоматические поля в СКД

Если вы разрабатываете отчет на базе Системы компоновки данных (СКД), вы можете воспользоваться встроенными механизмами ЗУП для расширения полей. В ЗУП реализован механизм так называемых "виртуальных полей кадровых данных".

Выполним следующие шаги для настройки:

  1. В схеме компоновки данных добавьте набор данных — запрос.
  2. Выберите данные из нужного вам документа или справочника (например, Документ.Командировка).
  3. В настройках набора данных на закладке "Связи наборов данных" или через программную установку параметров вызовите механизмы ЗУП для подтягивания кадров.
  4. В ЗУП часто достаточно просто выбрать поле Сотрудник, и если отчет работает в рамках БСП, система позволит добавить "связанные поля", такие как подразделение на дату.

Различие между Подразделением и Подразделением организации

Выясним причину, по которой иногда отчет выдает пустые значения, даже если запрос написан верно. Эта путаница критична, например, если настраивается массовое автоматическое начисление зарплаты по подразделениям. В ЗУП 3.1 существует два типа подразделений:

  1. Подразделение (структурное) — используется в кадровом учете и штатном расписании.
  2. Подразделение организации — используется в регламентированном учете (налоги, отчетность, ПФР/ИФНС).

В большинстве кадровых регистров используется именно структурное Подразделение. Проверьте, какое именно поле вы пытаетесь вывести. Если вы используете Справочник.ПодразделенияОрганизаций.ПустаяСсылка, как в исходном вопросе автора темы, вы получите пустой результат, если в базе используются обычные подразделения.

Проблема границы дня и "лишней минуты"

Посмотрим на пример ситуации, упомянутой на форуме: перевод оформлен с 15.07. В регистр начало действия может записаться как 15.07.2023 00:00:00 или даже 15.07.2023 00:01:00. Если вы делаете срез на НачалоДня(15.07.2023), запрос может не увидеть новую запись.

Рекомендация: Всегда используйте КонецДня для параметров даты при получении кадровых срезов, либо передавайте дату со временем 23:59:59. Это гарантирует, что все кадровые изменения, произошедшие в течение дня, попадут в выборку.

Заключение

Для корректного вывода подразделения в ЗУП 3.1:

← На главную