← К документации

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

Интранет

Рабочая справка по модулю intranet в коробочном Bitrix24: Util, CIntranetUtils, подразделения, сотрудники, структура компании и отсутствия.

Модуль intranet чаще всего нужен для оргструктуры: подразделения пользователя, сотрудники отдела, руководители, отсутствия и связанные с этим проверки в бизнес-процессах. Для сотрудников подразделений лучше сначала смотреть в сторону \Bitrix\Intranet\Util, а CIntranetUtils держать как старый совместимый вариант.

Раздел относится к классической модели структуры с UF_DEPARTMENT. Новая структура компании и модуль humanresources могут требовать другого API. Вызовы внутренних методов intranet, особенно отсутствий и выборки сотрудников подразделения, нужно сверить с исходниками своей версии; универсальная совместимость этих примеров не подтверждена.

Примеры внутреннего PHP API предназначены для коробки с подключённым ядром. Прямое чтение таблиц здесь — административная диагностика: оно само по себе не проверяет доступ пользователя к найденным объектам. Не публикуйте такой код как открытый HTTP-обработчик.

Общее понимание

Интранет — это не CRM, но он часто нужен рядом с CRM: чтобы определить отдел ответственного, получить сотрудников подразделения или найти руководителя.

Что даёт модуль intranet

В прикладном PHP-коде модуль обычно используют для работы с оргструктурой компании: отделами, пользователями в отделах и отсутствиями.

  • получить подразделения пользователя;
  • получить сотрудников отдела;
  • получить сотрудников дочерних отделов;
  • получить дерево оргструктуры;
  • проверить, входит ли пользователь в нужный отдел;
  • получить отсутствия сотрудников.

Подключение модуля

<?php

use Bitrix\Main\Loader;

if (!Loader::includeModule('intranet')) {
    throw new \RuntimeException('Модуль intranet не загружен');
}

В рабочем коде лучше проверять результат подключения.

<?php

use Bitrix\Main\Loader;

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;

if (!Loader::includeModule('intranet')) {
    throw new \RuntimeException('Модуль intranet не загружен');
}

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;

if (!Loader::includeModule('intranet')) {
    throw new \RuntimeException('Модуль intranet не загружен');
}

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;

if (!Loader::includeModule('intranet')) {
    throw new \RuntimeException('Модуль intranet не загружен');
}

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;

if (!Loader::includeModule('intranet')) {
    throw new \RuntimeException('Модуль intranet не загружен');
}

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;

if (!Loader::includeModule('intranet')) {
    throw new \RuntimeException('Модуль intranet не загружен');
}

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;

if (!Loader::includeModule('intranet')) {
    throw new \RuntimeException('Модуль 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;

if (!Loader::includeModule('intranet')) {
    throw new \RuntimeException('Модуль intranet не загружен');
}

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;

if (!Loader::includeModule('intranet')) {
    throw new \RuntimeException('Модуль 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;

if (!Loader::includeModule('intranet')) {
    throw new \RuntimeException('Модуль intranet не загружен');
}

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;

if (!Loader::includeModule('intranet')) {
    throw new \RuntimeException('Модуль intranet не загружен');
}

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;

if (!Loader::includeModule('intranet')) {
    throw new \RuntimeException('Модуль 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);

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

Источники