|
Размышления и теория - как хранить COM-объект &НаСервере после выполнения процедур | ☑ | ||
---|---|---|---|---|
0
Caber
31.01.22
✎
07:59
|
Все переменные &НаСервере и данные этих процедур очищаются после того, как они будут выполнены. С этим мы смирились.
Но COM-объект, это не совсем внутренняя часть инфрастуктуры 1С, поэтому, возможно, есть лазейка. Дело в том, что мне приходится работать с COM-объектом, который, к сожалению, невозможно использовать в процедурах &НаКлиенте. Возникла проблема - при каждом действии приходится создавать объект, что занимает много времени (несколько секунд). Я задумался - что можно придумать, чтобы COM-объект висел созданным каким либо образом. Есть мысли или опыт реализации такого костыля? |
|||
1
Ryzeman
31.01.22
✎
08:09
|
Насколько я понимаю то, что ты хочешь сделать нельзя, так как ни во временное хранилище COM-объекты не кладутся ни с клиента на сервер и назад не передаются.
Вопрос - а зачем в принципе во время работы с com-объектом бегать на клиент постоянно? Нельзя ли переписать логику так, что бы опросить изменения на клиенте сразу и внести нужные изменения в объект? Вариант - сериализовать объект в допустимую для 1с сущность, и после изменений её на клиенте один раз записать на сервере. |
|||
2
Мультук
гуру
31.01.22
✎
08:12
|
(0)
&НаСервере Функция УстановитьСоединение_Бухгалтерия(Соединить = Ложь) пСтр = неопределено; Если не пустаяСтрока(Объект.АдресВХранилище) Тогда пСтр = ПолучитьИзВременногоХранилища(Объект.АдресВХранилище); КонецЕсли; Если (пСтр = неопределено) или Соединить Тогда Парам = СтрокаСоединения_Бухгалтерия(); V83COMConnector= Новый COMОбъект("V83.COMConnector"); Попытка соед = V83COMConnector.Connect(Парам); пСтр = Новый Структура("COMОбъект", соед); Объект.АдресВХранилище = ПоместитьВоВременноеХранилище(пСтр, ЭтаФорма.УникальныйИдентификатор); Исключение Сообщить("Ошибка подключения к внешней системе !" + ОписаниеОшибки()); КонецПопытки; Иначе соед = пСтр.COMОбъект; КонецЕсли; Возврат соед; КонецФункции |
|||
3
Chai Nic
31.01.22
✎
08:15
|
Тема существует столько же, сколько и управляемое приложение.
Способов фактически два. 1. Возвращать внешний объект из общего модуля с галкой повторного возвращения значений 2. Сериализовать его в составе структуры и хранить в параметрах сеанса Оба способа натыкаются на проблемы. а. Время хранения кэшированных значений не более 20 минут, а если платформа считает что памяти мало - то и того меньше б. Объекты, на которые 1с "не видит" ссылку в явном виде (а сериализованную она не видит) считаются мусором и могут удалиться в любое время. в. Объект существует в контексте рабочего процесса в случае клиент-сервера. А рабочих процессов мало того что может быть несколько, так они могут быть ещё и на нескольких серверах. Так что, по обоим вариантам нужно проверять перед использованием, является ли то, что получено, именно COM-объектом и живой ли он. Ну и периодически есть риск, что получить не удалось и придется заново инициализировать объект, с соответствующими задержками... |
|||
4
Гений 1С
гуру
31.01.22
✎
08:16
|
(0) сделай отдельный процесс на сервере, который крутит бесконечный цикл и обрабатывает очередь (например через регламентное задание)
помещай в РС очереди заявки, а процесс будет их отрабатывать и помещать результат. Тогда COM на сервере может жить вечно. Ну, единственно надо прописать логику запуска службы, если она отвалилась. |
|||
5
Chai Nic
31.01.22
✎
08:18
|
(4) Вариант, но имеет недостаток в виде кванта времени. То есть, мгновенной реакции не получится.
|
|||
6
Caber
31.01.22
✎
08:38
|
(3) > Возвращать внешний объект из общего модуля с галкой повторного возвращения значений
- Это что получается, COMОбъект, созданный в таком модуле, и вправду не уничтожается после завершения процедуры? интересно... > Сериализовать его в составе структуры и хранить в параметрах сеанса - Я тут не до конца понимаю, как это физически работает. Сериализация, насколько я понимаю, это представление какого либо физического объекта в виде снимка, что то вроде дампа оперативной памяти. Так как com-объект это вполне себе работающий процесс, то может быть его и можно сериализовать, то вот обратно - нет. Или я не так понимаю эту архитектуру. (4) хитро. Учитывая, что есть способы бесконечного цикла без загрузки ЦП, то вполне себе рабочий вариант. |
|||
7
acht
31.01.22
✎
08:39
|
(0) > Но COM-объект, это не совсем внутренняя часть инфрастуктуры 1С
А переменная, куда ты кладешь COM-объект - это вот гарантировано внутренняя часть инфрастуктуры 1С. |
|||
8
Chai Nic
31.01.22
✎
08:39
|
(6) Сериализация в 1с - это превращение объекта в строку. Параметры сеанса и объекты временного хранилища хранятся именно как строки. При сериализации COM-объекта по сути происходит сериализация ссылки на него.
|
|||
9
Chai Nic
31.01.22
✎
08:42
|
+(8) И про "десериализации" мы получаем некую ссылку, а вот что там за этой ссылкой - хрен знает. Если нам повезло и мы попали на тот же рабочий процесс, а объект не был вычищен сборщиком мусора - то ура. Иначе увы.
|
|||
10
Megas
31.01.22
✎
08:43
|
(3) Дольше =)
Я таким вопросом задавлся ещё году в 2008, что бы com жил на сервере а к нему обращались с клиента. Единственное что пришло в голову это что Гений описал в (4). И не реализовал так как отклик будет долгий и много писанины. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |