Хранение COM Объектов на Сервере ТонкогоКлиента Ключевые слова: COM-объект на Сервере
COMОбъекты. Спаси и Сохрани.Описание проблемы
Не секрет, что многие неофиты Тонкого клиента сталкиваются с тем, что, переменные, допустим, модуля объекта обработки хранятся только на время серверного вызова. При последующем серверном вызове мы получим девственно чистые переменные.
Что же делать?
Первым и самым простым выходом может стать хранение переменных в реквизитах формы, на сервере. Хороший вариант, ну а что делать, если формы - нет.
ПараметрыСеанса, скажет пронырливый пользователь, да только нет там типа "ComОбъект", а на грязные попытки пристроиться к Фиксированным массивам, структурам и соответствиям система пошлем вас в путь (лесом).
Решение проблемы
Все просто. Мы поместим COMОбъект во ВременноеХранилище, где он переждет тягости Серверных вызовов. Когда же он нам понадобится - мы его вернем. Итак:
Процедура СоздатьИСохранитьComОбъект() Экспорт
Обработчик=Новый COMОбъект("v82.Application");
Обработчик.Connect("File=""D:\database\8.2\Пустая"";usr=""robot""; pwd=""z12cf57bdjk43""");
Обработчик.visible=false;
ПараметрыСеанса.АдресCOMОбъекта=ПоместитьВоВременноеХранилище(Обработчик,Новый УникальныйИдентификатор());
КонецПроцедуры
Замечания:
1) Процедура выполняется на Сервере. На Клиенте смысла во всех этих извращениях - нет.
2) В ФАКЕ процедуры ПоместитьВоВременноеХранилище() можно почитать, что хранилище живет, пока живет его форма-владелец, идентификатор которой мы передаем во 2-ом пераметре. Как видим из примера - мы передаем произвольный идентификатор, и, о чудо, хранилище остается живо. Ежели мы сделаем так:
ПараметрыСеанса.АдресCOMОбъекта=ПоместитьВоВременноеХранилище(Обработчик);
то чудес не будет. Причина чуда - неизвестна. Божественное вмешательство Волшебника?
Ну и получать COMОбъект - стандартно.
Функция ЖивЕщеComОбъект() Экспорт
Обработчик=ПолучитьИзВременногоХранилища(ПараметрыСеанса.АдресCOMОбъекта);
Возврат Обработчик<>Неопределено;
КонецФункции
Важно. Критично. Жизненно.
Согласно эмпирическим изысканиям - ComОбъект теряется на 30 -ой минуте его "неиспользования". Необъяснимо. Товарисчем http://www.forum.mista.ru/users.php?id=54874 было выдвинуто это предположение, мною было подтверждено эмпирически. Лечение просто - раз в 500 секунд - считывать COMОбъект из Временного хранилища, например, так:
Процедура ТаймерОбновленияComОбъектов() Экспорт
Если РаботаСCOMОбъектами.ЖивЕщеComОбъект()=Ложь Тогда
ОтключитьОбработчикОжидания("ТаймерОбновленияComОбъектов");
КонецЕсли;
КонецПроцедуры
КонецПроцедуры
Процедура ПриНачалеРаботыСистемы()
ОбщийМодуль.СоздатьОбработчик();
ПодключитьОбработчикОжидания("ТаймерОбновленияComОбъектов",500,Ложь);
КонецПроцедуры
За сим усе, ваш Злобный H A D G E H O G s |