ILX
@ILX
Соединяю дорожки, и умы людей немножко.

Как скачать все компании с битркс24 по api, имея crest, запросом через batch, если их больше 2500?

Так получилось , что пришлось мне однажды скачать полный лист компаний по битрикс API . В начале я долго не мог разобраться что да как, от того, что, как то скудно инфы мне показалось.
Однако потом все-же разобрался и решил запилить этот вопрос. Может кому пригодиться, тк часто я на данном ресурсе и сам что-то смотрю.
И так, после выкуривания сего мануала https://dev.1c-bitrix.ru/learning/course/index.ph...
как установить CREST чтобы можно было пакетно общаться c bitrix24 при помощи batch.
Сделано следующее
1) Установлены на север файлы из архива https://dev.1c-bitrix.ru/docs/marketplace-and-apps...
2) Проведена регистрация локального приложения использующего только API в битриксе
3) Полученые в битриксе коды REST_CLIENT_ID, и CLIENT_SECRET вбиты в фаил settings.php на сервере

После успешной регистрации встал вопрос как работает 'crm.company.list' .
Тк его вызов методом call выдаёт только первые 50 результатов.
В официально й документации не сказано. как именно выводить следующие 50 может я плохо смотрел конечно, но в итоге путём длительных поисков было установлено что достаточно добвить к методу вот такой запрос ?start=50 для постраничного запроса.
Ну и чтобы одним запросом вызвать сразу множество нужно просто объединить в пакетный запрос такие запросы, однако у него есть ограничение когда дойдет до 50 такого запроса придется сделать следуюший batch запрос и начать с того места где остановился прежний.
<?php
require_once (__DIR__.'/crest.php');
$result = CRest::call('batch',
						array(
								'halt' => 0,
								'cmd'=> array(
								'list_0' => 'crm.company.list',
								'list_1' =>'crm.company.list?start=50',
								'list_2' =>'crm.company.list?start=100',
											)
							 )
					);
print_r ($result);
?>

Я представил примитивную реализацию запроса может быть кто-то скинет универсальный ее вариант, где результат будет полный массив из комапний? А может уже есть не на коленке писаный вариант, поделитесь?
  • Вопрос задан
  • 51 просмотр
Решения вопроса 1
ILX
@ILX Автор вопроса
Соединяю дорожки, и умы людей немножко.
В продолжении темы...
Универсальная функция которая вернёт все компании сколько их бы не было, не кидайтесь помидорами за говнокод...
function call_all_company ()//функция которая вернет все комапнии из bitrix24
		{
			$total = CRest::call('crm.company.list')["total"];
		
			$list_N=(int)($total/50)+1; //Количество необходимых листов +1 тк от нуля
			for($i=0; $i < $list_N; $i++)
			{
				$cmd_arr_cach[(int)($i/49)]["list_".$i] = 'crm.company.list?start='.($i*50);
			}
			foreach ($cmd_arr_cach as $key => $cmd_arr)
			{
				sleep(1);//Щадяший режим лучше ставить 2 секунды
				
				$local = CRest::call('batch',
										array(
												'halt' => 0,
												'cmd'=> $cmd_arr
											)
										);
										
				$result[]= call_user_func_array('array_merge', $local['result']['result']);
			}
			return $result[0];
		}
		 print_r (call_all_company ());
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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