← Назад к справке

REST

Виджеты

Рабочая справка по REST-виджетам Bitrix24: placement.bind, placement.unbind, PLACEMENT, PLACEMENT_OPTIONS, CRM, задачи, мессенджер и универсальные виджеты.

Виджет REST — это способ встроить своё приложение в интерфейс Bitrix24: карточку CRM, список задач, профиль пользователя, мессенджер, контакт-центр или другое место. Обычно виджет регистрируют при установке приложения через placement.bind.

Общее понимание

Виджет привязывает URL приложения к конкретному месту интерфейса Bitrix24.

Что такое виджет

Bitrix24 открывает обработчик виджета в iframe, слайдере или другом интерфейсном месте. На URL обработчика передаётся контекст: где открыт виджет, кто его открыл и к какой сущности он относится.

Для простых внутренних инструментов виджет проще делать как локальное приложение: страница приложения открывается внутри Bitrix24, получает контекст и дальше вызывает REST-методы через BX24.callMethod().

placement

PLACEMENT — это код места встройки. Именно он передаётся в placement.bind и говорит Битриксу, куда добавить приложение.

BX24.callMethod(
    'placement.bind',
    {
        PLACEMENT: 'CRM_DEAL_DETAIL_TAB',
        HANDLER: 'https://example.com/bitrix24/deal-tab.php',
        TITLE: 'Мой виджет'
    },
    function (result) {
        if (result.error()) {
            console.error(result.error());
            return;
        }

        console.log(result.data());
    }
);

Когда один и тот же URL используется для нескольких виджетов, значение PLACEMENT помогает понять, откуда именно был открыт обработчик.

Основные места встройки

Это не полный справочник всех параметров, а рабочая карта: куда можно встроить приложение и какую страницу документации открыть, когда нужен конкретный виджет.

CRM

Виджет Код или семейство placement Где используется Документация
Пункт контекстного меню в списке элементов CRM_XXX_LIST_MENU, CRM_DYNAMIC_XXX_LIST_MENU Контекстное меню элемента в списке CRM. Открыть
Пункт выпадающего меню над списком элементов CRM_XXX_LIST_TOOLBAR, CRM_DYNAMIC_XXX_LIST_TOOLBAR Верхнее меню над списком лидов, сделок, контактов, компаний, счетов, предложений и смарт-процессов. Открыть
Вкладка в детальной карточке элемента CRM CRM_XXX_DETAIL_TAB, CRM_DYNAMIC_XXX_DETAIL_TAB Отдельная вкладка внутри карточки CRM. Открыть
Кнопка над таймлайном карточки элемента CRM_XXX_DETAIL_ACTIVITY, CRM_DYNAMIC_XXX_DETAIL_ACTIVITY Кнопка рядом с действиями над таймлайном CRM-карточки. Открыть
Пункт выпадающего меню верхней кнопки карточки элемента CRM_XXX_DETAIL_TOOLBAR, CRM_DYNAMIC_XXX_DETAIL_TOOLBAR Верхнее меню действий в карточке CRM. Открыть
Пункт контекстного меню дела в карточке элемента CRM_XXX_ACTIVITY_TIMELINE_MENU, CRM_DYNAMIC_XXX_ACTIVITY_TIMELINE_MENU Контекстное меню дела в таймлайне CRM. Открыть
Пункт выпадающего меню генератора документов CRM_XXX_DOCUMENTGENERATOR_BUTTON Меню генератора документов. Открыть
Пункт выпадающего меню верхней кнопки дизайнера роботов CRM_XXX_ROBOT_DESIGNER_TOOLBAR Верхнее меню в дизайнере роботов CRM. Открыть
Пункт выпадающего меню в туннелях продаж CRM_FUNNELS_TOOLBAR Выпадающее меню в туннелях продаж. Открыть
Пункт левого меню CRM-аналитики CRM_ANALYTICS_MENU Левое меню CRM-аналитики. Открыть
Пункт выпадающего меню верхней кнопки CRM-аналитики CRM_ANALYTICS_TOOLBAR Верхнее меню CRM-аналитики. Открыть

Задачи

Виджет Код или семейство placement Где используется Документация
Пункт контекстного меню списка TASK_LIST_CONTEXT_MENU Контекстное меню задачи в списке. Открыть
Вкладка в карточке задачи TASK_VIEW_TAB Отдельная вкладка внутри задачи. Открыть
Правая панель карточки задачи TASK_VIEW_SIDEBAR Блок в правой колонке задачи. Открыть
Ссылка в верхней части карточки задачи TASK_VIEW_TOP_PANEL Верхняя часть карточки задачи. Открыть
Пункт основного выпадающего меню TASK_USER_LIST_TOOLBAR, TASK_GROUP_LIST_TOOLBAR Меню над списком задач. Открыть
Пункт меню около настроек роботов TASK_ROBOT_DESIGNER_TOOLBAR Дизайнер роботов задач. Открыть

Рабочие группы и проекты

Виджет Код или семейство placement Где используется Документация
Пункт основного выпадающего меню проекта SONET_GROUP_DETAIL_TAB Меню рабочей группы или проекта. Открыть
Пункт выпадающего меню над списком задач TASK_GROUP_LIST_TOOLBAR Верхнее меню списка задач проекта. Открыть
Пункт меню около настроек роботов TASK_ROBOT_DESIGNER_TOOLBAR Дизайнер роботов проекта. Открыть

Профиль пользователя, календарь и телефония

Раздел Виджет Код или семейство placement Документация
Профиль пользователя Пункт контекстного меню в профиле USER_PROFILE_MENU Открыть
Профиль пользователя Пункт контекстного меню верхней кнопки профиля USER_PROFILE_TOOLBAR Открыть
Календарь Виджет в календаре CALENDAR_GRIDVIEW Открыть
Телефония Вкладка в карточке звонка CALL_CARD Открыть
Телефония Пункт меню в аналитике звонков TELEPHONY_ANALYTICS_MENU Открыть
Телефония WebRTC WebRTC Открыть

Мессенджер

Виджет Код или семейство placement Где используется Документация
Виджет над полем ввода IM_TEXTAREA Панель над полем ввода сообщения. Открыть
Виджет для сайдбара IM_SIDEBAR Пункт приложения в сайдбаре чата. Открыть
Пункт контекстного меню сообщения IM_CONTEXT_MENU Контекстное меню конкретного сообщения. Открыть
Коллекция смайлов IM_SMILES_SELECTOR Пользовательская коллекция смайлов. Открыть

Контакт-центр, универсальные виджеты и пользовательские поля

Раздел Виджет Код или семейство placement Документация
Контакт-центр Виджет в контакт-центре CONTACT_CENTER Открыть
Универсальные виджеты Виджет в виде ссылки со слайдером REST_APP_URI Открыть
Универсальные виджеты Невидимый виджет на каждой странице PAGE_BACKGROUND_WORKER Открыть
Пользовательские поля Зарегистрировать новый тип пользовательских полей userfieldtype.add Открыть

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

Когда регистрировать

Виджеты проще регистрировать при установке приложения через BX24.install(). Пока приложение не установлено до конца, виджет обычно не отображается в интерфейсе.

Если приложение переустанавливается, проверьте, не создаются ли дубли привязок. Для этого можно сначала вызвать placement.get или при необходимости удалить старую привязку через placement.unbind.

Регистрация

Основной метод регистрации виджета — placement.bind.

placement.bind

BX24.install(function () {
    BX24.callMethod(
        'placement.bind',
        {
            PLACEMENT: 'CRM_DEAL_DETAIL_TAB',
            HANDLER: 'https://example.com/bitrix24/deal-tab.php',
            TITLE: 'Мой виджет'
        },
        function (result) {
            if (result.error()) {
                console.error(result.error());
                BX24.installFinish();
                return;
            }

            BX24.installFinish();
        }
    );
});

В HANDLER указывается URL страницы приложения, которую Bitrix24 откроет в месте встройки. Для боевого приложения это должен быть доступный HTTPS-адрес.

