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