Имя: Пароль:
1C
1С v8
COMОбъект - многоразовый
,
0 DownloadMASTER
 
09.12.13
23:01
Клиент-сервеный режим работы
Хочу один раз создать COMОбъект не важно откуда, через регламентное задание или из формы по кнопке
и использовать его многоразово, чтобы не создавать COMОбъект, если он уже создан

Создаю COMОбъект и сохраняю его адрес в константу:

Константы.КонстантаСтроковогоТипа.Установить(ПоместитьВоВременноеХранилище(COMобъектЭкселя,Новый УникальныйИдентификатор));

А когда мне надо проверить есть ли уже созданный объект делаю:

COMобъектЭкселя    = ПолучитьИзВременногоХранилища(Константы.КонстантаСтроковогоТипа.Получить());

Проблема в том, что если запустить регламентное задание и из-под него прочитать адрес хранилища - он будет заполнен правильным адресом, а вот если получить значение из адреса, то результат будет Неопределено.

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

Использовал изначально статью:
Хранение COM Объектов на Сервере ТонкогоКлиента
http://kb.mista.ru/article.php?id=787
Но в моем случае ПараметрыСеанса не подходят.
1 Dethmont
 
09.12.13
23:34
Почему не подходят параметры сеанса? Ты хочешь заюзать один COM объект для всех пользователей?
2 EvgeniuXP
 
09.12.13
23:37
используй С# и веб-сервис :)
3 DownloadMASTER
 
10.12.13
00:22
> Почему не подходят параметры сеанса?
пробовал. При создании на сервере инициалиирую
Но когда сеанс другой запускается, параметр сеанса опять неинициализирован

> Ты хочешь заюзать один COM объект для всех пользователей?
Да, для всех юзеров, для всех регламентных заданий
4 ДенисЧ
 
10.12.13
00:28
Ерунду придумал....
Создаю на толстом клиенте объекта, записываю.
А потом читаю его из веб-клиента на каком-нибудь андройде.
А потом на сервере на линухе.
И что имеем?
5 DownloadMASTER
 
10.12.13
00:54
ДенисЧ, все под вендой, вебсервисы к COMобъекту обращаться не будут.
6 DownloadMASTER
 
10.12.13
01:05
посмотрел на партнерском форуме всплывал подобный вопрос в 2010 году.

из 1С никто не ответил, закончилось высказыванием:
"Фоновые задания это разные процессы а COM-объект живет в адресном пространстве породившего его процесса"

но мне надо многоразово использовать один и тот же уже созданный COMобъект из пользовательского режима и из фоновых заданий...
7 Записьдампа
 
10.12.13
01:15
(6) >но мне надо
Пуговичку на затылок.

Не взлетит. В общем случае фоновые и сеансы могут жить на разных серверах кластера и про друг друга не подозревать вообще. Максимум, можно попробовать - закэшировать в рамках одного сеанса через модули повторного использования.
8 DownloadMASTER
 
10.12.13
09:27
Есть еще в глобальном контексте:

ПолучитьCOMОбъект(<ИмяФайла>, <ИмяКлассаCOM>)
Параметры:

<ИмяФайла> (необязательный)

Тип: Строка.
Имя файла, включающее полный путь.
<ИмяКлассаCOM> (необязательный)

Тип: Строка.
Имя класса COM, экземпляр которого должен быть создан или получен. Если расширение имени файла, указанное в первом параметре полностью идентифицирует класс объекта, то параметр может быть опущен.
Возвращаемое значение:

Тип: COMОбъект.


Проблема в том, что нужный мне COMобъект при инициализации загружает в память EXE файл. И при попытке к нему обратиться через ПолучитьCOMОбъект(ПутьДоФайла) одинес говорит, что Расширение файла неправильное...
9 Serginio1
 
10.12.13
11:14
Вообще DLL особо не выгружаются из процесса. Так, что повторное обращение минимально по времени. Для .exe проще использовать сервисы COM+
http://www.steeltrace.ru/details/articleid/22/регистрация-1с-com-компонента-для-работы-с-64-битными-приложениями.aspx
10 Rebelx
 
10.12.13
11:19
(0) гугли "синглтон"
11 ДенисЧ
 
