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

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

·4 мин·SellUs
Ярослав Акулиничев
Ярослав Акулиничев
Основатель и технический директор SellUs

Команда 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 для показа данных о посетителе сайта во время звонка.

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

Когда кастомизации становится больше, чем ядра, стоит взвесить, когда выгоднее своя CRM на открытом ядре.

Нужна кастомизация Битрикс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.

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

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

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

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

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

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

Отправляя форму, вы принимаете политику конфиденциальности.