← Назад к справке

Модули коробки

Интранет

Рабочая справка по модулю 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);

Формат результата лучше проверить на конкретной коробке: настройки отсутствий и версии модуля могут отличаться.

Источники