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 |
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, 15:28 | #5 |
Участник
|
|
|
27.04.2017, 15:50 | #6 |
Участник
|
|
|
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, 16:59 | #10 |
Участник
|
Нет, с помощью ComConnector форму открыть нельзя.
|
|
|
За это сообщение автора поблагодарили: TravellerInTime (1). |
27.04.2017, 17:06 | #11 |
Administrator
|
С помощь COMConnector можно:
Также соединение относительно небыстрое. Т.е. для целей получения метаданных или относительно небольшого количества данных - подойдет. Но для целей регулярной интеграции документов с большим количеством строк (или большого кол-ва документов) не подойдет. Визуальные вещи также не запускаются (т.е. COMConnector не управляет поведением клиента 1С).
__________________
Возможно сделать все. Вопрос времени |
|
28.04.2017, 07:59 | #12 |
Участник
|
Цитата:
Получение данных из 1С планируется в настоящий момент через web-service. С ним еще не игрался, может тоже возникнет куча вопросов. Кстати, а как по скорости web service 1С? PS: Странно форум настроен, не могу поставить благодарность, пишет, что нужно 3 дня подождать. |
|
28.04.2017, 11:22 | #13 |
Участник
|
Продолжаю изучать тему. С методанными вроде разобрался.
А вот такая строчка кода в Ax не прокатывает, ибо с русскими буквами Ax не дружит. catalogObject = comApplication.Справочники.Контрагенты.СоздатьЭлемент(); Как обратится к справочнику "Контрагенты" в данном случае? |
|
28.04.2017, 11:51 | #14 |
Участник
|
Цитата:
Есть возможность получение данных через OData, есть возможность делать Rest через http-сервисы. Вроде в последней версии сделали возможность держать сеанс, это позволяет ускорить работу сервисов. Быстро или не быстро зависит от ваших задач. |
|
02.05.2017, 19:30 | #15 |
Участник
|
Цитата:
А вот такая строчка кода в Ax не прокатывает, ибо с русскими буквами Ax не дружит.
catalogObject = comApplication.Справочники.Контрагенты.СоздатьЭлемент(); Как обратится к справочнику "Контрагенты" в данном случае? |
|
02.05.2017, 20:51 | #16 |
Administrator
|
Цитата:
Тут нужно разделить задачи. Задача 1. Обратиться к объекту 1С, как к объекту метаданных (в терминах АХ - обратиться к форме через класс TreeNode). Здесь все работает и получается. Задача 2. Обратиться к объекту 1С как к хранилищу данных и выбрать из него данные. Это решается запросом, пример которого я приводил. Задача 3. Обратиться к объекту 1С, как к хранилищу данных и записать в него данные. Здесь с одной стороны - Вам в помощь синтаксис-помощник, с помощью которого Вы может быть и добьетесь выполнения команды СоздатьЭлемент, но с другой стороны - Вы не сможете в реквизиты с русскими названиями записать данные. И это тоже ограничение COM. (Если я не ошибаюсь - проблем с общими реквизитами может и не возникнуть, но 100% возникнут проблемы с реквизитами, добавленными вручную). Цитата:
Есть вариант решения задачи без программирования на стороне 1С. Сейчас нет 1С под рукой, чтобы точно ткнуть в нужный пункт меню, но по-моему это называется то ли универсальная обработка данных, то ли универсальный импорт данных. В общем - идея основывается на основе идеи, заложенной в конфигурации "Конвертация данных". В 1С существует механизм, который позволяет перекачивать данные между двумя различными конфигурациями. Для этого конфигурация "Конвертация данных" анализирует обе конфигурации и создает правила обмена, которые представляют собой XML-файлик, в котором замэплены все реквизиты всех объектов одной конфигурации на соответствующие реквизиты объектов другой конфигурации. С т.з. 1С - для универсального импорта данных - необходим файл-источник (с данными) и правила обмена.Оба файла представляют собой XML-файлики. Формат файлика правил обмена легко понятен - достаточно один раз на него взглянуть любым XML-редактором. Форма файлика - источника - тоже понятен. Оба файлика можно легко запрограммировать создавать в АХ и единственная проблема, которая встанет в этом случае - это мэппинг реквизитов 1С на поля/методы в АХ. Сейчас этот мэппинг делается вручную (Вы в коде в АХ в явном виде заполняете конкретные реквизиты 1С, либо создаете внешнюю обработку, в которой все равно в коде указываете эти реквизиты). Заодно в файлике можно указывать (для документов) - требуется ли его проведение после создания. Связка между ID в АХ и ID в 1С у Вас будет, т.к. данные все генерит АХ. Собственно, все. Дальше в 1С процедура импорта данных (если мы говорим о выгрузке данных из АХ в 1С) оформляется, как регламентная (аналог пакетника в АХ) и система "хрюкает" безо всяких доработок. Любое обновление конфигурации 1Са потребует соответственно изменений на стороне АХ, но не на стороне 1С. Высший пилотаж - это если Вы в АХ еще и реализуете некий конструктор мэппинга, чтобы и в АХ можно было бы не программировать. Но это уже по сравнению с написанием внешней обработки - на порядок сложнее задача.
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 02.05.2017 в 20:56. |
|
|
За это сообщение автора поблагодарили: mazzy (2), TravellerInTime (1), gl00mie (2). |
03.05.2017, 08:29 | #17 |
Участник
|
Всем спасибо!
У меня на настоящий момент не стоит задачи отдать данные из Ax в 1С. Я просто разбираюсь с возможностями Automation-сервера 1С. На вопрос, который я задал и не получил ответа, отвечу сам себе, может кому пригодиться. Чтобы обратится к справочнику по русскому имени, можно использовать класс COMDispFunction. X++: c = application1S.Catalogs(); f = new COMDispFunction(c, 'Контрагенты', COMDispContext::PropertyGet); v = new COMVariant(COMVariantInOut::OUT_RETVAL, COMVariantType::VT_DISPATCH); f.call(v); c = COM::createFromVariant(v); |
|
|
За это сообщение автора поблагодарили: S.Kuskov (2), sukhanchik (5), Logger (1). |
03.05.2017, 09:12 | #18 |
Administrator
|
А что это за объект? Ну т.е. какие с ним действия можно сделать? Создать запись?
__________________
Возможно сделать все. Вопрос времени |
|
03.05.2017, 12:00 | #19 |
Участник
|
|
|
|
|