|
Передать COM объект из модуля объекта в модуль формы | ☑ | ||
---|---|---|---|---|
0
prostovityaz
22.06.16
✎
12:35
|
Сейчас реализовано криво...
Внешняя обработка. в модуле объекта сделал подключение к другой БД: Перем ГлСоеди Экспорт; Функция ПолучитьПодключениеКБД() Экспорт Параметры = ПутьКБазеДанныхРезультатов; V83COMConnector= Новый COMОбъект("V83.COMConnector"); Попытка ГлСоеди = V83COMConnector.Connect(Параметры); Возврат ГлСоеди; Исключение сообщить("Ошибка подключения!"); Возврат Неопределено; КонецПопытки; КонецФункции ГлСоеди - это переменная экспортная в модуле объекта. Получить в модуле формы чёто не соображу как. В модуле формы &НаСервере вызываю функцию ПолучитьПодключениеКБД(). Запихиваю её в переменную в модуле формы. Но как только перехожу &НаКлиент, переменная в модуле формы становится "Неопределено". Как эту глобальную переменную вызвать в модуле формы &наСервере? Или как реализовать иначе? |
|||
1
aleks_default
22.06.16
✎
12:38
|
перенести создание комобъекта в серверный модуль формы
|
|||
2
prostovityaz
22.06.16
✎
12:46
|
(1) да, но если дальше из клиента перейти в процедуру, которая выполняется на сервере, отладчик определяет как "Неопределено" соединение, которое я раньше синициализировал.
|
|||
3
prostovityaz
22.06.16
✎
13:37
|
тема умерла? :)
|
|||
4
Пикчер
22.06.16
✎
13:42
|
(2) ком объект мутабельный - изменяемый. Это значит с его передачей между клиентом и сервером будут проблемы. Попробуй обойтись без передач
|
|||
5
ovrfox
22.06.16
✎
13:51
|
Во первых на форме СОМ объект не имеет смысла. В смысле на клиенте.
На сервере при вызове различных процедур получаем разный контекст сервера. Как передать значение - обычно значение передают через "ХранилищеЗначения", если оно имеет не простой тип. Для СОМ объекта не прокатит. Остается мало вариантов, точнее один - через общую переменную. Это может быть глобальная переменная из глобального модуля или переменная из модуля сеанса пользователя. |
|||
6
ovrfox
22.06.16
✎
13:53
|
Кстати, если у тебя табличные внешние данные, лучше подключить их к конфигурации через внешние источники данных.
|
|||
7
Пикчер
22.06.16
✎
14:26
|
(2) (5) наверно есть еще способ. Проблема так понял в серверных вызовах. Сервер не хранит контекст между вызовами. Тогда ком можно положить в структуру, которая сериализуется и структуру уже во временное хранилище поместитьвовременноехранилище
|
|||
8
prostovityaz
22.06.16
✎
14:50
|
(7) в структуре сом соединение теряется.
у меня что-то в таком духе в модуле формы: перем СоединениеСВнешнейБД; &НаКлиенте Процедура ВыполнитьЗаписьСвойствФормы() форма = получитьформу("документ."+МойДокумент+".ФормаОбъекта"); //получил я форму для каждого Свойство из Форма цикл СвойстваВоВнешнююБД(Свойство, МойДокумент); конеццикла; КонецПроцедуры &НаСервере Процедура СвойстваВоВнешнююБД(Свойство, МойДокумент) СоединениеСВнешнейБД = ПолучитьПодключение(); если подключение <> Неопределено тогда ЗаписатьСвойстваВоВнешнююБД(Свойство, МойДокумент); иначе возврат; конецесли; конецпроцедуры &НаСервере Функция ПолучитьПодключение() ПараметрыДляСоед = Объект.ПутьКБазеДанныхРезультатов; V83COMConnector= Новый COMОбъект("V83.COMConnector"); Попытка Соединение = V83COMConnector.Connect(ПараметрыДляСоед); Возврат Соединение; Исключение сообщить("Ошибка подключения! "+ ОписаниеОшибки()); Возврат Неопределено; КонецПопытки; КонецФункции &НаСервере Процедура ЗаписатьСвойстваВоВнешнююБД(толькопросмотр , доступность, МойДокумент) НоваяЗапись =СоединениеСВнешнейБД.РегистрыСведений.СвойстваОбъектовМетаданныхДокументов.СоздатьМенеджерЗаписи(); тз.период = ТекущаяДата(); тз.Конфигурация = метаданные.Имя; тз.версия = метаданные.Версия; тз.Синоним = метаданные.Синоним; тз.Свойство = Свойство; тз.имяДокумента = МойДокумент; тз.записать(); КонецПроцедуры что-то в таком духе... но тут будет постоянное, для каждого свойства из формы, обращение с попыткой соединиться... как оптимизировать, я хз... код писал из головы. |
|||
9
aleks_default
22.06.16
✎
14:56
|
бред
|
|||
10
Nuobu
22.06.16
✎
15:00
|
(8) Тебе в (1) и (5) сказали, чтобы ты весь код по созданию и использованию КОМа перенёс на сервер. Это значит, что на клиенте ты что-то заполняешь, меняешь какие-то значения. Потом жмакаешь кнопку, вызывая серверную процедуру, где это всё отправляешь по КОМу. А постоянно держать его в "памяти" не нужно, старайся избегать этого.
|
|||
11
ovrfox
23.06.16
✎
09:37
|
(8) поставь директиву на &НаСервере перед объявлением переменной, а еще лучше передавай соединение в явном виде в вызываемую процедуру.
|
|||
12
Пикчер
23.06.16
✎
09:44
|
(11) она все равно потеряется. Не хранит серевер данные между вызовами с клиента. И передать его нельзя - мутабельное. Нужно каждый раз создавать соединение заново.
|
|||
13
Пикчер
23.06.16
✎
09:45
|
(12) ну или пытаться через временное хранилище хранить между вызовами .но Не уверен что оно ком удержит
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |