Блог Горошко Андрея Bitrix24,PHP Получить историю движения по стадиям crm.stagehistory.list

Получить историю движения по стадиям crm.stagehistory.list

Эффективная интеграция и кастомизация функционала в Битрикс24 часто требует работы на уровне API. Сегодня мы подробно рассмотрим «Получить историю движения по стадиям crm.stagehistory.list». Вы узнаете экспертные методики работы с crm.stagehistory.list и научитесь избегать типичных ошибок начинающих разработчиков.

Получить историю движения по стадиям crm.stagehistory.list

> Scope: crm
>
> Кто может выполнять метод: любой пользователь

Метод crm.stagehistory.list возвращает записи об истории движения по стадиям для элементов:

  • лидов,
  • сделок,
  • старых счетов,
  • новых счетов,
  • смарт-процессов.

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

Название
тип
Описание
entityTypeId
[integer][1]
Идентификатор типа объекта. Может принимать значения:
— 1 — лид,
— 2 — сделка,
— 5 — счет (старый),
— 31 — счет (новый),
— числовой идентификатор пользовательского типа, например 130
order
[object][1]
Список для сортировки, где ключ — поле, а значение — ASC или DESC
filter
[object][1]
Список для фильтрации. Фильтр поддерживает использование точных значений, массивов значений, а также модификаторы:
— >= — больше либо равно
— > — больше
— <= — меньше либо равно
— < — меньше
— @ — IN, в качестве значения передается массив
— !@ — NOT IN, в качестве значения передается массив
— % — LIKE, поиск по подстроке. Символ % в значении фильтра передавать не нужно. Поиск ищет подстроку в любой позиции строки
— =% — LIKE, поиск по подстроке. Символ % нужно передавать в значении. Примеры:
— "мол%" — ищет значения, начинающиеся с «мол»
— "%мол" — ищет значения, заканчивающиеся на «мол»
— "%мол%" — ищет значения, где «мол» может быть в любой позиции
— %= — LIKE (аналогично =%)
— !% — NOT LIKE, поиск по подстроке. Символ % в значении фильтра передавать не нужно. Поиск идет с обеих сторон
— !=% — NOT LIKE, поиск по подстроке. Символ % нужно передавать в значении. Примеры:
— "мол%" — ищет значения, не начинающиеся с «мол»
— "%мол" — ищет значения, не заканчивающиеся на «мол»
— "%мол%" — ищет значения, где подстроки «мол» нет в любой позиции
— !%= — NOT LIKE (аналогично !=%)
— = — равно, точное совпадение (используется по умолчанию)
— != — не равно
— ! — не равно
select
[object][1]
Список получаемых полей
start
[integer][1]
Сдвиг для постраничной навигации. Логика работы с постраничной навигацией стандартная для списочных методов

Примеры кода

Получить историю движения по стадиям для сделки с ID=1

  • cURL (Webhook)
    curl -X POST \
    -H "Content-Type: application/json" \
    -H "Accept: application/json" \
    -d '{"entityTypeId":2,"order":{"ID":"ASC"},"filter":{"OWNER_ID":1},"select":["ID","STAGE_ID","CREATED_TIME"]}' \
    https://**put_your_bitrix24_address**/rest/**put_your_user_id_here**/**put_your_webbhook_here**/crm.stagehistory.list
  • cURL (OAuth)
    curl -X POST \
    -H "Content-Type: application/json" \
    -H "Accept: application/json" \
    -d '{"entityTypeId":2,"order":{"ID":"ASC"},"filter":{"OWNER_ID":1},"select":["ID","STAGE_ID","CREATED_TIME"],"auth":"**put_access_token_here**"}' \
    https://**put_your_bitrix24_address**/rest/crm.stagehistory.list
  • JS
    // callListMethod рекомендуется использовать, когда необходимо получить весь набор списочных данных и объём записей относительно невелик (до примерно 1000 элементов). Метод загружает все данные сразу, что может привести к высокой нагрузке на память при работе с большими объемами.
    
    const parameters = {
        entityTypeId: 2,
        order: { "ID": "ASC" },
        filter: { "OWNER_ID": 1 },
        select: [ "ID", "STAGE_ID", "CREATED_TIME" ]
    };
    
    try {
      const response = await $b24.callListMethod(
        'crm.stagehistory.list',
        parameters,
        (progress) => { console.log('Progress:', progress) }
      )
      const items = response.getData() || []
      for (const entity of items) { console.log('Entity:', entity) }
    } catch (error) {
      console.error('Request failed', error)
    }
    
    // fetchListMethod предпочтителен при работе с крупными наборами данных. Метод реализует итеративную выборку с использованием генератора, что позволяет обрабатывать данные по частям и эффективно использовать память.
    
    try {
      const generator = $b24.fetchListMethod('crm.stagehistory.list', parameters, 'ID')
      for await (const page of generator) {
        for (const entity of page) { console.log('Entity:', entity) }
      }
    } catch (error) {
      console.error('Request failed', error)
    }
    
    // callMethod предоставляет ручной контроль над процессом постраничного получения данных через параметр start. Подходит для сценариев, где требуется точное управление пакетами запросов. Однако при больших объемах данных может быть менее эффективным по сравнению с fetchListMethod.
    
    try {
      const response = await $b24.callMethod('crm.stagehistory.list', parameters, 0)
      const result = response.getData().result || []
      for (const entity of result) { console.log('Entity:', entity) }
    } catch (error) {
      console.error('Request failed', error)
    }
  • PHP
    try {
        $response = $b24Service
            ->core
            ->call(
                'crm.stagehistory.list',
                [
                    'entityTypeId' => 2,
                    'order' => ['ID' => 'ASC'],
                    'filter' => ['OWNER_ID' => 1],
                    'select' => ['ID', 'STAGE_ID', 'CREATED_TIME'],
                ]
            );
    
        $result = $response
            ->getResponseData()
            ->getResult();
    
        echo 'Success: ' . print_r($result, true);
        
        if ($result->more()) {
            $result->next();
        }
    
    } catch (Throwable $e) {
        error_log($e->getMessage());
        echo 'Error listing stage history: ' . $e->getMessage();
    }
  • BX24.js
    BX24.callMethod(
        "crm.stagehistory.list",
        {
            entityTypeId: 2,
            order: { "ID": "ASC" },
            filter: { "OWNER_ID": 1 },
            select: [ "ID", "STAGE_ID", "CREATED_TIME" ]
        },
        function(result)
        {
            if(result.error())
                console.error(result.error());
            else
            {
                console.dir(result.data());
                if(result.more())
                    result.next();
            }
        }
    );
  • PHP CRest
    require_once('crest.php');

    $result = CRest::call(
        'crm.stagehistory.list',
        [
            'entityTypeId' => 2,
            'order' => ['ID' => 'ASC'],
            'filter' => ['OWNER_ID' => 1],
            'select' => ['ID', 'STAGE_ID', 'CREATED_TIME']
        ]
    );

    echo '<PRE>';
    print_r($result);
    echo '</PRE>';

Получить историю движения по стадиям для смарт-процесса с entityTypeId=130 и элементом OWNER_ID=29

  • cURL (Webhook)
    curl -X POST \
    -H "Content-Type: application/json" \
    -H "Accept: application/json" \
    -d '{"entityTypeId":130,"order":{"ID":"ASC"},"filter":{"OWNER_ID":29},"select":["ID","STAGE_ID","CREATED_TIME"]}' \
    https://**put_your_bitrix24_address**/rest/**put_your_user_id_here**/**put_your_webbhook_here**/crm.stagehistory.list
  • cURL (OAuth)
    curl -X POST \
    -H "Content-Type: application/json" \
    -H "Accept: application/json" \
    -d '{"entityTypeId":130,"order":{"ID":"ASC"},"filter":{"OWNER_ID":29},"select":["ID","STAGE_ID","CREATED_TIME"],"auth":"**put_access_token_here**"}' \
    https://**put_your_bitrix24_address**/rest/crm.stagehistory.list
  • JS
    // callListMethod рекомендуется использовать, когда необходимо получить весь набор списочных данных и объём записей относительно невелик (до примерно 1000 элементов). Метод загружает все данные сразу, что может привести к высокой нагрузке на память при работе с большими объемами.
    
    const parameters = {
        entityTypeId: 130,
        order: { "ID": "ASC" },
        filter: { "OWNER_ID": 29 },
        select: [ "ID", "STAGE_ID", "CREATED_TIME" ]
    };
    
    try {
      const response = await $b24.callListMethod(
        'crm.stagehistory.list',
        parameters,
        (progress) => { console.log('Progress:', progress) }
      )
      const items = response.getData() || []
      for (const entity of items) { console.log('Entity:', entity) }
    } catch (error) {
      console.error('Request failed', error)
    }
    
    // fetchListMethod предпочтителен при работе с крупными наборами данных. Метод реализует итеративную выборку с использованием генератора, что позволяет обрабатывать данные по частям и эффективно использовать память.
    
    try {
      const generator = $b24.fetchListMethod('crm.stagehistory.list', parameters, 'ID')
      for await (const page of generator) {
        for (const entity of page) { console.log('Entity:', entity) }
      }
    } catch (error) {
      console.error('Request failed', error)
    }
    
    // callMethod предоставляет ручной контроль над процессом постраничного получения данных через параметр start. Подходит для сценариев, где требуется точное управление пакетами запросов. Однако при больших объемах данных может быть менее эффективным по сравнению с fetchListMethod.
    
    try {
      const response = await $b24.callMethod('crm.stagehistory.list', parameters, 0)
      const result = response.getData().result || []
      for (const entity of result) { console.log('Entity:', entity) }
    } catch (error) {
      console.error('Request failed', error)
    }
  • PHP
    try {
        $response = $b24Service
            ->core
            ->call(
                'crm.stagehistory.list',
                [
                    'entityTypeId' => 130,
                    'order' => ['ID' => 'ASC'],
                    'filter' => ['OWNER_ID' => 29],
                    'select' => ['ID', 'STAGE_ID', 'CREATED_TIME'],
                ]
            );
    
        $result = $response
            ->getResponseData()
            ->getResult();
    
        echo 'Success: ' . print_r($result, true);
        
        if ($result->more()) {
            $result->next();
        }
    
    } catch (Throwable $e) {
        error_log($e->getMessage());
        echo 'Error listing stage history: ' . $e->getMessage();
    }
  • BX24.js
    BX24.callMethod(
        "crm.stagehistory.list",
        {
            entityTypeId: 130,
            order: { "ID": "ASC" },
            filter: { "OWNER_ID": 29 },
            select: [ "ID", "STAGE_ID", "CREATED_TIME" ]
        },
        function(result)
        {
            if(result.error())
                console.error(result.error());
            else
            {
                console.dir(result.data());
                if(result.more())
                    result.next();
            }
        }
    );
  • PHP CRest
    require_once('crest.php');

    $result = CRest::call(
        'crm.stagehistory.list',
        [
            'entityTypeId' => 130,
            'order' => ['ID' => 'ASC'],
            'filter' => ['OWNER_ID' => 29],
            'select' => ['ID', 'STAGE_ID', 'CREATED_TIME']
        ]
    );

    echo '<PRE>';
    print_r($result);
    echo '</PRE>';

Обработка ответа

HTTP-статус: 200

{
    "result": {
        "items": [
        {
            "ID": 35,
            "TYPE_ID": 1,
            "OWNER_ID": 21,
            "CREATED_TIME": "2024-04-25T14:59:11+00:00",
            "CATEGORY_ID": 0,
            "STAGE_SEMANTIC_ID": "P",
            "STAGE_ID": "NEW"
        }
        ]
    },
    "total": 1,
    "time": {
        "start": 1724106224.858572,
        "finish": 1724106225.344968,
        "duration": 0.48639607429504395,
        "processing": 0.11864185333251953,
        "date_start": "2024-08-15T22:15:44+00:00",
        "date_finish": "2024-08-15T22:15:45+00:00",
        "operating": 0.11855506896972656
    }
}

Возвращаемые данные

Название
тип
Описание
result
array
Корневой элемент ответа, содержит массив записей items. Каждый объект — массив с ключами
time
time
Информация о времени выполнения запроса

Объект items {#items}

Название
тип
Описание
ID
[int][1]
Идентификатор записи
TYPE_ID
[int][1]
Тип записи. Может принимать значения:
— 1 — создание элемента,
— 2 — перевод на промежуточную стадию,
— 3 — перевод на финальную стадию,
— 5 — смена воронки
OWNER_ID
[int][1]
Идентификатор объекта, в котором изменилась стадия
CREATED_TIME
[datetime][1]
Идентификатор созданного элемента, равен времени перевода элемента на стадию

Дополнительно есть специфичные для разных типов объектов поля:

  • для лидов и старых счетов
Название
тип
Описание
STATUS_SEMANTIC_ID
[int][1]
Cемантика стадии:
— P — промежуточная стадия,
— S — успешная стадия,
— F — провальная стадия
STATUS_ID
[int][1]
Идентификатор стадии
  • для сделок, новых счетов и смарт-процессов
Название
тип
Описание
CATEGORY_ID
[int][1]
Идентификатор воронки
STAGE_SEMANTIC_ID
[int][1]
Семантика стадии:
— P — промежуточная стадия,
— S — успешная стадия,
— F — провальная стадия
STAGE_ID
[int][1]
Идентификатор стадии

Обработка ошибок

HTTP-статус: 401, 400

{
    "error": 0,
    "error_description": "SHIPMENT_DOCUMENT entity is not supported"
}

Возможные коды ошибок

СтатусКодОписаниеЗначение
403allowed_only_intranet_userДействие разрешено только интранет-пользователямПользователь не является интранет-пользователем
400ENTITY_TYPE_NOT_SUPPORTEDEntity type TYPE is not supportedВозникает при передаче невалидного entityTypeId
400INVALID_ARG_VALUEInvalid filter: field ‘field‘ is not allowed in filterПереданное в filter поле field недоступно для фильтрации
400INVALID_ARG_VALUEInvalid filter: field ‘field‘ has invalid valueПереданное значение для поля field в filter некорректно
400INVALID_ARG_VALUEInvalid order: field ‘field‘ is not allowed in orderПереданное в order поле field недоступно для сортировки
400INVALID_ARG_VALUEInvalid order: allowed sort directions are ASC, DESC. But got ‘orderValue‘ for field ‘field‘Переданное значение orderValue для поля field в параметр order некорректно
  • [](./index)
  • [](./main-entities-fields)

[1]: ../data-types.md

💡 Экспертное мнение и рекомендации

Практические рекомендации:

  • При написании кастомных компонентов для «Получить историю движения по стадиям crm.stagehistory.list» всегда разделяйте бизнес-логику и представление (шаблон).
  • Используйте отладку SQL-запросов через конструкцию $wpdb->last_query или стандартный трекер Битрикса, чтобы контролировать нагрузку.

Похожая задача в бизнесе?

Помогу автоматизировать процессы и внедрить ИИ

Меня зовут Андрей Горошко. Я Full-stack разработчик и эксперт по 1С-Битрикс. Настраиваю CRM Битрикс24, разрабатываю защищенные API и создаю умных ИИ-агентов для автоматизации рутины.

Related Post

Добавить задачу в канбан Скрама tasks.api.scrum.kanban.addTaskДобавить задачу в канбан Скрама tasks.api.scrum.kanban.addTask

Каждый PHP-разработчик, работающий с экосистемой Bitrix Framework, должен глубоко понимать работу её ключевых компонентов. В этой статье мы проведем подробный аудит темы «Добавить задачу в канбан Скрама tasks.api.scrum.kanban.addTask», проанализируем лучшие

Установка шаблонов сайтовУстановка шаблонов сайтов

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

Как использовать метод SDK sale.propertyvariant.delete в Битрикс24Как использовать метод SDK sale.propertyvariant.delete в Битрикс24

Каждый PHP-разработчик, работающий с экосистемой Bitrix Framework, должен глубоко понимать работу её ключевых компонентов. В этой статье мы проведем подробный аудит темы «Как использовать метод SDK sale.propertyvariant.delete в Битрикс24», проанализируем