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