Документация для разработчиков
Темная тема

batch

Права на выполнение: для всех

Описание

Выполнение пакета запросов.

В некоторых случаях возникает необходимость отправить несколько запросов подряд. Для оптимизации процесса можно использовать пакетное выполнение запросов.

Параметры

Параметр Описание
halt Определяет прерывать ли последовательность запросов в случае ошибки.
cmd Массив запросов стандартного вида (следует помнить про квотирование данных запросов; получается, что данные для подзапросов должны пройти двойное квотирование).

Примечание: Количество запросов в пакете ограничено 50.

Массив запросов может быть как с числовыми ключами, так и ассоциативным. В параметрах каждого последующего запроса можно использовать данные предыдущих запросов в таком виде:

$result[идентификатор_запроса][поле_ответа]

где идентификатором запроса служит его ключ в массиве запросов.

С версии rest 24.0.0 для метода batch запрещена вложенность (при вызове метода batch нельзя вызывать внутри другой batch).

Пример

https://my.bitrix24.ru/rest/batch.xml?auth=d161f25928c3184678924ec127edd29a&halt=0&cmd[get_user]=user.current%3F&cmd[get_department]=department.get%3FID%3D%2524result%255Bget_user%255D%255BUF_DEPARTMENT%255D

Обратите внимание, что параметры URL-кодированы. Рекомендация кодировать параметры - обязательна, в противном случае корректность результата не гарантируется.

Ответ XML

<response>
	<result>
		<result>
			<get_user>
				<ID>1</ID>
				<LOGIN>admin</LOGIN>
				<ACTIVE>1</ACTIVE>
				<EMAIL>sigurd@example.com</EMAIL>
				<NAME>Одмин</NAME>
				<LAST_NAME/>
				<SECOND_NAME/>
				<PERSONAL_GENDER/>
				<PERSONAL_PROFESSION/>
				<PERSONAL_WWW/>
				<PERSONAL_BIRTHDAY>1955-04-10T00:00:00+03:00</PERSONAL_BIRTHDAY>
				<PERSONAL_PHOTO>/upload/main/80c/44169_C5_PrimalWaterE500CC.jpg</PERSONAL_PHOTO>
				<PERSONAL_ICQ/>
				<PERSONAL_PHONE/>
				<PERSONAL_FAX/>
				<PERSONAL_MOBILE/>
				<PERSONAL_PAGER/>
				<PERSONAL_STREET/>
				<PERSONAL_CITY/>
				<PERSONAL_STATE/>
				<PERSONAL_ZIP/>
				<PERSONAL_COUNTRY>0</PERSONAL_COUNTRY>
				<WORK_COMPANY/>
				<WORK_POSITION/>
				<UF_DEPARTMENT>
				<item>128</item>
				</UF_DEPARTMENT>
				<UF_INTERESTS/>
				<UF_SKILLS/>
				<UF_WEB_SITES/>
				<UF_XING/>
				<UF_LINKEDIN/>
				<UF_FACEBOOK/>
				<UF_TWITTER/>
				<UF_SKYPE/>
				<UF_DISTRICT/>
				<UF_PHONE_INNER/>
			</get_user>
			<get_department>
				<item>
					<ID>128</ID>
					<NAME>ИТ-отдел</NAME>
					<SORT>500</SORT>
					<PARENT>114</PARENT>
					<UF_HEAD>255</UF_HEAD>
				</item>
			</get_department>
		</result>
		<result_error/>
		<result_total>
			<get_department>1</get_department>
		</result_total>
		<result_next/>
	</result>
</response>

Пример строки json для помещения в тело POST запроса для метода batch.

BX24.callMethod(
	'batch',
	{
		'halt': 0,
		'cmd': {
			'user': 'user.get?ID=1',
			'first_lead': 'crm.lead.add?fields[TITLE]=Test Title',
			'user_by_name': 'user.search?NAME=Test2',
			'user_lead': 'crm.lead.add?fields[TITLE]=Test Assigned&fields[ASSIGNED_BY_ID]=$result[user_by_name][0][ID]',
		}
	},
	function(result)
	{
		console.log(result.answer);
	}
);

