Эффективная интеграция и кастомизация функционала в Битрикс24 часто требует работы на уровне API. Сегодня мы подробно рассмотрим «Установить набор дополнительных контентных блоков в запись таймлайна crm.time…». Вы узнаете экспертные методики работы с crm.timeline.layout.blocks.set и научитесь избегать типичных ошибок начинающих разработчиков.
Установить набор дополнительных контентных блоков в запись таймлайна crm.timeline.layout.blocks.set
> Scope: crm
>
> Кто может выполнять метод: администратор
Метод crm.timeline.layout.blocks.set устанавливает набор дополнительных контентных блоков для записи таймлайна.
Установка нового набора дополнительных контентных блоков в запись таймлайна будет стирать ранее добавленный набор в рамках одного приложения.
Установка набора дополнительных контентных блоков не может быть применена к записям таймлайна относящимся к:
- делам, для дел используйте методы crm.activity.layout.blocks.,
- лог-записям таймлайна,
- устаревшим записям таймлайна.
Параметры метода
Названиетип | Описание |
|---|---|
entityTypeIdinteger | Идентификатор объекта CRM, к которому привязана запись таймлайна |
entityIdinteger | Идентификатор объекта CRM, к которому привязана запись таймлайна |
timelineIdinteger | Идентификатор записи таймлайна |
layout*RestAppLayoutDto | Объект, описывающий набор дополнительных контентных блоков |
Примеры кода
В запись таймлайна с id = 8, привязанного к сделке с id = 4 установим следующий набор дополнительных контентных блоков:
1. Текст
2. Длинный многострочный текст
3. Ссылка
4. Блок с заголовком
- cURL (Webhook)
curl -X POST \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"entityTypeId":2,"entityId":4,"timelineId":8,"layout":{"blocks":{"block_1":{"type":"text","properties":{"value":"Здравствуйте!\nМы начинаем.","multiline":true,"bold":true,"color":"base_90"}},"block_2":{"type":"largeText","properties":{"value":"Здравствуйте!\nМы начинаем.\nМы продолжаем.\nМы все еще работаем над этим.\nМы продолжаем.\nМы близки к результату.\nДо свидания."}},"block_3":{"type":"link","properties":{"text":"Открыть сделку","bold":true,"action":{"type":"redirect","uri":"/crm/deal/details/123/"}}},"block_4":{"type":"withTitle","properties":{"title":"Заголовок","block":{"type":"text","properties":{"value":"Какое-то значение"}}}}}}' \
https://**put_your_bitrix24_address**/rest/**put_your_user_id_here**/**put_your_webbhook_here**/crm.timeline.layout.blocks.set- cURL (OAuth)
curl -X POST \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"entityTypeId":2,"entityId":4,"timelineId":8,"layout":{"blocks":{"block_1":{"type":"text","properties":{"value":"Здравствуйте!\nМы начинаем.","multiline":true,"bold":true,"color":"base_90"}},"block_2":{"type":"largeText","properties":{"value":"Здравствуйте!\nМы начинаем.\nМы продолжаем.\nМы все еще работаем над этим.\nМы продолжаем.\nМы близки к результату.\nДо свидания."}},"block_3":{"type":"link","properties":{"text":"Открыть сделку","bold":true,"action":{"type":"redirect","uri":"/crm/deal/details/123/"}}},"block_4":{"type":"withTitle","properties":{"title":"Заголовок","block":{"type":"text","properties":{"value":"Какое-то значение"}}}}}},"auth":"**put_access_token_here**"}' \
https://**put_your_bitrix24_address**/rest/crm.timeline.layout.blocks.set- JS
try
{
const response = await $b24.callMethod(
'crm.timeline.layout.blocks.set',
{
entityTypeId: 2, // Сделка
entityId: 4, // ID Сделки
timelineId: 8, // ID Записи таймлайна привязанного к данной сделке
layout: layout, // Объект, описывающий набор дополнительных контентных блоков
}
);
const result = response.getData().result;
console.info(result);
}
catch( error )
{
console.error(error);
}- PHP
try {
$response = $b24Service
->core
->call(
'crm.timeline.layout.blocks.set',
[
'entityTypeId' => 2, // Сделка
'entityId' => 4, // ID Сделки
'timelineId' => 8, // ID Записи таймлайна привязанного к данной сделке
'layout' => [
'blocks' => [
'block_1' => [
'type' => "text",
'properties' => [
'value' => "Здравствуйте!\nМы начинаем.",
'multiline' => true,
'bold' => true,
'color' => "base_90"
]
],
'block_2' => [
'type' => "largeText",
'properties' => [
'value' => "Здравствуйте!\nМы начинаем.\nМы продолжаем.\nМы все еще работаем над этим.\nМы продолжаем.\nМы близки к результату.\nДо свидания."
]
],
'block_3' => [
'type' => "link",
'properties' => [
'text' => "Открыть сделку",
'bold' => true,
'action' => [
'type' => "redirect",
'uri' => "/crm/deal/details/123/"
]
]
],
'block_4' => [
'type' => "withTitle",
'properties' => [
'title' => "Заголовок",
'block' => [
'type' => "text",
'properties' => [
'value' => "Какое-то значение"
]
]
]
]
]
]
]
);
$result = $response
->getResponseData()
->getResult();
echo 'Success: ' . print_r($result, true);
} catch (Throwable $e) {
error_log($e->getMessage());
echo 'Error setting timeline layout blocks: ' . $e->getMessage();
}- BX24.js
const layout = {
blocks: {
'block_1': {
type: "text",
properties: {
value: "Здравствуйте!\nМы начинаем.",
multiline: true,
bold: true,
color: "base_90"
}
},
'block_2': {
type: "largeText",
properties: {
value: "Здравствуйте!\nМы начинаем.\nМы продолжаем.\nМы все еще работаем над этим.\nМы продолжаем.\nМы близки к результату.\nДо свидания."
}
},
'block_3': {
type: "link",
properties: {
text: "Открыть сделку",
bold: true,
action: {
type: "redirect",
uri: "/crm/deal/details/123/"
}
}
},
'block_4': {
type: "withTitle",
properties: {
"Заголовок",
block: {
type: "text",
properties: {
value: "Какое-то значение"
}
}
}
}
}
};
BX24.callMethod(
'crm.timeline.layout.blocks.set',
{
entityTypeId: 2, // Сделка
entityId: 4, // ID Сделки
timelineId: 8, // ID Записи таймлайна привязанного к данной сделке
layout: layout, // Объект, описывающий набор дополнительных контентных блоков
},
(result) => {
if (result.error()) {
console.error(result.error());
} else {
console.info(result.data());
}
},
);- PHP CRest
require_once('crest.php');
$result = CRest::call(
'crm.timeline.layout.blocks.set',
[
'entityTypeId' => 2,
'entityId' => 4,
'timelineId' => 8,
'layout' => [
'blocks' => [
'block_1' => [
'type' => "text",
'properties' => [
'value' => "Здравствуйте!\nМы начинаем.",
'multiline' => true,
'bold' => true,
'color' => "base_90"
]
],
'block_2' => [
'type' => "largeText",
'properties' => [
'value' => "Здравствуйте!\nМы начинаем.\nМы продолжаем.\nМы все еще работаем над этим.\nМы продолжаем.\nМы близки к результату.\nДо свидания."
]
],
'block_3' => [
'type' => "link",
'properties' => [
'text' => "Открыть сделку",
'bold' => true,
'action' => [
'type' => "redirect",
'uri' => "/crm/deal/details/123/"
]
]
],
'block_4' => [
'type' => "withTitle",
'properties' => [
'title' => "Заголовок",
'block' => [
'type' => "text",
'properties' => [
'value' => "Какое-то значение"
]
]
]
]
]
]
]
);
echo '';
print_r($result);
echo '';Внешний вид
Результатом примера выше будет запись:
!Пример
Если запись таймлайна содержит более одного набора дополнительных контентных блоков, то они будут выводиться в порядке их добавления.
В html верстке с помощью data-атрибутов явно выделено то, каким приложением был добавлен набор дополнительных контентных блоков:
data-app-name: название приложения,data-rest-client-id: идентификатор приложения.
Обработка ответа
HTTP-статус: 200
Возвращает { success: true } в случае успешной записи набора дополнительных контентных блоков, иначе null.
{
"success": true
}Обработка ошибок
HTTP-статус: 400
{
"error": "ERROR_WRONG_CONTEXT",
"error_description": "Вызов метода возможен только в контексте rest приложения"
}Возможные коды ошибок
| Код | Описание |
|---|---|
ERROR_WRONG_CONTEXT | Вызов метода возможен только в контексте rest приложения |
OWNER_NOT_FOUND | Элемент, к которому привязана запись таймлайна, не найден |
NOT_FOUND | Запись таймлайна не найдена |
ACCESS_DENIED | Доступ запрещен |
UNSUITABLE_TIMELINE_ITEM | Тип записи таймлайна не подходит для добавления набора дополнительных контентных блоков |
FIELD_IS_REQUIRED | Поле blocks в RestAppLayoutDto должно быть заполнено. |
Также метод отдает ошибки, связанные с неправильной структурой набора контентных блоков. Подробности можно узнать в тексте ошибки.
- [](./index)
- [](./crm-timeline-layout-blocks-get)
- [](./crm-timeline-layout-blocks-delete)
- [](./content-blocks-test-app)
💡 Экспертное мнение и рекомендации
Практические рекомендации:
- При написании кастомных компонентов для «Установить набор дополнительных контентных блоков в запись таймлайна crm.time…» всегда разделяйте бизнес-логику и представление (шаблон).
- Используйте отладку SQL-запросов через конструкцию
$wpdb->last_queryили стандартный трекер Битрикса, чтобы контролировать нагрузку.
Похожая задача в бизнесе?
Помогу автоматизировать процессы и внедрить ИИ
Меня зовут Андрей Горошко. Я Full-stack разработчик и эксперт по 1С-Битрикс. Настраиваю CRM Битрикс24, разрабатываю защищенные API и создаю умных ИИ-агентов для автоматизации рутины.
или на почту: gorandvas@yandex.ru