AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.03.2011, 17:03   #1  
Кирилл
Гость
 
n/a
Проблема с созданием экземпляра com-объекта на сервере
Добрый день,
AX2009 интегрирую с внешней системой.

Внешняя система предоставляет com-объект для манипуляций с ней,
в AX2009 запилил класс для запуска в пакетном режиме, который будет периодически обменивается данными с внешней системой посредством использования экземпляра данного com-объекта.

Для начала сделал по-старинке:
класс клиентский, пакетный сервер запускается в отдельной клиентской сессии.
Все работает.
Можно переводить и на серверный вариант, чтобы не париться с клиентской сессией.

Поставил RunOn = Server.
Метод new подпилил так:

X++:
void new()
{
    InteropPermission p;
    ;
    super();

    p = new InteropPermission(InteropKind::ComInterop);
    p.assert();
    storageConnector = new COM("Cleverence.Warehouse.StorageConnector");
//    storageConnector = new COM("CDO.Message"); // для проверки создаются ли другие объекты
    CodeAccessPermission::revertAssert();
}
Пробую. Получаю:
Цитата:
COM-объект класса "Cleverence.Warehouse.StorageConnector" не удалось создать. Убедитесь, что объект был должным образом зарегистрирован на компьютере "AOS-DEV-01V".
Убедился.

На указанном AOS установлен также и клиент. Открываю его.
Ставлю у класса RunOn = Client - запускается.
Ставлю у класса RunOn = Server - указанная выше ошибка.

Под доменным админом то же самое.

Другие объекты типа CDO.Message или ADODB.Recordset создаются нормально при любом значении RunOn.

Если кто в состоянии, подскажите, пожалуйста, в каком направлении копать.
За это сообщение автора поблагодарили: Ace of Database (3), AlexSt (1).
Старый 24.03.2011, 17:35   #2  
Damn is offline
Damn
Участник
 
436 / 154 (6) ++++++
Регистрация: 28.05.2003
Адрес: в глуши
Нужно искать 64-битный вариант COM-объекта "Cleverence.Warehouse.StorageConnector".
Либо АОС делать 32-битным.
__________________
Дмитрий
За это сообщение автора поблагодарили:  (1), AlexSt (1).
Старый 24.03.2011, 17:37   #3  
#bet is offline
#bet
MCTS
Аватар для #bet
MCBMSS
 
30 / 13 (1) ++
Регистрация: 02.06.2004
Адрес: Киев
Либо париться с клиентской сессией
Старый 25.03.2011, 14:11   #4  
titov is offline
titov
Участник
 
73 / 87 (3) ++++
Регистрация: 23.12.2005
Адрес: Казань
Здесь прописано как запустить СОМ коннектор 1с8х в режиме 32 бит на 64-битовом сервере.
http://gilev.ru/1c/hasp/
в ссылке есть пункт
15. Для COM-соединений к 64х битному серверу приложений использование возможно только на том компьютере, на котором установлен ключ 64-разрядного сервера 1С:Предприятия (и не из терминальной сессии).
Для использования V81.COMConnector на компьютерах, которым доступны только клиентские ключи, можно зарегистрировать 32-разрядный V81.COMConnector в COM+.
- запустите Component Services;
- создайте пустое COM+ приложение с Activation type - Server application и именем, например, V81_COMConnector, укажите имя пользователя Windows, от имени которого компонента будет запускаться в адресном пространстве отдельного процесса dllhost.exe;
- в ветке Components добавьте новую компоненту comcntr.dll из каталога загрузочных модулей 1С:Предприятия.
В этом случае V81.COMConnector будет запускаться в отдельном 32-разрядном процессе и может использоваться как 32-разрядными, так и 64-разрядными приложениями.

Данная рекомендация была использована как для СОМ коннектора 1с (не было ключей 64-бит), так и еще для одной компоненты СОМ сторонней фирмы, под которую не было 64- битовой dll.
Пакеты ax2009 АОС 64-бит Window server 2008 sp2 работают с этими СОМ компонентами, проблем не было.
За это сообщение автора поблагодарили:  (1), Omeo (1), Logger (3), Ace of Database (3), jeky (1), demoded (1), kr1user (0), AlexSt (1).
Старый 15.06.2011, 15:47   #5  
epic is offline
epic
Участник
 
43 / 10 (1) +
Регистрация: 22.12.2006
Всем привет.
Обновил версию 1с до 8.2., теперь интеграция с АХ 2009 SP1 накрылась медным тазом. Добавил новое приложение com+ (как в сообщении выше), загрузил компоненту из папки с установленным 1с8.2. Импорт поставщиков из 1С в АХ 2009 не работает: "COM-объект класса "V81.COMConnector" не удалось создать. Убедитесь, что объект был должным образом зарегистрирован на компьютере "AX-DEMO"." Зачем-то АХ 2009 упорно сигнализирует о том, что используется объект V81* которого уже впомине нет. В макросе используется следующее. Перепробывал все варианты.
//define.COMConnectorProgId("V81.COMConnector") // исходник
//define.COMConnectorProgId("V82.COMConnector") // второе чтение
define.COMConnectorProgId("82.COMConnector.1") // по принципу названия компоненты в component services

В методе поиска/создания ком объекта, если последний не нашелся, указано:
comConnector = new COM( #COMConnectorProgId);//V81.COMConnector

Сервер перезагружал. АОС тоже. Поможите кто чем богат на знания.
Старый 15.06.2011, 16:12   #6  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
Попробуйте для начала не использовать макрос, а явно указать строку "V82.COMConnector"
Старый 18.11.2013, 17:08   #7  
AlexSt is offline
AlexSt
Участник
 
5 / 10 (1) +
Регистрация: 12.11.2013
Всем привет!
Помогите пожалуйста решить подобную проблему. Создал на сервере (Windows Server 2008 R2 Standard SP1, 64bit) приложение COM+, как описано выше (от имени Network Service). Объект создается, но на методе Connect все намертво виснет (DAX 4.0):

X++:
    c1COMObj = new COM("V82.COMConnector");
    connection = c1COMObj.Connect("Srvr=\"" + c1Params.DBCluster + "\";Ref=\"" + c1Params.DBClusterName + "\";Usr=\"" + c1Params.User1C + "\";Pwd=\"" + c1Params.User1CPassword + "\";");
При этом для "V82.Application" все работает.
comcntr.dll нашел 2 штуки - в Program Files и в Program Files (x86). Пробовал подставлять обе, результат один. В чем может быть дело?

Последний раз редактировалось AlexSt; 18.11.2013 в 17:58.
Старый 19.11.2013, 18:57   #8  
AraraT® is offline
AraraT®
Участник
1C
 
158 / 106 (4) +++++
Регистрация: 13.01.2006
Адрес: Республика Татарстан, г. Казань
Основные моменты при создании приложений COM+:

1. Когда создаете приложение COM+, указывайте, что это серверное приложение;
2. Далее в мастере создания в окне "Удостоверение приложения" необходимо указать пользователя и пароль от имени которого стартует АОС;
3. Далее в мастере создания в окне "Добавление пользователей и ролей" также необходимо добавить пользователя от имени которого стартует АОС;
4. При создании конкретного компонента внутри приложения COM+ выбирайте библиотеку comcntr.dll из папки "Program Files (x86)".

Нижеприведенный код должен отрабатывать без проблем:

X++:
    new InteropPermission(InteropKind::ComInterop).assert();

    COMconnector        = new COM(this.getCOMConnectorProg());

    CodeAccessPermission::revertAssert();
где функция getCOMConnectorProg() имеет вид:

X++:
private str getCOMConnectorProg()
{
    str getCOMConnectorProg;
    ;
    switch(Version)
    {
        case        ::V80 :
            getCOMConnectorProg     = #V80_COMConnector;
            break;
        case        ::V81 :
            getCOMConnectorProg     = #V81_COMConnector;
            break;
        case        ::V82 :
            getCOMConnectorProg     = #V82_COMConnector;
            break;
        default :
            throw error(strFmt("Для версии %1 не реализовано",Version));
    }

    return getCOMConnectorProg;
}
макросы:

X++:
    #define.V80_COMConnector('V8.COMConnector')
    #define.V81_COMConnector('V81.COMConnector')
    #define.V82_COMConnector('V82.COMConnector')
__________________
Айрат Вильданов.
skype: vildanov.a
За это сообщение автора поблагодарили: Dron AKA andy (5), S.Kuskov (2), jeky (1), AlexSt (1).
Старый 20.11.2013, 11:13   #9  
AlexSt is offline
AlexSt
Участник
 
5 / 10 (1) +
Регистрация: 12.11.2013
Огромное спасибо! Заработало. Похоже ключевым был пользователь, от имени которого запускается АОС.
Старый 21.11.2013, 12:55   #10  
AlexSt is offline
AlexSt
Участник
 
5 / 10 (1) +
Регистрация: 12.11.2013
Еще раз всем привет!
К сожалению, проблема решена не полностью. При вызове любой функции 1С, например:
X++:
    result = connection.axSyncClient("Test");
вылетает ошибка, в данном случае: "Метод "axSyncClient" в COM-объекте класса "<неизвестно>" возвратил код ошибки 0x80020009 (DISP_E_EXCEPTION), который означает: {ОбщийМодуль.ВнешниеПроцедуры.Модуль(340,4)}: Процедура или функция с указанным именем не определена (ВвестиЗначение)."
Такая функция в 1С точно есть, для "V82.Application" это работает. Подскажите пожалуйста, в чем может быть дело?

Последний раз редактировалось AlexSt; 21.11.2013 в 12:59.
Старый 21.11.2013, 14:52   #11  
AraraT® is offline
AraraT®
Участник
1C
 
158 / 106 (4) +++++
Регистрация: 13.01.2006
Адрес: Республика Татарстан, г. Казань
Цитата:
Сообщение от AlexSt Посмотреть сообщение
Еще раз всем привет!
К сожалению, проблема решена не полностью. При вызове любой функции 1С, например:
X++:
    result = connection.axSyncClient("Test");
вылетает ошибка, в данном случае: "Метод "axSyncClient" в COM-объекте класса "<неизвестно>" возвратил код ошибки 0x80020009 (DISP_E_EXCEPTION), который означает: {ОбщийМодуль.ВнешниеПроцедуры.Модуль(340,4)}: Процедура или функция с указанным именем не определена (ВвестиЗначение)."
Такая функция в 1С точно есть, для "V82.Application" это работает. Подскажите пожалуйста, в чем может быть дело?
Не путайте COM и OLE.

В данном случае "V82.Application" - это OLE.

А функция "ВвестиЗначение" - функция клиентского исполнения, которая представляет собой показ диалога для ввода значение переданного типа и требует работы с интерфейсной составляющей платформы 1С. Через COM-объект ("V82.COMConnector") она работать не будет.
__________________
Айрат Вильданов.
skype: vildanov.a
Старый 21.11.2013, 15:18   #12  
AlexSt is offline
AlexSt
Участник
 
5 / 10 (1) +
Регистрация: 12.11.2013
Но там и не должно быть никакого диалога. Функция должна отработать без взаимодействия с пользователем и вернуть результат в виде текстовой строки. Может быть для работы через COMConnector функции в 1С должны быть написаны с учетом некоторых ограничений?
Старый 21.11.2013, 15:37   #13  
AraraT® is offline
AraraT®
Участник
1C
 
158 / 106 (4) +++++
Регистрация: 13.01.2006
Адрес: Республика Татарстан, г. Казань
Функция "ВвестиЗначение" - это функция глобального контекста, т.е. функция ядра платформы 1С.

Вот ее описание из встроенной справки:

Вызывает диалог для ввода значения заданного типа. Если тип переменной не определен и <Тип> представляет собой составной тип данных, то в поле ввода появляется кнопка выбора типа.

Доступность:
Тонкий клиент, веб-клиент, толстый клиент.


Обратите внимание на раздел "Доступность", среди перечисленного нет "Внешнее соединение", что требуется для работы с процедурами/функциями через COM-соединение.


Касательно вашего случая, возможно, что по бизнес логике функция "ВвестиЗначение" и не вызывается, может быть она даже используется в другой процедуре/функции общего модуля, не в той, которую вы пытаетесь вызвать через COM. Но при подключении через COM и вызове чего-либо из общего модуля, платформа проверяет этот модуль в режиме Внешнего соединения, для которого вызов этой функции недопустим, поэтому у вас и появляется указанная ошибка.

Найдите вот это место "ОбщийМодуль.ВнешниеПроцедуры.Модуль(340,4)" и логику работы функции ВвестиЗначение обрамите в директивы препроцессора:
X++:
#  
#
Я думаю, что проблема у вас пропадет, ну или наткнетесь на другое место неверного вызова функций контекста, не предназначенных для Внешнего соединения.
__________________
Айрат Вильданов.
skype: vildanov.a
За это сообщение автора поблагодарили: AlexSt (1).
Старый 21.11.2013, 16:44   #14  
AlexSt is offline
AlexSt
Участник
 
5 / 10 (1) +
Регистрация: 12.11.2013
Спасибо большое! Получилось.

Последний раз редактировалось AlexSt; 21.11.2013 в 18:26.
Старый 30.10.2018, 17:03   #15  
jeky is offline
jeky
:o)
Аватар для jeky
 
