Имя: Пароль:
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, чтобы он туда клал больше информации?
Спасибо.
Закон Брукера: Даже маленькая практика стоит большой теории.