Как найти пустые подразделения в 1С с учетом всей иерархии?

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

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

Понимание концепции «пустого» подразделения

Прежде чем приступать к написанию кода, важно четко определить критерий выборки. Мы считаем подразделение «пустым» только в том случае, если ни в самом элементе, ни в одном из его дочерних элементов (на любой глубине вложенности) нет записей о сотрудниках. Иными словами, нас интересуют только «листья» дерева, которые не содержат данных, или ветки, в которых полностью отсутствуют сотрудники на всех уровнях иерархии.

Метод исключения непустых родителей

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

  1. Получаем список всех подразделений, где есть сотрудники.
  2. Разворачиваем иерархию вверх. Чтобы исключить родителя, который содержит непустого потомка, нам нужно получить всех родителей для каждого найденного «занятого» подразделения.
  3. Формируем исключающий список. Собрав все такие элементы, мы получаем полный перечень подразделений, которые не должны попасть в наш итоговый отчет.

Технические нюансы реализации запросов

При реализации данного алгоритма важно учитывать особенности работы платформы 1С с иерархией. Конструкция В ИЕРАРХИИ в запросах 1С является мощным инструментом, но она имеет ограничения при работе с вложенными запросами. Чтобы корректно отфильтровать дерево, мы рекомендуем следующий порядок действий:

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


ВЫБРАТЬ РАЗЛИЧНЫЕ
    Сотрудники.Подразделение КАК Подразделение
ПОМЕСТИТЬ ВТ_НеПустые
ИЗ
    РегистрСведений.КадроваяИстория КАК Сотрудники
ГДЕ
    Сотрудники.ЕстьСотрудники = ИСТИНА
;

ВЫБРАТЬ
    Подразделения.Ссылка
ИЗ
    Справочник.Подразделения КАК Подразделения
ГДЕ
    НЕ Подразделения.Ссылка В ИЕРАРХИИ (ВЫБРАТЬ Подразделение ИЗ ВТ_НеПустые)

Рассмотрим подробнее, почему это работает: когда мы используем НЕ В ИЕРАРХИИ, платформа автоматически отсекает не только те элементы, которые напрямую указаны в списке, но и всех их «родителей», так как для них условие вхождения в иерархию непустого подразделения также будет истинным.

Решение с использованием ИТОГИ ПО

Если задача требует построения дерева в коде, можно использовать механизм итогов. Запрос с конструкцией ИТОГИ ПО Подразделение ИЕРАРХИИ позволяет получить структуру, которую можно перебирать в цикле. При обходе выборки вы можете проверять наличие сотрудников в узлах. Если узел и все его подчиненные пусты, вы можете смело включать его в свой список пустых подразделений.

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

Использование возможностей СКД

Наиболее оптимальный способ для вывода отчетов — использование СКД. Вам не нужно писать сложный код вручную. Достаточно выполнить следующие действия:

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

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

← На главную