В результате:

  • user - вернёт пользователя с ID = 1
  • first_lead - создаст лид
  • user_by_name - найдёт пользователя с именем "Test2"
  • user_lead - создаст лид с ответственным пользователем, найденным в user_by_name

На PHP рекомендуется использовать CRest::callBatch()

Смотрите также



Пользовательские комментарии

Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.

Для этого нужно всего лишь авторизоваться на сайте

Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
0
Константин Савин
Сообщение не промодерировано, возможны ошибки и неточности.
function getProductDetails($smart_name)
{
   $result = CRest::callBatch([
       'product_list' => [
           'method' => 'catalog.product.list',
           'params' => [
               'select' => ["id", "name", "iblockId"],
               'filter' => ["name" => $smart_name, "iblockId" => 25],
           ],
       ],
       'product_get' => [
           'method' => 'catalog.product.get',
           'params' => [

               'id' => '$result[product_list][products][0][id]'
           ],
       ],
   ]);
   return $result;
}
Обратите внимание на '$result[product_list] вы следующим вызовом вызываете $result по умолчанию везде и название предыдущего метода product_list
0
Константин Савин
Сообщение не промодерировано, возможны ошибки и неточности.
$deal_id = $_REQUEST['ID'];

function fetchAllItems($dealId, $entityTypeId = 191, $limit = 50) {
   $allItems = []; // Массив для хранения всех полученных записей
   $start = 0; // Начальная позиция для запроса

   do {
       $aData = [
           'item_list' => [
               'method' => 'crm.item.list',
               'params' => [
                   'entityTypeId' => $entityTypeId,
                   'filter' => ['parentId2' => $dealId],
                   'select' => ['ID'],
                   'start' => $start,
               ],
           ]
       ];

       $aResultTasks = CRest::callBatch($aData);

       // Проверяем наличие ошибок в ответе
       if (isset($aResultTasks['error'])) {
           // Обработка ошибки (можно выбросить исключение или вернуть ошибку)
           return $allItems; // Возвращаем уже собранные данные
       }

       // Проверяем, есть ли результаты
       $items = $aResultTasks['result']['result']['item_list']['items'] ?? [];

       // Если есть данные, добавляем их в общий массив
       if (!empty($items)) {
           $allItems = array_merge($allItems, $items);
           $start += $limit; // Увеличиваем $start на лимит для следующего запроса
       } else {
           break; // Если нет больше данных, выходим из цикла
       }
   } while (true); // Продолжаем запрашивать, пока есть данные

   return $allItems; // Возвращаем собранные данные
}

// Использование функции
$allItems = fetchAllItems($deal_id);



writeToLog($allItems, '$allItems');
0
Константин Савин
Сообщение не промодерировано, возможны ошибки и неточности.
Получить элемент смарт процесса через batch
$deal_id = $_REQUEST['ID'];
$arData = [
'item_list' => [
'method' => 'crm.item.list',
'params' => [
'entityTypeId' => 111,
'filter' => ['parentId2' => $deal_id],
'select' => ['ID']
]
],
'item_get' => [
'method' => 'crm.item.list',
'params' => [
'entityTypeId' => 191,
"id" => '$result[result][result][item_list][items][0]',//!!!!!!!!!!!!!тут в кавычках $result !!!!!!!!!!!!!!!!!
]
],
];

$result = CRest::callBatch($arData);

writeToLog($result, '$result');
0
Константин Савин
Сообщение не промодерировано, возможны ошибки и неточности.
$deal_id = $_REQUEST['ID'];
$arData = [
   'add_lead' => [
       'method' => 'crm.item.list',
       'params' => [
           'entityTypeId' => 111,
           'filter' => ['parentId2' => $deal_id],
           'select' => ['ID']
       ]
   ],
];

