Как в ЗУП 3.1 программно узнать подразделение, в котором работает сотрудник

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

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

Анализ структуры хранения данных в ЗУП 3.1

Проанализируем ситуацию: почему старый подход с использованием прямого запроса к "Срезу последних" не всегда является оптимальным? В ЗУП 3.1 данные разделены по назначению. Система должна быстро выдавать актуальные данные для списков, строить сложные отчеты за периоды и при этом корректно обрабатывать ситуации, когда в один день происходят несколько кадровых событий (например, прием и перемещение).

Рассмотрим основные регистры, которые пришли на смену привычному регистру РаботникиОрганизаций:

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

Вариант 1: Получение актуальных данных через Текущие кадровые данные

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

Разберем пример запроса:


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

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

Вариант 2: Использование Кадровой истории (традиционный подход)

Посмотрим на пример запроса к основной кадровой истории. Если нам нужно узнать место работы сотрудника на произвольную дату, мы используем виртуальную таблицу СрезПоследних регистра КадроваяИсторияСотрудников. Важно помнить, что в ЗУП 3.1 ключевым измерением является именно Сотрудник, а не ФизическоеЛицо, так как одно физлицо может иметь несколько рабочих мест (внутреннее совместительство).


ВЫБРАТЬ
    КадроваяИстория.Подразделение КАК Подразделение,
    КадроваяИстория.Должность КАК Должность,
    КадроваяИстория.Организация КАК Организация
ИЗ
    РегистрСведений.КадроваяИсторияСотрудников.СрезПоследних(&Период, Сотрудник = &ВыбСотрудник) КАК КадроваяИстория

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

Вариант 3: Интервальные регистры — современный стандарт

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

Рассмотрим пример запроса для получения данных на конкретную дату:


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

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

Вариант 4: Рекомендованный метод через API (Программный интерфейс)

Самый надежный способ, который гарантирует корректность данных даже после глобальных обновлений конфигурации — это использование программного модуля КадровыйУчет. Фирма «1С» рекомендует использовать метод СоздатьВТКадровыеДанныеСотрудников. Этот метод формирует временную таблицу со всеми необходимыми данными, учитывая все внутренние правила БЗК.

Разберем по шагам, как это реализовать в коде:

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

МенеджерВТ = Новый МенеджерВременныхТаблиц;
МассивСотрудников = Новый Массив;
МассивСотрудников.Добавить(ВыбСотрудник);

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

КадровыйУчет.СоздатьВТКадровыеДанныеСотрудников(ПараметрыПолученияДанных);

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

Результат = Запрос.Выполнить().Выбрать();
Если Результат.Следующий() Тогда
    // Работаем с данными
КонецЕсли;

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

Заключение

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

← На главную