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

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

Новая структура в Битрикс24 реализована модулем humanresources.

Ранее данные об организационной структуре хранились в инфоблоках, но в текущей версии модуля реализовано хранение в собственных таблицах.

Возможности модуля

Модуль позволяет:

  • создавать подразделения;
  • добавлять сотрудников в подразделения;
  • назначать несколько руководителей и заместителей;
  • поддерживать произвольный уровень вложенности;
  • работать с несколькими структурами в рамках одного Битрикс24 (еще не реализовано)

Как выглядит новая структура

Страница создания и изменения структуры компании расположена по адресу: /hr/structure/

Новая структура компании Битрикс24 -- Так выглядит новая структура компании в Битрикс24
Так выглядит новая структура компании в Битрикс24

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

Страница настройки прав доступа

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

Страница настроек прав доступа к редактированию структуры -- Страница настроек прав доступа к редактированию структуры
Так выглядит страница настроек прав доступа для редактирования структуры

Совместимость

На данный момент (апрель 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Конкретные роли сотрудников в рамках их подразделений.

Полезные ссылки

Похожие статьи

Создание своей сущности в Битрикс24
Cоздадим свою сущность в Битрикс24 с гридом, CRUD, своим провайдером для tagSelector, массовым редактирование записей и не только
Настройка прав доступа к редактированию структуры компании в Битрикс 24
Подробная инструкция по настройке прав доступа к редактированию организационной структуры в Битрикс24. Узнайте, как назначать роли пользователям, управлять отделами и сотрудниками, настраивать уровни доступа для администраторов, HR и руководителей