gifts2017

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

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

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

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

И так...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

Подписаться Добавить вознаграждение

Комментарии

1. larissa builova (larisab) 09.12.09 20:37
Отлично! Супермолодец! :)
2. Юрий Тимофеев (Tatitutu) 09.12.09 22:07
Василий - на ходу подметки режешь .Зачет
да.... "обломал" ты меня (мой маленький секретик)
3. dushelov (Душелов) 09.12.09 22:59
(2) Сколько еще таки "секретов" вперед :)
4. Котэ Пруидзе (kote) 10.12.09 01:24
(2) А жадничать - нехорошо :)
5. Александр Рытов (Арчибальд) 10.12.09 12:04
Когда внятно написано, и дураку понятно. Я вот все понял :D
6. BigB (BigB) 10.12.09 13:09
(0) Ругается чего то на
{МодульУправляемогоПриложения(2,2)}: Переменная не определена (Тестовый)
<<?>>Тестовый.ИнитВК(); (Проверка: Тонкий клиент)
{МодульУправляемогоПриложения(3,2)}: Переменная не определена (Тестовый)
<<?>>Тестовый.ТестВК(); (Проверка: Тонкий клиент)
{МодульУправляемогоПриложения(2,2)}: Переменная не определена (Тестовый)
<<?>>Тестовый.ИнитВК(); (Проверка: Веб-клиент)
{МодульУправляемогоПриложения(3,2)}: Переменная не определена (Тестовый)
<<?>>Тестовый.ТестВК(); (Проверка: Веб-клиент)
7. larissa builova (larisab) 10.12.09 13:12
В общий серверный модуль добавляем инициализацию компоненты (в моем примере он привилегированный и имеет имя "Тестовый"):
8. BigB (BigB) 10.12.09 13:21
9. BigB (BigB) 10.12.09 13:23
У меня в "Проверка конфигурации" стоят все галки
Прикрепленные файлы:
10. BigB (BigB) 10.12.09 13:35
(0) В режиме "Управляемое приложение" это не работает, а в режиме "Обычное приложение" работает.
11. dushelov (Душелов) 10.12.09 14:20
(10) А галочку "Вызов сервер" кто ставить будет?
12. dushelov (Душелов) 10.12.09 14:34
Добавил тестовую базу ;)
13. BigB (BigB) 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) 15.12.09 13:04
18. dushelov (Душелов) 15.12.09 14:01
(17) Вариантов решения, думаю много.
19. - - (Rebelx) 15.12.09 17:09
(18) я знаю 4 разных варианта :)
20. dushelov (Душелов) 16.12.09 12:59
(19) Ну мы определили 2 :) Какие еще 2? Очень даже интересно!
21. - - (Rebelx) 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) 06.12.10 20:46
(23) а ты пробовал передавать com объекты между клиентом и сервером? ИМХО не получится.
25. Василий Демидов (Душелов) 07.12.10 01:30
(24) Не получится никак. Согласен.
26. Alex Tim (Qseft) 05.10.11 16:14
С 8.1 я так понял не прокатит, а жаль. Спасибо за идею.
27. Дмитрий Павлик (DimaP) 16.05.12 17:07
1-1.5 года назад мучился с подобным, в частности, хранить коннект к другой базе таким образом не полчалось - ком категорически не хотел так сохраняться и восстанавливаться ))
28. Роман Озеряный (rozer) 02.11.12 18:28
29. Андрей Овсянкин (Evil Beaver) 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) 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) 13.12.13 15:03
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа