Всем привет!
Уже почти год использую 1С:Шину для настройки всяческих интеграций различного масштаба.
Очередная задача казалась довольно простой: раз в час выгрузить некие данные из самописной CRM (PHP+MySQL)и сложить их в файлик для дальнейшей обработки в BI-системе. Возможно, правильно было бы сделать в CRM API для подключения, но там своя атмосфера со своими разработчиками, да и выборка не шибко сложная по своей логике... так что я наваял запрос к мускулю и понес его в шину.
В шине все как обычно - создал проект, добавил процесс интеграции и три сущности:
- Таймер просто раз в час инициирует обмен
- Блок SQL выполняет запрос, формирует из результатов запроса CSV-файл и передает его в виде сообщения в файловый приемник
- Файловый приемник просто размещает этот файл на нужном сервере в нужном каталоге.
Интерес в этой схеме может вызвать разве что указание строки подключения в блоке SQL
Для MySQL формат такой: jdbc:mysql://<login>:<passworf>@<host>:<port>/<dbname>, нужно подставить внутри угловых скобок.
И кто ж знал (ну, кроме тех, кто документацию заранее читают), что 1С:Шина из коробки не умеет подключаться к MySQL. Минус час, появляется решение:
1. Качаем jdbc-дравер с https://dev.mysql.com/downloads/connector/j/ (у меня шина на винде крутится, так что я выбирал Platform Independent)
2. Из скачанного архива копируем единственный файл mysql-connector-j-8.1.0.jar (имя может отличаться в зависимости от версии) в каталог <каталог шины>\lib\chassis\modules\ (у меня это c:\Program Files\1C\1CE\components\1c-enterprise-esb-with-ide-1.4.1+21-x86_64\lib\chassis\modules\)
3. Перезапускаем службу 1С "Шины" (у меня в винде - 1c-enterprise-esb-with-ide, в линксе не знаю, извините).
После перезапуска процесс интеграции начинает работать, но единственным результатом работы становится тонна ошибок вида "the url cannot be null". В логах шины они вот так выглядели:
В общем, вы наверно сразу догадались, а у меня час ушел, пока совсем руки не опустились и я вдруг не решил избавиться от кириллицы в названии подсистемы. Ага, вот этой, которая теперь "CRM" называется, а по умолчанию - "Основной":
И вы знаете, все заработало.
Надеюсь, если что-то подобное будете делать, я вам немного времени сэкономил )
P.S. И совсем-совсем на всякий случай, код запроса в MySQL и превращения результатов в сообщение-файл:
метод ОбработкаСообщения(Контекст: CRM_Xchange.КонтекстВызова, Сообщение: CRM_Xchange.Сообщение, Соединение: СоединениеSql): СообщениеИнтеграции
пер Запрос = Соединение.СоздатьЗапросСВыборкой(
"SELECT
DATE(cust.customer_create_date) AS 'Период',
sum(<выражение1>) as 'Поле1',
...
sum(<выражение9>) as 'Поле9',
FROM
customer cust
LEFT JOIN personal ON cust.id = personal.id
LEFT JOIN company_department ON personal.company_department_id = company_department.id
WHERE ...")
исп РезультатЗапроса= Запрос.Выполнить()
исп Поток = новый ВременныйПотокЗаписи()
знч CSV = новый ЗаписьДанных(Поток)
CSV.ЗаписатьСтроку("Период,Поле1,...,Поле9")
пока РезультатЗапроса.Следующий()
CSV.ЗаписатьСтроку(
РезультатЗапроса.Получить("Период").ВСтроку() + ";" +
РезультатЗапроса.Получить("Поле1").ВСтроку() + ";" +
...
РезультатЗапроса.Получить("Поле9").ВСтроку()
)
;
возврат Сообщение.УстановитьТелоИзПотока(Поток.ОткрытьПотокЧтения())
;