Имя: Пароль:
1C
 
Передача СОМ-объекта с клиента на сервер
0 Max Street
 
19.11.15
13:19
Привет. Как передать СОМ-объект с клиента на сервер?
Пробовал так:

V8 = Новый COMОбъект("V83.Application");
РезультатПодключения = V8.Connect(ПараметрыСоединения);
Объект.АдресВХ = ПоместитьВоВременноеХранилище(V8, Новый УникальныйИдентификатор());
//где Объект.АдресВХ - реквизит типа Строка неограниченной длины

и вот так:

V8 = Новый COMОбъект("V83.Application");
РезультатПодключения = V8.Connect(ПараметрыСоединения);
СтруктураСОМ = Новый Структура("СОМ", V8);
Объект.АдресВХ = ПоместитьВоВременноеХранилище(СтруктураСОМ, Новый УникальныйИдентификатор());

в обоих случаях одна ошибка:

Ошибка помещения значения во временное хранилище
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'request':

Процедуры по переносу находятся в модуле объекта. Туда и нужно передать V8
1 ДенисЧ
 
19.11.15
13:20
Никак не передашь.
2 Чайник Рассела
 
19.11.15
13:20
(1) только хотел про тебя написать
3 VikingKosmo
 
19.11.15
13:21
Не передавать COM соединение, а создавать его сразу на сервере
4 Чайник Рассела
 
19.11.15
13:22
+(3) еще лучше в общем модуле с повторным использованием значений на время сеанса
5 Max Street
 
19.11.15
13:23
(3) пробовал процедуру установки соединения перенести в модуль объекта, но так соединение не устанавливается вообще
6 VikingKosmo
 
19.11.15
13:25
может потому что сервер не в курсе, куда коннектиться нужно?
7 los_hooliganos
 
19.11.15
13:25
(5) Сервера на разных физических. На тот к которому подключаетесь должны быть права и разрешения у того кто подключается.
А в связи с глюковастостью 8.2/3 желательно идентичные логин/пароли для серверов 1С.
8 Max Street
 
19.11.15
13:31
(6) еще как в курсе. в ПараметрыСоединения содержится строка, в которой указаны путь к базе(файловая), имя пользователя, пароль
9 Nuobu
 
19.11.15
13:31
(0) ХранилищеЗначения пробовал?
10 Max Street
 
19.11.15
13:33
(9) нет, сейчас попробую, спасибо
11 VikingKosmo
 
19.11.15
13:33
(8) а доступ с сервера 1С, к диску на котором база лежит, хоть есть?
12 ДенисЧ
 
19.11.15
13:33
А давайте подумаем...
Что произойдёт, если программа этого кома на клиенте установлена, а на сервере нет?
13 Cyberhawk
 
19.11.15
13:34
Нужно не просто через хранилище значения, а поместить СОМ-объект в структуру, а ее уже в хранилище значения
14 Max Street
 
19.11.15
13:35
(11) есть конечно
15 VikingKosmo
 
19.11.15
13:36
(14) ну так и в чем проблема все делать на сервере?!
16 DexterMorgan
 
19.11.15
13:37
А почему сразу на сервере нельзя создать ком?
17 Max Street
 
19.11.15
13:38
(15) (16) я сразу так и делал, но соединение не устанавливается. только на клиенте получилось
18 VikingKosmo
 
19.11.15
13:39
(17) а разобраться, почему на сервере не устанавливается?
19 Fish
 
19.11.15
13:40
(17) А какие ошибки были?
20 Max Street
 
19.11.15
13:41
(18) (19) да никаких ошибок. в списке процессов только видно, что соединение устанавливается, но через секунду пропадает.
21 VikingKosmo
 
19.11.15
13:42
(20) а как узнал, что ошибок не было?
22 Max Street
 
19.11.15
13:43
(21) сообщений с ошибками не выдавало
23 DexterMorgan
 
19.11.15
13:59
(17) Надо разбираться почему
24 Max Street
 
19.11.15
14:00
(23) Уже пробовал - никаких идей. А у тебя?
25 Fish
 
19.11.15
14:01
(24) Отладчиком смотрел?
26 Max Street
 
19.11.15
14:01
Господа, а кто-нибудь пробовал устанавливать соединение и переносить данные на стороне сервера?
27 DexterMorgan
 
19.11.15
14:02
(24) ну а ком объект создается в отладке? у пользователя в параметрах соединения есть право внешнего соединения?
28 DexterMorgan
 
19.11.15
14:03
(26) да конечно пробовали =)
29 cw014
 
19.11.15
14:03
(24) Журнал регистрации курил? Пробовал при "отвале" в Попытку Исключение с сообщением об ошибке?
30 vde69
 
19.11.15
14:04
если COM объект зарегистрирован на сервере 1с или используется удаленный вызов то нужно

пользователю под которым работает сервер 1с (служба) нужно добавить права "пользователь DCOM" после этого перезагрузить сервер 1с

во всех других случаях - ничего не выйдет
31 DexterMorgan
 
19.11.15
14:05
(30) точно кста, сам сталкивался =)
32 Tateossian
 
19.11.15
14:06
(26) У меня регламентно данные с одной базы в другую так на сервере переносятся.
33 Max Street
 
19.11.15
14:07
сейчас перенесу процедуру по установке соединения на сервер и отпишусь
34 vde69
 
