Матвей Земсков

Заметки веб-мастера

Суббота, 17 июля 2021 18:36

Нестандартный импорт компаний и контактов в Битрикс 24

Оцените материал
(1 Голосовать)

Несмотря на то, что для импорта компаний и контактов в Битрикс 24 существуют шаблоны определенного формата, бывают случаи, когда клиент предоставляет данные совсем в другом виде. Например, это может быть файл Excel, причем на одном листе книги содержится информация и о компаниях, и о контактах. У меня был опыт разбора такого документа. Он был прислан нам одним из клиентов для добавления информации в облачный Битрикс24. В этой статье я хочу описать процесс решения задачи по импорту данных на портал.

Решение было нестандартным, на портале использовались входящие вебхуки.

Чтобы добавить входящий вебхук на портале Битрикс24, выберите в левом меню пункт «Разработчикам» → «Готовые сценарии» (Другое) → «Входящий вебхук». В открывшемся окне перейдите к настройке прав и отметьте там пункты CRM (crm) и Пользователи (user). Значение поля «Вебхук для вызова rest api» сохраните в текстовом файле. Оно пригодится вам в будущем при настройке библиотеки CRest.

В xls-файле (далее файл-источник) одновременно находилась информация о компаниях

xsl файл с данными для импорта (компании)

и контактах

xsl файл с данными для импорта (контакты)

Причем подразумевалось, что контактов у каждой компании может быть несколько.

В процессе решения задачи я использовал следующие инструменты: Excel, PHP, библиотеку CRest от Битрикс, а также методы REST API Битрикс 24.

Итак, опишу в общих чертах весь ход решения: сначала нужно выделить из файла данные о компаниях и сохранить все это в формате CSV. Его проще обрабатывать средствами PHP. Я назвал этот файл base.csv. Если записей в файле для загрузки много, то лучше разделить его на части. Загружаем на портал компании с помощью специально созданного для этого скрипта-вебхука. При этом необходимо сохранить идентификаторы, которые получили компании при добавлении на портал и названия компании. Эту информацию будем сохранять в csv-файлы, для дальнейшей привязки их к контактам в нашем начальном файле. Файл с результатами загрузки я назвал result.csv.

Так как порядок компаний в файле, который мы создали в процессе добавления данных на портал (result.csv) такой же как и в файле источнике, смело совмещаем их в Excel. Далее сравниваем столбцы с названием из файла источника с названиями из добавленных столбцов. Если все сделано правильно, содержимое столбцов должно совпадать.

совмещаем результат с файлом источником

Как видно на скриншоте выше - мы на правильном пути.

Переходим к загрузке контактов и привязке их к компаниям. Это также делается с помощью REST API Битрикс24. Удаляем ненужные поля из файла-источника, и снова сохраняем его в формате csv. Далее обходим данные в файле-вебхуке и с помощью методов REST API создаем контакты с привязкой к компаниям, идентификаторы которых нам уже известны. Ответственный у всех компаний и контактов был один и тот же, поэтому я просто сохранил его в константе в специальном файле для скриптов-вебхуков.

Теперь можно перейти к ознакомлению с кодом скриптов. Начнем со структуры файлов. Она у меня получилась следующая:

  • Папка crest – в ней находится библиотека Crest от Битрикс с помощью которой мы будем делать запросы по REST API.
  • Папка log - сюда сохраняются логи запросов по REST API.
  • const.php – в файле хранятся константы для вебхуков
  • functions.php – файл с вспомогательными функциями для вебхука
  • import_comp.php – скрипт-вебхук для импорта компаний
  • import_cont.php – скрипт-вебхук для импорта контактов
  • base.csv и base_contacts.csv – файлы с данными для импорта
  • result.csv – файл с идентификаторами компаний в Б24. Он формируется после импорта компаний и нужен для привязки контактов к компаниям при их загрузке на портал

Для корректной работы библиотеки CRest нужно сделать небольшие настройки. Откроем файл crest/settings.php и установим значение константы C_REST_WEB_HOOK_URL. Его нужно скопировать из поля «Вебхук для вызова rest api» на странице создания (редактирования) входящего вебхука на вашем портале Битрикс24.

