Книга знаний

1С:Предприятие / Приемы программирования / OLE, COM

Хранение COM Объектов на Сервере ТонкогоКлиента

Как сохранить COM-объект на Сервере между СервернымиВызовами.Автор статьи: H A D G E H O G s | Редакторы: aka AMIGO, Asmody
Последняя редакция №9 от 02.08.12 | История
URL: http://kb.mista.ru/article.php?id=787

Ключевые слова: COM-объект на Сервере


Эта статья перенесена в Книгу знаний v.2 http://kb.mista.ru/2/doku.php?id=1c:v8:xranenie_com_obektov_na_servere_tonkogoklienta

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Объект V82.Application (он, и только он, за другими подобного не замечено) теряется на 20 -ой минуте его "неиспользования". Так сделали 1С. Столько живет объект во временном хранилище, если у него нет идентификатора - формы владельца. Лечение просто - раз в 500 секунд - считывать COMОбъект из Временного хранилища, например, так:

Процедура ТаймерОбновленияComОбъектов() Экспорт
    Если РаботаСCOMОбъектами.ЖивЕщеComОбъект()=Ложь Тогда
        ОтключитьОбработчикОжидания("ТаймерОбновленияComОбъектов");
    КонецЕсли;
КонецПроцедуры
        
КонецПроцедуры
Процедура ПриНачалеРаботыСистемы()
    ОбщийМодуль.СоздатьОбработчик();
    ПодключитьОбработчикОжидания("ТаймерОбновленияComОбъектов",500,Ложь);
КонецПроцедуры


Успехов! ваш H A D G E H O G s

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика