В ходе одного из наших недавних внедрений Битрикс24 в коробке у нас возникла задача добавления нового типа Дел в CRM — нечто среднее между звонком и визитом. Заказчик хотел, чтобы этот новый тип дел участвовал в отчетах по CRM и в фильтрах.
Для начала – необходимо было добавить ссылку на новый тип дела в карточку сущностей CRM.

Мы выяснили, что за вывод этой части интерфейса отвечает компонент crm.timeline. В частности в его template.php содержится список выводимых ссылок на типы дел. Например для звонка там представлено что-то вроде:

Соответсвенно, как мы можем видеть, это обычная ссылка с data-параметром data-item-id. Значит мы можем добавить свою, со своим уникальным data-item-id.
Как видим, href для ссылки задан как «#» — нажатие на эту ссылку обрабатывается JS-кодом из script.js этого компонента. Действительно, за это отвечает функция BX.CrmTimelineMenuBar. processItemSelection(). Вот такой код обрабатывает нажатие ссылки для дела Звонок:

Здесь проверяется как раз тот самый параметр из data-item-id. Также с помощью BX.Crm.Activity.Planner вызывается форма добавления нового дела. В нее нужно будет передать TYPE_ID провайдера дела и информацию о текущей CRM-сущности в полях OWNER_TYPE_ID и OWNER_ID.
Мы можем полностью скопировать вызов для Звонка, заменив только наш data-item-id. После этого в интерфейсе карточки появится ссылка на наш кастомный тип дела, и при нажатии на нее будет открываться форма создания звонка.
Теперь пора разобраться с тем как зарегистрировать собственный тип дела.
Изучив доступную документацию мы видим, что это можно сделать подписавшись на событие OnGetActivityProviders модуля crm, и вернув специальный класс, описывающий провайдер тип дела, унаследованный от \Bitrix\Crm\Activity\Provider\Base

Ориентироваться здесь также можно на уже имеющиеся провайдеры типов дел. Их можно найти по пути: /bitrix/modules/crm/lib/activity/provider.
Вы можете ориентироваться на пример visit.php как на самый базовый. Код этих провайдеров достаточно понятен. В простейшем случае от вас потребуется только указать функции getName() и getTypes(). Функция getTypes() как раз описывает типы дел:

Значения PROVIDER_ID и PROVIDER_TYPE_ID должны быть уникальными, они нам потребуются далее. В нашем случае в оба поля мы указали YBWS_QUOTATION.
Тип дела готов, зарегистрирован и уже появился в фильтре дел:

Как помните ранее у нас при клике на тип дела в карточке CRM – вызывалась форма для звонка. Теперь мы можем вызвать форму нашего собственного дела:

Как видите в TYPE_ID мы указали BX.Crm.Activity.Planner, а в PROVIDER_ID и PROVIDER_TYPE_ID указали YBWS_QUOTATION. Теперь при клике на наш тип дела – открывается его собственная форма. Вид это формы можно изменить с помощью функции renderView нашего класса провайдера дела.
Для того, чтобы наш тип дела появился в кнопке создания новых дел в списке дел нужно добавить функцию prepareToolbarButtons провайдера дел.

Чтобы по типу дела собиралась статистика и его можно было использовать в отчетах CRM – нужно в функции getSupportedCommunicationStatistics() указать следующее:

Теперь можно строить графики по своим типам дел:

Также можно строить отчеты с использованием кастомных типов дел:
