Имя: Пароль:
1C
1С v8
Передать 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) ну или пытаться через временное хранилище хранить между вызовами .но  Не уверен что оно ком удержит
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший