Как получить большие объемы данных
Выберите инструмент для разработки с AI-агентом:
- используйте Битрикс24 Вайбкод, чтобы создать приложение для Битрикс24 по описанию задачи без знания языков программирования. Агент напишет код и разместит приложение на сервере без ручной настройки хостинга
- используйте MCP-сервер, чтобы разрабатывать интеграцию через REST API в своем проекте. Агент будет обращаться к официальной REST-документации
При импорте большого числа элементов через списочные методы со стандартной REST-навигацией не используйте обычную постраничную навигацию с последовательным увеличением start = start + 50.
Вместо этого выбирайте страницы через фильтр по последнему полученному идентификатору и передавайте start = -1. Такой подход отключает подсчет общего количества элементов и снижает нагрузку на Битрикс24.
При start >= 0 стандартная REST-навигация возвращает страницу данных и считает общее количество элементов для поля total. На больших выборках или сложных фильтрах подсчет может работать медленно.
Для одной страницы данных фильтр по последнему идентификатору не нужен. Достаточно передать start = -1, чтобы метод вернул до 50 элементов без подсчета total.
Обычная навигация списочных методов через поля next и start описана в статье Особенности работы списочных методов.
Как выбрать все элементы
Чтобы последовательно получить все элементы по фильтру, используйте методы, которые поддерживают сортировку по стабильному числовому идентификатору.
- Отсортируйте элементы по идентификатору по возрастанию
- Добавьте в фильтр условие
>IDили>idсо значением последнего полученного идентификатора - Передайте
start = -1, чтобы отключить подсчет общего количества - После каждого запроса сохраните идентификатор последнего элемента из ответа
- Повторяйте запрос, пока метод не вернет меньше 50 элементов
Такой цикл не использует поле next. Следующая страница формируется фильтром по идентификатору.
Что учесть при импорте
Между запросами оставляйте задержку, чтобы не превысить лимиты REST API. Если метод возвращает ошибку лимита, уменьшите частоту запросов и повторите вызов позже.
Применяйте этот подход только для методов, в которых фильтр и сортировка по идентификатору работают со start = -1 как стандартная REST-навигация. Если во время импорта элементы удаляются или права доступа меняются, состав выборки может измениться между запросами.
Ниже приведен пример кода и сравнение времени выполнения с обычной постраничной навигацией. При 2 387 743 элементах с одинаковыми правами и фильтром время выполнения уменьшилось с 49,9 секунды до 0,097 секунды.
Пример
$tokenID = 'XXXXXXXXXXXXXXXXXXXXX';
$host = 'XXXX.bitrix24.ru';
$user = 1;
// Начинаем с нуля или с ID, на котором остановился предыдущий импорт.
$lastId = 0;
$finish = false;
while (!$finish)
{
$http = new \Bitrix\Main\Web\HttpClient();
$http->setTimeout(5);
$http->setStreamTimeout(50);
$json = $http->post(
'https://'.$host.'/rest/'.$user.'/'.$tokenID.'/crm.item.list/',
[
'entityTypeId' => 1,
'order' => ['id' => 'ASC'],
'filter' => ['>id' => $lastId],
'select' => ['id', 'title', 'createdTime'],
'start' => -1,
]
);
$result = \Bitrix\Main\Web\Json::decode($json);
$items = $result['result'] ?? [];
$itemsCount = count($items);
if ($itemsCount === 0)
{
break;
}
foreach ($items as $item)
{
$lastId = $item['id'];
// Обработайте элемент.
}
if ($itemsCount < 50)
{
$finish = true;
}
if (!$finish)
{
usleep(500000);
}
}
/*
// Результат выполнения REST-запроса с подсчетом общего количества.
Array
(
[next] => 50
[total] => 2387743
[time] => Array
(
[start] => 1770996013.4833
[finish] => 1770996063.3997
[duration] => 49.916450023651
[processing] => 49.899916887283
[date_start] => 2026-02-13T18:20:13+03:00
[date_finish] => 2026-02-13T18:21:03+03:00
)
)
// Результат выполнения REST-запроса без подсчета общего количества.
Array
(
[total] => 0
[time] => Array
(
[start] => 1770997936.3857
[finish] => 1770997936.4835
[duration] => 0.097883939743042
[processing] => 0.068500995635986
[date_start] => 2026-02-13T18:52:16+03:00
[date_finish] => 2026-02-13T18:52:16+03:00
)
)
*/