Решение было нестандартным, на портале использовались входящие вебхуки.
Чтобы добавить входящий вебхук на портале Битрикс24, выберите в левом меню пункт «Разработчикам» → «Готовые сценарии» (Другое) → «Входящий вебхук». В открывшемся окне перейдите к настройке прав и отметьте там пункты CRM (crm) и Пользователи (user). Значение поля «Вебхук для вызова rest api» сохраните в текстовом файле. Оно пригодится вам в будущем при настройке библиотеки CRest.
В xls-файле (далее файл-источник) одновременно находилась информация о компаниях
и контактах
Причем подразумевалось, что контактов у каждой компании может быть несколько.
В процессе решения задачи я использовал следующие инструменты: Excel, PHP, библиотеку CRest от Битрикс, а также методы REST API Битрикс 24.
Итак, опишу в общих чертах весь ход решения: сначала нужно выделить из файла данные о компаниях и сохранить все это в формате CSV. Его проще обрабатывать средствами PHP. Я назвал этот файл base.csv. Если записей в файле для загрузки много, то лучше разделить его на части. Загружаем на портал компании с помощью специально созданного для этого скрипта-вебхука. При этом необходимо сохранить идентификаторы, которые получили компании при добавлении на портал и названия компании. Эту информацию будем сохранять в csv-файлы, для дальнейшей привязки их к контактам в нашем начальном файле. Файл с результатами загрузки я назвал result.csv.
Так как порядок компаний в файле, который мы создали в процессе добавления данных на портал (result.csv) такой же как и в файле источнике, смело совмещаем их в Excel. Далее сравниваем столбцы с названием из файла источника с названиями из добавленных столбцов. Если все сделано правильно, содержимое столбцов должно совпадать.
Как видно на скриншоте выше - мы на правильном пути.
Переходим к загрузке контактов и привязке их к компаниям. Это также делается с помощью REST API Битрикс24. Удаляем ненужные поля из файла-источника, и снова сохраняем его в формате csv. Далее обходим данные в файле-вебхуке и с помощью методов REST API создаем контакты с привязкой к компаниям, идентификаторы которых нам уже известны. Ответственный у всех компаний и контактов был один и тот же, поэтому я просто сохранил его в константе в специальном файле для скриптов-вебхуков.
Теперь можно перейти к ознакомлению с кодом скриптов. Начнем со структуры файлов. Она у меня получилась следующая:
|
Для корректной работы библиотеки CRest нужно сделать небольшие настройки. Откроем файл crest/settings.php и установим значение константы C_REST_WEB_HOOK_URL. Его нужно скопировать из поля «Вебхук для вызова rest api» на странице создания (редактирования) входящего вебхука на вашем портале Битрикс24.
Теперь перейдем к настройкам нашего вебхука. Это файл const.php. В моем случае я сохранил в константах идентификатор ответственного, который у всех создаваемых сущностей будет одинаковым. А также массив со ключами значений поля «Тип компании». Это список, поэтому ключей несколько.
PHP
В файле functions.php я разместил код вспомогательных функций для вебхука. В частности функцию под названием writeToLogLight для сохранения данных в лог-файл.
PHP
Эти файлы, а также библиотеку CRest нужно подключить в самом начале скриптов вебхуков import_comp.php и import_cont.php.
PHP
Как я писал выше первым шагом нашего нестандартного импорта является загрузка в Битркис24 информации о компаниях. Для этого создадим скрипт-вебхук по имени import_comp.php. Сейчас я разберу его код по порядку.
В начале скрипта открываем файл base.csv на чтение и создаем пустой массив для сохранения результатов работы скрипта
PHP
Далее объявим переменную $row = 1. Она нужна для формирования ключей в массиве $arCSVResult, который мы в итоге будем записывать в cvs-файл result.csv.
Запускаем цикл для построчного обхода файла. Каждая строка будет сохраняться в переменной $data
PHP
В моем случае в файле в массиве хранилась следующая информация о каждой компании из файла 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
Далее формируем и выполняем запрос по REST API с помощью библиотеки CRest для создания компании. Используем метод crm.company.add
PHP
Если все прошло успешно, сохраняем результат (идентификатор компании) в переменной $bx_id, название компании помещаем в $comp_name. Затем добавляем эти данные в массив $arCSVResult.
PHP
Первая часть задачи почти выполнена. Осталось только сохранить все элементы сформированного массива $arCSVResult в файл result.csv. Что и делаем далее.
PHP
Переходим к второй части: теперь можно совместить данные из 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
При желании можно сохранить результат добавления контактов и компаний в лог-файл, но в рамках задачи я этого не делал. Просто выводил результат на экран.
PHP
Пример добавления записи в лог:
PHP
На этом задача по нестандартному импорту компаний и контактов выполнена. На портал добавлены компании и контакты. Контакты привязаны к компаниям.
Ваш файл скорее всего будет отличаться от описанного в статье, но это - не беда. Используя примеры кода вы сможете адаптировать их под свой формат файла. Надеюсь, что сделать это для вас будет несложно.