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

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

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

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

И так...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

Комментарии
1. larissa builova (larisab) 157 09.12.09 20:37 Сейчас в теме
Отлично! Супермолодец! :)
2. Юрий Тимофеев (Tatitutu) 3568 09.12.09 22:07 Сейчас в теме
Василий - на ходу подметки режешь .Зачет
да.... "обломал" ты меня (мой маленький секретик)
3. dushelov (Душелов) 09.12.09 22:59 Сейчас в теме
(2) Сколько еще таки "секретов" вперед :)
4. Котэ Пруидзе (kote) 448 10.12.09 01:24 Сейчас в теме
(2) А жадничать - нехорошо :)
5. Александр Рытов (Арчибальд) 2652 10.12.09 12:04 Сейчас в теме
Когда внятно написано, и дураку понятно. Я вот все понял :D
6. BigB (BigB) 155 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) 155 10.12.09 13:21 Сейчас в теме
9. BigB (BigB) 155 10.12.09 13:23 Сейчас в теме
У меня в "Проверка конфигурации" стоят все галки
Прикрепленные файлы:
10. BigB (BigB) 155 10.12.09 13:35 Сейчас в теме
(0) В режиме "Управляемое приложение" это не работает, а в режиме "Обычное приложение" работает.
11. dushelov (Душелов) 10.12.09 14:20 Сейчас в теме
(10) А галочку "Вызов сервер" кто ставить будет?
12. dushelov (Душелов) 10.12.09 14:34 Сейчас в теме
Добавил тестовую базу ;)
13. BigB (BigB) 155 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) 648 15.12.09 13:04 Сейчас в теме
18. dushelov (Душелов) 15.12.09 14:01 Сейчас в теме
(17) Вариантов решения, думаю много.
19. - - (Rebelx) 929 15.12.09 17:09 Сейчас в теме
(18) я знаю 4 разных варианта :)
20. dushelov (Душелов) 16.12.09 12:59 Сейчас в теме
(19) Ну мы определили 2 :) Какие еще 2? Очень даже интересно!
21. - - (Rebelx) 929 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) 929 06.12.10 20:46 Сейчас в теме
(23) а ты пробовал передавать com объекты между клиентом и сервером? ИМХО не получится.
25. Василий Демидов (Душелов) 3778 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) 3791 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 Сейчас в теме