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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 27.04.2017, 12:30   #1  
TravellerInTime is offline
TravellerInTime
Участник
Аватар для TravellerInTime
 
130 / 36 (2) +++
Регистрация: 14.07.2003
Адрес: Россия, Тула
Вызов 1С из Ax 2009
Всем привет!
Есть у кого опыт интеграции Ax и 1С?
Пытаюсь разобраться как работать с 1С из Ax 2009.
Написал вот такой код
X++:
    COM s = new COM('V83.Application');
    COM d;
    s.Connect('Srvr="server";Ref="base"');
    s.Visible(true);

    d = s.NewObject('Справочник.Контрагенты');
Соединение проходит успешно, но на последней строке я получаю ошибку:
Метод "NewObject" в COM-объекте класса "V83.Application" возвратил код ошибки 0x80020005 (DISP_E_TYPEMISMATCH), который означает: Один или несколько аргументов не могли быть преобразованы.
Какое здесь несоответствие типов я не понимаю. Во всех примерах, что есть в инете (не с Ax, конечно), передаётся в этот метод строка.
Подскажите, пожалуйста, как сделать правильно?

Последний раз редактировалось sukhanchik; 03.05.2017 в 09:08.
Старый 27.04.2017, 13:59   #2  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
COMVariant вместо строки?
__________________
Мы летаем, кружимся, нагоняем ужасы ...
Старый 27.04.2017, 14:51   #3  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
873 / 649 (23) +++++++
Регистрация: 14.10.2004
Мне кажется, что надо вместо 'V83.Application' использовать 'V83.COMConnector'
Я так работал с 1С версии 8.2, использовал V82.COMConnector
Старый 27.04.2017, 15:28   #4  
TravellerInTime is offline
TravellerInTime
Участник
Аватар для TravellerInTime
 
130 / 36 (2) +++
Регистрация: 14.07.2003
Адрес: Россия, Тула
Цитата:
Сообщение от Ace of Database Посмотреть сообщение
Мне кажется, что надо вместо 'V83.Application' использовать 'V83.COMConnector'
COMConnector насколько я понимаю, не позволяет работать с интерфейсом пользователя или я ошибаюсь?
Старый 27.04.2017, 15:50   #5  
TravellerInTime is offline
TravellerInTime
Участник
Аватар для TravellerInTime
 
130 / 36 (2) +++
Регистрация: 14.07.2003
Адрес: Россия, Тула
Цитата:
Сообщение от TasmanianDevil Посмотреть сообщение
COMVariant вместо строки?
Вы это имели ввиду:
X++:
     COMVariant v = COMVariant::createFromStr('Справочники.Контрагенты', COMVariantInOut::In);
     d = s.NewObject(v);
