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