Поддержка COM-соединения. Часть №2

23 декабря 2012

Файлы для загрузки:

Предисловие

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

Сегодня разговор будет идти о более интересном подходе поддержки COM-соединения с другой информационной базой (ИБ) 1С:Предприятия, который основан на использовании web-сервиса.

Нам понадобятся:

  1. Некоторая служебная база, к которой будет происходить обращение через COM для получения данных.
  2. Web-сервис, управляющий COM-соединением.
  3. Рабочая база, инициализирующая COM-соединение со служебной базой.

Теперь по порядку.

КАК ЭТО БУДЕТ РАБОТАТЬ?

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

Старая схема

Инициализация соединения занимает значительное время, поскольку COM-объект загружает конфигурацию базы, к которой подключается. Поэтому данный способ не подходит в тех случаях, где скорость соединения должна занимать не более нескольких секунд. Представьте, что подключение происходит к УПП, где конфигурация размером с 200 мегабайт. Какой объем трафика мы получим, если пять пользователей будут подключаться к служебной базе?

Общий принцип работы новой схемы заключается в поддержке COM-соединения со служебной базой на web-сервере, в нашем примере мы будем использовать IIS (подробнее). Прочитать про установку и настройку веб-сервера Вы можете по ссылке. Рабочая база будет устанавливать соединение с web-сервером и работать с кэшированным соединением COM используя web-сервис. На скриншоте ниже показана общая схема работы.

Новая схема

Огромный плюс такой схемы в том, что соединение будет инициализировано один раз. Не будет необходимости устанавливать COM-соединение со служебной базой каждый раз, когда пользователь начнет использовать функции программы, требующие получение данных из служебной базы. Следовательно, значительно сократится время обращения и объем трафик при инициализации соединения.

В ТЕОРИИ ХОРОШО, А ЧТО НА ПРАКТИКЕ?

На практике сложности могут возникнуть только при создании Web-сервиса и его использовании на платформе 1С:Предприятие 8.x. Рассмотрим пошаговый пример.

Служебная база

В нашем примере в качестве служебной ИБ будет простейшее решение, в конфигурации которого содержится общий модуль с методом "CurDate", возвращающим строку с текущей датой и временем. 
В служебной базе
Для удобства использования включим метод "CurDate" в глобальный контекст.

Web-сервис

В нашем примере веб-сервис создадим с помощью Visual C# 2010 Express. Он будет относительно простым, поэтому мы рассмотрим лишь основные моменты. Более подробно о создании веб-сервисов Вы можете узнать здесь.

Первое что мы сделаем - это создадим отдельный класс, с помощью которого будем инициализировать COM-соединение со служебной ИБ. Этот класс был создан в отдельном проекте VS2010 и после добавлен в проект веб-сервиса. Программный код созданного класса показан на следующем скриншоте.

Класс соединения

Как мы видим, в метод "GetConnection" передается строка соединения с ИБ. После создается COM-объект соединения и вызывается метод "Connect", устанавливающий соединение с ИБ. В результате метод возвращает созданное COM-соединение вызывающему приложению.

