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