В конфигурации «1С:Зарплата и управление персоналом», редакция 3.1 (ЗУП 3.1), архитектура хранения данных претерпела значительные изменения по сравнению со старой редакцией 2.5. Одной из частых проблем, с которой сталкиваются разработчики и аналитики при составлении запросов и отчетов, является поиск дат приема и увольнения сотрудников. В справочнике Сотрудники эти реквизиты больше не хранятся напрямую. В этой статье мы подробно разберем, где именно в системе находятся эти даты, как их правильно получать программно с помощью запросов и встроенного API, а также как вывести их на форму в пользовательском режиме.
Прежде чем перейти к поиску дат, проанализируем важный методологический нюанс ЗУП 3.1. В системе строго разделены понятия физического лица (справочник ФизическиеЛица) и сотрудника (справочник Сотрудники). Один и тот же человек (физическое лицо) может иметь несколько карточек в справочнике Сотрудники. Например, если он уволился, а через год снова устроился в компанию, или если он работает по внутреннему совместительству. Каждая карточка сотрудника жестко привязана к конкретному трудовому договору.
Поэтому помните: если вам нужны даты работы сотрудника по конкретному договору, поиск необходимо вести в привязке к элементу справочника Сотрудники. Если же стоит задача найти самую первую дату, когда человек вообще пришел в компанию, придется анализировать данные в разрезе физического лица.
Для быстрого и удобного получения актуальной информации разработчики фирмы «1С» добавили специальный вспомогательный регистр сведений — ТекущиеКадровыеДанныеСотрудников. Этот регистр хранит срез актуальных кадровых данных по каждому сотруднику на текущий момент времени.
Преимущества работы с этим регистром:
ДатаПриема и ДатаУвольнения.ТекущаяОрганизация, ТекущееПодразделение, ТекущаяДолжность.Важное предупреждение: этот регистр является вспомогательным (информационным) и заполняется автоматически при проведении кадровых документов. В редких случаях (например, при некорректной программной загрузке данных, сбоях или незавершенных транзакциях) данные в нем могут временно разойтись с реальными документами. Если вам нужна абсолютная точность, используйте кадровые регистры напрямую.
Если вам требуется «железобетонный» вариант получения данных в запросе, который гарантированно исключает рассинхронизацию, следует обращаться к основному регистру сведений КадроваяИсторияСотрудников. Данные в нем хранятся в неявном виде через кадровые события. Для выгрузки сведений из этого регистра можно использовать отчет по кадровой истории сотрудников.
Выясним причину такой структуры: регистр хранит всю историю изменений по сотруднику. Каждая запись содержит ресурс ВидСобытия, который принимает значения из перечисления ВидыКадровыхСобытий (например: Прием, Перемещение, Увольнение, НачальныеДанные, ВосстановлениеВДолжности).
Для вычисления нужных дат в запросе используем следующую логику:
Период для записей, где вид события равен Прием или НачальныеДанные (используется при переносе остатков из старых баз). Если периодов работы у сотрудника было несколько, обычно выбирают самый поздний из них.Период для записи с видом события Увольнение.Критически важный нюанс при работе с датой увольнения в запросах: в регистре КадроваяИсторияСотрудников дата увольнения записывается как первый день, когда сотрудник больше не работает. Это часто вызывает путаницу. Например, если в документе «Увольнение» последним рабочим днем сотрудника указано 10 ноября, то в регистре кадровой истории в поле Период запишется дата 11 ноября. Чтобы получить реальную дату увольнения (последний рабочий день), в запросе необходимо вычесть один день с помощью функции ДОБАВИТЬКДАТЕ(Период, ДЕНЬ, -1).
Если вы пишете программный код в конфигураторе, выполнять прямые запросы к регистрам не рекомендуется. В ЗУП 3.1 реализован мощный программный интерфейс (API) для разработчиков. Для получения кадровых данных предназначена функция общего модуля КадровыйУчет.КадровыеДанныеСотрудников.
Рассмотрим пример кода для получения даты приема одного сотрудника:
КадровыеДанные = КадровыйУчет.КадровыеДанныеСотрудников(Истина, Сотрудник, "ДатаПриема, ДатаУвольнения");
Если КадровыеДанные.Количество() > 0 Тогда
СтрокаДанных = КадровыеДанные[0];
ДатаПриема = СтрокаДанных.ДатаПриема;
ДатаУвольнения = СтрокаДанных.ДатаУвольнения;
КонецЕсли;
Проанализируем этот пример подробнее. Первым параметром мы передаем булево значение (нужно ли помещать результат во временную таблицу, в данном случае Истина). Второй параметр — это ссылка на сотрудника или массив сотрудников. Третий параметр — строка с перечислением необходимых нам полей через запятую.
Преимущества программного API перед прямым запросом:
Если же вам нужно получить самую первую дату приема физического лица в компанию (а не по конкретному трудовому договору), воспользуйтесь аналогичной функцией КадровыйУчет.КадровыеДанныеФизическихЛиц.
Если вы разрабатываете отчет на базе СКД, вам вообще не нужно вручную связывать таблицы или писать сложные программные вызовы. В ЗУП 3.1 реализован механизм предопределенных (виртуальных) полей.
Когда в качестве источника данных в конструкторе схемы компоновки данных вы выбираете таблицу Справочник.Сотрудники, вам автоматически становятся доступны вложенные поля через точку от поля Ссылка:
Ссылка.ОсновноеДанныеКонтракта.ДатаПриемаСсылка.ОсновноеДанныеКонтракта.ДатаУвольненияПлатформа сама на лету обратится к нужным кадровым регистрам и выведет корректные даты в ваш отчет.
Иногда требуется найти именно первичный документ, зафиксировавший прием или увольнение. Реквизиты дат хранятся непосредственно в кадровых документах:
ДатаПриема содержится в документах ПриемНаРаботу, ПриемНаРаботуСписком и ВосстановлениеВДолжности.ДатаУвольнения содержится в документах Увольнение и УвольнениеСписком.ДанныеНаНачалоЭксплуатации или специальных технических документах переноса данных.Если вы являетесь пользователем программы или аналитиком, и вам нужно просто увидеть эти даты на экране без программирования, разберем по шагам, как вывести их в список сотрудников:
Список (или ветку, отвечающую за вывод колонок таблицы).Принят (соответствует дате приема) и Уволен (соответствует дате увольнения).Мы подробно изучили все основные способы поиска и извлечения дат приема и увольнения в программе 1С:ЗУП 3.1. Используйте быстрый регистр ТекущиеКадровыеДанныеСотрудников для простых запросов, основной регистр кадровой истории для сложных выборок, и всегда отдавайте предпочтение готовому API КадровыйУчет при разработке программных модулей. При необходимости формирования готовой отчетности без программирования можно использовать отчет по датам приема и увольнения сотрудников.