Как получить большие объемы данных

Выберите инструмент для разработки с AI-агентом:

  • используйте Битрикс24 Вайбкод, чтобы создать приложение для Битрикс24 по описанию задачи без знания языков программирования. Агент напишет код и разместит приложение на сервере без ручной настройки хостинга
  • используйте MCP-сервер, чтобы разрабатывать интеграцию через REST API в своем проекте. Агент будет обращаться к официальной REST-документации

Если нужно получить много элементов списочным методом со стандартной REST-навигацией, не листайте страницы, увеличивая start = start + 50. При start >= 0 метод вместе со страницей данных считает общее количество элементов для поля total. На больших выборках или сложных фильтрах подсчет может работать медленно.

Вместо этого передавайте start = -1 и выбирайте следующую страницу фильтром по последнему полученному идентификатору. Так метод не считает общее количество элементов, и нагрузка на Битрикс24 снижается.

Для одной страницы фильтр по идентификатору не нужен: передайте start = -1, и метод вернет до 50 элементов без подсчета общего количества.

Обычная навигация списочных методов через поля next и start описана в статье Особенности работы списочных методов.

Как понять, что метод поддерживает start = -1

Стандартную REST-навигацию используют списочные методы, у которых на странице описан параметр start, а в ответе есть поля total и next. Например, crm.item.list, crm.deal.list, tasks.task.list, user.get.

Проверьте метод одним вызовом с start = -1 на выборке, где больше 50 элементов. Если метод поддерживает такой режим, в ответе нет поля next, а total равен 0 или отсутствует. У методов REST 3.0 другая навигация, этот способ к ним не относится.

Как выбрать все элементы

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

  1. Отсортируйте элементы по идентификатору по возрастанию
  2. Добавьте в фильтр условие >ID или >id со значением последнего полученного идентификатора
  3. Передайте start = -1, чтобы отключить подсчет общего количества
  4. После каждого запроса сохраните идентификатор последнего элемента из ответа
  5. Повторяйте запрос, пока метод не вернет меньше 50 элементов

Поле next в таком цикле не нужно: следующую страницу задает фильтр по идентификатору.

Что учесть при импорте

Между запросами оставляйте задержку, чтобы не превысить лимиты REST API. Если метод возвращает ошибку лимита, уменьшите частоту запросов и повторите вызов позже.

Применяйте подход только к методам, которые при start = -1 учитывают фильтр и сортировку по идентификатору так же, как при стандартной REST-навигации. Если во время импорта элементы удаляются или права доступа меняются, состав выборки может измениться между запросами.

Пример

Пример на PHP выгружает все лиды методом crm.item.list: entityTypeId = 1 — тип объекта «Лид». Нужны расширение cURL и входящий вебхук со scope crm от пользователя, который может читать лиды. Если запрос вернул ошибку, цикл остановится, а в $lastId останется последний обработанный идентификатор — с него можно продолжить.

У других методов имена полей и путь к списку в ответе могут отличаться. Например, у crm.lead.list элементы лежат прямо в result, а поле идентификатора — ID.

$webhook = 'https://example.bitrix24.ru/rest/1/xxxxxxxxxxxxxxxx/'; // адрес входящего вебхука
$lastId = 0; // или ID, на котором остановился предыдущий импорт

do {
    $ch = curl_init($webhook . 'crm.item.list');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
        'entityTypeId' => 1,
        'order' => ['id' => 'ASC'],
        'filter' => ['>id' => $lastId],
        'select' => ['id', 'title'],
        'start' => -1,
    ]));
    $result = json_decode((string)curl_exec($ch), true);
    curl_close($ch);

    if (!isset($result['result']['items'])) {
        // код ошибки метода или признак сетевой ошибки и ответа не в формате JSON
        echo 'Error ', $result['error'] ?? 'no response', ', last ID: ', $lastId, PHP_EOL;
        break;
    }

    $items = $result['result']['items'];
    foreach ($items as $item) {
        // обработайте элемент
        $lastId = $item['id'];
    }

    usleep(500000); // пауза, чтобы не превысить лимиты
} while (count($items) === 50);

Насколько подсчет замедляет запрос, показывает вызов crm.lead.list на 2 387 743 лидах с одинаковыми правами и фильтром. Запрос с подсчетом общего количества выполнялся 49,9 секунды, без подсчета — 0,098 секунды. Поля ответов, которые относятся к навигации и времени:

start = 0:  next = 50, total = 2387743, time.duration = 49.916
start = -1: total = 0, time.duration = 0.098

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

Следующая