В проект веб-сервиса добавим глобальный класс приложения (файл "Global.asax", который позволит при старте веб-сервиса провести инициализацию COM-соединения на уровне приложения и использовать его для всех подключаемых к сервису сеансов. В модуль события "Application_Start" вставим следующий код:

Класс соединения

Чтобы не усложнять пример, строка соединения указана явно. Далее вызывается метод "GetConnection" ранее созданного нами класса. Созданное соединение записываем в переменную приложения "v82". Перед этим мы добавили в проект веб-сервиса класс инициализации COM-соединения "Setv82Connection". Его код был написан выше. 

Непосредственно модуль веб-сервиса выглядит следующим образом:

Класс соединения

Как мы видим, метод "GetInf" обозначен директивой "WebMethod", что позволяет использовать его при работе с веб-сервисом. Сам метод обращается к переменной уровня приложения "v82", хранящей COM-объект подключения. Через нее он вызывает метод "CurDate", описанный нами ранее в конфигурации служебной базы. Остается только вызвать этот метод из 1С:Предприятия.

Работа с веб-сервисом

Из рабочей базы нам необходимо обратиться к веб-сервису и вызвать его метод "GetInf". Для этого в конфигурации рабочей базы создадим обработку "v82connection" с командой "Получить" на основной форме. Процедура-обработчик команды вызывает серверную функцию "ПолучитьСервер", в которой опишем алгоритм работы с веб-сервисом.

Перед этим добавим новый объект конфигурации WSСсылка, который будет содержать описание веб-сервиса. При создании объекта укажем URL для импорта WSDL. В нашем примере ссылка будет выглядеть следующим образом:

http://localhost/WebSrv/WebService.asmx?wsdl

Ссылка на WSDL содержит путь к файлу *.asmx, дополненный "?WSDL" для получения XML-описания веб-сервиса. В конечном счете мы получили следующую WSСсылку с WSDL-описанием.

Описание веб-сервиса

И последний шаг - описание программного кода работы с созданной WSСсылкой. Для этого в форме обработки "v82connection" для процедуры "ПолучитьСервер" напишем следующее:

Программная работа с WS-ссылками

Подробнее о работе с WSСсылками на платформе 1С:Предприятие 8.х Вы можете узнать здесь. Отметим лишь, что общий алгоритм работы с ними следующий:

  1. Получаем WSDL-определение (метод "ПолучитьWSОпределение").
  2. Создаем прокси для соединения с сервисом (метод "СоздатьWSПрокси").
  3. Создаем пакет XDTO соответствующего типа.
  4. Вызываем метод веб-сервиса с указанием типа параметра.
  5. Обрабатываем результат.

В итоге, мы имеем возможность работы со служебной базой через веб-сервис. Все готово для тестирования новой схемы работы с COM-соединением.

ТЕСТИРОВАНИЕ И ОСОБЕННОСТИ РАБОТЫ

В рабочей ИБ запустим сеансы двух пользователей. Вызовем параллельное обращение к созданному веб-сервису.

Параллельная работа с COM-соединением

Как мы видим, через установленное ранее COM-соединение на веб-сервере могут общаться к служебной базе параллельно сразу несколько сеансов. Используя инструмент замера производительности, сравним время обращения через веб-сервис и через COM-соединение.

Сравнение производительности

Очевидно, что время соединения со служебной базой значительно уменьшилось. Если COM-соединение было инициализировано за 3.25 сек., в основном за счет загрузки конфигурации служебной базы, то вызов метода веб-сервиса занял всего 0,14 секунды. Разница в 23 (!!!) раза! И чем больше будет размер служебной конфигурации, тем больше будет разница!
Предложенная схема кэширования COM-соединения имеет ряд особенностей, о которых стоит знать прежде, чем Вы начнете решать с ее помощью прикладные задачи:

  1. COM-соединение будет кэшировано до тех пор, пока существует хотя бы один клиентский сеанс на веб-сервере. Если к веб-сервису не было обращений в течении нескольких минут, то соединение со служебной базой будет разорвано. Чтобы поддерживать соединение даже при отключенных клиентских сеансах, можно создать регламентную задачу, которая с заданной периодичностью будет вызывать какой-либо простой метод веб-сервиса, тем самым поддерживая клиентское соединение с веб-сервером.
  2. На веб-сервисе нужно предусмотреть ситуацию потери COM-соединения и его повторную инициализацию.По различным причинам соединение веб-сервера со служебной базой может быть потеряно, поэтому предусмотреть возможность восстановления соединения просто необходимо.
  3. Всю работу с веб-сервисом из платформы вести на стороне сервера.Так мы сможем повысить надежность созданной схемы, поскольку настроить работу сервера 1С:Предприятия с веб-сервисом намного легче, чем проверять доступ и настройки каждой клиентской машины.

ВЫВОД

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

В конечном счете, использование технологии web-сервисов позволит значительно расширить возможности платформы 1С:Предприятие, сделав ее одним из лучших средств автоматизации любого предприятия.

P.S. Все самое интересно рождается на стыке технологий.


comments powered by Disqus