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

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

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

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

Метод 1. Использование прямого запроса к регистрам сведений

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

Рассмотрим логику построения запроса:

  1. Выбираем все элементы из справочника ПодразделенияОрганизаций.
  2. Выполняем ЛЕВОЕ СОЕДИНЕНИЕ с регистром ТекущиеКадровыеДанныеСотрудников по полю Подразделение.
  3. Устанавливаем фильтр в блоке ГДЕ, отбирая только те записи, где ссылка на сотрудника в регистре равна NULL.
  4. Обязательно исключаем уже расформированные подразделения, чтобы отчет был актуальным.

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


ВЫБРАТЬ
    Подразделения.Ссылка КАК Подразделение,
    Подразделения.Владелец КАК Организация
ИЗ
    Справочник.ПодразделенияОрганизаций КАК Подразделения
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТекущиеКадровыеДанныеСотрудников КАК КадровыеДанные
        ПО Подразделения.Ссылка = КадровыеДанные.ТекущееПодразделение
ГДЕ
    КадровыеДанные.Сотрудник ЕСТЬ NULL
    И Подразделения.Расформировано = ЛОЖЬ
    И Подразделения.ПометкаУдаления = ЛОЖЬ

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

Метод 2. Программное получение данных через общий модуль

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

Проанализируем пример кода, который позволяет получить кадровые данные сотрудников на определенную дату:


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

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

Этот метод возвращает ТаблицуЗначений. Чтобы найти пустые подразделения, мы можем выгрузить колонку Подразделение из этой таблицы и сравнить ее со справочником подразделений программно, либо передать эту таблицу в СКД.

Метод 3. Интеграция данных в отчет СКД через внешний набор

Если перед нами стоит задача создать полноценный отчет, лучшим решением будет использование СКД с программным заполнением данных. Рассмотрим, как это сделать через «Внешний набор данных».

Пошаговый алгоритм действий:

  1. В схеме компоновки данных создаем Набор данных - объект с именем, например, ВнешниеДанныеСотрудников.
  2. Описываем поля в наборе данных (Подразделение, Организация).
  3. В модуле объекта отчета (или в процедуре ПриКомпоновкеРезультата) формируем таблицу значений с помощью описанных выше методов.
  4. Передаем готовую таблицу в процессор компоновки.

Пример кода в модуле отчета:


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

Метод 4. Программное создание временных таблиц в СКД

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

Это позволяет нам писать запросы непосредственно в СКД к таблице ВТКадровыеДанные, которая физически будет создана программным кодом перед выполнением отчета. Это сохраняет все преимущества работы с иерархией и отборами СКД, избавляя от необходимости вручную описывать структуру внешнего набора данных.

Проанализируем преимущества такого подхода:

Резюме

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

← На главную