19.11.15
14:08
(31) я кстати сам допер в свое время, когда делал в регламенте выгрузку отчетов в ексель... копался целый день пока допер... в тот момент в инете подсказок на эту тему еще не было вообще...
35 Nuobu
 
19.11.15
14:09
(13) А зачем? Разве ты помещаешь в структуру таблицу значений, чтобы получить её в другом серверном вызове?
36 Tateossian
 
19.11.15
14:13
Я помню еще как-то ручками прописывал компоненту COM+, но там был сервер x64.
37 Max Street
 
19.11.15
14:20
Перенес процедуру по установке соединения в модуль объекта. Отладчик показывает, что V8 имеет тип СОМОбъект. В списке процессов появляется нужный процесс, через секунду исчезает. при запуске процедуры по переносу из v8 вылетает ошибка:

Значение не является значением объектного типа (NewObject)
Запрос = V8.NewObject("Запрос");
38 vde69
 
19.11.15
14:22
весь код покажи
39 Max Street
 
19.11.15
14:22
(9) хранилище значений тоже не подходит, т.к его можно создать только на сервере, а сом-объект на сервер не передать
40 Max Street
 
19.11.15
14:24
(28)
Процедура УстановкаСоединения() Экспорт
    
    ПараметрыСоединения = "File="""+СокрЛП("C:\test\перенос131115\настройки")+"""; Usr="""+СокрЛП("Иванов")+"""; Pwd="""+СокрЛП("123456")+""";";
    V8 = Новый COMОбъект("V83.Application");
    РезультатПодключения = V8.Connect(ПараметрыСоединения);
    Каталог_1С = V8.Метаданные.Имя;
    Сообщить("Соединение установлено");
    
КонецПроцедуры

Процедура ПервоначальныеНастройки() Экспорт
        
    Запрос = V8.NewObject("Запрос");
    Запрос.Текст =
    "ВЫБРАТЬ
    |    *
    |ИЗ
    |    Константы КАК Константы";
    
    ТЗ = Запрос.Выполнить().Выгрузить();
            
    НачатьТранзакцию();
            
    Для Каждого Элемент Из ТЗ.Колонки Цикл
        ЗначениеТЗ = ТЗ.Получить(0)[Элемент.Заголовок];
        Если ТипЗнч(ЗначениеТЗ) = Тип("Булево") ИЛИ ТипЗнч(ЗначениеТЗ) = Тип("Число") ИЛИ ТипЗнч(ЗначениеТЗ) = Тип("Дата")
            ИЛИ ТипЗнч(ЗначениеТЗ) = Тип("Строка") Тогда
            Константы[Элемент.Заголовок].Установить(ЗначениеТЗ);
        КонецЕсли;
    КонецЦикла;
    
    ЗафиксироватьТранзакцию();

КонецПроцедуры
41 Nuobu
 
19.11.15
14:24
(37) Потому что делал без попытки.
42 Max Street
 
19.11.15
14:24
(38)

Процедура УстановкаСоединения() Экспорт
    
    ПараметрыСоединения = "File="""+СокрЛП("C:\test\перенос131115\настройки")+"""; Usr="""+СокрЛП("Иванов")+"""; Pwd="""+СокрЛП("123456")+""";";
    V8 = Новый COMОбъект("V83.Application");
    РезультатПодключения = V8.Connect(ПараметрыСоединения);
    Каталог_1С = V8.Метаданные.Имя;
    Сообщить("Соединение установлено");
    
КонецПроцедуры

Процедура ПервоначальныеНастройки() Экспорт
        
    Запрос = V8.NewObject("Запрос");
    Запрос.Текст =
    "ВЫБРАТЬ
    |    *
    |ИЗ
    |    Константы КАК Константы";
    
    ТЗ = Запрос.Выполнить().Выгрузить();
            
    НачатьТранзакцию();
            
    Для Каждого Элемент Из ТЗ.Колонки Цикл
        ЗначениеТЗ = ТЗ.Получить(0)[Элемент.Заголовок];
        Если ТипЗнч(ЗначениеТЗ) = Тип("Булево") ИЛИ ТипЗнч(ЗначениеТЗ) = Тип("Число") ИЛИ ТипЗнч(ЗначениеТЗ) = Тип("Дата")
            ИЛИ ТипЗнч(ЗначениеТЗ) = Тип("Строка") Тогда
            Константы[Элемент.Заголовок].Установить(ЗначениеТЗ);
        КонецЕсли;
    КонецЦикла;
    
    ЗафиксироватьТранзакцию();

КонецПроцедуры
43 vde69
 
19.11.15
14:54
мда....


1. у тебя что лежит НА СЕРВЕРЕ ПО АДРЕСУ "C:\test\перенос131115\настройки" ??? вероятно на сервере такого вообще нет....

2. "V83.Application" - не будет работать по определению, там есть оконные функции, тебе нужен не OLE а COM конектор

3. убери у всех процедур слово "Экспорт", это даст гарантию что нет клиент/серверных переходов

и т.д.
44 vde69
 
19.11.15
14:57
а вообще не парь мозг, используй конвертацию данных, там все куда проще...
45 Max Street
 
19.11.15
17:09
(43) Я переношу из файловой базы. На что заменить "V83.Application"?
46 vde69
 
19.11.15
18:50
47 Cyberhawk
 
19.11.15
19:03
(35) нет, для ТЗ Я использую преобразование в массив структур и обратно (это если нет желания или возможности использовать временное хранилище).
А по поводу СОМ-а - в 8.3 это такой хак: http://goo.gl/kC6YOq
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс