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

Получить список элементов crm.item.list

Каждый PHP-разработчик, работающий с экосистемой Bitrix Framework, должен глубоко понимать работу её ключевых компонентов. В этой статье мы проведем подробный аудит темы «Получить список элементов crm.item.list», проанализируем лучшие практики и покажем, как правильно использовать crm.item.list в реальных задачах.

Получить список элементов crm.item.list

> Scope: crm
>
> Кто может выполнять метод: любой пользователь с правом «чтения» элементов объекта CRM

Метод получает список элементов определенного типа объекта CRM.

Элементы объекта CRM не попадут в итоговую выборку, если у пользователя нет прав на «чтение» этих элементов.

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

Название
тип
Описание
entityTypeId*
[integer][1]
Идентификатор системного или пользовательского типа, чьи элементы нужно получить
select
[array][1]
Список полей, которые должны быть заполнены у элементов в выборке.

Может содержать в себе только названия полей элемента или '*'.

Список всех доступных полей для выборки можно узнать методом crm.item.fields. Перечень стандартных полей доступен в статье Поля объектов CRM

filter
[object][1]
Объект формата:

{
    field_1: value_1,
    field_2: value_2,
    ...,
    field_n: value_n,
}

где
— field_n — название поля по которому будет отфильтрована выборка элементов
— value_n — значение фильтра

Фильтр может иметь неограниченную вложенность и количество условий.
По умолчанию все условия соединяются друг с другом как AND (логическое И). Если нужно использовать OR (Логическое ИЛИ), то можно передать специальный ключ logic со значением OR.

К ключам field_n можно добавить префикс, уточняющий работу фильтра.
Возможные значения префикса:
— >= — больше либо равно
— > — больше
— <= — меньше либо равно
— < — меньше
— @ — IN, в качестве значения передается массив
— !@ — NOT IN, в качестве значения передается массив
— % — LIKE, поиск по подстроке. Символ % в значении фильтра передавать не нужно. Поиск ищет подстроку в любой позиции строки
— =% — LIKE, поиск по подстроке. Символ % нужно передавать в значении. Примеры:
— "мол%" — ищет значения, начинающиеся с «мол»
— "%мол" — ищет значения, заканчивающиеся на «мол»
— "%мол%" — ищет значения, где «мол» может быть в любой позиции
— %= — LIKE (аналогично =%)
— !% — NOT LIKE, поиск по подстроке. Символ % в значении фильтра передавать не нужно. Поиск идет с обеих сторон
— !=% — NOT LIKE, поиск по подстроке. Символ % нужно передавать в значении. Примеры:
— "мол%" — ищет значения, не начинающиеся с «мол»
— "%мол" — ищет значения, не заканчивающиеся на «мол»
— "%мол%" — ищет значения, где подстроки «мол» нет в любой позиции
— !%= — NOT LIKE (аналогично !=%)
— = — равно, точное совпадение (используется по умолчанию)
— != — не равно
— ! — не равно

Список всех доступных полей для фильтрации можно узнать методом crm.item.fields. Перечень стандартных полей доступен в статье Поля объектов CRM

order
[object][1]
Объект формата:

{
    field_1: value_1,
    field_2: value_2,
    ...,
    field_n: value_n,
}

где
— field_n — название поля по которому будет произведена сортировка выборки элементов
— value_n — значение типа string равное:
— ASC — сортировка по возрастанию
— DESC — сортировка по убыванию

Список всех доступных полей для сортировки можно узнать методом crm.item.fields. Перечень стандартных полей доступен в статье Поля объектов CRM

start
[integer][1]
Параметр используется для управления постраничной навигацией.

Размер страницы результатов всегда статичный — 50 записей.

Чтобы выбрать вторую страницу результатов, передайте значение 50. Чтобы выбрать третью страницу результатов — значение 100 и так далее.

Формула расчета значения параметра start:

start = (N-1) * 50, где N — номер нужной страницы

useOriginalUfNames
[boolean][1]
Параметр для управления форматом имен пользовательских полей в запросе и ответе.
Возможные значения:

— Y — оригинальные имена пользовательских полей, например UF_CRM_2_1639669411830
— N — имена пользовательских полей в camelCase, например ufCrm2_1639669411830

По умолчанию — N

Примеры кода

Получить список лидов у которых:
1. Имя или фамилия не пустые
2. Находятся в статусе «В работе» или «Не обработан».
3. Пришли из источников «Реклама» или «Сайт».
4. Закреплены за менеджерами с идентификаторами 1 или 6.
5. Имеют сумму сделки от 5000 до 20000.
6. Режим расчета суммы является ручным

Задать следующий порядок сортировки у данной выборки:

  • Имя и фамилия в порядке возрастания

Для наглядности выберем только необходимые для нас поля:

  • Идентификатор id
  • Название title
  • Имя name
  • Фамилия lastName
  • Идентификатор стадии stageId
  • Идентификатор источника sourceId
  • Идентификатор ответственного assignedById
  • Сумма opportunity
  • Режим подсчета суммы isManualOpportunity
  • cURL (Webhook)
    curl -X POST \
    -H "Content-Type: application/json" \
    -H "Accept: application/json" \
    -d '{"entityTypeId":1,"select":["id","title","lastName","name","stageId","sourceId","assignedById","opportunity","isManualOpportunity"],"filter":{"0":{"logic":"OR","0":{"!=name":""},"1":{"!=lastName":""}},"@stageId":["NEW","IN_PROCESS"],"@sourceId":["WEB","ADVERTISING"],"@assignedById":[1,6],">=opportunity":5000,"<=opportunity":20000,"isManualOpportunity":"Y"},"order":{"lastName":"ASC","name":"ASC"}}' \
    https://**put_your_bitrix24_address**/rest/**put_your_user_id_here**/**put_your_webbhook_here**/crm.item.list
  • cURL (OAuth)
    curl -X POST \
    -H "Content-Type: application/json" \
    -H "Accept: application/json" \
    -d '{"entityTypeId":1,"select":["id","title","lastName","name","stageId","sourceId","assignedById","opportunity","isManualOpportunity"],"filter":{"0":{"logic":"OR","0":{"!=name":""},"1":{"!=lastName":""}},"@stageId":["NEW","IN_PROCESS"],"@sourceId":["WEB","ADVERTISING"],"@assignedById":[1,6],">=opportunity":5000,"<=opportunity":20000,"isManualOpportunity":"Y"},"order":{"lastName":"ASC","name":"ASC"},"auth":"**put_access_token_here**"}' \
    https://**put_your_bitrix24_address**/rest/crm.item.list
  • JS
    // callListMethod рекомендуется использовать, когда необходимо получить весь набор списочных данных и объём записей относительно невелик (до примерно 1000 элементов). Метод загружает все данные сразу, что может привести к высокой нагрузке на память при работе с большими объемами.
    
    try {
      const response = await $b24.callListMethod(
        'crm.item.list',
        {
          entityTypeId: 1,
          select: [
            "id",
            "title",
            "lastName",
            "name",
            "stageId",
            "sourceId",
            "assignedById",
            "opportunity",
            "isManualOpportunity",
          ],
          filter: {
            "0": {
              logic: "OR",
              "0": {
                "!=name": "",
              },
              "1": {
                "!=lastName": "",
              },
            },
            "@stageId": ["NEW", "IN_PROCESS"],
            "@sourceId": ['WEB', "ADVERTISING"],
            "@assignedById": [1, 6],
            ">=opportunity": 5000,
            "<=opportunity": 20000,
            "isManualOpportunity": "Y",
          },
          order: {
            lastName: 'ASC',
            name: 'ASC',
          },
        },
        (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.item.list', {
        entityTypeId: 1,
        select: [
          "id",
          "title",
          "lastName",
          "name",
          "stageId",
          "sourceId",
          "assignedById",
          "opportunity",
          "isManualOpportunity",
        ],
        filter: {
          "0": {
            logic: "OR",
            "0": {
              "!=name": "",
            },
            "1": {
              "!=lastName": "",
            },
          },
          "@stageId": ["NEW", "IN_PROCESS"],
          "@sourceId": ['WEB', "ADVERTISING"],
          "@assignedById": [1, 6],
          ">=opportunity": 5000,
          "<=opportunity": 20000,
          "isManualOpportunity": "Y",
        },
        order: {
          lastName: 'ASC',
          name: 'ASC',
        },
      }, '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.item.list', {
        entityTypeId: 1,
        select: [
          "id",
          "title",
          "lastName",
          "name",
          "stageId",
          "sourceId",
          "assignedById",
          "opportunity",
          "isManualOpportunity",
        ],
        filter: {
          "0": {
            logic: "OR",
            "0": {
              "!=name": "",
            },
            "1": {
              "!=lastName": "",
            },
          },
          "@stageId": ["NEW", "IN_PROCESS"],
          "@sourceId": ['WEB', "ADVERTISING"],
          "@assignedById": [1, 6],
          ">=opportunity": 5000,
          "<=opportunity": 20000,
          "isManualOpportunity": "Y",
        },
        order: {
          lastName: 'ASC',
          name: 'ASC',
        },
      }, 0);
      const result = response.getData().result || [];
      for (const entity of result) { console.log('Entity:', entity); }
    } catch (error) {
      console.error('Request failed', error);
    }
  • PHP
    try {
        $entityTypeId = 1; // Replace with actual entity type ID
        $order = []; // Replace with actual order array
        $filter = []; // Replace with actual filter array
        $select = []; // Replace with actual select array
        $startItem = 0; // Optional, can be adjusted as needed
        $itemsResult = $serviceBuilder
            ->getCRMScope()
            ->item()
            ->list($entityTypeId, $order, $filter, $select, $startItem);
        foreach ($itemsResult->getItems() as $item) {
            print("ID: " . $item->id . PHP_EOL);
            print("XML ID: " . $item->xmlId . PHP_EOL);
            print("Title: " . $item->title . PHP_EOL);
            print("Created By: " . $item->createdBy . PHP_EOL);
            print("Updated By: " . $item->updatedBy . PHP_EOL);
            print("Created Time: " . $item->createdTime->format(DATE_ATOM) . PHP_EOL);
            print("Updated Time: " . $item->updatedTime->format(DATE_ATOM) . PHP_EOL);
            // Add more fields as necessary
        }
    } catch (Throwable $e) {
        print("Error: " . $e->getMessage() . PHP_EOL);
    }
  • BX24.js
        BX24.callMethod(
            'crm.item.list',
            {
                entityTypeId: 1,
                select: [
                    "id", 
                    "title",
                    "lastName",
                    "name",
                    "stageId", 
                    "sourceId", 
                    "assignedById", 
                    "opportunity", 
                    "isManualOpportunity",
                ],
                filter: {
                    "0": {
                        logic: "OR",
                        "0": {
                            "!=name": "",
                        },
                        "1": {
                            "!=lastName": "",
                        },
                    },
                    "@stageId": ["NEW", "IN_PROCESS"],
                    "@sourceId": ['WEB', "ADVERTISING"],
                    "@assignedById": [1, 6],
                    ">=opportunity": 5000,
                    "<=opportunity": 20000,
                    "isManualOpportunity": "Y",
                },
                order: {
                    lastName: 'ASC',
                    name: 'ASC',
                },
            },
            (result) => {
                if (result.error())
                {
                    console.error(result.error());

                    return;
                }

                console.info(result.data());
            },
        );
  • PHP CRest
    require_once('crest.php');

    $result = CRest::call(
        'crm.item.list',
        [
            'entityTypeId' => 1,
            'select' => [
                "id",
                "title",
                "lastName",
                "name",
                "stageId",
                "sourceId",
                "assignedById",
                "opportunity",
                "isManualOpportunity",
            ],
            'filter' => [
                "0" => [
                    "logic" => "OR",
                    "0" => [
                        "!=name" => "",
                    ],
                    "1" => [
                        "!=lastName" => "",
                    ],
                ],
                "@stageId" => ["NEW", "IN_PROCESS"],
                "@sourceId" => ['WEB', "ADVERTISING"],
                "@assignedById" => [1, 6],
                ">=opportunity" => 5000,
                "<=opportunity" => 20000,
                "isManualOpportunity" => "Y",
            ],
            'order' => [
                'lastName' => 'ASC',
                'name' => 'ASC',
            ],
        ]
    );

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

Пример запроса с фильтром по дате с логикой OR

Фильтруем сделки entityTypeId = 2 по двум датам создания. Для каждой даты задаем диапазон начала и конца суток.

Для наглядности выберем только необходимые для нас поля:

  • Идентификатор id
  • Название title
  • Дата создания createdTime
  • cURL (Webhook)
    curl -X POST \
    -H "Content-Type: application/json" \
    -H "Accept: application/json" \
    -d '{"entityTypeId":2,"select":["id","title","createdTime"],"filter":{"0":{"logic":"OR","0":{">=createdTime":"2025-10-31T00:00:00+02:00","<createdTime":"2025-11-01T00:00:00+02:00"},"1":{">=createdTime":"2025-02-28T00:00:00+02:00","<createdTime":"2025-03-01T00:00:00+02:00"}}}}' \
    https://**put_your_bitrix24_address**/rest/**put_your_user_id_here**/**put_your_webbhook_here**/crm.item.list
  • cURL (OAuth)
    curl -X POST \
    -H "Content-Type: application/json" \
    -H "Accept: application/json" \
    -d '{"entityTypeId":2,"select":["id","title","createdTime"],"filter":{"0":{"logic":"OR","0":{">=createdTime":"2025-10-31T00:00:00+02:00","<createdTime":"2025-11-01T00:00:00+02:00"},"1":{">=createdTime":"2025-02-28T00:00:00+02:00","<createdTime":"2025-03-01T00:00:00+02:00"}}},"auth":"**put_access_token_here**"}' \
    https://**put_your_bitrix24_address**/rest/crm.item.list
  • JS
    try {
        const response = await $b24.callMethod(
            'crm.item.list',
            {
                entityTypeId: 2,
                select: ['id', 'title', 'createdTime'],
                filter: {
                    '0': {
                        logic: 'OR',
                        '0': {
                            '>=createdTime': '2025-10-31T00:00:00+02:00',
                            '<createdTime': '2025-11-01T00:00:00+02:00',
                        },
                        '1': {
                            '>=createdTime': '2025-02-28T00:00:00+02:00',
                            '<createdTime': '2025-03-01T00:00:00+02:00',
                        },
                    },
                },
            },
        );

        const items = response.getData().items || [];
        items.forEach((item) => {
            console.info(`Deal #${item.id}: ${item.title} (${item.createdTime})`);
        });
    } catch (error) {
        console.error('crm.item.list error', error);
    }
  • PHP
    try {
        $entityTypeId = 2;
        $order = [];
        $filter = [
            "0" => [
                "logic" => "OR",
                "0" => [
                    ">=createdTime" => "2025-10-31T00:00:00+02:00",
                    "<createdTime" => "2025-11-01T00:00:00+02:00",
                ],
                "1" => [
                    ">=createdTime" => "2025-02-28T00:00:00+02:00",
                    "<createdTime" => "2025-03-01T00:00:00+02:00",
                ],
            ],
        ];
        $select = ['id', 'title', 'createdTime'];
        $startItem = 0;

        $itemsResult = $serviceBuilder
            ->getCRMScope()
            ->item()
            ->list($entityTypeId, $order, $filter, $select, $startItem);

        foreach ($itemsResult->getItems() as $item) {
            print("ID: " . $item->id . PHP_EOL);
            print("Title: " . $item->title . PHP_EOL);
            print("Created Time: " . $item->createdTime->format(DATE_ATOM) . PHP_EOL);
            print(PHP_EOL);
        }
    } catch (Throwable $e) {
        print("Error: " . $e->getMessage() . PHP_EOL);
    }
  • BX24.js
        BX24.callMethod(
            'crm.item.list',
            {
                entityTypeId: 2,
                select: ['id', 'title', 'createdTime'],
                filter: {
                    '0': {
                        logic: 'OR',
                        '0': {
                            '>=createdTime': '2025-10-31T00:00:00+02:00',
                            '<createdTime': '2025-11-01T00:00:00+02:00',
                        },
                        '1': {
                            '>=createdTime': '2025-02-28T00:00:00+02:00',
                            '<createdTime': '2025-03-01T00:00:00+02:00',
                        },
                    },
                },
            },
            function (result) {
                if (result.error()) {
                    console.error('crm.item.list error', result.error());
                    return;
                }

                const { items } = result.data();
                items.forEach((item) => {
                    console.log(`Deal #${item.id}: ${item.title} (${item.createdTime})`);
                });

                if (result.more()) {
                    result.next();
                }
            }
        );
  • PHP CRest
    require_once('crest.php');

    $result = CRest::call(
        'crm.item.list',
        [
            'entityTypeId' => 2,
            'select' => ['id', 'title', 'createdTime'],
            'filter' => [
                "0" => [
                    "logic" => "OR",
                    "0" => [
                        ">=createdTime" => "2025-10-31T00:00:00+02:00",
                        "<createdTime" => "2025-11-01T00:00:00+02:00",
                    ],
                    "1" => [
                        ">=createdTime" => "2025-02-28T00:00:00+02:00",
                        "<createdTime" => "2025-03-01T00:00:00+02:00",
                    ],
                ],
            ],
        ]
    );

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

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

HTTP-статус: 200

{
    "result": {
        "items": [
            {
                "id": 253,
                "assignedById": 6,
                "stageId": "NEW",
                "opportunity": 19000,
                "sourceId": "WEB",
                "title": "Лид #253",
                "name": "Админ",
                "lastName": null,
                "isManualOpportunity": "Y"
            },
            {
                "id": 255,
                "assignedById": 1,
                "stageId": "NEW",
                "opportunity": 19600,
                "sourceId": "WEB",
                "title": "Лид #255",
                "name": "Иван",
                "lastName": "Иванов",
                "isManualOpportunity": "Y"
            },
            {
                "id": 252,
                "assignedById": 1,
                "stageId": "NEW",
                "opportunity": 12000,
                "sourceId": "ADVERTISING",
                "title": "Лид #252",
                "name": "Иван",
                "lastName": "Котов",
                "isManualOpportunity": "Y"
            },
            {
                "id": 254,
                "assignedById": 6,
                "stageId": "IN_PROCESS",
                "opportunity": 19000,
                "sourceId": "ADVERTISING",
                "title": "Лид #254",
                "name": "Кот",
                "lastName": "Котов",
                "isManualOpportunity": "Y"
            }
        ]
    },
    "total": 4,
    "time": {
        "start": 1721724354.214286,
        "finish": 1721724354.805263,
        "duration": 0.5909769535064697,
        "processing": 0.24513697624206543,
        "date_start": "2024-07-23T10:45:54+02:00",
        "date_finish": "2024-07-23T10:45:54+02:00",
        "operating": 0
    }
}

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

