Как получить большие объемы данных
Выберите инструмент для разработки с 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 другая навигация, этот способ к ним не относится.
Как выбрать все элементы
Чтобы последовательно получить все элементы по фильтру, используйте методы, которые поддерживают сортировку по стабильному числовому идентификатору.
- Отсортируйте элементы по идентификатору по возрастанию
- Добавьте в фильтр условие
>IDили>idсо значением последнего полученного идентификатора - Передайте
start = -1, чтобы отключить подсчет общего количества - После каждого запроса сохраните идентификатор последнего элемента из ответа
- Повторяйте запрос, пока метод не вернет меньше 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