Сообщение Настройка прав доступа к редактированию структуры компании в Битрикс 24 появились сначала на Crazy Chipmunk.
]]>Настройка прав редактированию структуры компании в Битрикс24 доступна начиная с тарифа «Базовый».

Администратор Битрикс24 имеет полный контроль над настройками доступа, но может делегировать эти полномочия другим пользователям. Чтобы изменить параметры, перейдите:
Сотрудники → Структура компании → Меню (≡) → Настройки доступа
Рекомендуется предоставлять права только тем сотрудникам, которые непосредственно работают с организационной структурой, например, HR-специалистам или руководителям подразделений. Это поможет минимизировать риски несанкционированного доступа и сохранить целостность данных.

Роль определяет набор прав, которыми обладает сотрудник. В Битрикс24 предусмотрено пять стандартных ролей:
Вы можете создавать новые роли, изменять существующие или копировать их. Для добавления новой роли нажмите «Создать роль», задайте название и сохраните изменения.

Чтобы назначить роль пользователю, нажмите «+» под нужной ролью и выберите сотрудника, отдел или группу. Например, руководителю может потребоваться право на создание подразделений, а заместителю – на редактирование состава отдела.
Если у пользователя несколько ролей с разными правами, система автоматически предоставит максимальный уровень доступа. Например, если в одной роли запрещено удаление отделов, а в другой разрешено, сотрудник сможет выполнять это действие.

Доступные параметры управления правами включают:
Уровни доступа:

Сообщение Настройка прав доступа к редактированию структуры компании в Битрикс 24 появились сначала на Crazy Chipmunk.
]]>Сообщение Управление отделами в структуре компании Битрикс24 появились сначала на Crazy Chipmunk.
]]>Структура компании строится на основе отделов, где для каждого определены:
Важно: Для создания и редактирования отделов пользователям требуются соответствующие права доступа. Подробнее о правах доступа можно прочитать здесь

| Поле | Описание |
|---|---|
| Название | Отображается в структуре компании |
| Описание | Функции и задачи отдела (рекомендуется заполнять подробно) |
| Вышестоящий отдел | Определяет положение в иерархии компании |

Назначьте сотрудников:



Нажмите Создать отдел для завершения процесса

Пример: Отдел логистики → Транспортный отдел + Склад
Доступные изменения:
Нажмите ⋮ → Редактировать отдел
Внесите необходимые правки
Сохраните изменения

Нажмите ⋮ → Удалить отдел
Подтвердите действие
Важно: При удалении отдела:

Сообщение Управление отделами в структуре компании Битрикс24 появились сначала на Crazy Chipmunk.
]]>Сообщение Api модуля humanresources. Сотрудники. Часть 3 появились сначала на Crazy Chipmunk.
]]>Существует 2 метода: getAllEmployees и getPagedEmployees.
Отличие в том, что метод getAllEmployees вернёт список всех сотрудников подразделения, а метод getPagedEmployees— только ограниченное количество сотрудников с постраничной навигацией, что удобно при работе с большими структурами. Параметр $withAllChildNodes позволяет учесть подчиненные отделы.
Метод getById класса RoleHelperService вернет роль сотрудника в данном подразделении. Роли хранятся в таблице b_hr_structure_role:
use Bitrix\HumanResources\Service\NodeMemberService;
use Bitrix\HumanResources\Service\RoleHelperService;
$departmentId = 3;
$modeMemberService = new NodeMemberService();
$roleHelperService = new RoleHelperService();
// Получить всех сотрудников
$result = $modeMemberService
->getAllEmployees(
$departmentId,
false,
false
)
->getItemMap();
// Получить сотрудников с пагинацией
$result = $modeMemberService
->getPagedEmployees(
$departmentId,
false,
0,
100,
true
)
->getItemMap();
foreach ($result as $item) {
$memberId = $item->id;
foreach ($item->roles as $role) {
// получить роль сотрудника в данном подразделении
$role = $roleHelperService->getById($role);
}
}
Результирующий объект представляет собой экземпляр класса Bitrix\HumanResources\Item\NodeMember.
Свойство id этого объекта указывает на идентификатор сотрудника в контексте конкретного подразделения(memberId).
В свойстве entityId хранится id пользователя.
Этот id отличается от стандартного id пользователя.
Рассмотрим объект Bitrix\HumanResources\Item\NodeMember
| Свойство | Описание |
|---|---|
entityType | Тип сущности, в данном случае это перечисление Bitrix\HumanResources\Type\MemberEntityType |
entityId | Идентификатор сущности (пользователя) |
nodeId | Идентификатор отдела |
active | Статус активности (1 — активен, 0 — неактивен) |
roles | Список ролей |
icon | Иконка |
id | Уникальный идентификатор сотрудника |
addedBy | Идентификатор пользователя, который добавил сотрудника |
createdAt | Дата и время создания сущности (DateTime) |
updatedAt | Дата и время последнего обновления сущности (DateTime) |
use Bitrix\HumanResources\Service\NodeMemberService;
$memberId = 3;
$targetMemberId = 11;
$result = $modeMemberService
->getMemberSubordination(
$memberId,
$targetMemberId
);
Отношения между сотрудниками в Битрикс24 хранятся в перечислении (enum) Bitrix\HumanResources\Type\MemberSubordinateRelationType.
| Enum | Значение | Описание |
|---|---|---|
| RELATION_ITSELF | 0 | Один и тот же человек |
| RELATION_HIGHER | 1 | Сотрудник выше по иерархии (руководитель) |
| RELATION_EQUAL | 2 | Сотрудники на одном уровне (коллеги) |
| RELATION_LOWER | 3 | Сотрудник ниже по иерархии (подчинённый) |
| RELATION_OTHER | 4 | Связь не найдена |
| RELATION_OTHER_STRUCTURE | 5 | Сотрудники из разных структур |
use Bitrix\HumanResources\Service\NodeMemberService;
$departmentId = 3;
$result = $nodeMemberService
->getDefaultHeadRoleEmployees($departmentId)
->getItemMap();
use Bitrix\HumanResources\Exception\CreationFailedException;
use Bitrix\HumanResources\Item\NodeMember;
use Bitrix\HumanResources\Repository\NodeMemberRepository;
use Bitrix\HumanResources\Type\MemberEntityType;
$userId = 1;
$targetDepartmentId = 3;
$member = new NodeMember(
MemberEntityType::USER,
$userId,
$targetDepartmentId,
true,
role: 1 // руководитель
);
$nodeMemberRepository = new NodeMemberRepository();
try {
$nodeMemberRepository->create($member);
} catch (CreationFailedException $e) {
print_r($e->getErrors()->toArray());
}
use Bitrix\HumanResources\Repository\NodeMemberRepository;
use Bitrix\HumanResources\Repository\NodeRepository;
use Bitrix\HumanResources\Service\NodeMemberService;
use Bitrix\Intranet\Exception\UpdateFailedException;
$modeMemberService = new NodeMemberService();
$nodeRepository = new NodeRepository();
$memberRepository = new NodeMemberRepository();
$targetDepartmentId = 3;
$memberId = 9;
$node = $nodeRepository->getById($targetDepartmentId);
$member = $memberRepository->findById($memberId);
// изменить роль на заместителя если требуется
$member->role = 3;
try {
$result = $modeMemberService->moveMember($member, $node);
} catch (UpdateFailedException $e) {
print $e->getErrors()->toArray();
}
При удалении сотрудник будет перемещён в корневое подразделение.
use Bitrix\HumanResources\Exception\WrongStructureItemException;
use Bitrix\HumanResources\Repository\NodeMemberRepository;
use Bitrix\HumanResources\Repository\NodeRepository;
use Bitrix\HumanResources\Service\NodeMemberService;
use Bitrix\Intranet\Exception\UpdateFailedException;
$modeMemberService = new NodeMemberService();
$nodeRepository = new NodeRepository();
$memberRepository = new NodeMemberRepository();
$targetDepartmentId = 3;
$memberId = 9;
$member = $memberRepository->findById($memberId);
try {
$result = $modeMemberService->removeUserMemberFromDepartment($member);
} catch (UpdateFailedException $e) {
print_r($e->getErrors()->toArray());
} catch (WrongStructureItemException $e) {
print_r($e->getErrors()->toArray());
}
Сообщение Api модуля humanresources. Сотрудники. Часть 3 появились сначала на Crazy Chipmunk.
]]>Сообщение Api модуля humanresources. Отделы. Часть 2. появились сначала на Crazy Chipmunk.
]]>
use Bitrix\HumanResources\Service\NodeService;
$nodeService = new NodeService();
$nodeId = 1;
$nodes = $nodeService->getNodeChildNodes($nodeId)->getItemMap();
$arResult = [];
foreach ($nodes as $node) {
$arResult[$node->id] = $node->name;
}
Метод getNodeChildNodes()Bitrix\HumanResources\Item\Collection\NodeCollection
Описание методов коллекции
| Метод | Описание |
|---|---|
| getItemMap() | массив объектов Bitrix\HumanResources\Item\Node |
| getIterator() | вернет экземпляр класса ArrayIterator |
| getFirst() | вернет первый объект коллекции Bitrix\HumanResources\Item\Node |
| getItemById($id) | вернет объект коллекции Bitrix\HumanResources\Item\Node по id |
| filter(\Closure $rule) | вернет отфильтрованную коллекцию |
| count() | количество элементов в коллекции |
$nodeService
->getNodeChildNodes($nodeId)
->filter(fn($node) => $node->id === 1);
Рассмотрим объект класса Bitrix\HumanResources\Item\Node
| Свойство | Описание |
|---|---|
| name | Название отдела |
| type | Тип, перечисление Bitrix\HumanResources\Type\NodeEntityType |
| structureId | Идентификатор структуры, к которому относится отдел |
| accessCode | Код доступа |
| id | Уникальный идентификатор |
| parentId | Идентификатор родительского узла. 0 указывает на корневую сущность |
| depth | Глубина структуры. 0 указывает на верхний уровень |
| createdBy | Идентификатор пользователя, создавшего отдел |
| createdAt | Дата и время создания |
| updatedAt | Дата и время последнего обновления |
| xmlId | Внешний идентификатор |
| active | Активность (1 — активен, 0 — неактивен) |
| globalActive | Глобальный статус активности (1 — активен, 0 — неактивен) |
| sort | Порядок сортировки |
| description | Описание |
use Bitrix\HumanResources\Model\NodeTable;
$nodeId = 3;
$structureId = 1;
$nodes = NodeTable::getList([
'select' => ['*'],
'filter' => ['=PARENT_ID' => $nodeId, '=STRUCTURE_ID' => $structureId],
])->fetchAll();
use Bitrix\HumanResources\Model\NodeMemberTable;
use Bitrix\HumanResources\Model\NodeTable;
use Bitrix\Main\Engine\CurrentUser;
use Bitrix\Main\ORM\Query\Join;
use Bitrix\HumanResources\Service\NodeService;
// через api
$nodeService = new NodeService();
$result = $nodeService->getNodesByUserId(1);
// через таблицы
$nodes = NodeMemberTable::getList([
'filter' => ['ENTITY_ID' => CurrentUser::get()->getId(), 'ACTIVE' => 'Y'],
'select' => ['ID', 'DEPARTMENT'],
'runtime' => [
'DEPARTMENT' =>
[
'data_type' => NodeTable::class,
'reference' => ['=this.NODE_ID' => 'ref.ID'],
'join_type' => Join::TYPE_LEFT
]
]
])->FetchCollection();
foreach ($nodes as $node) {
echo $node->get('DEPARTMENT')->getName();
echo '<br>';
}
use Bitrix\HumanResources\Exception\CreationFailedException;
use Bitrix\HumanResources\Item\Node;
use Bitrix\HumanResources\Service\NodeService;
use Bitrix\HumanResources\Type\NodeEntityType;
/** на вход свойства объекта Bitrix\HumanResources\Item\Node
* @param string $name
* @param NodeEntityType = DEPARTMENT
* @param int $structureId =1
* @param ?string $accessCode
* @param ?int $id
* @param ?int $parentId
*/
$node = new Node(
'It-отдел',
NodeEntityType::DEPARTMENT,
1,
null,
null,
1
);
try {
$nodeService->insertNode($node);
} catch (Exception $e) {
print_r($e->getErrors()->toArray());
}
use Bitrix\HumanResources\Repository\NodeRepository;
use Bitrix\HumanResources\Service\NodeService;
$nodeService = new NodeService();
$nodeRepository = new NodeRepository();
$departmentId = 9;
$node = $nodeRepository->getById($departmentId);
$node->description = "Просто какое-то описание";
$node->parentId = 2;
try {
$nodeService->updateNode($node);
} catch (Exception $e) {
print_r($e->getErrors()->toArray());
}
use Bitrix\HumanResources\Exception\DeleteFailedException;
use Bitrix\HumanResources\Repository\NodeRepository;
use Bitrix\HumanResources\Service\NodeService;
$nodeService = new NodeService();
$nodeRepository = new NodeRepository();
$departmentId = 9;
$node = $nodeRepository->getById($departmentId);
try {
$nodeService->removeNode($node);
} catch (DeleteFailedException $e) {
print $e->getErrors()->toArray();
}
Сообщение Api модуля humanresources. Отделы. Часть 2. появились сначала на Crazy Chipmunk.
]]>Сообщение Новая структура компании в Битрикс24. Часть 1 появились сначала на Crazy Chipmunk.
]]>Ранее данные об организационной структуре хранились в инфоблоках, но в текущей версии модуля реализовано хранение в собственных таблицах.
Модуль позволяет:
Страница создания и изменения структуры компании расположена по адресу: /hr/structure/

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

На данный момент (апрель 2025) реализована обратная совместимость модуля HR: При добавлении подразделения через модуль, подразделение добавляется и в инфоблоки (и наоборот). Важно: В будущем планируется полный переход на новую модель без обратной совместимости.
В прошлой версии для хранения древовидной структуры использовался механизм разделов инфоблоков, основанный на методе Nested Sets.
Nested Sets — это один из методов хранения иерархических данных (например, деревьев или структур с родительскими и дочерними элементами) в базе данных. Этот подход основан на использовании двух числовых значений (обычно называемых LEFT_MARGIN и RIGHT_MARGIN) для каждого узла в дереве.
В новой версии используется комбинация методов Closure Table и Adjacency List.
Каждый узел в дереве сохраняет ссылку на своего родителя, обычно с использованием поля parent_id.
Каждый узел хранит свой уникальный идентификатор (например, id) и идентификатор родительского узла (parent_id), который указывает на родительский элемент в дереве. Для корневых узлов значение parent_id будет равно NULL или 0.
Хранит не только родителя каждого узла, но и все возможные отношения между узлами. То есть для каждого узла сохраняются все его предки и сам он. Это достигается за счет использования дополнительной таблицы, которая хранит пары «потомок-родитель» для всех уровней иерархии.
В Closure Table создается таблица, где каждая строка содержит два столбца: ancestor (предок) и descendant (потомок). Таблица хранит все возможные пути от каждого потомка к его предкам.
| Таблица | Назначение |
|---|---|
| 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. Часть 1 появились сначала на Crazy Chipmunk.
]]>