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