Подключение к ExtSdk2 через OLE - Сценарии ExtSdk2
Содержание
Краткое описание
Подключение к OLE объекту
Основным способом для подключения к ExtSdk2 из внешних систем является OLE объект "Tensor.SbisPluginClientCOM". Данный OLE объект устанавливается на ПК пользователя при полной установке СБИС3 Плагин. Обновляется OLE объект автоматически вместе с обновлением СБИС3 Плагин. Подключение к OLE объекту аналогично работе с другими OLE объектами.
В момент подключения, OLE объект устанавливает WebSocket соединение с СБИС3 Плагин, по этому до отправки первой команды нужно убедиться, что данное подключение установлено дождавшись событие "connected" (type=Event, data.eventName=connected). . Подробнее см. в разделе Получение и обработка событий.
Подготовительные операции
ExtSdk2 является расширением (модулем) СБИС3 Плагин. При обращении к модулю плагину требуется указывать идентификатор модуля. Получить идентификатор ExtSdk можно при помощи команды ole.GetModule.
Кроме идентификатора модуля, для отправки команд в ExtSdk2 вызывающая сторона (клиент) должен быть аутентифицирован. Для аутентификации в ExtSdk2 доступны несколько вариантов. Результатом аутентификации является полученный идентификатор сессии который следует передавать при каждом вызове ExtSdk2 (допускается на одном соединении вызов команд из разных сессий).
Важно! Рекомендуется хранить данный идентификатор сессии между подключениями и вызывать аутентификацию только при получении ошибки аутентификации.
Вызов команд
Для взаимодействия с OLE объектом, в зависимости от возможностей Вашей системы, можно использовать либо JSON либо XML (в данном случае XML это безусловно сериализованный в XML JSON). Структура передаваемых данных идентична в обоих вариантах, выбор вариант зависит от наличия в ИС и скорости работы соответствующего парсера. В наших интеграционных модулях для 1С и SAP из-за необходимости поддержки старых версий используется XML.
Все вызовы СБИС3 Плагин асинхронны - вы отправляете команду и ждете сообщения о результатах выполнения команды. Для отправки команды, нужно вызвать метод ole.CallMethod или ole.CallMethodXML (исключение составляют команды аутентификации, их следует вызывать при помощи методов CallMethodWithoutAuth и CallMethodWithoutAuthXML). В ответ вы получите идентификатор запроса (UUID), данный идентификатор будет присутствовать в событии ответа и по нему вы сможете понять к какому запросу относится данное событие.
Со списком всех доступных команд Вы можете ознакомиться. В изложены наиболее оптимальные алгоритмы работы с ExtSdk2.
Получение и обработка событий
Работа с ExtSdk2 и СБИС3 Плагин осуществляется асинхронно, т.е. в ответ на ваш вызов Вы получите только его идентификатор, а не результат или ошибку. Для получения результата требуется делать периодический вызов функции ole.ReadAllObject или ole.ReadAllXml2 (в зависимости от формата обмена Json или XML). Данные функции возвращают все события которые поступили от плагина с момента последнего вызова этой функции (или запуска плагина если это первый вызов). Между вызовами ReadAll... необходимо делать таймаут 100-500мс, для этого можно воспользоваться методом ole.Sleep
По мимо событий содержащих результат вызова команды, в OLE Объект могут приходить события содержащие прогресс выполнения длительной операции (например загрузки больших файлов) или события произошедшие в СБИС, например распознавание документа и т.п. В интеграционных модулях рекомендуется построить обработку событий на принципах регистрации и вызова обработчика обратного вызова. Интеграционный модуль должен игнорировать не интересующие или неожиданные события.
Кроме асинхронных вызовов, сами команды ExtSdk2 могут выполняться асинхронно. В основном это касается методов отправки. Такие методы в качестве ответа возвращают специальный тип ошибки Error #ASYNC. Результат выполнения приходит отдельным событием Event #ASYNC. Такой подход обусловлен тем, что изначально предполагалось исключительно синхронное выполнение методов внутри СБИС3 Плагин.
Более подробно о обработке событий
Рекомендуем ознакомиться с примером реализации подключения к ExtSdk2 на python или 1С. Данный пример эмулирует синхронную работу кода информационной системы.