@po4emu4ka2020

Как правильно собрать batch-запрос на получение товаров сразу нескольких сделок, количество которых изначально неизвестно?

Учусь использовать RestAPI для того, чтобы работать по веб-хукам с Б24.
Никак не получается правильно собрать batch запрос.

У меня есть подзапрос со сделками по определенному статусу. Следом я хочу сформировать запрос, который будет вытаскивать из всех этих сделок товары. Но понять, как я это могу сделать, и могу ли вообще, у меня не выходит.

Вот, что у меня есть:

$listRes = CRest::call(
    'batch',
    array(
        'halt' => 0,
      'cmd'=> array(
          'deals' => 'crm.deal.list?filter[STAGE_ID]=PREPAYMENT_INVOICE',
          'products' => 'crm.deal.productrows.get?id=$result[deals][0][ID]',
      )
      )
    );
echo '<pre>';
print_r($listRes['result']);
echo '</pre>';


Этот код, конечно же, выводит только товары первой сделки, так как четко указан нулевой индекс результата:
'crm.deal.productrows.get?id=$result[deals][0][ID]',
Как указать в запросе, что этот индекс должен изменяться просто динамически?
Подскажите, пожалуйста.
Заранее спасибо за любой совет.
  • Вопрос задан
  • 76 просмотров
Решения вопроса 1
gromdron
@gromdron Куратор тега Битрикс24
Bitrix developer
Как указать в запросе, что этот индекс должен изменяться просто динамически?


Такой возможности в Битрикс24 нет.

Дело кроется в несколько ином видении проблематики. Когда вы выполняете запрос на получения количества он возвращает вам не более 50 элементов с постраничной, но батч это всего 50 запросов, то есть если бы такой механизм имел место, то батч был бы резиновым, так как по факту должен выполнить 51 запрос (1 на получение списка и еще 50 на получение каждого элемента). Каким образом должен был бы себя вести батч-запрос когда вы указали 3 запроса? Например получение списка сделок, получение конкретных сделок и получение какого-нибудь справочника? Выполнить 52 запроса? Нет, это фантастика.

Какой хак можно использовать?
Можно самому генерировать запросы на основании хака.
Так как в батче результат запроса выдается порядковым номером (если не указано иное), то они всегда будут в диапазоне от 0 до 49.
Для примера мы хотим получить 10 сделок из постранички одним запросом, тогда можно отправить следующий батч-запрос:

'halt' => 0,
'cmd'  => [
	'deals' => 'crm.deal.list?filter[STAGE_ID]=PREPAYMENT_INVOICE&filter[>ID]=0&limit=10',
	'products_0' => 'crm.deal.productrows.get?id=$result[deals][0][ID]',
	'products_1' => 'crm.deal.productrows.get?id=$result[deals][1][ID]',
	...
	'products_8' => 'crm.deal.productrows.get?id=$result[deals][8][ID]',
	'products_9' => 'crm.deal.productrows.get?id=$result[deals][9][ID]',
]


Когда мы проитерируем "products_*", мы получим последний обработанный ID (для примера это будет 123456) и сможем выполнить следующий батч-запрос:
'halt' => 0,
'cmd'  => [
	'deals' => 'crm.deal.list?filter[STAGE_ID]=PREPAYMENT_INVOICE&filter[>ID]=123456&limit=10',
	'products_0' => 'crm.deal.productrows.get?id=$result[deals][0][ID]',
	'products_1' => 'crm.deal.productrows.get?id=$result[deals][1][ID]',
	...
	'products_8' => 'crm.deal.productrows.get?id=$result[deals][8][ID]',
	'products_9' => 'crm.deal.productrows.get?id=$result[deals][9][ID]',
]


Но вы в любом случае должны понимать что чем больше данных будет возвращать ваш батч-запрос тем он мендленнее будет выполняться, поэтому в crm.deal.list рекомендую так же ограничить список получаемых полей.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы