Как программно получить должность сотрудника в 1С:Зарплата и управление персоналом 3.1

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

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

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

Метод 1: Использование универсальной функции КадровыйУчет.КадровыеДанныеСотрудников

Наиболее правильным и рекомендуемым способом получения кадровой информации в ЗУП 3.1 является использование экспортных функций модуля КадровыйУчет. Этот метод гарантирует, что вы получите актуальные данные с учетом всех кадровых перемещений, совместительства и особенностей конфигурации.

Рассмотрим применение основной функции КадровыеДанныеСотрудников. Она удобна тем, что позволяет за один вызов получить целый набор полей для списка сотрудников на конкретную дату. Проанализируем пример кода:


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

// Формируем строку необходимых полей через запятую
// Можно запросить: Должность, Подразделение, Организация, ФизЛицо и др.
СтрокаПолей = "Должность, Подразделение, ДолжностьПоШтатномуРасписанию";

// Вызываем функцию API
КадровыеДанные = КадровыйУчет.КадровыеДанныеСотрудников(
    Истина, 
    МассивСотрудников, 
    СтрокаПолей, 
    ТекущаяДата()
);

// Результатом является ТаблицаЗначений
Для Каждого СтрокаИзРезультата Из КадровыеДанные Цикл
    ТекДолжность = СтрокаИзРезультата.Должность;
    ТекПодразделение = СтрокаИзРезультата.Подразделение;
    // Работаем с полученными данными
КонецЦикла;

Важные нюансы этого метода:

  1. Параметр «ТолькоРазрешенные»: Первый параметр (Истина) отвечает за проверку прав доступа (RLS). Если у пользователя нет прав на просмотр данных сотрудника, функция их не вернет.
  2. Массив на входе: Функция всегда принимает массив сотрудников, даже если вам нужно получить данные только по одному человеку. Это сделано для оптимизации производительности при работе с большими списками.
  3. Должность vs Позиция: Обратите внимание, что поле Должность вернет ссылку на справочник «Должности», а поле ДолжностьПоШтатномуРасписанию вернет ссылку на позицию штатного расписания. Это критично, если в вашей базе ведется штатное расписание и названия позиций в нем отличаются от базовых названий должностей.

Метод 2: Работа с данными в запросах через временные таблицы

Если вам необходимо получить должности сотрудников внутри вашего собственного сложного запроса (например, для построения отчета), использование функции из первого метода в цикле будет крайне неэффективным. Для таких случаев в 1С предусмотрен механизм программного формирования временных таблиц с кадровыми данными.

Разберем алгоритм действий:

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

Посмотрим на пример реализации:


Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;

// 1. Формируем исходную таблицу со списком сотрудников
Запрос.Текст = 
    "ВЫБРАТЬ
    |    &Сотрудник КАК Сотрудник,
    |    &Период КАК Период
    |ПОМЕСТИТЬ ВТ_СписокСотрудников";
    
Запрос.УстановитьПараметр("Сотрудник", СсылкаНаСотрудника);
Запрос.УстановитьПараметр("Период", ТекущаяДата());
Запрос.Выполнить();

// 2. Вызываем системную процедуру для наполнения данными
// Она создаст ВТ с именем "ВТКадровыеДанныеСотрудников"
КадровыйУчет.СоздатьВТКадровыеДанныеСотрудников(
    Запрос.МенеджерВременныхТаблиц, 
    Истина, 
    "Должность, Подразделение", 
    "ВТ_СписокСотрудников");

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

РезультатЗапроса = Запрос.Выполнить().Выбрать();

Этот подход является эталонным с точки зрения производительности системы, так как 1С внутри себя выполнит оптимальное соединение с регистрами кадровой истории.

Метод 3: Регистр сведений «Текущие кадровые данные сотрудников»

Иногда требуется получить должность максимально быстро и только на текущий момент времени. В ЗУП 3.1 существует специальный непериодический регистр сведений ТекущиеКадровыеДанныеСотрудников.

Выясним причину, по которой этот метод не всегда применим. Данный регистр является своего рода «зеркалом» актуального состояния. В нем нет истории. Если вам нужно узнать, кем работал сотрудник год назад, этот регистр вам не поможет. Но для оперативных задач (например, вывести должность в текущей форме) он идеален.

Пример получения данных через этот регистр:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    ТекущиеДанные.Должность
    |ИЗ
    |    РегистрСведений.ТекущиеКадровыеДанныеСотрудников КАК ТекущиеДанные
    |ГДЕ
    |    ТекущиеДанные.Сотрудник = &Сотрудник";

Запрос.УстановитьПараметр("Сотрудник", СсылкаНаСотрудника);
Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда
    Должность = Выборка.Должность;
КонецЕсли;

Важно: Всегда проверяйте, не является ли сотрудник уволенным. В этом регистре данные могут сохраняться и после увольнения, поэтому стоит дополнительно проверять поле ДатаУвольнения или использовать методы из первого раздела статьи.

Метод 4: Прямой запрос к регистру «Кадровая история сотрудников»

Если по каким-то причинам вы не можете использовать программный интерфейс (API), можно обратиться напрямую к регистру сведений КадроваяИсторияСотрудников. Однако здесь кроется несколько «подводных камней».

Проанализируем ситуацию: данные в этом регистре хранятся с признаком В работе. Также там могут присутствовать записи-пустышки или записи о будущих изменениях. Чтобы получить корректную должность на дату, нужно использовать виртуальную таблицу СрезПоследних и обязательно накладывать фильтр по условию В работе = Истина.

Пример структуры запроса:


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

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

Резюме и рекомендации

Подведем итоги нашего разбора. Выбор метода зависит от контекста вашей задачи:

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

← На главную