В жизни так бывает, причём бывает чаще чем хотелось бы, хоть в целом и довольно редко – надо интегрировать Битрикс24 с ЗУП. Сими дружественными компаниями заявлена штатная интеграция (но только для коробки Б24), которая осуществляется по следующей принципиальной схеме:
Обмен инициирует всегда 1С. Это либо штатный, либо устанавливаемый самостоятельно и доступный модуль обмена, который посылает запросы.
На стороне Б24 имеем в качестве точки обмена скрипт, если быть точнее скрипты (но об этом будет ниже), в одном из которых вызов метода IncludeComponent, который подключает контроллер. Он и таит в себе логику обмена.
Штатный обмен, в принципе, если быть экспертом одного из продуктов можно освоить за небольшое количество минут или часов – информация представлена на одном из официальных сайтов 1С-Битрикс.
Пролог
Нам же это скучно, поэтому ввязываемся в авантюру по интеграции ЗУП с Б24 Enterprise, а чтобы было интереснее – берем закрытый объект, почти совсем не бизнес даже, а учреждение с многоуровневой и чудно ветвленой системой безопасности.
В общем, на руках бэкап Б24 с обезличенными данными и обезличенный же XML-файл обмена из ЗУП.
Итак, сама задача… Хотя, нет. До самой задачи ещё далеко – не помешало бы сначала наладить тестовый механизм для того, чтобы по заверениям работающий штатный алгоритм проверить.
Инструментарий:
Виртуальная машина VMBitrix – 1 шт.
1С-Битрикс24 (копия для разработки) – 1 шт.
Файл обмена, выгруженный предположительно штатным модулем обмена 1С – 1 шт.
VS Code + SSH FS плагин на будущее – 1 комплект.
Postman – 1 шт.
Виртуальная машина VMBitrix
По правде говоря, это никакая не виртуальная и даже не машина, а CentOS 7 (ну, или 6) со всеми вытекающими. Можно из чистой центоси сделать своеобразный и уже сконфигурированный LAMP+ для Битрикс несколькими командами.
wget http://repos.1c-bitrix.ru/yum/bitrix-env.sh
# chmod +x bitrix-env.sh
# ./bitrix-env.sh
Для дотошных читателей следует рассказать, что виртуальная машина в реальности всё же существует. На клиентском сайте вендора в разделе скачать. Образы уже сконфигурированных ОС под популярные виртуализации выложены и в корне сайта по умолчанию уже лежит скрипт установки демо и скрипт восстановления. Именно скрипт восстановления был использован для создания локальной копии портала.
Следует ещё отметить, что VMBitrix не единственное, но самое быстро-разворачиваемое универсальное окружение для Б24.
1С-Битрикс24 Enterprise
Не буду много распространяться про то, что отличает Энтерпрайз от других коробок. Наверное, в данном повествовании хватит акцента на цене и уровне ответственности. Тем более, модули связанные с масштабированием не используются. Впрочем, как и многосайтовость.
Файл обмена из 1С ЗУП
Если вы хоть раз занимались интеграцией двух систем, будучи ответственным только на одном продукте, то вам знакомо как велик соблазн спихнуть на ту сторону любую мелочь, которую лень проверять на своей стороне. Этот недуг поражает даже самых ответственных людей, выступающих в любой роли и с любым уровнем погружения. Поддавался недугу и я.
Попытка повлиять на то чтобы пришли нужные данные сами чудесным образом, догадавшись, куда и в какой последовательности записываться, для очистки совести тоже осуществлена.
VS Code + SSH FS плагин
Итак, вооружившись доступом к файловой системе проекта, мы начинаем свое путешествие в увлекательный мир не задокументированных интеграций.
Не зря в самом начале статьи была реплика про то, что «Обмен инициирует всегда 1С». Для понимания архитектуры это был первый шаг, в модуле обмена на стороне 1С прописан адрес скрипта, выступающего узлом обмена в Б24 – по умолчанию это /bitrix/admin/1c_intranet.php.
В нем, согласно правилам системы ничего не хранится. Подключается один из служебных скриптов системного модуля Интранет(intranet) /bitrix/modules/intranet/tools/1c_intranet.php.
Именно этот модуль нам дает программный интерфейс для организации работы с сотрудниками и структурой на портале. Модули в BitrixFramework занимают место модели в архитектуре MVC.
И именно для взаимодействия с ним написанный системный компонент intranet.users.import.1c вызывается из служебного скрипта при помощи метода IncludeComponent. Компоненты в BitrixFramework занимают место контроллера в архитектуре MVC. На вход компонента подается массив параметров, если не вдаваться в тонкости, то – настройки из модуля Интранет, которые задаются в административной части корпортала.
Postman
При упоминании должности почтальона в наших широтах перед глазами встает образ скорее Печкина из Простоквашино, нежели герой Кевина Костнера из одноименного заокеанского фильма.
Но наш герой – программа, адрес тоже известен: postman.com [ссылка удалена модератором].
Эпилог
Путем нехитрых манипуляций вычитки кода того самого системного компонента и экспериментов с программой-почтальоном за пару часов выработан полуавтоматических алгоритм, позволяющий подсунуть в Б24 файл выгрузки из 1С.
Что важно знать про обмен:
Протокол обмена – GET
Нужно несколько последовательных запросов с разными параметрами
Если файл выгрузки 1С ЗУП в архиве, то нужно использовать галочку «Использовать сжатие zip, если доступно» в настройках модуля Интранет в админке. И наоборот – если XML без архивной оболочки – галочку нужно снять.
Первый запрос, авторизация по логину и паролю:
GET http://портал/bitrix/admin/1c_intranet.php?mode=checkauth
Возвращает PHPSESSID. Его необходимо в последующем передавать с каждым запросом.
Второй запрос:
GET http://портал/bitrix/admin/1c_intranet.php?mode=init
Подготавливает/вычищает папку для загрузки файла. Возвращает что-то вроде zip=no
file_limit=204800
, если всё отработало.
Третий запрос:
GET http://портал /bitrix/admin/1c_intranet.php?mode=file&PHPSESSID=tmfi6bf67llse3akv7cv13m6h8&filename=import.xml
В случае успешной передачи и записи файла на сервер возвращает success. Будьте бдительны – нужно передать в Body сам файл бинарно, и указать его название в GET-параметре filename.
Четвертый запрос:
GET http://портал /bitrix/admin/1c_intranet.php?mode=import&PHPSESSID=tmfi6bf67llse3akv7cv13m6h8&filename=import.xml
Надо отсылать несколько раз с теми же параметрами, пока не пройдут последовательно все шаги импорта. Все эти шаги также можно вычитать в коде вышеуказанного компонента, осуществляющего импорт. Возвращаемые значения:
progress
Временные таблицы удалены.
progress
Временные таблицы созданы.
progress
Файл импорта прочитан.
progress
Временные таблицы проиндексированы.
progress
Проверка структуры успешно пройдена.
progress
Метаданные импортированы успешно.
progress
Обработано 2 из 2 пользователей.
progress
Загрузка пользователей завершена.
progress
Обработано 11 из 11 записей графика отсутствий.
progress
Загрузка графика отсутствий завершена.
success
Импорт успешно завершен.
Постскриптум
Наверняка, кто-то из комментаторов укажет на другие инструменты, или сможет поделиться похожим опытом. Возможно, кто-то проведет параллели с импортом каталога из УТ в БУС.
По правде говоря, сам тоже, хоть в статье и опустил, но руководствовался аналогичным опытом. Продолжение следует – в следующей статье расскажу как решалась сама задача породившая такую хитроумную организацию труда.