Имя: Пароль:
1C
1С v8
Не могу понять, вызывает ли сервер 1С внешнюю компоненту...
0 max735
 
30.04.14
11:21
Здравствуйте,
пытаюсь запустить внешнюю компоненту на сервере 1С. Для этого:
Сделал обработку в конфигурации с галочкой "Сервер".
В обработку поместил вызов функции ПодключитьВнешнююКомпоненту(mProgID).
В качестве результата получаю "Ложь".
Смотрю запросы к регистрам с помощью программы procmon (ProcessMonitor),
запросов не вижу. Если переключаю обработку в клиентский режим, то запросы идут.
Соответственно вопрос: может ли сервер 1С в принципе вызывать внешние компоненты, если да, то что я могу делать не так?
Все это делается в предположении, что 64-битный сервер требует 64-битной компоненты, но, если я правильно понимаю, на данном этапе просто не происходит попытки что-либо получить от регистра.

Спасибо.
1 Maxus43
 
30.04.14
11:21
Сделал обработку в конфигурации с галочкой "Сервер".

что?
2 H A D G E H O G s
 
30.04.14
11:24
Вариант синтаксиса: По идентификатору

Синтаксис:

ПодключитьВнешнююКомпоненту(<ИдентификаторОбъекта>)
Параметры:

<ИдентификаторОбъекта> (обязательный)

Тип: Строка.
Идентификатор объекта внешнего компонента в виде ProgID (Programmatic Identifier) реестра MS Windows (например: "AddIn.Scanner").
Должно соответствовать информации, находящейся в регистрационной базе данных системы (Registry).
Описание варианта метода:

Компонент должен быть выполнен по технологии COM и зарегистрирован в реестре MS Windows.
Эти компоненты совместимы с компонентами 1С:Предприятия 7.7.
Внимание! Вариант метода не работает на сервере и во внешнем соединении.
3 H A D G E H O G s
 
30.04.14
11:24
Внимание! Вариант метода не работает на сервере и во внешнем соединении.
4 H A D G E H O G s
 
30.04.14
11:25
Вот так вот ребятишки. Я надеюсь - вам стыдно.
5 max735
 
30.04.14
11:37
(4) Мне стыдно, но вопрос остался,
можно ли в принципе на стороне сервера загрузить внешнюю компоненту? Каким-либо другим способом?
Спасибо.
6 max735
 
30.04.14
11:38
Еще вопрос,
может ли сам сервер 1С выступать в качестве COM сервера?
7 ДенисЧ
 
30.04.14
11:39
(6) да
8 H A D G E H O G s
 
30.04.14
11:40
(5) Можно.
ПодключитьВнешнююКомпоненту("C:\mydll.dll","MyDll",ТипВнешнейКомпоненты.COM)

Ну или разных вариантов метода из макетов, двоичных хранящихся в реквизитах через нав. ссылку
9 H A D G E H O G s
 
30.04.14
11:40
Не понимаю, что вызывает сложности.
10 H A D G E H O G s
 
30.04.14
11:42
(6) Нет.
11 H A D G E H O G s
 
30.04.14
11:42
(10) + если я правильно понял смысл вашего вопроса :-)
12 Serginio1
 
30.04.14
11:44
(0) Ну и 64 разрядная COM DLL должна быть зарегестрирована в соответствующей ветке реестра.
А какой смысл в ВК на сервере? Если эту задачу решает прекрасно COM
13 max735
 
30.04.14
11:49
(7) (10) Обрисую стоящую задачу:
есть внешняя компонента (ВК), которая нормально работает с клиентом 1С. Компонента используется для обмена с другой программой. При этом ВК через IDispatch* pBackConnection может управлять клиентом 1С, в частности отдает результат в виде ТаблицыЗначений. Собственно вопрос, предоставляет ли сервер 1С этот интерфейс? Насколько я понял Native API этого делать не может и вообще сильно урезан...
14 H A D G E H O G s
 
30.04.14
11:56
(13) Да, сервер 1С этот интерфейс предоставляет.
15 H A D G E H O G s
 
30.04.14
11:57
(13) А я писал свой сериализатор/десериализатор XDTO на Дельфи для native а потому забил.
16 H A D G E H O G s
 
30.04.14
11:57
а потому забил-> а потом забил
17 max735
 
30.04.14
11:59
(14) Спасибо, сейчас попробую использовать "ПодключитьВнешнююКомпоненту", посмотрю, что получится.
18 Serginio1
 
30.04.14
11:59
В ВК ты можешь получить ссылку на AppDispatch
Но ты можешь передать в в твой КОМ объект ссылку на  модуль, Таблицу итд.
У тебя ВК 32 разрядная?
19 max735
 
30.04.14
12:03
(18) Да, 32-разрядная, в принципе я ее пересобрал в 64-разрядном виде, но пока проблемы с подключением. Проект подрос, люди хотят реализовывать обмен на сервере.
20 Serginio1
 
30.04.14
12:26
(19) Ну так зарегистрируй ей через соответсющий regsvr32
21 max735
 
30.04.14
12:39
(20) Это понятно, но у меня процесс не доходит до загрузки библиотеки, просто не иду обращения к регистрам виндоуз. И насколько я понял из других тем, сервер все-таки не работает с COM компонентами, только со сделанными по Native API. До конца не уверен, но пока просвета не вижу.
22 H A D G E H O G s
 
30.04.14
12:51
(21) Вы неправильно поняли.
23 Serginio1
 
30.04.14
12:55
(21) Можешь определить метод в котором и передашь в параметре свою таблицу значений, которую и заполнишь
24 max735
 
30.04.14
13:10
(22) Возможно есть различие между "голым" COM и внешней компонентой, построенной на COM в отличие от Native. Пока не могу ничего сказать определенного, не в курсе.
25 max735
 
30.04.14
15:53
В чем может быть засада?

Вызов функции

ПодключитьВнешнююКомпоненту("C:\mydll.dll","MyDll",ТипВнешнейКомпоненты.COM)

в регистре все прописывает (и на стороне сервера тоже), но всегда выдает ложь, в том числе и в режиме клиента, когда

ПодключитьВнешнююКомпоненту(mProgID) отрабатывает нормально.

?

Спасибо.
26 H A D G E H O G s
 
30.04.14
15:57
(25) Отладчик языка библиотеки - в руки и вперед!
27 max735
 
14.05.14
11:38
Вынужден поднять тему.
В целях чистоты эксперимента взял готовый пример внешней компоненты от 1С , тот, которы1 на C++ с использованием ATL.

Сейчас уперся в следующий момент:
Если подключаю так:
ПодключитьВнешнююКомпоненту("AddIn.AddInCom");
то вызов:
ВК = Новый("AddIn.AddInExtension");
отрабатывает нормально.  

Если же использую загрузку:
ПодключитьВнешнююКомпоненту("C:\AddInCOM.dll","AddInCOM",ТипВнешнейКомпоненты.COM);
то в ответ на:
ВК = Новый("AddIn.AddInExtension");

получаю "Тип не определен".

В обоих случаях компонента загружается (вижу по логам и по ответу на вызов).

Есть надежда, что я что-то делаю не так? Или "все"?
28 H A D G E H O G s
 
14.05.14
11:49
"""то в ответ на:

ВК = Новый("AddIn.AddInExtension");

получаю "Тип не определен". """

Угу.

Ибо надо

ВК = Новый("AddIn.AddInCOM.AddInExtension");
29 H A D G E H O G s
 
14.05.14
11:49
или

ВК = Новый("AddIn.AddInExtension.AddInCOM");

уж не помню, но в СП написано
30 max735
 
14.05.14
12:08
Спасибо HADGEHOGs,
отработал вариант:
ВК = Новый("AddIn.AddInCOM.AddInExtension");

Если интересно, то по (25) проблема была скорее всего в том, что у меня ВК писалась "с нуля" и в ней не реализован механизм "AddIn". поэтому у меня загрузка производится как:

ПодключитьВнешнююКомпоненту("MyVK");

а не:
ПодключитьВнешнююКомпоненту("AddIn.MyVK");

Скорее всего по этому "длинный" вызов (с тремя параметрами) не отрабатывает.

Сейчас буду проверять самое интересное, как отработает вызов элементов 1С через pBackConnection...
31 max735
 
15.05.14
12:19
Уважаемый HADGEHOGs,
может быть Вы сможете еще помочь мне прояснить следующую ситуацию:
через PBackConection (pConnrection) пытаюсь получить ссылку на AppDispatch. Вызов m_iConnect->GetIDsOfNames(...  отрабатывает нормально (возвращает 0). Но далее, при попытке вызова m_iConnect->Invoke(... rphost активно что-то пытается делать, затем вылетает с ошибкой (наверное по таймауту).
Точно такой же код, но в 32-битной версии и при выполнении на клиенте отрабатывает без проблем (понятно, что там работет 1cv8.exe а не rphost). Сервис агента 1С грузится под администратором. Соответственно возникли два вопроса:
1. В принципе, rphost должен воспринимать нормально запрос на Invoke или нет?
2. Можно ли каким либо образом расширить логирование rphost, чтобы он туда клал больше информации?
Спасибо.
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.