Теперь перейдем к настройкам нашего вебхука. Это файл const.php. В моем случае я сохранил в константах идентификатор ответственного, который у всех создаваемых сущностей будет одинаковым. А также массив со ключами значений поля «Тип компании». Это список, поэтому ключей несколько.

PHP

	// Ответственный по-умолчанию
	define('ASSIGNED_BY_ID_DEFAULT', 11);
	// Тип компании
	$arCompTypes = Array(
		'buss_owner' => 'CUSTOMER', // ИП
		'comp_ltd' => 'SUPPLIER', // ООО
		'rel_org' => 1, // Религиозная организация
		'priv_pers' => 2, // Частное лицо
	);

В файле functions.php я разместил код вспомогательных функций для вебхука. В частности функцию под названием writeToLogLight для сохранения данных в лог-файл.

PHP

	function writeToLogLight($data, $title = '', $logname = 'hook.log') 
	{ 
		$log = date("Y.m.d G:i:s").' '; 
		$log .= (strlen($title) > 0 ? $title : 'DEBUG') . " "; 		
		if(is_array($data) || is_object($data)){
			$log .= print_r($data, 1); 	
		}
		else{
			$log .= $data;
		}		
		$log .= "\n------------------------\n"; 
		file_put_contents(getcwd() . '/log/'.$logname, $log, FILE_APPEND); 
		return true; 
	}

Эти файлы, а также библиотеку CRest нужно подключить в самом начале скриптов вебхуков import_comp.php и import_cont.php.

PHP

	require_once (__DIR__.'/crest/crest.php');
	require_once (__DIR__.'/const.php');
	require_once (__DIR__.'/functions.php');

Как я писал выше первым шагом нашего нестандартного импорта является загрузка в Битркис24 информации о компаниях. Для этого создадим скрипт-вебхук по имени import_comp.php. Сейчас я разберу его код по порядку.

В начале скрипта открываем файл base.csv на чтение и создаем пустой массив для сохранения результатов работы скрипта

PHP

	if (($handle = fopen("base.csv", "r")) !== FALSE) {
		$arCSVResult = Array();
	…}

Далее объявим переменную $row = 1. Она нужна для формирования ключей в массиве $arCSVResult, который мы в итоге будем записывать в cvs-файл result.csv.

Запускаем цикл для построчного обхода файла. Каждая строка будет сохраняться в переменной $data

PHP

	while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
	…}

В моем случае в файле в массиве хранилась следующая информация о каждой компании из файла base.csv:

  • $data[0] - Тип компании - COMPANY_TYPE
  • $data[1] - Название компании – TITLE
  • $data[2] - Город - ADDRESS_CITY
  • $data[3] - Рабочий телефон PHONE['WORK']
  • $data[4] - Моб. Телефон PHONE['MOBILE']
  • $data[5] - Другой телефон PHONE['OTHER']
  • $data[6] - Рабочая эл.почта EMAIL['WORK']
  • $data[7] - Другая эл.почта EMAIL['OTHER']
  • $data[8] - Ответственный, Имя Фамилия - ASSIGNED_BY_ID

Так как в $data[0] находится текстовое название типа компании, а нужен его идентификатор с портала (ранее я упоминал, что сохранил идентификаторы типов в массиве $arCompTypes в файле const.php) получаем его корректное значение с помощью switch-case

PHP

$data[0] = trim($data[0]);		
switch ($data[0]){
        case 'Частное лицо':
	$comp_type = $arCompTypes['priv_pers'];
        break;
        case 'Религиозная организация':
	$comp_type = $arCompTypes['rel_org'];
        break;			
        case 'ООО':
	$comp_type = $arCompTypes['comp_ltd'];
        break;
        case 'ИП':
	$comp_type = $arCompTypes['buss_owner'];			
        break;
}

Далее формируем и выполняем запрос по REST API с помощью библиотеки CRest для создания компании. Используем метод crm.company.add

