Перейти к основному содержимому
SellUs
Гайды

Кастомизация интерфейса CRM в Битрикс24: BX.UI, JX и Placement API

·4 мин·SellUs
Ярослав Акулиничев
Основатель SellUs, разработчик решений для Битрикс24 с 2017 года

Команда SellUs разрабатывает приложения и кастомизации для Битрикс24 с 2017 года: Helper, AutoHub, Page2Bitrix24. Ниже разбираем инструменты, которыми пользуемся сами при разработке под клиента. Подробнее о команде.

Стандартный интерфейс Битрикс24 покрывает 80% задач. Остальные 20% требуют кастомизации: добавить кнопку в список контактов, встроить дополнительную вкладку в карточку сделки, показать собственный виджет в боковой панели.

Это статья для разработчиков и технических директоров. Разберём инструменты: BX.UI, JX-компоненты, Placement API. Покажем примеры кода и расскажем что именно можно изменить в интерфейсе CRM без нарушения требований маркетплейса.

Три уровня кастомизации

Перед тем как писать код: определитесь на каком уровне нужна кастомизация.

Уровень 1. Placement API (рекомендуемый)

Битрикс24 предоставляет официальные «точки встраивания» (placement): места в интерфейсе куда приложение может добавить свой элемент. Кнопки, панели, вкладки. Это официальный способ, поддерживается маркетплейсом.

Уровень 2. BX.UI компоненты

JavaScript-фреймворк Битрикс24 для построения UI. Позволяет создавать диалоги, попапы, формы в стиле системного интерфейса. Используется совместно с Placement API.

Уровень 3. JX Framework

Более низкоуровневый слой. Управление DOM, события, AJAX-запросы. Используется когда BX.UI не хватает.

Placement API: что и куда можно встроить

Placement: это именованная точка в интерфейсе. Приложение регистрирует обработчик для конкретного placement, и система показывает элемент приложения в нужном месте.

CRM_LEAD_LIST_MENU и CRM_CONTACT_LIST_MENU

Добавляют пункт в контекстное меню строки списка (правый клик или три точки рядом со строкой). Позволяют добавить действие над конкретным лидом или контактом из списка.

Регистрация в REST API:

POST https://your-domain.bitrix24.ru/rest/placement.bind
placement = CRM_CONTACT_LIST_MENU
handler   = https://your-app.ru/handler.php
title     = Моё действие

При клике: Битрикс24 вызывает handler с параметрами: ID контакта, ID пользователя, данные из строки.

CRM_DEAL_DETAIL_TAB и CRM_CONTACT_DETAIL_TAB

Добавляют вкладку в карточку сделки или контакта. Вкладка загружает iframe с вашим приложением. Передаются параметры: ID сущности, тип.

Это самый распространённый способ встроить дополнительный функционал: расчёт маржинальности, история взаимодействий из внешней системы, карта доставки.

CRM_DEAL_DETAIL_ACTIVITY

Блок в ленте активности карточки сделки. Позволяет добавить собственный тип активности: лог из телефонии, событие из внешней системы.

CALL_CARD

Панель в карточке звонка (при входящем/исходящем вызове). Показывает данные о клиенте из внешней базы прямо во время разговора.

CRM_ROBOTDESIGNER_TRIGGER и CRM_ROBOTDESIGNER_ROBOT

Добавляют кастомные триггеры и роботы в конструктор автоматизации. Это мощный placement для создания собственных действий в воронке.

Регистрация placement: пример кода

Регистрация через REST API (PHP):

$result = CRest::call('placement.bind', [
    'PLACEMENT'   => 'CRM_CONTACT_LIST_MENU',
    'HANDLER'     => 'https://your-app.ru/menu-handler.php',
    'TITLE'       => 'Проверить в базе',
    'DESCRIPTION' => 'Проверяет контакт во внутренней базе данных',
    'GROUP_NAME'  => 'Мои действия',
    'ICON'        => 'https://your-app.ru/icon.png',
]);

Обработчик menu-handler.php получает POST-запрос с параметрами:

PLACEMENT_OPTIONS[entityId]     = 123    // ID контакта
PLACEMENT_OPTIONS[entityTypeId] = 3      // тип сущности CRM
AUTH[access_token]              = ...    // токен для REST-запросов

BX.UI: компоненты для кастомного UI

BX.UI: это набор JavaScript-компонентов которые повторяют визуальный стиль Битрикс24. Используйте их чтобы ваш интерфейс выглядел нативно.

Диалоговое окно

var dialog = new BX.UI.Dialog({
    title: 'Проверка контакта',
    width: 600,
    content: '<div id="my-content">Загрузка...</div>',
    buttons: [
        new BX.UI.Dialog.Button({
            text: 'Применить',
            color: BX.UI.Button.Color.SUCCESS,
            onclick: function() {
                // действие
                dialog.close();
            }
        }),
        BX.UI.Dialog.ButtonSet.CANCEL,
    ],
});
dialog.show();

Попап-уведомление

BX.UI.Notification.Center.notify({
    content: 'Контакт найден в базе: Иванов Иван',
    type: 'success',
    autoHideDelay: 4000,
});

Выпадающий список (Popup Menu)

Используется для контекстных меню и выпадающих панелей:

var popup = new BX.PopupMenu(
    'my-popup-' + id,
    node,
    [
        { text: 'Открыть в CRM', onclick: function() { /* ... */ } },
        { text: 'Отправить письмо', onclick: function() { /* ... */ } }
    ],
    { autoHide: true, closeByEsc: true }
);
popup.show();

JX Framework: работа с DOM и событиями

JX (JavaScript eXtended): более низкоуровневый слой. Полезен для:

AJAX-запросы к REST API из JS

BX.ajax.runAction('crm.contact.get', {
    data: { id: contactId }
}).then(function(response) {
    var contact = response.data;
    console.log(contact.NAME, contact.LAST_NAME);
}).catch(function(error) {
    console.error(error);
});

Подписка на события CRM

Битрикс24 генерирует JavaScript-события при изменении данных в интерфейсе:

// Подписаться на сохранение карточки сделки
BX.addCustomEvent('CRMObjectEditorSaved', function(event) {
    var entityId = event.id;
    var entityType = event.entityTypeName; // 'deal', 'contact', etc.
    // ваш код
});

Работа с BX.SidePanel

SidePanel: боковая панель Битрикс24. Открывает ваш iframe без перехода на новую страницу:

BX.SidePanel.Instance.open('https://your-app.ru/detail/?id=' + contactId, {
    width: 800,
    animationDuration: 300,
    label: {
        text: 'Детальная информация',
        bgColor: '#4CAF50',
    },
});

Что не стоит делать

Ряд подходов технически работает но нарушает правила маркетплейса или создаёт проблемы при обновлениях:

Прямая манипуляция DOM Битрикс24

Изменение HTML-структуры системных элементов через document.querySelector и подобные методы. Работает сегодня. Ломается после обновления системы.

Переопределение системных JS-функций

Monkey-patching BX.CRM.* методов. Официально не поддерживается.

Использование внутренних CSS-классов

Классы вида crm-entity-stream-* не документированы и меняются без предупреждения.

Правильный путь

Всегда использовать Placement API + BX.UI + REST API. Это официальные интерфейсы которые поддерживаются командой Битрикс24.

Примеры приложений SellUs

За 9 лет работы с Битрикс24 мы разработали несколько приложений использующих описанные механизмы:

  • Helper: набор инструментов для ускорения работы менеджеров в CRM. Использует Placement API для встройки кнопок и панелей в карточки сделок и контактов.
  • AutoHub: автоматизация интеграций. Использует CRM_ROBOTDESIGNER_ROBOT для добавления кастомных роботов в конструктор автоматизации Битрикс24.
  • Page2Bitrix24: подключение внешних сайтов к CRM. Использует BX.SidePanel и CALL_CARD placement для показа данных о посетителе сайта во время звонка.

Если нужно разработать кастомизацию под конкретный бизнес-процесс: напишите нам, опишем архитектуру и оценим сроки.

Нужна кастомизация Битрикс24 под ваш процесс?
Спроектируем архитектуру, выберем нужные placement, реализуем через официальные API. Приложение будет работать и после апдейтов Битрикс24.
Обсудить разработку

Частые вопросы

Можно ли протестировать кастомизацию без публикации в маркетплейсе Битрикс24?+

Да, для тестирования публикация в маркетплейсе не нужна. Локальное приложение или обработчик placement можно зарегистрировать и проверить на конкретном тестовом портале, публикация в маркетплейсе требуется только если планируется распространять решение на другие компании.

Сломается ли моя кастомизация при следующем обновлении Битрикс24?+

Если сделано через официальные интерфейсы (Placement API, BX.UI, REST API), риск минимальный: команда Битрикс24 поддерживает обратную совместимость этих механизмов. Риск возникает, если использовать неофициальные обходные пути вроде прямой манипуляции DOM или внутренних CSS-классов, именно поэтому в статье они выделены отдельно как то, чего делать не стоит.

Нужен ли отдельный сервер для обработчика placement?+

Да, обработчик placement — это внешний URL, куда Битрикс24 отправляет запросы, он должен быть физически размещён где-то за пределами самого портала: на собственном сервере, облачном хостинге или бессерверной платформе. Логика приложения выполняется там, а не внутри Битрикс24.

В чём разница между кастомизацией через Placement API и локальным приложением?+

Placement API — это конкретный механизм встраивания элемента в интерфейс (кнопка, вкладка, панель). Локальное приложение — это более широкое понятие: способ регистрации и распространения кастомизации в рамках одного портала. На практике локальное приложение обычно и использует Placement API как один из инструментов. Подробный разбор регистрации приложений и прав доступа: [как расширить Битрикс24 своим приложением](/blog/lokalnoe-prilozhenie-bitrix24/).

Можно ли использовать BX.UI и JX внутри приложения на React или Vue?+

Технически можно подключить BX.UI и JX как обычные JavaScript-библиотеки внутри современного фронтенд-стека, но они изначально спроектированы для работы без сборщиков и фреймворков. Для приложения на React или Vue чаще проще использовать только официальный REST API для получения данных, а интерфейс строить средствами самого фреймворка, обращаясь к BX.UI только там, где нужно визуально повторить нативный стиль Битрикс24.

Сколько стоит разработка кастомизации интерфейса CRM?+

Зависит от сложности: простая кнопка через Placement API с несложным обработчиком — это разработка на несколько часов, полноценное приложение с несколькими точками встраивания, боковыми панелями и кастомными роботами уже требует недель работы. Точную оценку можно получить только после описания конкретной задачи.

Разработаем приложение или кастомизацию под ваш Битрикс24

От встраивания кнопки в список контактов до полного приложения с боковыми панелями и кастомными роботами. Разработка через официальные API маркетплейса.

Обсудить проект по вашей задаче

Оставьте контакты: перезвоним в течение 2 часов в рабочее время.

TelegramMAX