|  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 | 
| Участник | |
|  | 
|  | 
| 
 |