|   |   | 
| 
 | 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 | 
        (21)+ да уж. v8: Жизнь Переменной до закрытия обработки     | |||
| 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+ - это как раз то, что нужно - причём всё делает сама система - просто нужно настроить.     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |