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

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. Открыть
Пункт выпадающего меню генератора документов См. страницу документации Меню генератора документов. Открыть
Пункт выпадающего меню верхней кнопки дизайнера роботов См. страницу документации Верхнее меню в дизайнере роботов CRM. Открыть
Пункт выпадающего меню в туннелях продаж См. страницу документации Выпадающее меню в туннелях продаж. Открыть
Пункт левого меню CRM-аналитики См. страницу документации Левое меню CRM-аналитики. Открыть
Пункт выпадающего меню верхней кнопки CRM-аналитики См. страницу документации Верхнее меню CRM-аналитики. Открыть

Задачи

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

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

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

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

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

Мессенджер

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

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

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

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

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

Виджеты удобно регистрировать при установке приложения через 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, а основную работу запускать только при нужном условии.

Источники