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