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