10.12.13
11:23
(10) Нафига тут синглетон, если задача изначально нерешаема в общем виде?
12 DownloadMASTER
 
10.12.13
11:24
Serginio1, спасибо посмотрю

Да, если бы в моем случае это был чистый COM то проблем не возникло, а тут получается аплликейшен
13 IKSparrow
 
10.12.13
11:28
(0) Модуль с повторным использованием значений на время сеанса. Вот твоё решение.
14 mikecool
 
10.12.13
11:30
в чем проблема создавать ком, когда он нужен?
15 ДенисЧ
 
10.12.13
11:31
(14) Соединение иногда идёт по 10-30 секунд. Не всегда это приёмлемо.
16 Rebelx
 
10.12.13
11:34
(11) с какого перепугу не решаема? у меня есть готовое решение работающее в рамках одного рабочего процесса, правда только на 8.1 тестилось.
17 Ork
 
10.12.13
11:35
(14) + 100500
Тем более, что речь идет о мелкософтофском екселе. Там такая тема - когда создается экземпляр олеобъекта и олесервер уже запущен - олеобъект цепляется к УЖЕ ЗАПУЩЕННОМУ экземпляру олесервера. А не создает новый.

Таким макаром - все уже украдено /*заложено в логику олесервера*/ до нас и ТС.
18 Rebelx
 
10.12.13
11:44
(17)чет я про ексель не нашел упоминания...
19 mistеr
 
10.12.13
11:45
(6) >мне надо многоразово использовать один и тот же уже созданный COMобъект из пользовательского режима и из фоновых заданий...

Жесть. Готов спорить, ты не сможешь внятно обосновать это "нужно". Ты правда хочешь, чтобы сеансы ждали друг друга на этих вызовах?

В принципе, все решается. Например, через дополнительную ВК и DCOM. Но не нужно.
20 mikecool
 
10.12.13
11:45
(15) хренассе бъект ((
21 Жан Пердежон
 
10.12.13
11:47
на мисте новая традиция: каждую неделю новая тема про ComОбъект и как его хранить между клиентскими вызовами.
22 ДенисЧ
 
10.12.13
11:51
(20) Соедниение со скулем или 1с-ом.
23 ДенисЧ
 
10.12.13
11:51
(16) С того, что оно хочет не в рамках одного процесса.
24 acsent
 
10.12.13
11:55
Нужно свой мультиплексор писать
25 Ork
 
10.12.13
11:56
(18) В (0) русским по белому написано "COMобъектЭкселя"
26 Infsams654
 
10.12.13
12:02
27 Rebelx
 
10.12.13
12:02
(25) ну да, я именов не читал.
тогда надо просто писать COMобъектЭкселя = ПолучитьCOMОбъект(<ИмяФайла>)
28 Serginio1
 
10.12.13
12:03
Еще можно запустить Эксель а к нему уже подключаться
как
http://www.cyberforum.ru/delphi-beginners/thread822393.html
GetActiveOleObject('Excel.Application');
29 vde69
 
модератор
10.12.13
12:14
а кто вообще спросил каким образом теоретически может жить экземпляр ком обьекта на кластере серверов 1с?

ведь реально рхосты выполняются на физически разных серверах, при чем возможно даже с разными операционками!

поэтому хотелка автора в общем случае - бред!
30 ДенисЧ
 
10.12.13
12:22
(29) Вообще-то я об это твержу с самого начала....
31 DownloadMASTER
 
10.12.13
12:47
эксель в имени просто как пример приведен.
надо запускать http://winscp.net/eng/docs/library

там при поднятии
Session    = Новый COMОбъект("WinSCP.Session");
тут опредеяем настройки и делаем
Session.Open(Структура.SessionOptions);

в процессах появляется WinSCP.exe

т.е. я хочу один раз поднять его и дальше юзать
32 DownloadMASTER
 
10.12.13
13:00
Также понятны доводы почему этого нельзя сделать стандартно из 1С
Надо пробовать предложенные сторонние средства, были бы примеры по-подробнее
33 acsent
 
10.12.13
13:02
(29) отдельный сервер под ком ))
34 DownloadMASTER
 
