Каталог решений - Что делать, если COM-соединение вылетает?

Что делать, если COM-соединение вылетает?

Что делать, если COM-соединение вылетает?

В наличии

Как-то я столкнулся с тем, что соединение с V82.COMConnector вылетало при множественных обращениях ко внешним информационным базам. В статье рассказывается, как побороть недуг. Способ смешной, откровенно говоря. А если проводить медицинские аналогии — чисто хирургический.

Надеюсь, что кому-то эта небольшая статья сэкономит время.

Категория:

Описание

Что делать, если COM-соединение вылетает?

Для COM-соединения используется два 1С-объекта: V82.Application, V82.COMConnector. Считается, что объект: V82.Application менее эффективен, так как использует интерфейсные библиотеки, при этом объект V82.COMConnector не имеет в своем арсенале ничего из того, что отвечает за интерфейс.  Казалось бы всё просто и понятно, но есть одно “НО” – при использовании V82.COMConnector   1С 8.2  теряет ключ защиты или вылетает по Run-time (хотя и не всегда, а при некоторых, одному одинэсу ведомых условиях…).

С обозначенной бедой в полной мере я столкнулся в релизе платформы 8.2.15.319 (хотя, в более ранних релизах беда тоже была).  Выглядело это примерно так – при множественных обращениях к информационным базам обработка, которая использовала данные внешних ИБ успешно отрабатывала, а вот при закрытии этой обработки начиналась та самая чехарда. Иногда и не закрывая обработки, а просто попытавшись открыть, скажем, справочник Контрагенты, текущая информационная база радостно вылетала.

Понятно, что первое, что приходит на ум – некорректное закрытие подключений. Но нет, подключение существовало ровно, пока было необходимо. Потом ему присваивалось значение Неопределено. Много еще где копал, но, как выяснилось – искал черную кошку в темной комнате. В конце концов нашел  описание ошибки, зарегистрированное на http://users.v8.1c.ru/ там, где платформы скачивают. В релизе 8.2.15.319 ошибка, как следовало из описания, была исправлена. Однако, моя платформа об этом не знала…

Что в результате? В результате отказался от использования объекта V82.COMConnector и вместо него взял V82.Application и COM-соединение стало работать стабильно. Из негатива только такой нюанс: при отключении внешнего соединения, выдавалось окно диалога, с просьбой подтвердить выход из приложения. Окно мне было без надобности, поэтому отключил его вывод на уровне системной записи, под которой происходило подключение к информационной базе.

 

Такая вот история…

 

Ниже привожу код для подключения с использованием V82.Application.

Модуль формы обработки.

Перем мТекущееПодключение Экспорт ;
…
Процедура ПодключитьИБСерверныйВариант(ИмяСервера, ИмяБазы,  Пользователь, Пароль)   Экспорт           
     мТекущееПодключение = новый COMОбъект("V82.Application");
     Состояние(ИмяБазы + "..." + " возможны интерфейсные сообщения...");
     Connection = Истина;                                                                                  
     Попытка
         Connection = мТекущееПодключение.Connect("Srvr="+СокрЛП(ИмяСервера) + ";" + "Ref="+СокрЛП(ИмяБазы) + ";" + "Usr="+СокрЛП(Пользователь) + ";" + "Pwd="+СокрЛП(Пароль));
     Исключение
         мТекущееПодключение = Неопределено;
         Предупреждение("Ошибка открытия информационной базы" + ИмяБазы );
         Сообщить(ОписаниеОшибки());
     КонецПопытки;
КонецПроцедуры

На нюансах работы с объектами внешней ИБ здесь останавливаться не буду, по этому поводу много чего есть, в том числе и на infostart. Напомню, только, что для того, чтобы работать с запросом во внешней базе можно использовать такой код:

Запрос = мТекущееПодключение.NewObject("Query");           
Запрос.Текст = “….Текст запроса …”;
Запрос.УстановитьПараметр("НачалоПериода",
НачалоПериода);Запрос.УстановитьПараметр("КонецПериода" , КонецДня(КонецПериода));

Для того, чтобы передать массив субконто, подойдет такой код:

ВидыСубконтоКД = мТекущееПодключение.NewObject("Массив");
ВидыСубконтоКД.Добавить(мТекущееПодключение.ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты);
ВидыСубконтоКД.Добавить(мТекущееПодключение.ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Договоры);
Запрос.УстановитьПараметр("ВидыСубконтоКД", ВидыСубконтоКД);

Обратите внимание, что массив во внешней информационной базе в вышеприведенном примере создается при помощи мТекущееПодключение.NewObject(«Массив»);

has been added to your cart:
Оформление заказа