|
27.04.2017, 12:30 | #1 |
Участник
|
Вызов 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 |
Мрачный тип
|
COMVariant вместо строки?
__________________
Мы летаем, кружимся, нагоняем ужасы ... |
|
27.04.2017, 14:51 | #3 |
Участник
|
Мне кажется, что надо вместо 'V83.Application' использовать 'V83.COMConnector'
Я так работал с 1С версии 8.2, использовал V82.COMConnector |
|
27.04.2017, 15:28 | #4 |
Участник
|
|
|
27.04.2017, 15:50 | #5 |
Участник
|
|
|
27.04.2017, 15:28 | #6 |
Administrator
|
Ну вот как-то так можно получить описание:
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(); 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 |
Участник
|
|
|
27.04.2017, 16:38 | #8 |
Участник
|
Тип называется либо СправочникОбъект.Контрагенты, либо СправочникСсылка.Контрагенты, в зависимости от того, что вы хотите создать. Вообще создавать таким образом ни объект, ни ссылку не стоит. Для создания объекта нужно использовать метод менеджера справочника СоздатьЭлемент(), или СоздатьГруппу(). Типа
catalogObject = comApplication.Справочники.Контрагенты.СоздатьЭлемент(); .... catalogObject.Записать(); И да, лучше использовать ComConnector. |
|
|
За это сообщение автора поблагодарили: sukhanchik (2). |
27.04.2017, 16:56 | #9 |
Участник
|
|
|
27.04.2017, 17:06 | #10 |
Administrator
|
С помощь COMConnector можно:
Также соединение относительно небыстрое. Т.е. для целей получения метаданных или относительно небольшого количества данных - подойдет. Но для целей регулярной интеграции документов с большим количеством строк (или большого кол-ва документов) не подойдет. Визуальные вещи также не запускаются (т.е. COMConnector не управляет поведением клиента 1С).
__________________
Возможно сделать все. Вопрос времени |
|
28.04.2017, 07:59 | #11 |
Участник
|
Цитата:
Получение данных из 1С планируется в настоящий момент через web-service. С ним еще не игрался, может тоже возникнет куча вопросов. Кстати, а как по скорости web service 1С? PS: Странно форум настроен, не могу поставить благодарность, пишет, что нужно 3 дня подождать. |
|
28.04.2017, 11:51 | #12 |
Участник
|
Цитата:
Есть возможность получение данных через OData, есть возможность делать Rest через http-сервисы. Вроде в последней версии сделали возможность держать сеанс, это позволяет ускорить работу сервисов. Быстро или не быстро зависит от ваших задач. |
|
28.04.2017, 11:22 | #13 |
Участник
|
Продолжаю изучать тему. С методанными вроде разобрался.
А вот такая строчка кода в Ax не прокатывает, ибо с русскими буквами Ax не дружит. catalogObject = comApplication.Справочники.Контрагенты.СоздатьЭлемент(); Как обратится к справочнику "Контрагенты" в данном случае? |
|
27.04.2017, 16:59 | #14 |
Участник
|
Нет, с помощью ComConnector форму открыть нельзя.
|
|
|
За это сообщение автора поблагодарили: TravellerInTime (1). |
15.05.2017, 16:35 | #15 |
Участник
|
Продолжу в этой теме.
Дальнейшей темой моего изучения стали веб-сервисы 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 |
Участник
|
Player1 Спасибо, я читал эту тему... Как я написал уже выше, у меня нет проблем с авторизацией в .net. Я спрашиваю, как это сделать в Ax штатными средствами?
Последний раз редактировалось TravellerInTime; 16.05.2017 в 08:09. |
|
17.05.2017, 12:27 | #18 |
Участник
|
Мы как-то так это делаем. Сделали на 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 |
Участник
|
Идея с обёрткой в .net понятна, и она уже приходила на ум.
Т.е. получается MS не сделала никакой возможности авторизации на веб-сервисе из Ax? Браво! |
|
19.05.2017, 09:10 | #20 |
Участник
|
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(); |
|
|
|