10.12.13
14:46
Ок
спасибо всем кто принял участие в обсуждении
35 kiruha
 
10.12.13
14:55
А почему нельзя для каждого юзера инициализировать ?
Ну подождет он 20 сек при инициализации, а потом сможет пользоваться целый день
36 vde69
 
модератор
10.12.13
16:19
(35) не сможет, по тому, что 1с не содержит в себе средств с помощью которых можно гарантировать что все запросы одной сесии будут исполнятся в одном рхосте. (что к слову сказать правильно)
37 Жан Пердежон
 
10.12.13
17:24
(36) если хост один, то очень даже может
38 Torquader
 
11.12.13
13:47
На самом деле, проблемы с созданием одного объекта на все процессы никакой нет. Только делать это нужно внутри самого объекта, и жить он должен в отдельном процессе - тогда в каждом процессе будут создаваться только заглушки для передачи данных, но обмен с объектом будет очень медленный.
Если же мы хотим передать ссылку на COM-объект из одного процесса в другой, то в общем случае, мы получаем кучу проблем - если COM-объект живёт в адресном пространстве одного процесса, то его методы могут вызываться напрямую, а из другого процесса эти методы должны вызываться через заглушки - также нужна гарантия, что процесс не завершится, иначе все остальные получат ссылку на того, кого уже нет.
В случае 1С никто не даст гарантию, что процесс, создавший объект не будет завершён, а передачи объекта из одного процесса в другой просто нет.
39 vde69
 
модератор
11.12.13
14:18
>>>а из другого процесса эти методы должны вызываться через заглушки

не правда, из одного процесса можно напрямую использовать любую незащищенную память любого процесса. На сколько я понимаю так работает например "снегопат"
40 Torquader
 
11.12.13
14:23
(39) И как предполагается использовать память, если физическая память проецирована в разные адресные пространства двух процессов.
Понятно, что можно сделать копирование данных, например есть даже WM_COPYDATA, но осознанную информацию получить будет проблематично - например, если в объекте где-то есть ссылка на другой блок памяти, то другому процессу такая ссылка ничего не скажет - адреса-то разные.
41 vde69
 
модератор
11.12.13
15:29
(40) что-то типа GlobalDosAlloc, на память не помню, в msdm  читал описание как можно помещать свай код в память чужих процессов. (разумеется если прав хватает)
42 EvgeniuXP
 
11.12.13
19:23
(3) тебе ж сказали, используй С# и веб-сервис и твоя хотелка удовлетворена.
43 Torquader
 
11.12.13
19:46
(41) Таки и WriteProcessMemory никто не отменял.
А про CreateRemoteThread я вообще молчу.
Только чем это поможет COM-объекту, который живёт и работает в памяти одного процесса и ничего не знает про другие, а для RPC-вызовов должна использоваться очередь событий того потока, в котором живёт сам объект (также не забываем, что в одном процессе может быть несколько потоков, у которых память общая, а стеки находятся в разных местах).
44 mistеr
 
12.12.13
10:18
(38) (39) Читайте про DCOM.
45 kiruha
 
12.12.13
10:31
Я так и не понял что в итоге -
у меня есть com объект долго инициализирующийся - порядка 20 сек. Хотелось бы его сохранить, хотя бы для одного пользователя.
На данный момент как в 1С делать ?
46 ДенисЧ
 
12.12.13
10:33
(45) в 8.2 - хранилище значения и при получении проверять на живость.
В 8.3 - функция в общем модуле с кешированием результатов.
47 kiruha
 
12.12.13
10:35
(46)
На живость - Неопределено, или попытка выполнить метод ?
48 kiruha
 
12.12.13
10:35
Или типЗнч
49 ДенисЧ
 
12.12.13
10:37
(47) Сначала неопределено, потом вызов метода в попытке.
50 Serginio1
 
12.12.13
10:42
51 kiruha
 
12.12.13
10:46
(49)
Ок, спасибо !
52 Torquader
 
13.12.13
23:33
(50) Вот-вот и я тоже вспоминал, что COM+ - это как раз то, что нужно - причём всё делает сама система - просто нужно настроить.
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.