Блог Горошко Андрея Bitrix24,PHP Установить набор дополнительных контентных блоков в запись таймлайна crm.time…

Установить набор дополнительных контентных блоков в запись таймлайна crm.time…

Эффективная интеграция и кастомизация функционала в Битрикс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.,
  • лог-записям таймлайна,
  • устаревшим записям таймлайна.

Параметры метода

Название
тип
Описание
entityTypeId
integer
Идентификатор объекта CRM, к которому привязана запись таймлайна
entityId
integer
Идентификатор объекта CRM, к которому привязана запись таймлайна
timelineId
integer
Идентификатор записи таймлайна
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 и создаю умных ИИ-агентов для автоматизации рутины.

Related Post

Как использовать метод SDK crm.item.productrow.fields в Битрикс24Как использовать метод SDK crm.item.productrow.fields в Битрикс24

Оптимизация производительности и безопасности — залог успешного проекта на 1С-Битрикс. Данный материал посвящен практическому применению «Как использовать метод SDK crm.item.productrow.fields в Битрикс24». Мы подготовили подробный разбор принципов работы и развернутые

Настройка сжатия Gzip и Brotli на веб-сервере NGINX для БитриксНастройка сжатия Gzip и Brotli на веб-сервере NGINX для Битрикс

Профессиональная поддержка, модернизация и оптимизация производительности сайта на 1С-Битрикс — это гарантия высокой конверсии, стабильности продаж и защиты от киберугроз. Услуга «Настройка сжатия Gzip и Brotli на веб-сервере NGINX для

Установить общую карточку для всех пользователей crm.company.details.configur…Установить общую карточку для всех пользователей crm.company.details.configur…

При разработке и поддержке проектов на платформе 1С-Битрикс критически важно использовать современные стандарты D7 API. В этом руководстве мы детально изучим тему «Установить общую карточку для всех пользователей crm.company.details.configur…», разберем