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