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