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

Scope: crm

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

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

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

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

Обязательные параметры отмечены *

Название
тип

Описание

entityTypeId*
integer

Идентификатор системного или пользовательского типа, чьи элементы нужно получить

select
array

Список полей, которые должны быть заполнены у элементов в выборке.

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

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

filter
object

Объект формата:

{
            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

Объект формата:

{
            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

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

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

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

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

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

useOriginalUfNames
boolean

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

  • 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 -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_webhook_here**/crm.item.list
        
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
        
// 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);
        }
        
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.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());
                },
            );
        
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 -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_webhook_here**/crm.item.list
        
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
        
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);
        }
        
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.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();
                    }
                }
            );
        
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

Корневой элемент ответа. Содержит единственный ключ items

items
item[]

Массив c информацией о найденных элементах.

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

total
integer

Общее количество найденных элементов

next
integer

Содержит значение, которое нужно передать в следующий запрос в параметр start, чтобы получить следующую порцию данных.

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

time
time

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

По умолчанию имена пользовательских полей передаются и возвращаются в 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"
        }
        

Название
тип

Описание

error
string

Строковый код ошибки. Может состоять из цифр, латинских букв и знака подчеркивания

error_description
error_description

Текстовое описание ошибки. Описание не предназначено для показа конечному пользователю в необработанном виде

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

Статус

Код

Описание

Значение

403

allowed_only_intranet_user

Действие разрешено только интранет-пользователям

Пользователь не является интранет-пользователем

400

NOT_FOUND

Смарт-процесс не найден

Возникает, при передаче невалидного entityTypeId

400

INVALID_ARG_VALUE

Invalid filter: field 'field' is not allowed in filter

Переданное в filter поле field недоступно для фильтрации

400

INVALID_ARG_VALUE

Invalid filter: field 'field' has invalid value

Переданное значение для поля field в filter некорректно

400

INVALID_ARG_VALUE

Invalid order: field 'field' is not allowed in order

Переданное в order поле field недоступно для сортировки

400

INVALID_ARG_VALUE

Invalid order: allowed sort directions are ASC, DESC. But got 'orderValue' for field 'field'

Переданное значение orderValue для поля field в параметр order некорректно

Статусы и коды системных ошибок

HTTP-статус: 20x, 40x, 50x

Описанные ниже ошибки могут возникнуть при вызове любого метода

Статус

Код
Текст ошибки

Описание

500

INTERNAL_SERVER_ERROR
Internal server error

Возникла внутренняя ошибка сервера, обратитесь к администратору сервера или в техническую поддержку Битрикс24

500

ERROR_UNEXPECTED_ANSWER
Server returned an unexpected response

Возникла внутренняя ошибка сервера, обратитесь к администратору сервера или в техническую поддержку Битрикс24

503

QUERY_LIMIT_EXCEEDED
Too many requests

Превышен лимит на интенсивность запросов

405

ERROR_BATCH_METHOD_NOT_ALLOWED
Method is not allowed for batch usage

Текущий метод не разрешен для вызова с помощью batch

400

ERROR_BATCH_LENGTH_EXCEEDED
Max batch length exceeded

Превышена максимальная длина параметров, переданных в метод batch

401

NO_AUTH_FOUND
Wrong authorization data

Неверный access-токен или код вебхука

400

INVALID_REQUEST
Https required

Для вызовов методов требуется использовать протокол HTTPS

503

OVERLOAD_LIMIT
REST API is blocked due to overload

REST API заблокирован из-за перегрузки. Это ручная индивидуальная блокировка, для снятия необходимо обращаться в техническую поддержку Битрикс24

403

ACCESS_DENIED
REST API is available only on commercial plans

REST API доступен только на коммерческих планах

403

INVALID_CREDENTIALS
Invalid request credentials

У пользователя, с чьим access-токеном или вебхуком был вызван метод, не хватает прав

404

ERROR_MANIFEST_IS_NOT_AVAILABLE
Manifest is not available

Манифест недоступен

403

insufficient_scope
The request requires higher privileges than provided by the webhook token

Запрос требует более высоких привилегий, чем предоставляет токен вебхука

401

expired_token
The access token provided has expired

Предоставленный access-токен доступа истек

403

user_access_error
The user does not have access to the application

Пользователь не имеет доступа к приложению. Это означает, что приложение установлено, но администратор портала разрешил доступ к этому приложению только конкретным пользователям

500

PORTAL_DELETED
Portal was deleted

Публичная часть сайта закрыта. Чтобы открыть публичную часть сайта на коробочной установке отключите опцию «Временное закрытие публичной части сайта». Путь к настройке: Рабочий стол > Настройки > Настройки продукта > Настройки модулей > Главный модуль > Временное закрытие публичной части сайта

Продолжите изучение