Не помогло - та же ошибка.
Старый 27.04.2017, 15:28   #6  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,311 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Ну вот как-то так можно получить описание:
X++:
            COM                     comApplication;
            COM                     comCatalog;
            COM                     comCatalogs;
            COM                     comMetaData;
            COM                     comObject;
            str                     connectionString;
            str                     objectNameId = "Контрагенты";
            #define.V80_COMConnector('V8.COMConnector')
            #define.V81_COMConnector('V81.COMConnector')
            #define.V82_COMConnector('V82.COMConnector')
            #define.V83_COMConnector('V83.COMConnector')
            ;
            new InteropPermission(InteropKind::ComInterop).assert();
            comObject              = new COM(#V83_COMConnector);
            comApplication      = comObject.Connect(connectionString);
            comMetaData = comApplication.MetaData();
            comCatalogs = comMetaData.Catalogs();
            comCatalog = comCatalogs.Find(objectNameId); // Можно получить описание объекта справочник.Контрагенты
            CodeAccessPermission::revertAssert();
Если же нужно данные получить - то нужно делать запрос в 1С и тогда код будет выглядеть как-то так:
X++:
            str Code;
            str sqlString = "ВЫБРАТЬ Справочник.Контрагенты.Код КАК Code ИЗ Справочник.Контрагенты";

            query = application.NewQuery();
            query.Text(sqlString);
            iterator = query.Execute().Select().comObject(); // Для 8.2 вместо Select() - Choose()
	    while (iterator.Next())
	    {
                Code = iterator.Code(); // Код контрагента
            }
Код примерный, выдран из рабочего кода, поэтому напрямую может не работать. Я показал концепцию.
__________________
Возможно сделать все. Вопрос времени

Последний раз редактировалось sukhanchik; 02.05.2017 в 21:14.
За это сообщение автора поблагодарили: TravellerInTime (1), S.Kuskov (5).
Старый 27.04.2017, 16:04   #7  
TravellerInTime is offline
TravellerInTime
Участник
Аватар для TravellerInTime
 
130 / 36 (2) +++
Регистрация: 14.07.2003
Адрес: Россия, Тула
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
Ну вот как-то так можно получить описание:
....
Я показал концепцию.
О! Ключевое слово MetaData(), которое я никак не мог найти!
Буду изучать дальше! Спасибо!
Старый 27.04.2017, 16:38   #8  
brahma is offline
brahma
Участник
1C
 
278 / 80 (3) ++++
Регистрация: 01.12.2005
Тип называется либо СправочникОбъект.Контрагенты, либо СправочникСсылка.Контрагенты, в зависимости от того, что вы хотите создать. Вообще создавать таким образом ни объект, ни ссылку не стоит. Для создания объекта нужно использовать метод менеджера справочника СоздатьЭлемент(), или СоздатьГруппу(). Типа
catalogObject = comApplication.Справочники.Контрагенты.СоздатьЭлемент();
....
catalogObject.Записать();

И да, лучше использовать ComConnector.
За это сообщение автора поблагодарили: sukhanchik (2).
Старый 27.04.2017, 16:56   #9  
TravellerInTime is offline
TravellerInTime
Участник
Аватар для TravellerInTime
 
130 / 36 (2) +++
Регистрация: 14.07.2003
Адрес: Россия, Тула
Цитата:
Сообщение от brahma Посмотреть сообщение
И да, лучше использовать ComConnector.
С его помощью я могу открыть форму документа, справочника?
Старый 27.04.2017, 17:06   #10  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,311 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от TravellerInTime Посмотреть сообщение
С его помощью я могу открыть форму документа, справочника?
С помощь COMConnector можно:
  • Получить данные из БД
  • Получить метаданные конфигурации.
Ряд методов/свойств в COMConnector не работает. Подробнее - см. синтаксис-помощник в 1С.
Также соединение относительно небыстрое. Т.е. для целей получения метаданных или относительно небольшого количества данных - подойдет. Но для целей регулярной интеграции документов с большим количеством строк (или большого кол-ва документов) не подойдет.
Визуальные вещи также не запускаются (т.е. COMConnector не управляет поведением клиента 1С).
__________________
Возможно сделать все. Вопрос времени
Старый 28.04.2017, 07:59   #11  
TravellerInTime is offline
TravellerInTime
Участник
Аватар для TravellerInTime
 
130 / 36 (2) +++
Регистрация: 14.07.2003
Адрес: Россия, Тула
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
С помощь COMConnector можно:
Визуальные вещи также не запускаются (т.е. COMConnector не управляет поведением клиента 1С).
Значит я всё правильно разобрался, что нужен именно Application.
Получение данных из 1С планируется в настоящий момент через web-service. С ним еще не игрался, может тоже возникнет куча вопросов. Кстати, а как по скорости web service 1С?

PS: Странно форум настроен, не могу поставить благодарность, пишет, что нужно 3 дня подождать.
Старый 28.04.2017, 11:51   #12  
brahma is offline
brahma
Участник
1C
 
278 / 80 (3) ++++
Регистрация: 01.12.2005
Цитата:
Сообщение от TravellerInTime Посмотреть сообщение
Значит я всё правильно разобрался, что нужен именно Application.
Для открытия формы нужен Application. Другое дело стоит ли вообще связываться с открытием формы.
Цитата:
Сообщение от TravellerInTime Посмотреть сообщение
Получение данных из 1С планируется в настоящий момент через web-service. С ним еще не игрался, может тоже возникнет куча вопросов. Кстати, а как по скорости web service 1С?
Есть возможность получение данных через OData, есть возможность делать Rest через http-сервисы. Вроде в последней версии сделали возможность держать сеанс, это позволяет ускорить работу сервисов. Быстро или не быстро зависит от ваших задач.
Старый 28.04.2017, 11:22   #13  
TravellerInTime is offline
TravellerInTime
Участник
Аватар для TravellerInTime
 
130 / 36 (2) +++
Регистрация: 14.07.2003
Адрес: Россия, Тула
Продолжаю изучать тему. С методанными вроде разобрался.
А вот такая строчка кода в Ax не прокатывает, ибо с русскими буквами Ax не дружит.
catalogObject = comApplication.Справочники.Контрагенты.СоздатьЭлемент();
Как обратится к справочнику "Контрагенты" в данном случае?
Старый 27.04.2017, 16:59   #14  
brahma is offline
brahma
Участник
1C
 
278 / 80 (3) ++++
Регистрация: 01.12.2005
Нет, с помощью ComConnector форму открыть нельзя.
За это сообщение автора поблагодарили: TravellerInTime (1).
Старый 15.05.2017, 16:35   #15  
TravellerInTime is offline
TravellerInTime
Участник
Аватар для TravellerInTime
 
130 / 36 (2) +++
Регистрация: 14.07.2003
Адрес: Россия, Тула
Продолжу в этой теме.
Дальнейшей темой моего изучения стали веб-сервисы 1С.
В Reference я добавил веб-сервис. Ax создала обёртку. Написал код. Вроде всё просто и понятно. И тут стал вопрос авторизации, как из Ax передать логин и пароль пользователя в 1С?
Если на .net я просто пишу:
service.ClientCredentials.UserName.UserName = "User";
service.ClientCredentials.UserName.Password = "Password";
то обёртка, созданная Ax, не имеет ClientCredentials.
Подскажите, пожалуйста, как всё это делается в Ax?
Старый 16.05.2017, 08:03   #17  
TravellerInTime is offline
TravellerInTime
Участник
Аватар для TravellerInTime
 
130 / 36 (2) +++
Регистрация: 14.07.2003
Адрес: Россия, Тула
Player1 Спасибо, я читал эту тему... Как я написал уже выше, у меня нет проблем с авторизацией в .net. Я спрашиваю, как это сделать в Ax штатными средствами?

Последний раз редактировалось TravellerInTime; 16.05.2017 в 08:09.
Старый 17.05.2017, 12:27   #18  
maldini is offline
maldini
Участник
 
103 / 30 (2) +++
Регистрация: 06.03.2007
Адрес: москва
Мы как-то так это делаем. Сделали на C# прокси класс на основе сервиса 1С подключили сервис как web reference. Затем его добавили в референс в AX и испрользуем как ниже показано.
X++:
        version = CLRInterop::parseClrEnum("System.Web.Services.Protocols.SoapProtocolVersion","Soap11");
        webService = new WebServicesProxyAX.Service1C.DAXTo1C();
        webService.set_UseDefaultCredentials(true);
        webService.set_SoapVersion(version);

        if(timeout)
            webService.set_Timeout(timeout);

        if(urlWebServices)
            webService.set_Url(urlWebServices);

Последний раз редактировалось Dron AKA andy; 17.05.2017 в 13:56.
За это сообщение автора поблагодарили: TravellerInTime (1).
Старый 18.05.2017, 08:51   #19  
TravellerInTime is offline
TravellerInTime
Участник
Аватар для TravellerInTime
 
130 / 36 (2) +++
Регистрация: 14.07.2003
Адрес: Россия, Тула
Идея с обёрткой в .net понятна, и она уже приходила на ум.
Т.е. получается MS не сделала никакой возможности авторизации на веб-сервисе из Ax? Браво!
Старый 19.05.2017, 09:10   #20  
MazZzDaI is offline
MazZzDaI
Участник
Аватар для MazZzDaI
 
44 / 35 (2) +++
Регистрация: 19.09.2013
Try this way:
X++:
ClrObject clientType = CLRInterop::getType("CheckersReference.CheckersBotAPI.CheckersBotClient"); 
CheckersReference.CheckersBotAPI.CheckersBotClient      myClient;
System.ServiceModel.Description.ClientCredentials       clientCredentials;
System.ServiceModel.Security.WindowsClientCredential    windowsCredentials;
System.Net.NetworkCredential                            creds;
    
creds = new System.Net.NetworkCredential();
creds.set_Domain("axforumDomain");
creds.set_UserName("axforumUser");
creds.set_Password("axforumUserPassword");
    
myClient = AifUtil::CreateServiceClient(clientType);
    
clientCredentials = myClient.get_ClientCredentials();
windowsCredentials = clientCredentials.get_Windows();
windowsCredentials.set_ClientCredential(creds);

myClient.MakeStepAI();
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
emeadaxsupport: AX Performance - What information and data to collect when you want to open a support case Blog bot DAX Blogs 0 29.09.2015 15:11
emeadaxsupport: AX Performance Troubleshooting Checklist Part 2 Blog bot DAX Blogs 0 09.09.2014 16:11
axinthefield: Compatibility Testing for Microsoft Dynamics AX Blog bot DAX Blogs 0 23.06.2012 02:26
axforum blogs: Квест: Подружим Dynamics Ax 2009 Sp1 RU7 c SharePoint Foundation 2010 - Этап 2 Blog bot DAX Blogs 0 12.07.2011 14:11
axStart: Microsoft Dynamics AX 2009 Hot Topics Web Seminar Series Blog bot DAX Blogs 0 06.08.2008 12:05
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

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

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

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