Имя: Пароль:
1C
 
V8: Глобальная переменная в модуле управляемой формы 8.2.
0 Alex_1987
 
27.04.10
08:44
Всем добрый день!

Помогите пожалуйста:

В начале модуля упр. формы обработки 8.2. создаю переменную таким образом

&НаСервере
Перем БД;

Потом в при создании формы на сервере создается экземпляр Comобъекта для соединения с БД.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
   
  БД = Новый COMОбъект("ADODB.Connection");

КонецПроцедуры

Но при обращении к переменной БД из другой функции сервера, она становится НЕОПРЕДЕЛЕННОЙ.
Такое ощущение что в вышеописанной процедуре обращение происходит не к явно описанной переменной в начале модуля, а создаётся новая ЛОКАЛЬНАЯ переменная БД.
Если бы тип был попроще - можно бы было хранить это в реквизитах формы и не париться.

Вопрос: Где хранить на протяжении всей работы обработки СOMобъект??

(Ясен пень, что можно хранить СCom-объект во временном хранилище, каждый раз засоввыая и высоввывая его оттуда, но это весьма достает когда таких объектов много, кроме того является ли это корректным с точки зрения быстродействия??)
1 xReason
 
27.04.10
08:52
Все верно. Переменная не живет

А как долго тебе надо хранить ком объект? Ну и потом он у тебя коннекшен. Ты держишь коннект всегда открытым?
2 Alex_1987
 
27.04.10
09:08
Ок, спасибо! Так я и думал...

На самом деле все гораздо сложнее, чем в вышеозначенном примере и коннект должен быть всегда открыт)

То есть через вр. хранилище..., или может еще кто-нибудь какой-нибудь способ предложит??


P.S. Ну все таки почему так?? Не могу привыкнуть после 8.1., там они жили у меня в объекте, а тут нас из объекта выгнали, тк из формы к объекту обратиться нельзя, так еще и форме переменные не храняться!
3 Defender aka LINN
 
27.04.10
09:13
(2) Есть реквизиты формы, есть временное хранилище. Нафига переменные?
4 Alex_1987
 
27.04.10
09:19
(3) Действительно!Особенно, учитывая то, что все равно в них нифига хранить нельзя!
5 H A D G E H O G s
 
27.04.10
09:20
ПараметрыСеанса.АдресCOMОбъекта=ПоместитьВоВременноеХранилище(Объект,Новый УникальныйИдентификатор());
6 Alex_1987
 
27.04.10
09:22
(5) Так и будет))
Thanx
7 H A D G E H O G s
 
27.04.10
09:23
Однако есть 2 момента - толи фичи толи бага
8 Alex_1987
 
27.04.10
09:25
(7) Просвяти меня!
9 H A D G E H O G s
 
27.04.10
09:26
1. Несмотря на то, что ВР не привязано ни к каокй форме - она будет жить даже при последующих Серверных вызовах
2. Как привязанное, так и не привязанное хранилище имеет свое время жизни, если его не обновлять - оно исчезнет.
10 Alex_1987
 
27.04.10
09:27
А... дадада я в курсе...
Спасибо))
11 H A D G E H O G s
 
27.04.10
09:27
Это эмпирика.
Если кто меня ткнет в теорию - буду благодарен.
12 H A D G E H O G s
 
27.04.10
09:27
(10) Хм...
Откуда инфа?
13 Defender aka LINN
 
27.04.10
09:27
(9) Хранилище остается. COM-объекты отваливаются. Хотя сильно долго не держал, через время, возможно, и хранилище самоубьется.
14 Alex_1987
 
27.04.10
09:30
(12) Из личного опыта...
15 Alex_1987
 
27.04.10
09:30
Хотя скорее у меня как в (13) было.
16 H A D G E H O G s
 
27.04.10
09:31
(13) Счазт затестим...
17 Alex_1987
 
27.04.10
09:41
Через пол часа отпали COM-объекты
18 xReason
 
27.04.10
10:19
А может пойти путем - Модуль +  Повторное использование возвращаемых значений

как минимум если объект сдох, его можно будет пересоздать
19 H A D G E H O G s
 
28.04.10
14:52
20 Alex_1987
 
29.04.10
07:46
(19) Спасибо большое! Я решил эту проблему примерно так же, только не по таймеру смотрю жив или нет, а в момент обращения к com-объекту.

Спасибо всем за помощь!
21 Alex_1987
 
30.04.10
11:24
Уважаемый, H A D G E H O G s, о твоей статье.

Позволю себе внести пару замечаний. Буду очень благодарен, если ты объяснишь мне в чем я не прав если что...

Вот тема из синт.помощника:
/////////////////////////////
ПоместитьВоВременноеХранилище (PutToTempStorage)
Синтаксис:
ПоместитьВоВременноеХранилище(<Данные>, <Адрес>)
Параметры:
<Данные> (обязательный)
Тип: Произвольный. Данные, которые необходимо поместить во временное хранилище.
<Адрес> (необязательный)
Тип: УникальныйИдентификатор; Строка. Адрес во временном хранилище, по которому надо поместить данные. Или уникальный идентификатор формы, во временное хранилище которой, надо поместить данные и вернуть новый адрес.
Если параметр не указан, помещенное значение будет удалено после очередного запроса сервера из общего модуля, при контекстном и неконтекстном серверном вызове из формы, при серверном вызове из модуля команды или при получении формы.
///////////////////////////////

Если прочитаем про адрес, то вытекает вот что:

"В ФАКЕ процедуры ПоместитьВоВременноеХранилище() можно почитать, что хранилище живет, пока живет его форма-владелец, идентификатор которой мы передаем во 2-ом пераметре", но ты передаешь во втором параметре не ее УИ а Новый УИ! Поэтому форма не будет владельцем этого хранилища.

"то чудес не будет. Причина чуда - неизвестна."

Может причина чуда в этом??
Из синт.помощника:
"Если параметр не указан, помещенное значение будет удалено после очередного запроса сервера из общего модуля, при контекстном и неконтекстном серверном вызове из формы, при серверном вызове из модуля команды или при получении формы."

Просто хочу понять для себя этот механизм, что бы не осталось "повисщих" вопросов...
22 Alex_1987
 
30.04.10
11:26
Так что без обид))
23 Alex_1987
 
30.04.10
11:31
ААА... все понял что ты имел ввиду во втором ЗАМЕЧАНИИ, пардон...
24 Alex_1987
 
30.04.10
11:33
Че-то я запутался в конец... Чудо в том что оно остается живо с произвольным УИ или в том что оно мрет без 2го параметра.
25 H A D G E H O G s
 
30.04.10
11:40
удо в том что оно остается живо с произвольным УИ
26 H A D G E H O G s
 
30.04.10
11:41
Чудо
27 Alex_1987
 
30.04.10
11:45
ААААААААААА... Я лошара!!!

Ну тогда все ок, я просто невкурил))

Спасибо    H A D G E H O G s, оличная статья))