Как в 1С:ЗУП 3.1 сформировать отчет по кадровым переводам с данными ДО и ПОСЛЕ перевода?

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

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

Рассмотрим подробно все доступные варианты, проанализируем их плюсы и минусы, а также разберем техническую реализацию для программистов.

Способ 1. Настройка типового отчета «Кадровые изменения»

Прежде чем приступать к разработке, давайте проверим возможности встроенного механизма компоновки данных. Типовой отчет Кадровые изменения (раздел Кадры — Кадровые отчеты) обладает скрытым потенциалом, о котором знают не все пользователи.

Разберем по шагам, как вытащить данные «до перевода» без использования кода:

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

Важный нюанс: Типовой отчет хорошо показывает, ЧТО изменилось (новое значение), но вывод старого значения в ту же строку часто требует «допиливания» схемы компоновки. Если стандартных полей не хватает, переходим к более профессиональным методам.

Способ 2. Использование регистра «Кадровая история сотрудников (интервальный)»

Для программиста и аналитика наиболее правильным путем будет использование данных из регистра сведений КадроваяИсторияСотрудниковИнтервальный. Рассмотрим, почему это эффективнее обычного регистра истории.

В обычном регистре сведений каждая запись — это просто точка во времени (событие). Чтобы понять, когда закончилось действие этой записи, нужно искать следующую. В интервальном регистре каждая запись уже имеет ДатаНачала и ДатаОкончания. Это позволяет нам строить запросы с соединением таблицы «самой с собой».

Проанализируем логику запроса для получения данных «было/стало»:


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

Однако в интервальном регистре КадроваяИсторияСотрудниковИнтервальный это сделать еще проще. Мы можем соединить записи по условию:

ПредыдущаяИстория.ДатаОкончания + 1 секунда = ТекущаяИстория.ДатаНачала

Выясним причину, почему стоит использовать именно интервальный регистр: он автоматически обрабатывает ситуации с «исправлением» документов и перекрытием периодов, что в обычном регистре пришлось бы вычислять вручную через сложные вложенные запросы.

Способ 3. Программная подготовка данных через типовые процедуры

Если вы разрабатываете сложный отчет на СКД, воспользуйтесь методами, которые применяют сами разработчики фирмы «1С». В типовых конфигурациях существует мощный механизм подготовки временных таблиц с кадровыми данными.

Рассмотрим процедуру ЗарплатаКадрыПериодическиеРегистры.СоздатьВТИмяРегистраПериоды. Она позволяет получить срезы данных на каждый момент изменения состояния. Посмотрим на пример логики построения отчета:

  1. Создаем запрос, в котором вызываем формирование временной таблицы кадровой истории.
  2. Используем менеджер временных таблиц, чтобы передать его в типовую функцию.
  3. В результате получаем таблицу, где для каждого изменения (перевода) зафиксированы все ключевые реквизиты.

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

В запросе мы можем поместить данные во временную таблицу ВТ_История, а затем выбрать из нее данные следующим образом:


ВЫБРАТЬ
    Т1.Сотрудник,
    Т1.Подразделение КАК НовоеПодразделение,
    ЕСТЬNULL(Т2.Подразделение, ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка)) КАК СтароеПодразделение
ИЗ
    ВТ_История КАК Т1
    ЛЕВОЕ СОЕДИНЕНИЕ ВТ_История КАК Т2 
    ПО Т1.Сотрудник = Т2.Сотрудник 
    И Т1.НомерСтрокиДляСравнения = Т2.НомерСтрокиДляСравнения + 1

Здесь НомерСтрокиДляСравнения — это порядковый номер кадрового события сотрудника, который легко получить с помощью функции АВТОНОМЕРЗАПИСИ() или через соединение по датам.

Дополнительные нюансы: на что обратить внимание

При построении отчета по переводам важно не забыть про реквизиты, которые с недавних пор хранятся в отдельных регистрах. Проанализируем эти изменения в структуре ЗУП 3.1:

Резюме и рекомендации

Мы проанализировали ситуацию и выяснили, что наиболее стабильным и гибким решением является создание внешнего отчета на базе СКД, использующего регистр КадроваяИсторияСотрудниковИнтервальный.

Основные шаги для реализации:

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

Такой подход обеспечит точность данных и позволит пользователям видеть наглядную картину кадровых перемещений в организации.

← На главную