Дополнительные возможности встройки CRM_XXX_DETAIL_ACTIVITY, CRM_DYNAMIC_XXX_DETAIL_ACTIVITY
Scope:
crmКто может работать со встройкой: пользователь с доступом на изменение элемента
При помощи дополнительных параметров можно для своего пункта в меню таймлайна установить интерфейс Битрикс24.
Для добавления встройки используйте метод placement.bind. Базовые возможности встройки описаны в статье Кнопка над таймлайном карточки элемента.
Скачать пример приложения с использованием встройки.
Параметр OPTIONS
|
Название |
Описание |
|
useBuiltInInterface |
Использовать стандартный интерфейс Битрикс24. По умолчанию |
|
newUserNotificationTitle |
Заголовок уведомления для нового пользователя |
|
newUserNotificationText |
Текст уведомления для нового пользователя. При клике на «Подробнее» откроется слайдер с контекстом |
Пример регистрации
BX24.callMethod(
'placement.bind',
{
'PLACEMENT': 'CRM_DEAL_DETAIL_ACTIVITY',
'HANDLER': 'https://your-handler-uri.ru',
'TITLE': 'Моя встройка',
'OPTIONS': {
'useBuiltInInterface': 'Y',
'newUserNotificationTitle': 'Встречайте новое приложение',
'newUserNotificationText': 'E-invoice поможет работать со счетами'
}
}
);

Работа с интерфейсом встройки
Взаимодействие происходит через метод BX24.placement.call. Цикл работы приложения при использовании штатного интерфейса Битрикс24 useBuiltInInterface = Y:
-
Загрузка iframe.
Приложение загружается в скрытом iframe. В
placementOptionsпередаются:entityTypeIdentityIduseBuiltInInterface: Y
-
Отрисовка интерфейса.
Когда приложение загружено, оно должно вызвать
setLayout, чтобы отрисовать первичное состояние места встройки.BX24.placement.call('setLayout', LayoutDto, callback); -
Реакция на действия.
Если приложение отобразило в интерфейсе интерактивные элементы, например ссылки, оно может зарегистрировать обработчик
bindLayoutEventCallback, чтобы обрабатывать реакцию на взаимодействие с элементами.BX24.placement.call('bindLayoutEventCallback', null, callback); -
Управление состоянием элементов.
Можно изменить внешний вид конкретного элемента интерфейса и его видимость через
setLayoutItemState.BX24.placement.call('setLayoutItemState', { id: '...', visible: true/false, properties: {...} }, callback); -
Управление кнопками.
Можно изменить внешний вид кнопок нижней части интерфейса через
setPrimaryButtonStateиsetSecondaryButtonState.BX24.placement.call('setPrimaryButtonState', {...}, callback); BX24.placement.call('setSecondaryButtonState', {...}, callback); -
Завершение работы.
Когда процесс работы пользователя со встройкой завершен или если пользователь нажал «отмена», необходимо вызвать
finish. Таймлайн будет переключен на таб по умолчанию.BX24.placement.call('finish'); -
Блокировка интерфейса.
На время длительных операций, например сохранения, интерфейс можно заблокировать вызвав
lock. Для разблокировки вызватьunlock.BX24.placement.call('lock'); // блокировка BX24.placement.call('unlock'); // разблокировка -
Отслеживание изменений элемента.
Для отслеживания изменений полей элемента, например чтобы перерисовать интерфейс в зависимости от значения поля, можно зарегистрировать обработчик
bindEntityUpdateCallback. Коллбек будет вызван сразу после сохранения полей в редакторе.BX24.placement.call('bindEntityUpdateCallback', null, callback);
Внешний вид интерфейса LayoutDto
|
Название |
Описание |
|
blocks |
Ассоциативный массив объектов, описывающих контентные блоки. Ключи массива — идентификаторы блоков. Минимум 1 элемент |
|
primaryButton |
Основная кнопка. Обычно завершает обработку данных, сохраняет их |
|
secondaryButton |
Дополнительная кнопка. Обычно отменяет процесс обработки данных |
Нажатие на активные кнопки вызывает коллбеки:
primaryButton— коллебBX24.placement.call('bindPrimaryButtonClickCallback', null, callback),secondaryButton— коллбекBX24.placement.call('bindSecondaryButtonClickCallback', null, callback).
ContentBlockDto
Контентные блоки основной области, их можно сочетать и гибко собирать различные интерфейсы.
Общая структура блока:
{
"type": "string",
"visible": true,
"properties": {}
}
type— тип блока, строка,visible— управление видимостью блока, булевое поле. Изменение видимости позволяет организовывать динамические интерфейсы. По умолчанию =true.properties— набор свойств конкретного блока.
Типы контентных блоков
| Тип | Название |
|---|---|
text |
Текст |
link |
Ссылка |
withTitle |
Блок с заголовком |
lineOfBlocks |
Несколько контент-блоков в одну строку |
dropdownMenu |
Выпадающий список |
input |
Поле с вводом текста |
textarea |
Поле ввода многострочного текста |
select |
Поле ввода с выбором из списка |
list |
Ненумерованный список |
section |
Раздел |
Текст
Блок с выводом отформатированного текста.
Обязательные параметры отмечены *
|
Название |
Описание |
|
value* |
Текст |
|
multiline |
Обработка переносов строк. Если |
|
bold |
Жирный текст. По умолчанию |
|
size |
Размер текста. Доступные значения:
|
|
color |
Цвет текста. Доступные значения:
|
{
"type": "text",
"properties": {
"value": "Здравствуйте!\nМы начинаем.",
"multiline": true,
"bold": true,
"size": "lg",
"color": "base_90"
}
}

Ссылка
Обязательные параметры отмечены *
|
Название |
Описание |
|
text* |
Текст ссылки, HTML теги не поддерживаются |
|
action* |
Действие по нажатию на ссылку |
|
size |
Размер текста. Доступные значения:
|
|
bold |
Жирный текст. По умолчанию |
{
"type": "link",
"properties": {
"text": "Открыть сделку",
"action": { "type": "redirect", "uri": "/crm/deal/details/123/" },
"bold": true
}
}

Блок с заголовком
Блок выводит название и значение. В качестве значения можно использовать другой контент-блок.
Обязательные параметры отмечены *
|
Название |
Описание |
|
title* |
Текст заголовка |
|
inline |
Показывать название и значение в одну строку. По умолчанию |
|
titleWidth |
Ширина заголовка, применяется если
|
|
block* |
Контент-блок, являющийся значением. Поддерживаются блоки с типами |
Пример с контент-блоком типа текст:
{
"type": "withTitle",
"properties": {
"title": "Заголовок",
"block": {
"type": "text",
"properties": {
"value": "Какое-то значение"
}
}
}
}

Пример с контент-блоком типа ссылка:
{
"type": "withTitle",
"properties": {
"title": "Заголовок 2",
"block": {
"type": "link",
"properties": {
"text": "Открыть сделку",
"action": {
"type": "redirect",
"uri": "/crm/deal/details/123/"
}
}
},
"inline": true
}
}

Несколько контент-блоков в одну строку
Блок выводит в одну строку несколько контент-блоков типа текст или ссылка. Это позволяет выводить одной строкой текст с разным форматированием и со ссылками.
Обязательные параметры отмечены *
|
Название |
Описание |
|
blocks* |
Ассоциативный массив контент-блоков. Поддерживаются блоки с типами |
{
"type": "lineOfBlocks",
"properties": {
"blocks": {
"text": {
"type": "text",
"properties": {
"value": "Какой-то текст"
}
},
"link": {
"type": "link",
"properties": {
"text": "ссылка",
"action": {
"type": "redirect",
"uri": "/crm/deal/details/123/"
}
}
},
"boldText": {
"type": "text",
"properties": {
"value": "жирный текст",
"bold": true
}
}
}
}
}

Выпадающий список
Обязательные параметры отмечены *
|
Название |
Описание |
|
selectedValue |
Текущее выбранное значение. Если не заполнено, будет использовано первое значение из списка |
|
values* |
Объект, в котором названия свойств это код варианта значения |
{
"type": "dropdownMenu",
"properties": {
"selectedValue": "client",
"values": {
"": "- не выбрано -",
"supplier": "поставщик",
"client": "клиент"
}
}
}

Чтобы отслеживать изменения значений, зарегистрируйте коллбек:
BX24.placement.call('bindValueChangeCallback', null, Callback)для получения изменений в любом из блоковBX24.placement.call('bindValueChangeCallback', 'id блока', Callback)для получения изменений значения только этого блока.
При изменении значения в коллбек придет id блока выпадающего списка и его текущее значение: {id: "clientMenu", value: "client"}.
Поле с вводом текста
Обязательные параметры отмечены *
|
Название |
Описание |
|
title |
Заголовок поля |
|
value |
Текст поля |
|
placeholder |
Плейсхолдер. Будет показан, если поле не заполнено |
|
disabled |
Если передано |
|
errorText |
Сообщение об ошибке. Если передан не пустой |
{
"type": "input",
"properties": {
"value": "aaa@mail.domain",
"placeholder": "Введите email",
"title": "Email",
"errorText": "Некорректное значение"
}
}

Чтобы отслеживать изменения значений, зарегистрируйте коллбек:
BX24.placement.call('bindValueChangeCallback', null, Callback)для получения изменений в любом из блоковBX24.placement.call('bindValueChangeCallback', 'id блока', Callback)для получения изменений значения только этого блока.
При изменении значения в коллбек придет id поля ввода текста и его текущее значение: {id: "email", value: "aaa@mail.domain"}.
Поле ввода многострочного текста
Обязательные параметры отмечены *
|
Название |
Описание |
|
title |
Заголовок поля |
|
value |
Текст поля |
|
placeholder |
Плейсхолдер. Будет показан, если поле не заполнено |
|
disabled |
Если передано |
|
errorText |
Сообщение об ошибке. Если передан не пустой |
{
"type": "textarea",
"properties": {
"value": "Пройти через калитку\nСвернуть налево",
"title": "Дополнительная информация"
}
}

Чтобы отслеживать изменения значений, зарегистрируйте коллбек:
BX24.placement.call('bindValueChangeCallback', null, Callback)для получения изменений в любом из блоковBX24.placement.call('bindValueChangeCallback', 'id блока', Callback)для получения изменений значения только этого блока.
При изменении значения в коллбек придет id поля ввода текста и его текущее значение: {id: "description", value: "Пройти через калитку\nСвернуть налево"}.
Поле ввода с выбором из списка
Обязательные параметры отмечены *
|
Название |
Описание |
|
title |
Заголовок поля |
|
selectedValue |
Текущее выбранное значение. Если не заполнено, будет использовано первое значение из списка |
|
values* |
Объект, в котором названия свойств это код варианта значения |
|
disabled |
Если передано |
|
errorText |
Сообщение об ошибке. Если передан не пустой |
{
"type": "select",
"properties": {
"selectedValue": "spb",
"values": {
"msk": "Москва",
"spb": "Санкт-Петербург",
"kld": "Калининград"
},
"title": "Город"
}
}

Чтобы отслеживать изменения значений, зарегистрируйте коллбек:
BX24.placement.call('bindValueChangeCallback', null, Callback)для получения изменений в любом из блоковBX24.placement.call('bindValueChangeCallback', 'id блока', Callback)для получения изменений значения только этого блока.
При изменении значения в коллбек придет id поля и его текущее значение: {id: "city", value: "msk"}.
Ненумерованный список
Обязательные параметры отмечены *
|
Название |
Описание |
|
blocks* |
Ассоциативный массив контент-блоков. Поддерживаются блоки с типами |
{
"type": "list",
"properties": {
"blocks": {
"li1": {
"type": "text",
"properties": {
"value": "Импорт элементов CRM без реквизитов",
"color": "base_70"
}
},
"li2": {
"type": "link",
"properties": {
"text": "Начало работы с CRM",
"action": {
"type": "layoutEvent",
"value": "link2ItemClicked!"
}
}
},
"li3": {
"type": "text",
"properties": {
"value": "Как сконвертировать лид",
"bold": true,
"color": "base_90"
}
}
}
}
}

Раздел
Блок выводит сгруппированный набор блоков. Возможен вариант с картинкой.
Обязательные параметры отмечены *
|
Название |
Описание |
|
blocks* |
Ассоциативный массив контент-блоков. Поддерживаются любые виды блоков. Минимум 1 элемент, максимум 20 |
|
imageSrc |
Полный путь до картинки |
|
imageSize |
Размер картинки. Доступные значения:
|
|
type |
Внешний вид. Доступные значения:
|
Пример с несколькими блоками и изображением:
{
"type": "section",
"properties": {
"type": "withBorder",
"imageSrc": "https://www.1c-bitrix.ru/images/content_ru/products/box/bus.png",
"blocks": {
"header": {
"type": "text",
"properties": {
"value": " Отправьте клиенту ссылку на встречу",
"size": "xl",
"color": "base_90"
}
},
"notes": {
"type": "list",
"properties": {
"blocks": {
"li1": {
"type": "text",
"properties": {
"value": "Клиент сам выберет удобный слот",
"color": "base_70"
}
},
"li2": {
"type": "text",
"properties": {
"value": "Встреча появится у вас в делах",
"color": "base_70"
}
}
}
}
},
"howto": {
"type": "link",
"properties": {
"text": "Как это работает?",
"action": {
"type": "openRestApp",
"value": "howto"
}
}
}
}
}
}

Пример с одним блоком без изображения:
{
"type": "section",
"properties": {
"type": "danger",
"blocks": {
"erroMessage": {
"type": "text",
"properties": {
"value": "Произошла ошибка. Попробуйте еще раз.",
"color": "danger"
}
}
}
}
}

