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