PHP

	$result = CRest::call('crm.company.add', [
		'fields' => [
			'TITLE' => trim($data[1]),
			'COMPANY_TYPE' => $comp_type,
			'UF_CRM_1622443829' => trim($data[2]), // пользовательское поле для города. Тип - текст
			'ASSIGNED_BY_ID' => ASSIGNED_BY_ID_DEFAULT,
				'PHONE' => [
					Array('VALUE' => $data[3], 'VALUE_TYPE'=>'WORK'),
					Array('VALUE' => $data[4], 'VALUE_TYPE'=>'MOBILE'),
					Array('VALUE' => $data[5], 'VALUE_TYPE'=>'OTHER'),
				],
				'EMAIL'=>[
					Array('VALUE' => $work_email, 'VALUE_TYPE'=>'WORK'),
					Array('VALUE' => $other_email, 'VALUE_TYPE'=>'OTHER'),						
				],
			]
		]		
	);

Если все прошло успешно, сохраняем результат (идентификатор компании) в переменной $bx_id, название компании помещаем в $comp_name. Затем добавляем эти данные в массив $arCSVResult.

PHP

	if(intval($result['result']) > 0){
		 $bx_id = intval($result['result']);
		 $comp_name = trim($data[1]);
		 $arCSVResult[$row] = Array($comp_name, $bx_id);
	}

Первая часть задачи почти выполнена. Осталось только сохранить все элементы сформированного массива $arCSVResult в файл result.csv. Что и делаем далее.

PHP

	$fp = fopen('result4.csv', 'w');
	foreach($arCSVResult as $fields){
		fputcsv($fp, $fields, ';');
	}
	fclose($fp);

Переходим к второй части: теперь можно совместить данные из result.csv с файлом источником используя для этого Excel и загрузить контакты на портал.

Для этого у нас есть скрипт-вебхук import_cont.php. Принцип у него такой же как у скрипта для загрузки компаний. Отличие только в используемом методе REST API и параметрах, которые в него передаются. Используется метод crm.contact.add, параметры передаются следующие:

  • $data[0] - Имя контакта – NAME
  • $data[1] - Телефон рабочий – PHONE
  • $data[2] - e-mail рабочий - EMAIL
  • $data[3] - ИД компании - COMPANY_ID

PHP

	$result = CRest::call('crm.contact.add', [
		'fields' => [
			'NAME' => $data[0],
			'COMPANY_ID' => $data[3],
			'ASSIGNED_BY_ID' => ASSIGNED_BY_ID_DEFAULT,
			'PHONE' => [
				Array('VALUE' => $data[1], 'VALUE_TYPE'=>'WORK'),
			],
			'EMAIL' => [
				Array('VALUE' => $data[2], 'VALUE_TYPE'=>'WORK'),
			],
		]
	]);

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

PHP

	if(intval($result['result']) > 0){
		echo 'К компании с id = '.$data[3].' добавлен контакт с id = '.$result['result'].'
'; }

Пример добавления записи в лог:

PHP

	$log_txt = 'К компании с id = '.$data[3].' добавлен контакт с id = '.$result['result'];
	writeToLogLight($log_txt, 'Success', 'cont_log.txt');

На этом задача по нестандартному импорту компаний и контактов выполнена. На портал добавлены компании и контакты. Контакты привязаны к компаниям.

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

Скачать архив с кодом из статьи

Прочитано 655 раз

Добавить комментарий


Мои услуги

Предлагаю следующие услуги:

  • Верстка шаблона сайта из дизайн-макета для CMS «1С-Битрикс Управление сайтом» и CMS “Joomla”
  • Создание форм различной сложности (обратная связь, анкеты и тп) для указанных CMS
  • Настройка и кастомизация компонентов и модулей для указанных CMS
  • Доработка модулей и компонентов для указанных CMS, добавление нестандартного функционала
  • Разработка лендингов (landing-pages)

По все вопросам обращайтесь через форму обратной связи

Скачать

Предлагаю вашему вниманию:

Наверх