131 / 64 (3) ++++
Регистрация: 22.05.2008
FYI
_________

COM-объект класса "V83.COMConnector.1" не удалось создать
Возможно после обновления 1С получили ошибку при запуске класса, выгружающего данные в 1С в пакетном режиме и запускающего функцию 1С посредством COM LoadData (возможно просто совпало), т.к. до этого момента выгрузка запускалась только вручную.
Вручную класс отрабатывал без ошибки.
Регистрация comcntr.dll в режиме 32 и 64 бит на 64-битовом сервере не помогла.
Помогло добавление пользователей aos-ов - пакетных серверов в роли компоненты приложения COM+
__________________
"Только на Бога не может быть обиды - если смерть пошлет, значит, жизни пришел предел, на то рождался,- а за все остальное на Земле есть и должен быть спрос!." Чингиз Торекулович Айтматов.

Последний раз редактировалось jeky; 30.10.2018 в 17:04. Причина: Форматирование текста
Теги
64-bit, com connector, com+

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Пакетная печать com-объектов на терминальном сервере Serg DAX: Программирование 1 22.10.2010 07:06
Проблема доступа через COM Connector wit DAX: Функционал 0 10.07.2006 12:34
Проблема с controlMethodOverload при выполнении на Сервере. oip DAX: Программирование 12 07.04.2006 11:15
Как получить конкретный интерфейс COM объекта Tony Green DAX: Программирование 20 02.12.2004 09:54
Создание экземпляра COM по его CLSID Borisov Nikolai DAX: Программирование 1 02.12.2002 10:37

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 05:48.