IE 2016

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

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

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

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

И так...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

Лучшие комментарии

11. dushelov 10.12.2009 14:20
(10) А галочку "Вызов сервер" кто ставить будет?
Ответили: (13)
+ 1 [ BigB; ]
# Ответить
12. dushelov 10.12.2009 14:34
Добавил тестовую базу ;)
+ 1 [ larisab; ]
# Ответить

Комментарии

1. larisab (файл скачал) 09.12.2009 20:37
Отлично! Супермолодец! :)
# Ответить
2. Tatitutu 09.12.2009 22:07
Василий - на ходу подметки режешь .Зачет
да.... "обломал" ты меня (мой маленький секретик)
Ответили: (4) (3)
# Ответить
3. dushelov 09.12.2009 22:59
(2) Сколько еще таки "секретов" вперед :)
# Ответить
4. kote 10.12.2009 01:24
(2) А жадничать - нехорошо :)
# Ответить
5. Арчибальд 10.12.2009 12:04
Когда внятно написано, и дураку понятно. Я вот все понял :D
# Ответить
6. BigB (файл скачал) 10.12.2009 13:09
(0) Ругается чего то на
{МодульУправляемогоПриложения(2,2)}: Переменная не определена (Тестовый)
<<?>>Тестовый.ИнитВК(); (Проверка: Тонкий клиент)
{МодульУправляемогоПриложения(3,2)}: Переменная не определена (Тестовый)
<<?>>Тестовый.ТестВК(); (Проверка: Тонкий клиент)
{МодульУправляемогоПриложения(2,2)}: Переменная не определена (Тестовый)
<<?>>Тестовый.ИнитВК(); (Проверка: Веб-клиент)
{МодульУправляемогоПриложения(3,2)}: Переменная не определена (Тестовый)
<<?>>Тестовый.ТестВК(); (Проверка: Веб-клиент)
# Ответить
7. larisab (файл скачал) 10.12.2009 13:12
В общий серверный модуль добавляем инициализацию компоненты (в моем примере он привилегированный и имеет имя "Тестовый"):
Ответили: (8)
# Ответить
8. BigB (файл скачал) 10.12.2009 13:21
(7)

Прикрепленные файлы:

Test82.JPG
# Ответить
9. BigB (файл скачал) 10.12.2009 13:23
У меня в "Проверка конфигурации" стоят все галки

Прикрепленные файлы:

ПроверкаКонфигурации.JPG
# Ответить
10. BigB (файл скачал) 10.12.2009 13:35
(0) В режиме "Управляемое приложение" это не работает, а в режиме "Обычное приложение" работает.
Ответили: (11)
# Ответить
11. dushelov 10.12.2009 14:20
(10) А галочку "Вызов сервер" кто ставить будет?
Ответили: (13)
+ 1 [ BigB; ]
# Ответить
12. dushelov 10.12.2009 14:34
Добавил тестовую базу ;)
+ 1 [ larisab; ]
# Ответить
13. BigB (файл скачал) 10.12.2009 14:37
(11) Упс. Недоглядел. Спасибо.
# Ответить
14. RomDron 14.12.2009 08:50
Плюс! Поставил бы даже за то, что инфа по 8.2. А то создается такое впечатление,что под УП никто ничего сам не пишет. :-) А Жаль, платформа очень интересная.
# Ответить
15. Virsy 14.12.2009 09:24
А как быть, если объект подключен через Новый(), а не Новый COMОбъект?

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

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

и еще один - модификация пи-кода модуля - это конечно 1С не Совместимо :)
Ответили: (22)
# Ответить
22. dushelov 16.12.2009 13:15
(21) Очень интересно... Есть над чем поломать голову :)
# Ответить
23. dushelov 25.12.2009 16:52
Кстати, прелесть этого подхода - возможность передачи ссылки на объект в фоновое задание, инициированное из клиентского сеанса (из "Руководства разработчика)....
Ответили: (24)
# Ответить
24. Rebelx 06.12.2010 20:46
(23) а ты пробовал передавать com объекты между клиентом и сервером? ИМХО не получится.
Ответили: (25)
# Ответить
25. Душелов 07.12.2010 01:30
(24) Не получится никак. Согласен.
# Ответить
26. Qseft 05.10.2011 16:14
С 8.1 я так понял не прокатит, а жаль. Спасибо за идею.
# Ответить
27. DimaP 16.05.2012 17:07
1-1.5 года назад мучился с подобным, в частности, хранить коннект к другой базе таким образом не полчалось - ком категорически не хотел так сохраняться и восстанавливаться ))
# Ответить
28. rozer 02.11.2012 18:28
Светлая память...
# Ответить
29. Evil Beaver 21.02.2013 12:41
>ПоместитьВоВременноеХранилище(ВК)

Вот это же не будет работать! Во врем. хранилище можно размещать только сериализуемые объекты. В противном случае, сервер будет их убивать по своему желанию, например, при передаче серверного вызова на другую машину кластера. В этот момент он будет сериализовывать значение, лежащее в хранилище (с COM он явно это сделать не сможет).
# Ответить
30. DancingShadow 30.04.2013 10:27
Удобно для объектов у которых нет входящих событий. Т.е. получить из хранилища, вызвать метод получается на ура, а вот обработать входящее событие COM объекта - увы и ах.
# Ответить
31. matashin 12.09.2013 10:40
Реализовывал соединение с MSSQL, все работает в 8.2 через временное хранилище и сохранение ссылки на него в параметрах сеанса, но через некоторое время параметр сеанса становиться неопределен, решил его реинициализацией, по необходимости.
# Ответить
32. piton66 12.12.2013 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 13.12.2013 15:03
Это вроде 8.3 косяк.
# Ответить
Внимание! За постинг в данном форуме $m не начисляются.
Внимание! Для написания сообщения необходимо авторизоваться
Текст сообщения*
Прикрепить файл






IE 2016