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