[8.2] Глобальные переменные в контексте сервера (управляемое приложение)

Опубликовал Василий Демидов (Душелов) в раздел Программирование - Практика программирования

Можно ли в 8.2 на сервере хранить ссылку на объект внешней компоненты?
Можно! Рассмотрим на примере...
Эта статья - отчет на вопрос в http://infostart.ru/forum/forum14/topic29689/

Как оказалось все очень просто.

И так...

1. Добавляем в параметры сеанса строковый параметр, скажем длиной 255 символов.

(для хранения ссылки на объект и возможности вызова из любого серверного метода)

К примеру, с именем "ВК".

2. В общий серверный модуль добавляем инициализацию компоненты (в моем примере он привилегированный и имеет имя "Тестовый"):

Функция ИнитВК() Экспорт
      
ИмяВК = "Душелов.ExcelEditor1C";

       Попытка
            
ВК = Новый COMОбъект(ИмяВК);
       Исключение
            
Сообщить("Ошибка создания объекта внешней компоненты: " + ИмяВК);
             Возврат Ложь;
       КонецПопытки;

      
ПараметрыСеанса.ВК = ПоместитьВоВременноеХранилище(ВК, Новый УникальныйИдентификатор);
      Возврат Истина;
КонецФункции

и тестовую функцию

Процедура ТестВК() Экспорт
       Если
ПараметрыСеанса.ВК = Неопределено Тогда
             Возврат;
       КонецЕсли;

      
ВК = ПолучитьИзВременногоХранилища(ПараметрыСеанса.ВК);
      
Сообщить(ВК.ПолучитьКоличествоЛистов());
КонецПроцедуры

И все :) Из любого места сервера и клиента объект внешней компоненты доступен!

Процедура ПриНачалеРаботыСистемы()
      
Тестовый.ИнитВК();
      
Тестовый.ТестВК();
КонецПроцедуры

В файлах статьи добавил тестовую базу, на которой можно проверить вызов метода ком-объекта из "глобальной переменной".

Скачать файлы

Наименование Файл Версия Размер
Тестовая база
.dt 9,77Kb
10.12.09
166
.dt 9,77Kb 166 Скачать бесплатно

См. также

Комментарии
1. larissa builova (larisab) 157 09.12.09 20:37 Сейчас в теме
Отлично! Супермолодец! :)
2. Юрий Тимофеев (Tatitutu) 3571 09.12.09 22:07 Сейчас в теме
Василий - на ходу подметки режешь .Зачет
да.... "обломал" ты меня (мой маленький секретик)
3. dushelov (Душелов) 09.12.09 22:59 Сейчас в теме
(2) Сколько еще таки "секретов" вперед :)
4. Котэ Пруидзе (kote) 450 10.12.09 01:24 Сейчас в теме
(2) А жадничать - нехорошо :)
5. Александр Рытов (Арчибальд) 2652 10.12.09 12:04 Сейчас в теме
Когда внятно написано, и дураку понятно. Я вот все понял :D
6. BigB (BigB) 156 10.12.09 13:09 Сейчас в теме
(0) Ругается чего то на
{МодульУправляемогоПриложения(2,2)}: Переменная не определена (Тестовый)
<<?>>Тестовый.ИнитВК(); (Проверка: Тонкий клиент)
{МодульУправляемогоПриложения(3,2)}: Переменная не определена (Тестовый)
<<?>>Тестовый.ТестВК(); (Проверка: Тонкий клиент)
{МодульУправляемогоПриложения(2,2)}: Переменная не определена (Тестовый)
<<?>>Тестовый.ИнитВК(); (Проверка: Веб-клиент)
{МодульУправляемогоПриложения(3,2)}: Переменная не определена (Тестовый)
<<?>>Тестовый.ТестВК(); (Проверка: Веб-клиент)
7. larissa builova (larisab) 157 10.12.09 13:12 Сейчас в теме
В общий серверный модуль добавляем инициализацию компоненты (в моем примере он привилегированный и имеет имя "Тестовый"):
8. BigB (BigB) 156 10.12.09 13:21 Сейчас в теме
9. BigB (BigB) 156 10.12.09 13:23 Сейчас в теме
У меня в "Проверка конфигурации" стоят все галки
Прикрепленные файлы:
10. BigB (BigB) 156 10.12.09 13:35 Сейчас в теме
(0) В режиме "Управляемое приложение" это не работает, а в режиме "Обычное приложение" работает.
11. dushelov (Душелов) 10.12.09 14:20 Сейчас в теме
(10) А галочку "Вызов сервер" кто ставить будет?
12. dushelov (Душелов) 10.12.09 14:34 Сейчас в теме
Добавил тестовую базу ;)
13. BigB (BigB) 156 10.12.09 14:37 Сейчас в теме
(11) Упс. Недоглядел. Спасибо.
14. RomDron (RomDron) 14.12.09 08:50 Сейчас в теме
Плюс! Поставил бы даже за то, что инфа по 8.2. А то создается такое впечатление,что под УП никто ничего сам не пишет. :-) А Жаль, платформа очень интересная.
15. Yuri (Virsy) 14.12.09 09:24 Сейчас в теме
А как быть, если объект подключен через Новый(), а не Новый COMОбъект?

ИмяВК="AddIn.DushelovICQ";
Попытка
ПодключитьВнешнююКомпоненту(ИмяВК);
JabberДоступен = Истина;
Исключение
Возврат ("Не удалось подключить компоненту "+ИмяВК);
КонецПопытки;

Попытка
Jabber = Новый(ИмяВК);//Новый COMОбъект(ИмяВК);//
Исключение
Возврат "Не удалось создать объект Jabber!";
КонецПопытки;
16. dushelov (Душелов) 14.12.09 13:50 Сейчас в теме
(15) В рамках данной статьи без разницы, как создается объект.
17. Валерий Просвирнин (Expert1C) 650 15.12.09 13:04 Сейчас в теме
18. dushelov (Душелов) 15.12.09 14:01 Сейчас в теме
(17) Вариантов решения, думаю много.
19. - - (Rebelx) 930 15.12.09 17:09 Сейчас в теме
(18) я знаю 4 разных варианта :)
20. dushelov (Душелов) 16.12.09 12:59 Сейчас в теме
(19) Ну мы определили 2 :) Какие еще 2? Очень даже интересно!
21. - - (Rebelx) 930 16.12.09 13:09 Сейчас в теме
(20) еще один используется тут: http://www.intelis-it.ru/software/intelis/urbd.html
...«ИНТЕЛИС: Управление распределенной базой 8» содержит механизмы (в том числе специально разработанный для целей повышения производительности COM-объект), позволяющие при выполнении в контексте сервера «1С: Предприятие 8» кэшировать необходимые для работы подсистемы данные, что позволяет использовать преимущества выполнения операций в контексте сервера без затрат ресурсов сервера на работу подсистемы...
Это кстати прошло 1С Совместимо

и еще один - модификация пи-кода модуля - это конечно 1С не Совместимо :)
22. dushelov (Душелов) 16.12.09 13:15 Сейчас в теме
(21) Очень интересно... Есть над чем поломать голову :)
23. dushelov (Душелов) 25.12.09 16:52 Сейчас в теме
Кстати, прелесть этого подхода - возможность передачи ссылки на объект в фоновое задание, инициированное из клиентского сеанса (из "Руководства разработчика)....
24. - - (Rebelx) 930 06.12.10 20:46 Сейчас в теме
(23) а ты пробовал передавать com объекты между клиентом и сервером? ИМХО не получится.
25. Василий Демидов (Душелов) 3788 07.12.10 01:30 Сейчас в теме
(24) Не получится никак. Согласен.
26. Alex Tim (Qseft) 05.10.11 16:14 Сейчас в теме
С 8.1 я так понял не прокатит, а жаль. Спасибо за идею.
27. Дмитрий Павлик (DimaP) 56 16.05.12 17:07 Сейчас в теме
1-1.5 года назад мучился с подобным, в частности, хранить коннект к другой базе таким образом не полчалось - ком категорически не хотел так сохраняться и восстанавливаться ))
28. Роман Озеряный (rozer) 182 02.11.12 18:28 Сейчас в теме
29. Андрей Овсянкин (Evil Beaver) 3857 21.02.13 12:41 Сейчас в теме
>ПоместитьВоВременноеХранилище(ВК)

Вот это же не будет работать! Во врем. хранилище можно размещать только сериализуемые объекты. В противном случае, сервер будет их убивать по своему желанию, например, при передаче серверного вызова на другую машину кластера. В этот момент он будет сериализовывать значение, лежащее в хранилище (с COM он явно это сделать не сможет).
30. DancingShadow (DancingShadow) 30.04.13 10:27 Сейчас в теме
Удобно для объектов у которых нет входящих событий. Т.е. получить из хранилища, вызвать метод получается на ура, а вот обработать входящее событие COM объекта - увы и ах.
31. Алексей Маташин (matashin) 12.09.13 10:40 Сейчас в теме
Реализовывал соединение с MSSQL, все работает в 8.2 через временное хранилище и сохранение ссылки на него в параметрах сеанса, но через некоторое время параметр сеанса становиться неопределен, решил его реинициализацией, по необходимости.
32. piton66 (piton66) 3 12.12.13 18:08 Сейчас в теме
Почему у меня не получается?
RS=Новый COMОБъект("MSCOMMLib.MSComm");
RS.Settings = "115200,n,8,1";
RS.CommPort=10;
RS.Handshaking = 1;
RS.RThreshold = 1;
RS.SThreshold = 1;
RS.InputLen = 0;
RS.RTSEnable = 1;
RS.InputMode = 0 ;

RS.PortOpen = Не RS.PortOpen;
       
 Если RS.PortOpen Тогда
       Сообщить("Comm. Port " + RS.CommPort + " Settings: " + RS.Settings);
       Сообщить(RS.Input);
	   ПараметрыСеанса.АдресКом=ПоместитьВоВременноеХранилище(RS,Новый УникальныйИдентификатор());
       Возврат Истина;
 Иначе
       Сообщить("Comport Problem");
	   Возврат ЛОЖЬ;
 КонецЕсли; 
...Показать Скрыть


Выдает ошибку Переданное значение не может быть помещено во временное хранилище.
Что не так делаю?
33. piton66 (piton66) 3 13.12.13 15:03 Сейчас в теме