Как получить данные о должности и подразделении сотрудника в 1С:ЗУП 3.1?

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

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

Использование интервальных регистров для консоли запросов

Если ваша задача — быстро вывести список сотрудников с их актуальными должностями и подразделениями через консоль запросов, наиболее эффективным объектом будет Регистр сведений «Кадровая история сотрудников (интервальный)». Рассмотрим подробнее, почему именно он удобен для разработчика.

В отличие от обычных регистров сведений, интервальный регистр хранит данные в виде периодов «Дата начала» и «Дата окончания». Это позволяет получить состояние сотрудника на любую дату без использования ресурсоемкого соединения со СрезомПоследних. Проанализируем пример простого запроса к этому регистру:


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

Такой подход гарантирует получение корректных данных, так как система сама заботится о «схлопывании» интервалов при кадровых изменениях. Это именно тот способ, на котором остановились участники обсуждения в сообщении №8.

Работа с регистром «Текущие кадровые данные сотрудников»

Разберем ситуацию, упомянутую в сообщении №3, когда регистр ТекущиеКадровыеДанныеСотрудников оказывается пустым. Этот регистр является вспомогательным (денормализованным) и предназначен для ускорения работы динамических списков (например, справочника «Сотрудники»).

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

Профессиональный подход: программный интерфейс (API)

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

Посмотрим на пример использования этой функции в коде:


// Формируем список сотрудников
СписокСотрудников = Новый Массив;
СписокСотрудников.Добавить(СсылкаНаСотрудника);

// Определяем нужные поля
Поля = "Сотрудник, Подразделение, Должность, ВидЗанятости";

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

Для Каждого Строка Из ТаблицаДанных Цикл
    Сообщить(Строка.Сотрудник + ": " + Строка.Должность + " в " + Строка.Подразделение);
КонецЦикла;

Этот метод предпочтительнее прямого обращения к регистрам, так как при обновлении конфигурации фирма «1С» может изменить структуру таблиц, но программный интерфейс (API), скорее всего, останется неизменным или будет обновлен автоматически.

Нюанс: Должность vs Позиция штатного расписания

При получении данных важно различать два понятия, которые часто путают начинающие разработчики:

  1. Должность — это элемент справочника Должности. Она общая для всей организации (например, «Бухгалтер»).
  2. Позиция штатного расписания — это конкретная единица в структуре предприятия (например, «Бухгалтер в отделе учета затрат»).

Если в базе ведется штатное расписание, то в регистре КадроваяИсторияСотрудников поле ДолжностьПоШтатномуРасписанию будет содержать ссылку на позицию, из которой уже можно получить и подразделение, и саму «общую» должность. Если вы видите в регистрах пустые колонки должностей, проанализируйте, не используются ли в вашей базе позиции штатного расписания.

Использование временных таблиц для сложных отчетов

Когда данных много и нужно соединить их с другими таблицами в сложном запросе, рекомендуется использовать механизм создания временных таблиц кадровых данных. В типовых решениях для этого предусмотрены специальные процедуры. Проанализируем логику:

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

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

Альтернативные источники: Данные для подбора

Как было замечено в сообщении №6, существует также регистр ДанныеСотрудниковДляПодбора. Он полезен, если вам нужно быстро получить информацию для выбора сотрудника в документ. Там хранятся не только кадровые данные, но и информация о состоянии (в отпуске, на больничном, уволен), что позволяет отсеивать неактивных сотрудников без дополнительных соединений с регистрами состояний.

Подведем итог:

← На главную