Организационная структура
Table of Contents
Организационная структура (Оргструктура, структура компании) – это организационная схема, которая показывает отношения между подразделениями компании, а также распределяет роли (руководитель-подчиненный)в ней. Многие инструменты Битрикс24 работают, основываясь на структуре компании. Так, например, только руководители видят отчёты подчиненных и время, которое они отработали за определенный период. Настраивая права доступа, вы можете дать права не отдельным сотрудникам, а сразу распределить их по отделам. Так сотрудники будут видеть только нужную информацию, не будут отвлекаться на посторонний шум, а также не будут иметь доступа к конфиденциальной информации.
В формировании организационной структуры участвую 2 структурные единицы - Подразделение и Сотрудник. В данной статье мы будем рассматривать работу “Подразделений”
Архитектура
Подразделения представляю собой древовидный классификатор построенный на базе разделов информационного блока “Оргструктура”. На одном портале может быть только одно корневое подразделение. В отличие от Отсутствий информационный блок для Оргструктуры единый для всего портала.
Каждое подразделение характеризуется следующими свойствами:
- Активность (Да/Нет)
- Название подразделения (строка)
- Руководитель (привязка к сотруднику)
- Вышестоящее подразделение: (привязка к разделам инфоблока Оргструктуры)
Дополнительно, каждое подразделение (раздел инфоблока) имеет следующие свойства:
- Учет рабочего времени
- Максимальное время начала рабочего дня
- Минимальное время завершения рабочего дня
- Минимальная продолжительность рабочего дня
- Отчет за день
- Шаблоны отчета
- Свободный график
Эти свойства используются для учета рабочего времени и для базовых возможностей не являются необходимыми.
API
Поскольку организационная структура построена на базе разделов информационного блока “Оргструктура”, API для CRUD-действий аналогичной работе с инфоблоками.
Перед началом работы с API инфоблоков нужно получить идентификатор инфоблока для конкретного сайта. Они хранятся в настройках (b_options, b_option_site) с кодом модуля intranet и названием iblock_structure
use \Bitrix\Main\Config\Option;
// General (default)
$iblockId = Option::get('intranet', 'iblock_structure', '-1');
// Specific site absence iblock id
$siteCo1StructureId = Option::get('intranet', 'iblock_structure', '-1', 'co1');
// Old api
$iblockId = \COption::GetOptionInt('intranet', 'iblock_structure', -1);
Обратите внимание на трюк со значением по-умолчанию
-1. Дело в том что при работе с инфоблоками пустое значение (равное нулю) в getList будет проигнорировано. Этот трюк позволяет не беспокоиться в случае технической ошибки и снизить ущерб.
Обратите внимание: в Битрикс24 модуль
intranetавтоматически подключен к порталу, поэтому методы интранета можно вызывать без подключения модуля
Получение дерева
Несмотря на то что архитектурно дерево подразделений устроено на базе информационных блоков, работать с чтением напрямую из инфоблока не рекомендуется и нет такой необходимости. Существует метод для получения объемного и полного дерева подразделений - CIntranetUtils::GetStructure().
Пример возвращаемой структуры:
/**
* @var array Cached structure
*/
$structure = \CIntranetUtils::GetStructure();
/**
* The same as:
*/
$structure = [
"TREE" => [
0 => ["1"],
1 => ["2", "4", "3"]
],
"DATA" => [
1 => [
"ID" => "1",
"NAME" => "DEMO",
"IBLOCK_SECTION_ID" => 0,
"UF_HEAD" => NULL,
"SECTION_PAGE_URL" => "#SITE_DIR#company/structure.php?set_filter_structure=Y&structure_UF_DEPARTMENT=#ID#",
"DEPTH_LEVEL" => "1",
"EMPLOYEES" => ["1"]
],
2 => [
"ID" => "2",
"NAME" => "Бухгалтерия",
"IBLOCK_SECTION_ID" => "1",
"UF_HEAD" => NULL,
"SECTION_PAGE_URL" => "#SITE_DIR#company/structure.php?set_filter_structure=Y&structure_UF_DEPARTMENT=#ID#",
"DEPTH_LEVEL" => "2",
"EMPLOYEES" => ["3"]
],
4 => [
"ID" => "4",
"NAME" => "Отдел маркетинга и рекламы",
"IBLOCK_SECTION_ID" => "1",
"UF_HEAD" => NULL,
"SECTION_PAGE_URL" => "#SITE_DIR#company/structure.php?set_filter_structure=Y&structure_UF_DEPARTMENT=#ID#",
"DEPTH_LEVEL" => "2",
"EMPLOYEES" => []
],
3 => [
"ID" => "3",
"NAME" => "Отдел продаж",
"IBLOCK_SECTION_ID" => "1",
"UF_HEAD" => NULL,
"SECTION_PAGE_URL" => "#SITE_DIR#company/structure.php?set_filter_structure=Y&structure_UF_DEPARTMENT=#ID#",
"DEPTH_LEVEL" => "2",
"EMPLOYEES" => ["4"]
],
],
];
CIntranetUtils::GetStructure() всегда возвращает структуру из двух элементов:
- Ключ
THREE- содержит ассоциативный массив, где ключи это ID родительского подразделения, а значения это массив из ID вложенных подразделений - Ключ
DATA- содержит ассоциативный массив, где ключи это идентификаторы подразделений, а значения это структура описывающая подразделение
Разберем структуру ключа DATA:
ID(string) - строковое представление идентификатора подразделенияNAME(string) - название подразделенияIBLOCK_SECTION_ID(int|string) -0или строковое представление идентификатора родительского подразделенияUF_HEAD(null|string) -nullили строковое представление идентификатора сотрудника который является руководителем подразделенияSECTION_PAGE_URL(string) - шаблон ссылки на детальную страницу подразделения.DEPTH_LEVEL(string) - Уровень вложенности подразделения (от 1 и выше)EMPLOYEES(array) - Массив строковых представлений идентификаторов сотрудников которые входят в данное подразделение
Дочерние подразделения
Существует несколько способов получить дочерние подразделения для указанного.
Массовый способ: если у вас есть список подразделений и вам нужно получить общий список всех вложенных подразделений, то лучше воспользоваться методом CIntranetUtils::GetIBlockSectionChildren($arSections), где $arSections - массив идентификаторов подразделений.
Метод использует запросы в цикле, поэтому старайтесь избегать большого количества подразделений в списке.
Пример поиска:
$searchSections = [1, 2, 3];
/**
* @var array List of department ids
*/
$result = \CIntranetUtils::GetIBlockSectionChildren($searchSections);
/*
$result = [
0 => 1,
1 => 2,
2 => 3,
5 => 4
];
*/
Обратите внимание на измененный порядок ключей - он получается в результате комбинации array_unique + array_merge, когда подразделения 2 и 3 вложенные в подразделение 1 были запрошены дополнительно. Никогда не опирайтесь на ключи этого метода
Точечный способ: если у вас есть конкретное подразделение и вы хотите получить либо дерево вложенных, либо плоскую структуру, то можете воспользоваться методом \CIntranetUtils::GetDeparmentsTree($section_id = 0, $bFlat = false).
Пример:
// Non flat
$result = \CIntranetUtils::GetDeparmentsTree(1);
/*
$result = [
1 => ["2", "4", "3"]
];
*/
// Flat
$result = \CIntranetUtils::GetDeparmentsTree(1, true);
/*
$result = ["2", "4", "3"];
*/
Обратите внимание на вывод в зависимости от параметра
$bFlat
Сотрудники подразделения
Для получения списка сотрудников подразделения можно воспользоваться методом: \Bitrix\Intranet\Util::getDepartmentEmployees( $params ).
Структура $params представляет собой ассоциативный массив, который состоит из следующих ключей:
DEPARTMENTS(array) - список идентификаторов подразделений, для которых выполняется поискRECURSIVE(string) -Y/N(по-умолчаниюN) - нужно ли вычислять сотрудников вложенных подразделенийACTIVE(string) -Y/Nвключать в список только действующих сотрудников (флаг активности = да)SKIP(int) - идентификатор сотрудника, которого не нужно включать в список.SELECT(array) - набор полей, которые нужно запросить из базы данных
Результатом работы метода будет наследник CDBResult, который можно итерировать.
Пример:
use \Bitrix\Intranet\Util;
$resUsers = Util::getDepartmentEmployees([
'DEPARTMENTS' => [1],
'RECURSIVE' => 'N',
]);
while( $arUser = $resUsers->fetch() )
{
var_dump($arUser);
}
В настоящий момент функция CIntranetUtils::getDepartmentEmployees($arDepartments, $bRecursive = false, $bSkipSelf = false, $onlyActive = 'Y', $arSelect = null) которая оставлена для обратной совместимости и является прокси-функцией в исходную \Bitrix\Intranet\Util::getDepartmentEmployees и ее использование не рекомендуется.
Полезная литература
Структура компании Связь структуры компании с инструментами Битрикс24