$result = CRest::callBatch($arData);
0
Valentina
Сообщение не промодерировано, возможны ошибки и неточности.
https://*****.bitrix24.ru/rest/1/*****/batch?cmd[request1]=crm.deal.get?ID=2&cmd[request2]=c... Почему в ответе на запрос на изменение поля сделки приходит true, но на самом деле поле не изменяется?  
0
Арсений Медведев
Сообщение не промодерировано, возможны ошибки и неточности.
Почему при отправки через батч запрос комментарии это работает некорректно? Приведу пример, я отправляю батч запросом комментарии, для этого я использую метод task.commentitem.add, в одном запросе отправляются комментарии от разных пользователей и некоторые комментарии не отправляются с ошибкой "недостаточно прав доступа", как я понял эта ошибка связана с тем, когда ты пытаешься приложить файл к комментарию, но у такого человека просто нет доступа к этому файлу, но проблема в том, что если ты передаешь комментарии в котором у человека есть доступ к файлу и передаешь комментарии другого человека который даже не передаёт никакого файла, то запросы в которых человек даже не передаёт файла сработает ошибка "недостаточно прав доступа", хотя казался бы файл никакой не передается, но ошибка все равно срабатывает. Запрос отправляется верный, с ним все ок, проблема именно в батч. Как такое можно решить?
0
Михаил Лебедев
Сообщение не промодерировано, возможны ошибки и неточности.
Цитата
Массив запросов может быть как с числовыми ключами...
Тогда и возвращайте массив с числовыми ключами.
Сейчас приходит объект к числовыми ключами.  
0
Николай Стрелец
Сообщение не промодерировано, возможны ошибки и неточности.
Пример батча, который можно использовать в облачном Б24, который первым get методом получит данные, потом использует эти данные во втором update методе (запрос не кодированный):
Код
https://*****.bitrix24.ru/rest/1/*****/batch?cmd[request1]=crm.deal.get?ID=2&cmd[request2]=crm.deal.update?ID=4&fields[OPPORTUNITY]=$result[request1][OPPORTUNITY]
1
Даниил Грабилов
Сообщение не промодерировано, возможны ошибки и неточности.
Мне кажется тут не хватает примеров, ответ на которые можно получить через ctrl+c ctrl+v

$arraybatch = [];
$arraybatch['anyname1'] = 'crm.deal.list?'.http_build_query(array('start'=>0)); //Параметр start определяет с какого элемента начать запрашивать информацию, колличество элементов можно посмотреть при первом запросе в параметре length.
$arraybatch['anyname2'] = 'crm.deal.list?'.http_build_query(array('start'=>50));
$arraybatch['dsadsadsdamd'] = 'crm.contact.list?'.http_build_query(array('start'=0)); //Запросы могут быть любимыи после одного запроса может быть сразу другой
$resultbatch = CRest::call('batch',[
   'halt' => '0',
   'cmd' => $arraybatch,
])['result']['result'];

print_r($resultbatch);
11
Алексей Кадников
Получаем за один запрос контакт по номеру телефона и связанную с ним компанию
Код
$data = call($_SESSION["query_data"]["domain"], "batch", array(
    "auth" => $_SESSION["query_data"]["access_token"],
    "halt" => 0,
    "cmd" => array(
        "find_contact" => 'crm.duplicate.findbycomm?'
            .http_build_query(array(
                "entity_type" => "CONTACT",
                "type" => "PHONE",
                "values" => array("+79625011243")
            )),
        "get_contact" => 'crm.contact.get?'
            .http_build_query(array(
                "id" => '$result[find_contact][CONTACT][0]',
            )),
        "get_company" => 'crm.company.get?'
            .http_build_query(array(
                "id" => '$result[get_contact][COMPANY_ID]',
                "select" => array("*"),//, "COMMUNICATIONS"),
            ))
    ),
))
******************
Пример кода несколько исправлен разработчиком по соображениям производительности.
© «Битрикс», 2001-2024, «1С-Битрикс», 2024