|
УФ, внешняя компонента, где хранить объект, созданный из внешней компоненты? | ☑ | ||
---|---|---|---|---|
0
Sewace
14.07.16
✎
15:10
|
Здравствуйте!
Управляемы формы. Есть общая форма. Есть процедура установки связи с внешней компонентой, объявленная "на сервере": &НаСервере Процедура УстановитьСвязьСОборудованием() Попытка Об = Неопределено; ПодключитьВнешнююКомпоненту("ОбщийМакет.НаименованиеМакета","Component",ТипВнешнейКомпоненты.Native); Об = Новый("AddIn.Component.ComponentName"); Исключение Об = Неопределено; КонецПопытки; КонецПроцедуры Подскажите, пожалуйста, где можно теперь этот объект "Об" сохранить в пределах работы этой формы? Мне нужно подключить обработчик ожидания, который будет регулярно из этого объекта получать данные. Но сохранить такой тип в реквизиты формы не могу. Запаковать в ХранилищеЗначений тоже нельзя, в параметры сеанса тоже не получается. |
|||
1
Borteg
14.07.16
✎
15:12
|
(0) объяви переменную в модуле формы. хочешь в модуле приложения и пиши туда.
|
|||
2
luter-89
14.07.16
✎
15:13
|
(1) Хреновый совет про переменную в модуле формы
|
|||
3
luter-89
14.07.16
✎
15:17
|
(0) Обычно создают глобальную переменную в модуле управляемого приложения, потом, например при запуске ее инициализируют
|
|||
4
luter-89
14.07.16
✎
15:18
|
(3) Инициализация происходит обычно на клиенте, насколько я помню
|
|||
5
Sewace
14.07.16
✎
15:18
|
(1)
Не получается. В процедуре создания объекта из внешней компоненты вижу в отладчике, что эта переменная заполняется COM-объектом, а уже при выходе из этой процедуры эта переменная сбрасывается в "Неопределено". Грешу на то, что тип не сериализуется или на то, что я не понимаю, как хранятся значения переменных, обяъвленных в моделе формы :-) |
|||
6
xxTANATORxx
14.07.16
✎
15:21
|
(0)тут советуют обернуть в структуру и в хранилище её
|
|||
7
Sewace
14.07.16
✎
15:23
|
(3)
Вот тоже не получается, она доступна становится только на клиенте. (4) Да вот на клиенте на строку "Об = Новый("AddIn.Component.ComponentName");" падает в исключение со словами "Тип не определен" (6) Спасибо, попробуй сейчас. |
|||
8
luter-89
14.07.16
✎
15:26
|
(5) После серверного вызова серверная переменная обнуляется. Почитай, чтобы более глубоко понимать УФ
http://catalog.mista.ru/public/198766/ |
|||
9
Sewace
14.07.16
✎
15:27
|
(6)
Такая же петрушка. На такой код: Стр = Новый Структура; Стр.Вставить("Об", Об); хз = Новый ХранилищеЗначения(Стр); ругается: "Переданное значение не может быть помещено в ХранилищеЗначений, поскольку не сериализуется или содержит вложенный несериализуемый элемент" |
|||
10
luter-89
14.07.16
✎
15:28
|
(7)
(3) Вот тоже не получается, она доступна становится только на клиенте. Ну, передавай потом ее на сервер переменной. Если ты хочешь ее все время хранить на сервере, возможно ты уже не правильно что-то продумал |
|||
11
Sewace
14.07.16
✎
15:28
|
(8)
Да, понял. Но с сервера на клиент передать объект не могу по причине того, что он не сериализуется. И на создать объект и держать его на клиенте тоже не получается. |
|||
12
luter-89
14.07.16
✎
15:28
|
(6) Что за советчики? COM объекты не сериализуются !!
|
|||
13
luter-89
14.07.16
✎
15:29
|
(11) Может не нужно работать на сервере?
|
|||
14
DrZombi
гуру
14.07.16
✎
15:30
|
(0) На сервере, и да, негде не хранится.
Некоторые умельцы помещают такие объекты Во временное хранилище. Но там ком объекты живут не долго. Система их чистит. |
|||
15
Sewace
14.07.16
✎
15:32
|
(13)
Вот тут не понял. У меня есть подключенный обработчик ожидания на форме, нацеленный естественно на клиентскую процедуру. Я не против в этой клиентской процедуре обратиться на сервер за получением данных (это не очень хорошо, но я готов пойти на компромисс, ведь на клиенте не получается создать COM-объект). Но при обращении на сервер я не могу понять, где искать этот объект (где его сохранить, чтобы потом к нему обратиться) |
|||
16
luter-89
14.07.16
✎
15:34
|
С com объектом нужно работать на клиенте
|
|||
17
luter-89
14.07.16
✎
15:35
|
(15) ))
это не очень хорошо, но я готов пойти на компромисс, ведь на клиенте не получается создать COM-объект На клиенте их и создают! |
|||
18
luter-89
14.07.16
✎
15:36
|
Глобальная клиентская переменная, при запуске инициализируешь, потом работаешь в своей форме с ней. А зачем тебе обработчик ожидания?
|
|||
19
DrZombi
гуру
14.07.16
✎
15:36
|
(0) Читать последнее сообщение
http://forum.infostart.ru/forum86/topic118827/ &НаКлиенте Процедура Поместить(Команда) ПоместитьНаСервере(ХранилищеКомпоненты); КонецПроцедуры &AtServer Procedure ПоместитьНаСервере(ХранилищеКомпоненты) // инициализируем компоненту НесериализумыйВ83Объект = New COMОбъект("V83.Application"); // поместим её в структуру Структура = New Структура("Объект", НесериализумыйВ83Объект); // структуру помещаем в хранилище ХранилищеКомпоненты = ПоместитьВоВременноеХранилище(Структура, ХранилищеКомпоненты); // пробуем получить из хранилища ВК = ПолучитьИзВременногоХранилища(ХранилищеКомпоненты).Объект; EndProcedure |
|||
20
DrZombi
гуру
14.07.16
✎
15:37
|
(9) Временное хранилище
|
|||
21
Serginio1
14.07.16
✎
15:38
|
(14) На самом деле можно запретить выгрузку DLL (через LoadLibrary самой себя) и использовать статические переменные. Я например в своей ВК так и поступаю. У меня проблемы с повторной инициализацией .Net
|
|||
22
DrZombi
гуру
14.07.16
✎
15:38
|
(16) А я бы работал на Сервере, так безопасней.
И как обычно, может только с сервера есть доступ к какому либо ресурсу. |
|||
23
Sewace
14.07.16
✎
15:41
|
(17)
Да, в идеале мне так и нужно. Но я наткнулся на проблему создания объекта на клиенте, а только лишь поменяв атрибут процедуры НаСервере, код заработал, и я начал копать в сторону сохранения объекта на сервере, хотя путь допускаю, что выбрал неправильный. На клиенте пишет "Тип не определен AddIn.Component.ComponentName" |
|||
24
DrZombi
гуру
14.07.16
✎
15:42
|
(23) Может все дело в том, что на Клиенте стоит Другая ОСь либо нет этого комка ;)
|
|||
25
Tateossian
14.07.16
✎
15:43
|
(12) Ты в корне не прав. Читай:
ТипВнешнейКомпоненты.Native |
|||
26
Serginio1
14.07.16
✎
15:43
|
(23) Судя по твоему описанию
ТипВнешнейКомпоненты.Native Это ни какой не COM. Ищи проблему в другом |
|||
27
Tateossian
14.07.16
✎
15:44
|
(12) Но да, dll не сериализуется, тут ты прав.
|
|||
28
DrZombi
гуру
14.07.16
✎
15:45
|
(26) т.е. просто банально нет прав?
|
|||
29
Serginio1
14.07.16
✎
15:45
|
Попробуй создать на клиенте
&НаКлиенте Процедура УстановитьСвязьСОборудованием() Попытка Об = Неопределено; ПодключитьВнешнююКомпоненту("ОбщийМакет.НаименованиеМакета","Component",ТипВнешнейКомпоненты.Native); Об = Новый("AddIn.Component.ComponentName"); |
|||
30
luter-89
14.07.16
✎
15:45
|
(23) Возможно инициализируешь не правильно. ПРоверь параметры, возможно не правильно "Component"
|
|||
31
Tateossian
14.07.16
✎
15:46
|
А что возвращает эта обработка?
|
|||
32
luter-89
14.07.16
✎
15:47
|
(30) Хотя имя тут значение не имеет
|
|||
33
luter-89
14.07.16
✎
15:47
|
Возможно не в zip формате загружена в макет
|
|||
34
luter-89
14.07.16
✎
15:48
|
И компонента точно рабочая?
|
|||
35
Sewace
14.07.16
✎
15:48
|
(29)
Да, вот именно так ругается на строку: Об = Новый("AddIn.Component.ComponentName"); Тип не определен. Но в этом же примере меняю "&НаКлиенте" на "&НаСервере" - и объект создается. |
|||
36
Tateossian
14.07.16
✎
15:49
|
Есть вариант изврата в легкой форме: запускать клиент на сервере отдельным сеансом через cmd, там подключать эту компоненту, вот останется продумать алгоритм обмена. Например, через какой-нибудь файл файловой системе. Возможно, с точки зрения оптимизации это будет работать быстрее, так как не придется постоянно подключать компоненту.
|
|||
37
Sewace
14.07.16
✎
15:49
|
Клиент и сервер - это файловая база у меня на ноуте. Компонента рабочая. "НаСервере" работает. На неуправляемых формах тоже работает.
|
|||
38
Serginio1
14.07.16
✎
15:49
|
29+
ПодключитьВнешнююКомпоненту(<Местоположение>, <Имя>, <Тип>) Параметры: <Местоположение> (обязательный) Тип: Строка. Местоположение внешнего компонента. В качестве местоположения может использоваться: путь к файлу внешнего компонента в файловой системе (недоступно на веб-клиенте), не ZIP-архив; полное имя макета, хранящего двоичные данные или ZIP-архив; URL к внешнему компоненту, в виде двоичных данных или ZIP-архива, в формате, аналогичном ПолучитьНавигационнуюСсылку. <Имя> (обязательный |
|||
39
luter-89
14.07.16
✎
15:50
|
(37) Думаю тебе нужно пообщаться с создателями компоненты
|
|||
40
Serginio1
14.07.16
✎
15:50
|
(35) Укажи путь к файлу.
|
|||
41
Tateossian
14.07.16
✎
15:50
|
(35) На клиенте нет доступа к макету.
|
|||
42
Tateossian
14.07.16
✎
15:51
|
(41) Выгрузи из макета в темп.
|
|||
43
DrZombi
гуру
14.07.16
✎
15:52
|
(37) Лучше поставь к себе сервер и пиши нормально. Файловый вариант не всегда адекватно себя ведет, как на серверной версии. Может случится, что там не будет работать, или наоборот.
|
|||
44
Serginio1
14.07.16
✎
15:55
|
&НаСервере
Функция ПолучитьМакетНаСервере(ИмяМакета) ТекОбъект=РеквизитФормыВЗначение("Отчет"); Макет = ТекОбъект.ПолучитьМакет(ИмяМакета); Возврат Макет; КонецФункции &НаКлиенте Функция ЗаписатьМакет(ИмяМакета,ИмяФайла="") Если ИмяФайла="" Тогда ИмяФайла=ИмяМакета КонецЕсли; Каталог=КаталогВременныхФайлов(); Попытка ИмяФайла=Каталог+ИмяФайла+".dll"; ПолучитьМакетНаСервере(ИмяМакета).Записать(ИмяФайла); исключение Сообщить(ОписаниеОшибки()); конецпопытки; возврат ИмяФайла КонецФункции |
|||
45
Sewace
14.07.16
✎
15:55
|
(41)
Блин, скорее всего! Меня смутило то, что на эту строку программа не ругалась. Сейчас допустил специальную ошибку в наименовании макета, и тоже не ругается на эту строку. Сейчас перестрою код так, чтобы данные из макета гарантировано прочитать. Спасибо большое за наводку! Отпишусь. |
|||
46
Sewace
14.07.16
✎
15:56
|
(44)
За меня код переработали. Спасибо большое! )) |
|||
47
Sewace
14.07.16
✎
16:08
|
Tateossian, Serginio1, luter-89 и всем всем всем большое спасибо! Действительно дело было в макете.
Итого, может кому пригодится, код получился таким: &НаКлиенте Перем Об; &НаСервере Функция ПолучитьМакетНаСервере(ИмяМакета) Макет = ПолучитьОбщийМакет("НаименованиеОбщегоМакета"); Возврат Макет; КонецФункции &НаКлиенте Функция ЗаписатьМакет(ИмяМакета) Каталог = КаталогВременныхФайлов(); Попытка ИмяФайла = Каталог + ИмяФайла + ".dll"; ПолучитьМакетНаСервере(ИмяМакета).Записать(ИмяФайла); Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; Возврат ИмяФайла; КонецФункции &НаСервере Процедура УстановитьСвязьСОборудованием() ИмяФайлаМакета = ЗаписатьМакет("НаименованиеОбщегоМакета"); Попытка Об = Неопределено; ПодключитьВнешнююКомпоненту(ИмяФайлаМакета,"Component",ТипВнешнейКомпоненты.Native); Об = Новый("AddIn.Component.ComponentName"); Исключение Об = Неопределено; КонецПопытки; КонецПроцедуры И далее храню объект в переменной модуля формы (в реквизит произвольного типа не получается записать). |
|||
48
Serginio1
14.07.16
✎
16:12
|
Только наверное
не &НаСервере Процедура УстановитьСвязьСОборудованием() а &НаКлиенте Процедура УстановитьСвязьСОборудованием() |
|||
49
luter-89
14.07.16
✎
16:13
|
(48) Вот вот
|
|||
50
H A D G E H O G s
14.07.16
✎
16:20
|
Жесть какая.
УстановитьВнешнююКомпоненту("ОбщийМакет.НаименованиеМакета"); ПодключитьВнешнююКомпоненту("ОбщийМакет.НаименованиеМакета","Component",ТипВнешнейКомпоненты.Native); |
|||
51
Tateossian
14.07.16
✎
16:30
|
(50) Пришел серьезный дядька и в две строки переписал весь код:)
|
|||
52
sitex
naïve
14.07.16
✎
16:38
|
(51) + он всем разбил моск))) и расстроил.
|
|||
53
Sewace
14.07.16
✎
16:48
|
(48), (49) Да, конечно!
|
|||
54
luter-89
14.07.16
✎
16:48
|
(50) Что - то не заметил отсутствие в коде сабжа УстановитьВнешнююКомпоненту
|
|||
55
Serginio1
14.07.16
✎
16:52
|
УстановитьВнешнююКомпоненту (InstallAddIn)
Синтаксис: УстановитьВнешнююКомпоненту(<Местоположение>) Параметры: <Местоположение> (обязательный) Тип: Строка. Строка, определяющая местоположение внешнего компонента. В качестве строки может использоваться: полное имя макета, в котором хранится внешний компонент в архиве; URL к внешнему компоненту, упакованному в ZIP-архив, в формате, аналогичном ПолучитьНавигационнуюСсылку(). Описание: Доставляет объект внешнего компонента с сервера на клиент, после чего он становится доступен для метода ПодключитьВнешнююКомпоненту |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |