Как получить должность сотрудника запросом в ЗУП 3.1, если в ТекущиеКадровыеДанныеСотрудников она не заполнена

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

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

Почему данные исчезли из регистра «Текущие кадровые данные»

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

Важно помнить, что данные в этом регистре обновляются специальным регламентным заданием «Обновление данных о сотрудниках». Если это задание отключено или выполняется с ошибками, данные будут неактуальны. Но даже при его работе, стратегическое решение 1С — получение данных напрямую из истории или через временные таблицы. Поэтому нам стоит рассмотреть более надежные методы.

Способ 1. Использование интервальных регистров (самый быстрый запрос)

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

Рассмотрим пример запроса к интервальному регистру:


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

При использовании этого метода обратите внимание на параметр ДатаОкончания. В 1С принята константа «пустой» даты завершения (обычно 31.12.3999), поэтому условие МЕЖДУ корректно отработает для актуальных сотрудников.

Способ 2. Использование программного формирования временной таблицы (Золотой стандарт)

Наиболее правильным и универсальным способом в ЗУП 3.1 является использование механизма создания временных таблиц кадровых данных. Этот метод учитывает все нюансы системы: совмещение, работу по штатному расписанию, периоды действия и даже права доступа. Мы можем программно подготовить запрос, который 1С сама дополнит нужными соединениями.

Разберем этот механизм по шагам:

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

Пример подготовки структуры запроса в коде:


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

// 2. Подготавливаем исходную таблицу с сотрудниками
Запрос.Текст = 
"ВЫБРАТЬ
|   &Сотрудник КАК Сотрудник,
|   &Период КАК Период
|ПОМЕСТИТЬ ВТСотрудникиПериоды";
Запрос.УстановитьПараметр("Сотрудник", ВыбранныйСотрудник);
Запрос.УстановитьПараметр("Период", ТекущаяДата());
Запрос.Выполнить();

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

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

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

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

Нюансы получения должности при ведении штатного расписания

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

Выясним причину, почему иногда поле Должность в регистрах истории может быть пустым. Это происходит, когда логика учета завязана на позицию. В таких случаях в запросах следует обращаться к полю ДолжностьПоШтатномуРасписанию. Оно ссылается на справочник ПозицииШтатногоРасписания, из которого уже можно вытащить «чистую» должность:

КадроваяИстория.ДолжностьПоШтатномуРасписанию.Должность

Краткий итог

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

Помните, что прямое обращение к ТекущиеКадровыеДанныеСотрудников в современном ЗУП является признаком устаревшего подхода и может привести к ошибкам в данных отчета.

← На главную