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

16 декабря 2012

Предисловие

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

Использование COM-соединения удобно и достаточно стабильно для большинства возникающих задач. Однако у механизма есть один узкий момент, о котором и пойдет речь в статье далее.

В данном случае, узкий момент - это время установки соединения с другой базой. Оно может быть достаточно длительным и дело тут вот в чем. Когда мы устанавливаем соединение с ИБ по средством COM, то сначала он полностью загружает конфигурацию базы, к которой мы подключаемся. Если бы мы подключались, например, к базе типового решения 1С "Управление производственным предприятием", то время подключения было бы достаточно продолжительным, поскольку конфигурация весит более 200 МБ.

Сеансы

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

Текущая ситуация

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

Конфигурация служебной базы содержит в себе общий модуль "DateTime", включенный в глобальный контекст, чтобы мы могли вызывать процедуру получения времени без обращения к общему модулю. Текущее время будем получать в формате "Число_Месяц_Год_Час_Минута_Секунда". Тип возвращаемого значения - "Строка".

Рабочая база содержит в себе общие модули и константу для инициализации COM-соединения. Их подробно рассматривать не будем, отмечу лишь, что для создания соединения используется функция общего модуля "ПодлкючениеКБазе1С" - "Подключиться". Она возвращает COM-объект подключения.

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

Время подключения

Учитывая, что размер служебной конфигурации составляет 18 КБ, время соединения для более сложных конфигураций увеличится в разы. Если же мы будем поддерживать соединение, то в дальнейшем операция по получению текущей даты из другой базы составит 0,000314 сек. Фактически в 10000 раз быстрее! 

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

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

Как хранить COM-объект?

Вся сложность в поддержании соединения состоит в том, что платформа 1С:Предприятие не может хранить COM-объект в информационной базе. Конечно, нет необходимости сохранять объект в реквизитах справочника или документа, поскольку соединение может меняться. Если, например, сервер 1С будет перезапущен,  то хранить COM-объект будет бессмысленно из-за отсутствия ранее установленного соединения.

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

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

Рассмотрим сохранение COM-объекта для управляемой формы в тонком клиенте. Для это нам понадобится в модуле формы создать переменную с директивой "&НаКлиенте". В нее мы и будем сохранять текущее соединение. При первом подключении через COM мы сохраняем установленной соединение в эту переменную и в последующие разы используем уже его.

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

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

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

Какие минусы и плюсы?

Начнем с плюсов, поскольку их не так много:

  1. Используются только возможности платформы.
  2. Относительная легкость в реализации.
  3. Высокая степень надежности, так как COM-соединение фактически зависит только от качества сети.

Перейдем к минусам:

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

Подведем итоги

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

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

Синтаксис помощник

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

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

 


comments powered by Disqus