Как добавить вкладку в CRM Bitrix24

Функционал модуля CRM Bitrix24 предоставляет широкие возможности для управления вашим бизнесом. Но в ряде случаев, в силу специфики и разнообразия рабочих процессов организаций, этого функционала недостаточно и приходится разрабатывать дополнительные компоненты. В этой статье мы рассмотрим один из способов отображения вашего функционала в интерфейсе CRM сущностей.

Как вы уже могли понять, речь пойдёт о добавлении собственных табов в элементах crm (лидах, сделках, контактах, компаниях и т.д). Разрабатываемый компонент будет предоставлять механизм управления этими вкладками, т.е. позволит определять логику отображения функционала в зависимости от условий (например прав доступа). Сперва определимся с решаемой задачей.

Шаг 1. Постановка задачи

Требуется отобразить компонент списка сотрудников (сам компонент возьмём из статьи про создание списков b24) в crm сделках. Отображать компонент нужно только пользователям с правами на редактирование выбранной сделки. При создании сделки вкладка должна быть заблокирована.

Шаг 2. Концепция и архитектура

Событие

Понятное дело, что для добавления своих вкладок в интерфейс выносить шаблон компонента или, тем более, компонент — избыточно. В модуле CRM есть штатное событие onEntityDetailsTabsInitialized. Это событие происходит в компоненте bitrix:crm.entity.details (именно этот компонент отвечает за отображение элементов crm) при получении массива отображаемых вкладок.

/**
 * file path: bitrix/components/bitrix/crm.entity.details/class.php
 */

public function executeComponent()
{
	...
    $this->arResult['TABS'] = $this->updateTabsByEvent($this->arResult['TABS']);
    ...    
}

protected function updateTabsByEvent(array $tabs): array
{
  $event = new Event('crm', 'onEntityDetailsTabsInitialized', [
    'entityID' => $this->entityID,
    'entityTypeID' => $this->entityTypeID,
    'guid' => $this->guid,
    'tabs' => $tabs,
  ]);
  
  EventManager::getInstance()->send($event);
  
  foreach ($event->getResults() as $result) {
    if ($result->getType() === EventResult::SUCCESS) {
      $parameters = $result->getParameters();
      if (is_array($parameters) && is_array($parameters['tabs'])) {
        $tabs = $parameters['tabs'];
      }
    }
  }

  return $tabs;
}

Менеджер вкладок

Подписавшись на событие можно добавить в существующий массив вкладок свою (можно удалить/изменить другие, но сейчас не об этом 🙂 ).

Добавить всего 1 таб — это скучно и неинтересно. При наступлении события мы будем обращаться к «менеджеру вкладок», который, в свою очередь, обработает и вернёт актуальный набор вкладок.

Шаг 3. Реализация

Компонент списка пользователей

Создаём компонент (для примера возьмём готовый компонент из статьи «Отображение данных в виде списков в Bitrix24»). На текущем этапе оставим всё как есть, далее немного доработаем его для корректной работы во вкладке.

Менеджер вкладок

Создадим класс CrmCustomTabManager а пространстве имён Aclips\CustomCrm. (Не забудьте правильно описать автозагрузку классов).

<?php

/**
* file path: local/php_interface/classes/Aclips/CustomCrm/CrmCustomTabManager.php
*/

namespace Aclips\CustomCrm;

use Bitrix\Main\Loader;

Loader::includeModule('crm');

/**
* Менеджер для работы со вкладками сущностей CRM
*/
class CrmCustomTabManager
{
/**
* CRM права текущего пользователя
* @var \CCrmPerms
*/
protected \CCrmPerms $userPermissions;

public [...]