Название
тип
Описание
result
[object][1]
Корневой элемент ответа. Содержит единственный ключ items
items
item[]
Массив c информацией о найденных элементах.

Возвращаемые поля зависят от параметра select, описание полей

total
[integer][1]
Общее количество найденных элементов
next
[integer][1]
Содержит значение, которое нужно передать в следующий запрос в параметр start, чтобы получить следующую порцию данных.

Параметр next появляется в ответе, если количество элементов, соответствующих вашему запросу, превышает значение 50.

time
[time][1]
Информация о времени выполнения запроса

По умолчанию имена пользовательских полей передаются и возвращаются в camelCase, например ufCrm2_1639669411830.
При передаче параметра useOriginalUfNames со значением Y пользовательские поля будут возвращаться с оригинальными именами, например UF_CRM_2_1639669411830.

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

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

{
    "error": "INVALID_ARG_VALUE",
    "error_description": "Invalid filter: field 'FIELD' is not allowed in filter"
}

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

СтатусКодОписаниеЗначение
403allowed_only_intranet_userДействие разрешено только интранет-пользователямПользователь не является интранет-пользователем
400NOT_FOUNDСмарт-процесс не найденВозникает, при передаче невалидного 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 некорректно
  • [](crm-item-add)
  • [](crm-item-update)
  • [](crm-item-get)
  • [](crm-item-delete)
  • [](crm-item-fields)
  • [](./object-fields)
  • [](../../../tutorials/tasks/how-to-connect-task-to-spa)
  • [](../../../tutorials/crm/how-to-get-lists/how-to-get-elements-by-stage-filter)
  • [](../../../tutorials/crm/how-to-get-lists/get-activity-list-by-deals)
  • [](../../../tutorials/crm/how-to-get-lists/how-to-get-contractors)

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

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

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

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

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

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

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

Related Post

Как использовать метод SDK crm.company.contact.items.set в Битрикс24Как использовать метод SDK crm.company.contact.items.set в Битрикс24

При разработке и поддержке проектов на платформе 1С-Битрикс критически важно использовать современные стандарты D7 API. В этом руководстве мы детально изучим тему «Как использовать метод SDK crm.company.contact.items.set в Битрикс24», разберем

Восстановить файл из корзины disk.file.restoreВосстановить файл из корзины disk.file.restore

При разработке и поддержке проектов на платформе 1С-Битрикс критически важно использовать современные стандарты D7 API. В этом руководстве мы детально изучим тему «Восстановить файл из корзины disk.file.restore», разберем архитектурные особенности

Входящая очередь событийВходящая очередь событий

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