ButtonDto
Кнопка в нижней части интерфейса.
|
Название |
Описание |
|
title* |
Текст кнопки |
|
state |
Состояние. Доступные значения:
|
Действия с кнопкой ActionDto
Действие определяет реакцию на клик по определенному элементу. Доступные виды действий:
Переход по ссылке
Переход по ссылке возможен в двух вариантах:
- слайдер, если это относительная ссылка на стандартные объекты Битрикс24, поддерживающие работу в слайдере,
- обычный переход по ссылке в остальных случаях.
Обязательные параметры отмечены *
|
Название |
Описание |
|
type* |
Тип действия. Должно иметь значение |
|
value* |
URI ссылки. Например: |
{
"type": "redirect",
"value": "/crm/deal/details/1/"
}
JS событие
Обязательные параметры отмечены *
|
Название |
Описание |
|
type* |
Тип действия. Должно иметь значение |
|
value* |
Идентификатор события. Например: |
{
"type": "layoutEvent",
"value": "clicked"
}
Вызов действия вызывает обработчик, который зарегистрирован через BX24.placement.call('bindLayoutEventCallback', null, Callback) или BX24.placement.call('bindLayoutEventCallback', 'id блока', Callback).
В обработчик будет передано value действия и id блока, который вызвал действие: {id: "myLink", value: "clicked"}.
Открытие слайдера приложения
Вызов действия откроет слайдер приложения, зарегистрировавшего встройку. В слайдер будет передан контекст:
entityTypeIdидентификатор типа объекта, к которому привязано дело,entityIdидентификатор элемента.
Обязательные параметры отмечены *
|
Название |
Описание |
|
type* |
Тип действия. Должно иметь значение |
|
value |
Массив произвольного формата, данные из которого будут переданы в слайдер приложения |
|
sliderParams |
Параметры открытия слайдера |
ActionSliderParamsDto
|
Название |
Описание |
|
width |
Ширина слайдера, px. Не может быть использовано одновременно с |
|
leftBoundary |
Слайдер во всю ширину окна браузера с отступом слева, px. Не может быть использовано одновременно с |
|
title |
Текст заголовка окна браузера при открытии слайдера |
{
"type": "openRestApp",
"value": {
"myId": 123,
"someImportant": "qwerty"
},
"sliderParams": {
"title": "Это заголовок слайдера приложения",
"width": 700
}
}
Примеры LayoutDto
{
"blocks": {
"section1": {
"type": "section",
"properties": {
"type": "withBorder",
"imageSrc": "https://www.1c-bitrix.ru/images/content_ru/products/box/bus.png",
"blocks": {
"header": {
"type": "text",
"properties": {
"value": " Отправьте клиенту ссылку на встречу",
"size": "xl",
"color": "base_90"
}
},
"notes": {
"type": "list",
"properties": {
"blocks": {
"li1": {"type": "text", "properties": {"value": "Клиент сам выберет удобный слот", "color": "base_70"}},
"li2": {"type": "text", "properties": {"value": "Встреча появится у вас в делах", "color": "base_70"}}
}
}
},
"howto": {
"type": "link",
"properties": {"text": "Как это работает?", "action": {"type": "openRestApp", "value": "howto"}}
}
}
}
},
"section2": {
"type": "section",
"properties": {
"type": "primary",
"blocks": {
"sectionText": {
"type": "lineOfBlocks",
"properties": {"blocks": {"block1": {"type": "text", "properties": {"value": "Если вы еще не пробовали генератор продаж, самое время испытать этот инструмент в действии", "color": "base_70"}}, "block2": {"type": "link", "properties": {"text": "Подробнее", "action": {"type": "redirect", "value": "/crm/"}}}}}
}
}
}
}
},
"primaryButton": {"title": "Включить"},
"secondaryButton": {"title": "Отмена"}
}

{
"blocks": {
"errorMessage": {
"type": "text",
"properties": {"value": "Используйте все возможности мобильного СМС маркетинга\nОтправку СМС легко настроить и использовать в CRM Битрикс24\nОтправляйте сообщения прямо из карточки сделки, лида, клиента, счета или предложения.", "size": "sm", "color": "base_70", "multiline": true}
},
"section1": {
"type": "section",
"properties": {"type": "danger", "blocks": {"errorMessage": {"type": "text", "properties": {"value": "Произошла ошибка. Попробуйте еще раз", "color": "danger"}}}}
}
},
"primaryButton": {"title": "Включить", "state": "disabled"},
"secondaryButton": {"title": "Отмена", "state": "disabled"}
}

{
"blocks": {
"name": {"type": "input", "properties": {"value": "Иван", "placeholder": "Введите имя", "title": "Имя"}},
"lastname": {"type": "input", "properties": {"value": "Иванов", "placeholder": "", "title": "Фамилия"}},
"secondname": {"type": "input", "properties": {"value": "", "placeholder": "Введите отчество", "title": "Отчество"}}
},
"primaryButton": {"title": "Сохранить"},
"secondaryButton": {"title": "Отмена"}
}

Продолжите изучение
- Установить обработчик виджета placement.bind
- Взаимодействие с UI из виджетов
- Взаимодействие с карточкой CRM
- Интерактивные приложения
- Кнопка над таймлайном карточки элемента CRM_XXX_DETAIL_ACTIVITY, CRM_DYNAMIC_XXX_DETAIL_ACTIVITY