Обзор
SDK предоставляет пять примитивов для работы с REST API Bitrix24, все доступны через b24.actions.v{2,3}.<primitive>.make(options). Они выглядят похоже, но имеют очень разные характеристики стоимости. Выбор неподходящего — самая частая причина медленных приложений и тикетов «почему мой дашборд забивает очередь?». Эта страница поможет принять решение за 30 секунд.
Выбор определяется тремя осями:
- Один вызов или много? Один REST-метод или несколько сразу.
- Ограничено или нет? Известно ли заранее, что результатов ≤ 50, или их может быть 50 000?
- Всё сразу или потоком? Нужны все записи в памяти для агрегации или обрабатывать по мере поступления?
AbstractB24 (b24.callMethod(), b24.callBatch(), b24.callListMethod(), b24.fetchListMethod(), b24.callBatchByChunk()) помечены @deprecated и будут удалены в v2.0.0. Они выводят runtime-предупреждение при каждом вызове и игнорируют разделение API по версиям. Всегда вызывайте действие явно: b24.actions.v2.call.make({…}) / b24.actions.v3.batch.make({…}) и т.д. См. руководство по миграции v0 → v1 для пошаговых замен.Матрица решений
Затем выберите версию API: предпочтительно v3 для любых методов, доступных в v3 (лучшая фильтрация, большие страницы, оптимизация на сервере), и v2 для всего остального. v2-версия Call.make() в SDK выводит предупреждение, когда вы вызываете v3-доступный метод в v2 — это сигнал к миграции.
Компромиссы по методам
Call.make()
Используйте, когда нужна ровно одна запись или одна серверная операция (update, add, delete).
Избегайте, когда обнаруживаете, что оборачиваете его в for-цикл с await — это сигнал переключиться на Batch или BatchByChunk. Цикл из N вызовов Call.make() — это N round-trip'ов; Batch сворачивает до 50 в один. BatchByChunk сворачивает любое число в ceil(N / 50) round-trip'ов.
CallList.make()
Используйте, когда результирующий набор достаточно мал, чтобы держать в памяти, и вы будете делать с ним что-то сквозное (сортировка, группировка, агрегация, дедупликация, передача в библиотеку графиков).
Избегайте, когда нужен лишь небольшой срез — передайте select и filter, чтобы сузить результат, вместо того чтобы получать всё. Метод всегда забирает все страницы, соответствующие вашему фильтру; «дай мне топ-10» без фильтра — расточительство.
FetchList.make()
Используйте, когда результат неограничен (или может быть), и вы можете обрабатывать записи по мере поступления: стримить их в CSV, отправлять в очередь, писать в базу, передавать через WebSocket.
Избегайте, когда нужна агрегация по всем записям, требующая полного набора в памяти — CallList проще. Генератор отдаёт чанки по 50 (v2) или options.limit до 1000 (v3); ваш downstream-код должен обработать каждый чанк до следующего запроса, поэтому тяжёлая синхронная работа между чанками замедляет общий проход.
Batch.make()
Используйте, когда одно действие пользователя зависит от данных нескольких разных методов. Типичный пример — плитка дашборда, которой нужны профиль пользователя, число открытых сделок и закреплённые задачи — три разных метода, один round-trip.
Избегайте, когда один и тот же метод повторяется 50+ раз. Именно для этого нужен BatchByChunk, а Batch отклонит всё, что больше 50 команд. Также избегайте, когда нужны именованные ключи результата и > 50 вызовов — BatchByChunk намеренно принимает только массив кортежей / массив объектов (именованные команды ломаются на границах чанков).
BatchByChunk.make()
Используйте, когда у вас произвольное число команд одной формы — массовые миграции, массовые create / update / delete, экспорт per-id-деталей для тысяч связанных записей.
Избегайте, когда у вас всего несколько вызовов — Batch проще и даёт именованные результаты. Также избегайте, когда нужно транзакционное поведение — BatchByChunk не атомарен. Если чанк 7 из 30 упал, чанки 1-6 уже применены; чанки 8-30 могут выполниться или нет в зависимости от isHaltOnError.
Лимиты — кратко
Частые антипаттерны
b24.callMethod()/b24.callBatch()/b24.callListMethod()/b24.fetchListMethod()/b24.callBatchByChunk(). Устаревшие шорткаты вAbstractB24. Они ещё работают, но выводят предупреждение при каждом вызове и будут удалены в v2.0.0. Мигрируйте на соответствующийb24.actions.v{2,3}.<primitive>.make({…})— см. руководство по миграции v0 → v1 для пошагового соответствия.for (const id of ids) await b24.actions.v2.call.make(...). N ID = N round-trip'ов. Используйтеactions.v2.batch.make, еслиids.length ≤ 50, иначеactions.v2.batchByChunk.make.actions.v2.callList.make → actions.v2.callList.make → actions.v2.callList.makeдля связанных сущностей. Это причина большинства медленных дашбордов. Получите родительский список один раз (actions.v2.callList.makeилиactions.v2.fetchList.make), затем загрузите связанные записи через одинactions.v2.batch.makeна каждый чанк из 50 ID.- Свой
orderвactions.v{2,3}.callList.make/actions.v{2,3}.fetchList.make. Курсорной пагинации нуженorder: { idKey: 'ASC' }. Любой пользовательскийorderотбрасывается с runtime-предупреждением (см. Ограничения). Вместо этого используйтеfilter, чтобы сузить срез. actions.v{2,3}.batch.makeс именованными командами на > 50 элементах. Либо разбейте вручную на несколько вызововbatch.make, либо переключитесь наactions.v{2,3}.batchByChunk.makeи используйте упорядоченные результаты.- Смешивание методов v2 и v3 в одном вызове
actions.v3.batch.make.BatchV3предварительно валидирует список вызовов и бросаетSdkErrorс кодомJSSDK_CORE_METHOD_NOT_SUPPORT_IN_API_V3, если какой-то метод не поддерживается в v3. Разделите батч по версиям API или используйтеactions.v2.batch.make.
См. также
- Рецепт: экспорт сделок в CSV —
FetchListдля потокового экспорта. - Рецепт: массовое обновление сделок —
BatchByChunkдля массовой мутации. - Коды ошибок и обработка —
SdkError,AjaxError, коды на стороне REST. - Система ограничений — выбор пресета
restrictionParamsдля выбранного метода.