Как программно получить кадровую историю сотрудника в 1С:ЗУП 3.1?

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом IT и автоматизация бизнеса
← На главную

При разработке отчетов или обработок в 1С:ЗУП 3.1 часто возникает задача получить полную историю кадровых событий сотрудника: приемы, переводы, изменения условий труда. На первый взгляд, кажется, что достаточно сделать простой запрос к регистру сведений КадроваяИсторияСотрудников. Однако, заглянув в типовые функции конфигурации, можно обнаружить сложные, многоэкранные запросы. Разберемся, почему так происходит и какой способ является методологически правильным и надежным для получения верных сведений.

Основная цель — получить данные для программного формирования унифицированной формы Т-2, включая все приемы и кадровые перемещения, и выгрузить их, например, в таблицу значений для дальнейшей обработки (подписания ЭЦП и отправки в личный кабинет).

Почему прямой запрос к регистрам — плохая идея?

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

  1. Данные распределены. Кадровая информация хранится не в одном месте. Например, основной срез данных находится в регистре КадроваяИсторияСотрудников, но вид занятости (основное место работы, внутреннее или внешнее совместительство) — в отдельном регистре. Для полной картины эти данные нужно правильно соединить.
  2. Сложность учета. В системе реализованы сложные кадровые механизмы, такие как временные переводы, совмещения, работа на нескольких должностях одновременно. Простой запрос к регистру не сможет корректно обработать все эти нюансы.
  3. Изменения при обновлениях. Разработчики 1С могут изменять структуру регистров в новых версиях конфигурации. Если ваш код напрямую обращается к регистрам, он может перестать работать после очередного обновления. Использование встроенных программных интерфейсов (API) защищает от таких проблем, так как 1С гарантирует их работоспособность. Подробно этот вопрос разобран в статье Универсальный отчёт для ЗУП: как сократить время разработки сложных отчётов в разы.

Поэтому методологически верный подход — использовать функции и процедуры, специально предназначенные для этого разработчиками конфигурации. Это обеспечивает стабильность, полноту данных и корректность их получения.

Вариант 1: Использование регистра КадроваяИсторияСотрудниковИнтервальный

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

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

Преимущества:

Недостатки:

Этот способ можно рассматривать как компромисс для решения простых задач, но для формирования полноценных отчетов, таких как Т-2, лучше использовать более надежный метод.

Вариант 2: Использование программного интерфейса (API) модуля КадровыйУчет

Это самый надежный, рекомендуемый и стабильный способ получения кадровых данных. Общий модуль КадровыйУчет содержит набор функций и процедур, которые являются единой точкой входа для работы с кадровой информацией. Полный перечень возможностей модуля можно изучить, используя справочник методов конфигурации Зарплата и кадры 3.1.

Процедура СоздатьВТКадровыеДанныеСотрудников

Эта процедура позволяет сформировать временную таблицу с широким набором кадровых данных для списка сотрудников. Она сама выполняет все сложные запросы "под капотом", собирая информацию из разных источников и корректно ее обрабатывая. Это идеальный вариант для формирования таких инструментов, как сводный отчет по стажу сотрудников на предприятии.

Разберем по шагам, как ей пользоваться.

  1. Подготовка. Сначала нужно создать запрос с менеджером временных таблиц и подготовить исходную временную таблицу. В этой таблице должны быть как минимум две колонки: Сотрудник и Период (дата, на которую нужно получить сведения).
  2. Определение списка полей. Необходимо указать, какие именно кадровые данные мы хотим получить. Это делается через строковую переменную, где имена полей перечисляются через запятую. Например: "Должность,Подразделение,ВидЗанятости,ДатаПриема,ФИОПолные".
  3. Вызов процедуры. Вызывается процедура КадровыйУчет.СоздатьВТКадровыеДанныеСотрудников, которой передаются менеджер временных таблиц и другие параметры. Для отладки и проверки таких конструкций идеально подойдет консоль запросов ЗУП с поддержкой обращения к методам программного интерфейса.
  4. Получение результата. После выполнения процедуры в менеджере временных таблиц появится новая таблица ВТКадровыеДанныеСотрудников, содержащая все запрошенные сведения. Эту таблицу можно использовать в последующих запросах для соединения с другими данными и вывода в отчет.

Посмотрим на пример кода

Предположим, нам нужно получить должность, подразделение и вид занятости для одного сотрудника на текущую дату.


// Создаем запрос и менеджер временных таблиц
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;

// 1. Создаем исходную временную таблицу со списком сотрудников и периодов
// В нашем примере - один сотрудник и текущая дата
Запрос.Текст = 
    "ВЫБРАТЬ
    |    &Сотрудник КАК Сотрудник,
    |    &Период КАК Период
    |ПОМЕСТИТЬ ВТСотрудникиПериоды";

Запрос.УстановитьПараметр("Сотрудник", НужныйСотрудник);
Запрос.УстановитьПараметр("Период", ТекущаяДата());
Запрос.Выполнить();

// 2. Определяем, какие поля нам нужны
СписокКадровыхДанных = "Должность, Подразделение, ВидЗанятости, ДатаПриема, ГрафикРаботы";

// 3. Вызываем процедуру для создания ВТ с кадровыми данными
// Сначала получаем описатель временных таблиц
ОписательВТ = КадровыйУчет.ОписательВременныхТаблицДляСоздатьВТКадровыеДанныеСотрудников(
    Запрос.МенеджерВременныхТаблиц, "ВТСотрудникиПериоды");

// Затем вызываем саму процедуру
// Второй параметр "Истина" означает, что нужно получать данные по сотруднику в целом,
// а не по его рабочему месту (важно для совместителей)
КадровыйУчет.СоздатьВТКадровыеДанныеСотрудников(ОписательВТ, Истина, СписокКадровыхДанных);

// 4. Теперь можно использовать результат
Запрос.Текст = 
    "ВЫБРАТЬ
    |    КадровыеДанные.Сотрудник,
    |    КадровыеДанные.Должность,
    |    КадровыеДанные.Подразделение,
    |    КадровыеДанные.ВидЗанятости,
    |    КадровыеДанные.ДатаПриема,
    |    КадровыеДанные.ГрафикРаботы
    |ИЗ
    |    ВТКадровыеДанныеСотрудников КАК КадровыеДанные";

Результат = Запрос.Выполнить().Выгрузить();

// Теперь в переменной "Результат" находится таблица значений 
// с запрошенными кадровыми данными
Для Каждого Строка Из Результат Цикл
    Сообщить("Сотрудник: " + Строка.Сотрудник + ", Должность: " + Строка.Должность);
КонецЦикла;

Этот подход позволяет гибко управлять составом получаемых данных и гарантирует, что вы получите их в том виде, в котором их "понимает" сама система. Именно так работают все стандартные механизмы, формирующие, к примеру, отчет "Кадровые изменения" в формате до / после.

Итоги

Для программного получения кадровой истории сотрудников в 1С:ЗУП 3.1 следует отказаться от прямых запросов к регистрам сведений в пользу использования программного интерфейса (API) конфигурации. Самым мощным и универсальным инструментом для этой задачи является процедура КадровыйУчет.СоздатьВТКадровыеДанныеСотрудников. Она обеспечивает полноту, корректность и, что немаловажно, стабильность вашего кода при будущих обновлениях программы.

← На главную