Новая структура компании в Битрикс24. Часть 1

Новая структура в Битрикс24 реализована модулем humanresources.
Ранее данные об организационной структуре хранились в инфоблоках, но в текущей версии модуля реализовано хранение в собственных таблицах.
Возможности модуля
Модуль позволяет:
- создавать подразделения;
- добавлять сотрудников в подразделения;
- назначать несколько руководителей и заместителей;
- поддерживать произвольный уровень вложенности;
- работать с несколькими структурами в рамках одного Битрикс24 (еще не реализовано)
Как выглядит новая структура
Страница создания и изменения структуры компании расположена по адресу: /hr/structure/

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

Совместимость
На данный момент (апрель 2025) реализована обратная совместимость модуля HR: При добавлении подразделения через модуль, подразделение добавляется и в инфоблоки (и наоборот). Важно: В будущем планируется полный переход на новую модель без обратной совместимости.
Архитектура
В прошлой версии для хранения древовидной структуры использовался механизм разделов инфоблоков, основанный на методе Nested Sets.
Nested Sets — это один из методов хранения иерархических данных (например, деревьев или структур с родительскими и дочерними элементами) в базе данных. Этот подход основан на использовании двух числовых значений (обычно называемых LEFT_MARGIN и RIGHT_MARGIN) для каждого узла в дереве.
Как работает Nested Sets?
- LEFT_MARGIN и RIGHT_MARGIN — это числовые значения, которые обозначают границы диапазона для каждого узла в дереве.
- Каждый узел имеет два числа, которые определяют его позицию в дереве, включая все дочерние элементы.
- Если узел является родительским, то его дочерние узлы будут иметь значения, которые находятся внутри диапазона этого родителя (между LEFT_MARGIN и RIGHT_MARGIN родительского узла).
Преимущества:
- Быстрый поиск потомков: Чтобы найти всех потомков определенного узла, достаточно выполнить запрос, проверив, находятся ли LEFT_MARGIN и RIGHT_MARGIN дочерних узлов внутри диапазона родительского узла.
- Хорошая производительность при чтении: Чтение иерархии происходит быстро, так как все связи между родителями и потомками заранее определены.
Недостатки:
- Медленные операции изменения: Изменение структуры, например, добавление, удаление или перемещение узлов, требует пересчета значений LEFT_MARGIN и RIGHT_MARGIN для множества других узлов, что делает эти операции достаточно дорогими по времени.
- Меньшая гибкость: Из-за необходимости пересчитывать диапазоны для многих узлов, сложно динамично изменять структуру дерева, особенно на больших объемах данных.
В новой версии используется комбинация методов Closure Table и Adjacency List.
Adjacency List (Список смежности)
Каждый узел в дереве сохраняет ссылку на своего родителя, обычно с использованием поля parent_id.
Каждый узел хранит свой уникальный идентификатор (например, id) и идентификатор родительского узла (parent_id), который указывает на родительский элемент в дереве. Для корневых узлов значение parent_id будет равно NULL или 0.
Преимущества:
- Простота реализации: Требуется только одно поле для хранения идентификатора родителя.
- Легкость в добавлении и удалении узлов: Нужно просто указать родителя для нового узла или удалить узел и его поддерево.
Недостатки:
- Для получения всех потомков узла требуется выполнить рекурсивный запрос или несколько последовательных запросов.
- Затруднено получение глубоко вложенных элементов (например, всех потомков определенного узла).
- Модификация структуры (например, перемещение узла или изменение родителя) требует дополнительных операций для обработки зависимостей.
Closure Table (Таблица замыканий)
Хранит не только родителя каждого узла, но и все возможные отношения между узлами. То есть для каждого узла сохраняются все его предки и сам он. Это достигается за счет использования дополнительной таблицы, которая хранит пары «потомок-родитель» для всех уровней иерархии.
В Closure Table создается таблица, где каждая строка содержит два столбца: ancestor (предок) и descendant (потомок). Таблица хранит все возможные пути от каждого потомка к его предкам.
Преимущества:
- Очень быстрый поиск всех предков или потомков узла, включая глубоко вложенные узлы.
- Операции добавления и удаления узлов гораздо более эффективны по сравнению с другими методами (например, перемещение узлов).
- Может поддерживать гибкие запросы, такие как поиск всех потомков или предков для узла.
Недостатки:
- Нужно хранить много данных, так как таблица становится очень большой (особенно для деревьев с большой глубиной).
- Добавление нового узла требует вставки нескольких записей в таблицу замыканий.
- Модификация структуры (например, удаление узла) может требовать удаления множества записей.
Таблицы модуля HR
Таблица | Назначение |
---|---|
b_hr_access_permission | Права доступа, привязанные к ролям |
b_hr_access_role | Список всех ролей в системе (например, Администратор, Руководитель, Сотрудник). Создать роль можно на странице настроек прав доступа |
b_hr_access_role_relation | Связь ролей с пользователями, подразделениями, группами |
b_hr_structure | Структуры компании (задел на будущее, на данный момент не реализовано) |
b_hr_structure_node | Конкретные узлы структуры (отделы), реализация метода Adjacency List |
b_hr_structure_node_member | Сотрудники, прикрепленные к отделам |
b_hr_structure_node_path | Для хранения узлов дерева, реализация метода Closure Table |
b_hr_structure_node_relation | Для хранения всех возможных путей между узлами |
b_hr_log | Логи ошибок |
b_hr_structure_node_member_role | Конкретные роли сотрудников в рамках их подразделений. |
Полезные ссылки
Похожие статьи

