| 
			
			 | 
		#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.  | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 Мрачный тип 
		
			
	 | 
	
	
	
		
		
		
		 
			
			COMVariant вместо строки?
		 
		
		
		
		
		
		
			
				__________________ 
		
		
		
		
	Мы летаем, кружимся, нагоняем ужасы ...  | 
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Мне кажется, что надо вместо 'V83.Application' использовать 'V83.COMConnector' 
		
		
		
		
		
		
		
	Я так работал с 1С версии 8.2, использовал V82.COMConnector  | 
| 
	
 | 
| 
			
			 | 
		#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). | |
| 
			
			 | 
		#5 | 
| 
			
			 Участник 
		
			
	 | 
	
	|
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Участник 
		
			
	 | 
	
	|
| 
	
 | 
| 
			
			 | 
		#7 | 
| 
			
			 Участник 
		
			
	 | 
	
	|
| 
	
 | 
| 
			
			 | 
		#8 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Тип называется либо СправочникОбъект.Контрагенты, либо СправочникСсылка.Контрагенты, в зависимости от того, что вы хотите создать. Вообще создавать таким образом ни объект, ни ссылку не стоит. Для создания объекта нужно использовать метод менеджера справочника СоздатьЭлемент(), или СоздатьГруппу(). Типа 
		
		
		
		
		
		
		
	catalogObject = comApplication.Справочники.Контрагенты.СоздатьЭлемент(); .... catalogObject.Записать(); И да, лучше использовать ComConnector.  | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: sukhanchik (2). | |
| 
			
			 | 
		#9 | 
| 
			
			 Участник 
		
			
	 | 
	
	|
| 
	
 | 
| 
			
			 | 
		#10 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Нет, с помощью ComConnector форму открыть нельзя.
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: TravellerInTime (1). | |
| 
			
			 | 
		#11 | 
| 
			
			 Administrator 
		
			
	 | 
	
	
	
		
		
		
		 
			
			С помощь COMConnector можно: 
		
		
		
		
		
		
			
 Также соединение относительно небыстрое. Т.е. для целей получения метаданных или относительно небольшого количества данных - подойдет. Но для целей регулярной интеграции документов с большим количеством строк (или большого кол-ва документов) не подойдет. Визуальные вещи также не запускаются (т.е. COMConnector не управляет поведением клиента 1С). 
				__________________ 
		
		
		
		
	Возможно сделать все. Вопрос времени  | 
| 
	
 | 
| 
			
			 | 
		#12 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
Получение данных из 1С планируется в настоящий момент через web-service. С ним еще не игрался, может тоже возникнет куча вопросов.   Кстати, а как по скорости web service 1С?PS: Странно форум настроен, не могу поставить благодарность, пишет, что нужно 3 дня подождать.  
		 | 
| 
	
 | 
| 
			
			 | 
		#13 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Продолжаю изучать тему. С методанными вроде разобрался. 
		
		
		
		
		
		
		
	А вот такая строчка кода в Ax не прокатывает, ибо с русскими буквами Ax не дружит. catalogObject = comApplication.Справочники.Контрагенты.СоздатьЭлемент(); Как обратится к справочнику "Контрагенты" в данном случае?  | 
| 
	
 | 
| 
			
			 | 
		#14 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
Есть возможность получение данных через OData, есть возможность делать Rest через http-сервисы. Вроде в последней версии сделали возможность держать сеанс, это позволяет ускорить работу сервисов. Быстро или не быстро зависит от ваших задач.  | 
| 
	
 | 
| 
			
			 | 
		#15 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			А вот такая строчка кода в Ax не прокатывает, ибо с русскими буквами Ax не дружит. 
catalogObject = comApplication.Справочники.Контрагенты.СоздатьЭлемент(); Как обратится к справочнику "Контрагенты" в данном случае?  | 
| 
	
 | 
| 
			
			 | 
		#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). | |
| 
			
			 | 
		#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). | |
| 
			
			 | 
		#18 | 
| 
			
			 Administrator 
		
			
	 | 
	
	
	
		
		
		
		 
			
			А что это за объект? Ну т.е. какие с ним действия можно сделать? Создать запись?
		 
		
		
		
		
		
		
			
				__________________ 
		
		
		
		
	Возможно сделать все. Вопрос времени  | 
| 
	
 | 
| 
			
			 | 
		#19 | 
| 
			
			 Участник 
		
			
	 | 
	
	|
| 
	
 | 
| 
	
	 | 
	
		
		
  |