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