Модули коробки
Интранет
Рабочая справка по модулю intranet в коробочном Bitrix24: Util, CIntranetUtils, подразделения, сотрудники, структура компании и отсутствия.
Модуль intranet чаще всего нужен для оргструктуры: подразделения пользователя,
сотрудники отдела, руководители, отсутствия и связанные с этим проверки в бизнес-процессах.
Для сотрудников подразделений лучше сначала смотреть в сторону
\Bitrix\Intranet\Util, а CIntranetUtils держать как старый
совместимый вариант.
Общее понимание
Интранет — это не CRM, но он часто нужен рядом с CRM: чтобы определить отдел ответственного, получить сотрудников подразделения или найти руководителя.
Что даёт модуль intranet
В прикладном PHP-коде модуль обычно используют для работы с оргструктурой компании: отделами, пользователями в отделах и отсутствиями.
- получить подразделения пользователя;
- получить сотрудников отдела;
- получить сотрудников дочерних отделов;
- получить дерево оргструктуры;
- проверить, входит ли пользователь в нужный отдел;
- получить отсутствия сотрудников.
Подключение модуля
<?php
use Bitrix\Main\Loader;
Loader::includeModule('intranet'); В рабочем коде лучше проверять результат подключения.
<?php
use Bitrix\Main\Loader;
/**
* Подключает модуль intranet.
*/
function requireIntranetModule(): void
{
if (!Loader::includeModule('intranet')) {
throw new \RuntimeException('Не удалось подключить модуль intranet');
}
}
requireIntranetModule(); CIntranetUtils и Util
В старом коде часто встречается CIntranetUtils. В D7-документации есть
вспомогательный класс \Bitrix\Intranet\Util. Для получения сотрудников
подразделений лучше использовать Util::getDepartmentEmployees(), если
метод есть на версии коробки.
Старый CIntranetUtils::GetDepartmentEmployees() можно считать
совместимым вариантом. По исходникам он передаёт параметры в
Bitrix\Intranet\Util::getDepartmentEmployees().
| Вариант | Когда использовать |
|---|---|
\Bitrix\Intranet\Util::getDepartmentEmployees() | Новый основной вариант для получения сотрудников подразделений. |
CIntranetUtils::GetDepartmentEmployees() | Старый вариант, если он уже используется в проекте или нужен быстрый совместимый код. |
\Bitrix\Intranet\Util::getEmployeesList() | Получить ID сотрудников, связанных с отделами сайта при многосайтовости. |
Карта методов
| Метод | Что делает | Когда использовать |
|---|---|---|
CIntranetUtils::GetUserDepartments() | Возвращает ID подразделений пользователя. | Проверки по отделам, маршрутизация БП, выбор руководителей. |
\Bitrix\Intranet\Util::getDepartmentEmployees() | Возвращает сотрудников подразделений по массиву параметров. | Основной вариант для выборки сотрудников отдела и дочерних отделов. |
CIntranetUtils::GetDepartmentEmployees() | Старый вариант получения сотрудников подразделения. | Совместимость со старым кодом. |
CIntranetUtils::GetStructure() | Возвращает структуру компании. | Когда нужно дерево подразделений. |
CIntranetUtils::GetAbsenceData() | Возвращает данные отсутствий. | Проверка отпусков и отсутствий перед назначением. |
\Bitrix\Intranet\Util::getEmployeesList() | Возвращает ID пользователей из отделов и подотделов, связанных с сайтом. | Многосайтовость и выборка сотрудников текущего сайта. |
Методы CIntranetUtils лучше быстро проверять на конкретной версии коробки:
это старый прикладной API, и поведение может отличаться в зависимости от настроек
портала.
Подразделения
Основные операции: получить отделы пользователя, сотрудников отдела и структуру компании.
Подразделения пользователя
<?php
use Bitrix\Main\Loader;
Loader::includeModule('intranet');
/**
* Получает ID подразделений пользователя.
*/
function fetchUserDepartmentIds(int $user_id): array
{
if ($user_id <= 0) {
return [];
}
$department_ids = \CIntranetUtils::GetUserDepartments($user_id);
return is_array($department_ids) ? array_map('intval', $department_ids) : [];
}
$department_ids = fetchUserDepartmentIds($user_id);
print_r($department_ids);
Для подразделений конкретного пользователя чаще всего всё ещё используют
CIntranetUtils::GetUserDepartments() или поле пользователя
UF_DEPARTMENT.
Новый вариант: сотрудники через Util
\Bitrix\Intranet\Util::getDepartmentEmployees() принимает массив
параметров. Так удобнее явно указать отделы, рекурсивность, активность пользователей
и нужные поля.
| Параметр | Назначение |
|---|---|
DEPARTMENTS | ID отдела или массив ID отделов. |
RECURSIVE | Y, если нужно включить дочерние отделы. |
ACTIVE | Y, если нужны только активные пользователи. |
CONFIRMED | Y, если нужны подтверждённые пользователи. |
SKIP | ID пользователя, которого нужно исключить. |
SELECT | Дополнительные поля пользователя. |
<?php
use Bitrix\Main\Loader;
use Bitrix\Intranet\Util;
Loader::includeModule('intranet');
/**
* Получает ID сотрудников подразделения через новый Util.
*/
function fetchDepartmentEmployeeIdsByUtil(int $department_id, bool $is_recursive = true): array
{
if ($department_id <= 0) {
return [];
}
$employee_ids = [];
$employee_result = Util::getDepartmentEmployees([
'DEPARTMENTS' => [$department_id],
'RECURSIVE' => $is_recursive ? 'Y' : 'N',
'ACTIVE' => 'Y',
'CONFIRMED' => 'Y',
'SELECT' => [
'ID',
],
]);
while ($employee = $employee_result->Fetch()) {
$employee_ids[] = (int) $employee['ID'];
}
$employee_ids = array_values(array_unique($employee_ids));
sort($employee_ids);
return $employee_ids;
}
$employee_ids = fetchDepartmentEmployeeIdsByUtil($department_id);
print_r($employee_ids); Старый вариант: сотрудники через CIntranetUtils
Этот вариант можно оставить для старого кода. По смыслу он делает то же самое: получает сотрудников подразделения, при необходимости рекурсивно по дочерним отделам.
<?php
use Bitrix\Main\Loader;
Loader::includeModule('intranet');
/**
* Получает ID сотрудников подразделения через старый CIntranetUtils.
*/
function fetchDepartmentEmployeeIdsByOldUtils(int $department_id, bool $is_recursive = true): array
{
if ($department_id <= 0) {
return [];
}
$employee_ids = [];
$employee_result = \CIntranetUtils::GetDepartmentEmployees(
$department_id,
$is_recursive,
false,
'Y',
[
'ID',
]
);
while ($employee = $employee_result->Fetch()) {
$employee_ids[] = (int) $employee['ID'];
}
$employee_ids = array_values(array_unique($employee_ids));
sort($employee_ids);
return $employee_ids;
}
$employee_ids = fetchDepartmentEmployeeIdsByOldUtils($department_id);
print_r($employee_ids); Сотрудники с ФИО
Если нужны не только ID, а сразу ФИО, должность и email, можно запросить эти поля
через SELECT в Util::getDepartmentEmployees().
<?php
use Bitrix\Main\Loader;
use Bitrix\Intranet\Util;
Loader::includeModule('intranet');
/**
* Получает сотрудников подразделения с основными полями через Util.
*/
function fetchDepartmentEmployees(int $department_id, bool $is_recursive = true): array
{
if ($department_id <= 0) {
return [];
}
$employees = [];
$employee_result = Util::getDepartmentEmployees([
'DEPARTMENTS' => [$department_id],
'RECURSIVE' => $is_recursive ? 'Y' : 'N',
'ACTIVE' => 'Y',
'CONFIRMED' => 'Y',
'SELECT' => [
'ID',
'NAME',
'LAST_NAME',
'SECOND_NAME',
'EMAIL',
'WORK_POSITION',
],
]);
while ($employee = $employee_result->Fetch()) {
$employees[] = $employee;
}
return $employees;
}
$employees = fetchDepartmentEmployees($department_id);
print_r($employees);
Если нужно сложнее сортировать или объединять данные из других таблиц, можно сначала
получить ID сотрудников через Util, а потом отдельной выборкой получить
пользователей через UserTable.
<?php
use Bitrix\Main\Loader;
use Bitrix\Main\UserTable;
Loader::includeModule('intranet');
/**
* Получает сотрудников подразделения через Util, а данные пользователей через UserTable.
*/
function fetchDepartmentEmployeesByUserTable(int $department_id): array
{
$employee_ids = fetchDepartmentEmployeeIdsByUtil($department_id, true);
if (empty($employee_ids)) {
return [];
}
return UserTable::getList([
'select' => [
'ID',
'NAME',
'LAST_NAME',
'SECOND_NAME',
'EMAIL',
'WORK_POSITION',
],
'filter' => [
'@ID' => $employee_ids,
'=ACTIVE' => 'Y',
],
'order' => [
'LAST_NAME' => 'ASC',
'NAME' => 'ASC',
],
])->fetchAll();
}
$employees = fetchDepartmentEmployeesByUserTable($department_id);
print_r($employees); Структура компании
<?php
use Bitrix\Main\Loader;
Loader::includeModule('intranet');
/**
* Получает структуру компании.
*/
function fetchCompanyStructure(): array
{
$structure = \CIntranetUtils::GetStructure();
return is_array($structure) ? $structure : [];
}
$structure = fetchCompanyStructure();
print_r($structure);
Формат структуры лучше посмотреть на своём портале через print_r(), потому
что в реальном проекте дальше обычно нужно пройти дерево отделов и собрать нужные ID.
Все сотрудники сайта
В \Bitrix\Intranet\Util есть метод getEmployeesList(). Он
возвращает ID пользователей, которые находятся в отделах и подотделах, связанных с
сайтом. Это пригодится при многосайтовости.
<?php
use Bitrix\Main\Loader;
use Bitrix\Intranet\Util;
Loader::includeModule('intranet');
/**
* Получает ID сотрудников, связанных с текущим сайтом.
*/
function fetchSiteEmployeeIds(): array
{
$employee_ids = Util::getEmployeesList();
return is_array($employee_ids) ? array_map('intval', $employee_ids) : [];
}
$employee_ids = fetchSiteEmployeeIds();
print_r($employee_ids); Рабочие примеры
Короткие функции, которые можно использовать в бизнес-процессах, агентах и обработчиках.
Проверить пользователя в отделе
<?php
use Bitrix\Main\Loader;
Loader::includeModule('intranet');
/**
* Проверяет, состоит ли пользователь в подразделении.
*/
function hasUserDepartment(int $user_id, int $department_id): bool
{
$department_ids = fetchUserDepartmentIds($user_id);
return in_array($department_id, $department_ids, true);
}
$has_department = hasUserDepartment($user_id, $department_id);
var_dump($has_department); Получить сотрудников нескольких отделов
<?php
use Bitrix\Main\Loader;
use Bitrix\Intranet\Util;
Loader::includeModule('intranet');
/**
* Получает ID сотрудников нескольких подразделений через Util.
*/
function fetchDepartmentsEmployeeIds(array $department_ids, bool $is_recursive = true): array
{
$department_ids = array_values(array_filter(array_map('intval', $department_ids)));
if (empty($department_ids)) {
return [];
}
$employee_ids = [];
$employee_result = Util::getDepartmentEmployees([
'DEPARTMENTS' => $department_ids,
'RECURSIVE' => $is_recursive ? 'Y' : 'N',
'ACTIVE' => 'Y',
'CONFIRMED' => 'Y',
'SELECT' => [
'ID',
],
]);
while ($employee = $employee_result->Fetch()) {
$employee_ids[] = (int) $employee['ID'];
}
$employee_ids = array_values(array_unique($employee_ids));
sort($employee_ids);
return $employee_ids;
}
$employee_ids = fetchDepartmentsEmployeeIds([10, 15, 22]);
print_r($employee_ids); Сотрудники отделов пользователя
<?php
use Bitrix\Main\Loader;
Loader::includeModule('intranet');
/**
* Получает сотрудников из подразделений пользователя через Util.
*/
function fetchUserDepartmentEmployeeIds(int $user_id): array
{
$department_ids = fetchUserDepartmentIds($user_id);
if (empty($department_ids)) {
return [];
}
return fetchDepartmentsEmployeeIds($department_ids, true);
}
$employee_ids = fetchUserDepartmentEmployeeIds($user_id);
print_r($employee_ids); Получить отсутствия
Отсутствия сотрудников могут использоваться в бизнес-процессах и автоматизации: например, чтобы не назначать задачу на отсутствующего сотрудника.
<?php
use Bitrix\Main\Loader;
Loader::includeModule('intranet');
/**
* Получает отсутствия пользователя за период.
*/
function fetchUserAbsences(int $user_id, string $date_from, string $date_to): array
{
if ($user_id <= 0) {
return [];
}
$absences = \CIntranetUtils::GetAbsenceData([
'USERS' => [$user_id],
'DATE_START' => $date_from,
'DATE_FINISH' => $date_to,
]);
return is_array($absences) ? $absences : [];
}
$absences = fetchUserAbsences(
$user_id,
'01.04.2026',
'30.04.2026'
);
print_r($absences); Формат результата лучше проверить на конкретной коробке: настройки отсутствий и версии модуля могут отличаться.