placement.unbind

Если нужно убрать привязку, используется placement.unbind.

BX24.callMethod(
    'placement.unbind',
    {
        PLACEMENT: 'CRM_DEAL_DETAIL_TAB',
        HANDLER: 'https://example.com/bitrix24/deal-tab.php'
    },
    function (result) {
        if (result.error()) {
            console.error(result.error());
            return;
        }

        console.log(result.data());
    }
);

PLACEMENT_OPTIONS

Когда Bitrix24 открывает обработчик виджета, в него передаются параметры контекста. Например, в карточке CRM обычно приходит ID элемента, а в мессенджере — данные диалога.

<?php

/**
 * Получает параметры виджета.
 */
function fetchPlacementOptions(): array
{
    $placement_options = $_REQUEST['PLACEMENT_OPTIONS'] ?? '{}';
    $options = json_decode((string) $placement_options, true);

    return is_array($options) ? $options : [];
}

$options = fetchPlacementOptions();

print_r($options);

В рабочих проектах первый шаг при разработке нового виджета — вывести весь $_REQUEST и отдельно PLACEMENT_OPTIONS, чтобы увидеть фактический контекст конкретного места встройки.

Примеры

Три частых места встройки: карточка CRM, сайдбар чата и невидимый worker.

CRM detail tab

BX24.callMethod(
    'placement.bind',
    {
        PLACEMENT: 'CRM_DEAL_DETAIL_TAB',
        HANDLER: 'https://example.com/bitrix24/deal-tab.php',
        TITLE: 'Данные интеграции'
    },
    function (result) {
        if (result.error()) {
            console.error(result.error());
            return;
        }

        console.log('CRM tab registered');
    }
);

В обработчике вкладки нужно читать PLACEMENT_OPTIONS, чтобы получить ID сущности CRM и загрузить данные именно по этой карточке.

<?php

/**
 * Получает ID CRM-элемента из параметров виджета.
 */
function fetchCrmEntityIdFromPlacement(): int
{
    $options = fetchPlacementOptions();

    return isset($options['ID']) ? (int) $options['ID'] : 0;
}

$deal_id = fetchCrmEntityIdFromPlacement();

echo $deal_id;

IM sidebar

BX24.callMethod(
    'placement.bind',
    {
        PLACEMENT: 'IM_SIDEBAR',
        HANDLER: 'https://example.com/bitrix24/im-sidebar.php',
        TITLE: 'Информация по чату'
    },
    function (result) {
        if (result.error()) {
            console.error(result.error());
            return;
        }

        console.log('IM sidebar registered');
    }
);

В сайдбаре мессенджера в PLACEMENT_OPTIONS может приходить dialogId. Для обычного группового чата он часто выглядит как chat1489. Перед использованием лучше вывести реальные параметры на своём портале.

<?php

/**
 * Получает dialogId из параметров виджета.
 */
function fetchDialogIdFromPlacement(): string
{
    $options = fetchPlacementOptions();

    return (string) ($options['dialogId'] ?? '');
}

$dialog_id = fetchDialogIdFromPlacement();

echo $dialog_id;

Background worker

PAGE_BACKGROUND_WORKER — невидимый виджет, который загружается на страницах Bitrix24. Его нужно использовать аккуратно: тяжёлый обработчик может замедлять интерфейс.

BX24.callMethod(
    'placement.bind',
    {
        PLACEMENT: 'PAGE_BACKGROUND_WORKER',
        HANDLER: 'https://example.com/bitrix24/background-worker.php',
        OPTIONS: {
            errorHandlerUrl: 'https://example.com/bitrix24/background-worker-error.php'
        }
    },
    function (result) {
        if (result.error()) {
            console.error(result.error());
            return;
        }

        console.log('Background worker registered');
    }
);

В таком обработчике лучше не выполнять тяжёлые запросы сразу при загрузке. Безопаснее сначала быстро загрузить минимальный JS, а основную работу запускать только при нужном условии.

Источники