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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 27.04.2017, 12:30   #1  
TravellerInTime is offline
TravellerInTime
Участник
Аватар для TravellerInTime
 
99 / 31 (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
Злыдни
 
734 / 266 (10) ++++++
Регистрация: 24.01.2005
Адрес: Сибирь
COMVariant вместо строки?
__________________
Axapta will die, MorphX stay forever
Старый 27.04.2017, 14:51   #3  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
667 / 507 (18) +++++++
Регистрация: 14.10.2004
Мне кажется, что надо вместо 'V83.Application' использовать 'V83.COMConnector'
Я так работал с 1С версии 8.2, использовал V82.COMConnector
Старый 27.04.2017, 15:28   #4  
sukhanchik is offline
sukhanchik
Moderator
Аватар для sukhanchik
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
MCBMSS
Злыдни
 
2,455 / 1547 (56) ++++++++
Регистрация: 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, 15:28   #5  
TravellerInTime is offline
TravellerInTime
Участник
Аватар для TravellerInTime
 
99 / 31 (2) +++
Регистрация: 14.07.2003
Адрес: Россия, Тула
Цитата:
Сообщение от Ace of Database Посмотреть сообщение
Мне кажется, что надо вместо 'V83.Application' использовать 'V83.COMConnector'
COMConnector насколько я понимаю, не позволяет работать с интерфейсом пользователя или я ошибаюсь?
Старый 27.04.2017, 15:50   #6  
TravellerInTime is offline
TravellerInTime
Участник
Аватар для TravellerInTime
 
99 / 31 (2) +++
Регистрация: 14.07.2003
Адрес: Россия, Тула
Цитата:
Сообщение от TasmanianDevil Посмотреть сообщение
COMVariant вместо строки?
Вы это имели ввиду:
X++:
     COMVariant v = COMVariant::createFromStr('Справочники.Контрагенты', COMVariantInOut::In);
     d = s.NewObject(v);
Не помогло - та же ошибка.
Старый 27.04.2017, 16:04   #7  
TravellerInTime is offline
TravellerInTime
Участник
Аватар для TravellerInTime
 
99 / 31 (2) +++
Регистрация: 14.07.2003
Адрес: Россия, Тула
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
Ну вот как-то так можно получить описание:
....
Я показал концепцию.
О! Ключевое слово MetaData(), которое я никак не мог найти!
Буду изучать дальше! Спасибо!
Старый 27.04.2017, 16:38   #8  
brahma is offline
brahma
Участник
1C
 
260 / 76 (3) ++++
Регистрация: 01.12.2005
Тип называется либо СправочникОбъект.Контрагенты, либо СправочникСсылка.Контрагенты, в зависимости от того, что вы хотите создать. Вообще создавать таким образом ни объект, ни ссылку не стоит. Для создания объекта нужно использовать метод менеджера справочника СоздатьЭлемент(), или СоздатьГруппу(). Типа
catalogObject = comApplication.Справочники.Контрагенты.СоздатьЭлемент();
....
catalogObject.Записать();

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

PS: Странно форум настроен, не могу поставить благодарность, пишет, что нужно 3 дня подождать.
Старый 28.04.2017, 11:22   #13  
TravellerInTime is offline
TravellerInTime
Участник
Аватар для TravellerInTime
 
99 / 31 (2) +++
Регистрация: 14.07.2003
Адрес: Россия, Тула
Продолжаю изучать тему. С методанными вроде разобрался.
А вот такая строчка кода в Ax не прокатывает, ибо с русскими буквами Ax не дружит.
catalogObject = comApplication.Справочники.Контрагенты.СоздатьЭлемент();
Как обратится к справочнику "Контрагенты" в данном случае?
Старый 28.04.2017, 11:51   #14  
brahma is offline
brahma
Участник
1C
 
260 / 76 (3) ++++
Регистрация: 01.12.2005
Цитата:
Сообщение от TravellerInTime Посмотреть сообщение
Значит я всё правильно разобрался, что нужен именно Application.
Для открытия формы нужен Application. Другое дело стоит ли вообще связываться с открытием формы.
Цитата:
Сообщение от TravellerInTime Посмотреть сообщение
Получение данных из 1С планируется в настоящий момент через web-service. С ним еще не игрался, может тоже возникнет куча вопросов. Кстати, а как по скорости web service 1С?
Есть возможность получение данных через OData, есть возможность делать Rest через http-сервисы. Вроде в последней версии сделали возможность держать сеанс, это позволяет ускорить работу сервисов. Быстро или не быстро зависит от ваших задач.
Старый 02.05.2017, 19:30   #15  
Shirmin Oleg is offline
Shirmin Oleg
Участник
 
80 / 35 (2) +++
Регистрация: 26.03.2004
Цитата:
А вот такая строчка кода в Ax не прокатывает, ибо с русскими буквами Ax не дружит.
catalogObject = comApplication.Справочники.Контрагенты.СоздатьЭлемент();
Как обратится к справочнику "Контрагенты" в данном случае?
Мы для таких вещей сделали внешнюю обработку в 1С, которую дергаем из Аксапты, и весь код на русском - внутри обработки. Правда, у нас интеграция с 1С в одну сторону - выгружаем документы из Аксапты. Поэтому формы 1С из Аксапты нам открывать не нужно.
Старый 02.05.2017, 20:51   #16  
sukhanchik is offline
sukhanchik
Moderator
Аватар для sukhanchik
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
MCBMSS
Злыдни
 
2,455 / 1547 (56) ++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от TravellerInTime Посмотреть сообщение
Продолжаю изучать тему. С методанными вроде разобрался.
А вот такая строчка кода в Ax не прокатывает, ибо с русскими буквами Ax не дружит.
catalogObject = comApplication.Справочники.Контрагенты.СоздатьЭлемент();
Как обратится к справочнику "Контрагенты" в данном случае?
Русские буквы нигде не прокатывают - это ограничение COM со стороны Windows.
Тут нужно разделить задачи.
Задача 1. Обратиться к объекту 1С, как к объекту метаданных (в терминах АХ - обратиться к форме через класс TreeNode). Здесь все работает и получается.
Задача 2. Обратиться к объекту 1С как к хранилищу данных и выбрать из него данные. Это решается запросом, пример которого я приводил.
Задача 3. Обратиться к объекту 1С, как к хранилищу данных и записать в него данные. Здесь с одной стороны - Вам в помощь синтаксис-помощник, с помощью которого Вы может быть и добьетесь выполнения команды СоздатьЭлемент, но с другой стороны - Вы не сможете в реквизиты с русскими названиями записать данные. И это тоже ограничение COM. (Если я не ошибаюсь - проблем с общими реквизитами может и не возникнуть, но 100% возникнут проблемы с реквизитами, добавленными вручную).

Цитата:
Сообщение от Shirmin Oleg Посмотреть сообщение
Мы для таких вещей сделали внешнюю обработку в 1С, которую дергаем из Аксапты, и весь код на русском - внутри обработки. Правда, у нас интеграция с 1С в одну сторону - выгружаем документы из Аксапты. Поэтому формы 1С из Аксапты нам открывать не нужно.
Верно - это один из вариантов решения. Самый простой по реализации, но несущий в себе необходимость программирования на стороне 1С.
Есть вариант решения задачи без программирования на стороне 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  
TravellerInTime is offline
TravellerInTime
Участник
Аватар для TravellerInTime
 
99 / 31 (2) +++
Регистрация: 14.07.2003
Адрес: Россия, Тула
Всем спасибо!
У меня на настоящий момент не стоит задачи отдать данные из 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);
Теперь в "c" искомый справочник.
За это сообщение автора поблагодарили: S.Kuskov (2), sukhanchik (5), Logger (1).
Старый 03.05.2017, 09:12   #18  
sukhanchik is offline
sukhanchik
Moderator
Аватар для sukhanchik
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
MCBMSS
Злыдни
 
2,455 / 1547 (56) ++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от TravellerInTime Посмотреть сообщение
Теперь в "c" искомый справочник.
А что это за объект? Ну т.е. какие с ним действия можно сделать? Создать запись?
__________________
Возможно сделать все. Вопрос времени
Старый 03.05.2017, 12:00   #19  
TravellerInTime is offline
TravellerInTime
Участник
Аватар для TravellerInTime
 
99 / 31 (2) +++
Регистрация: 14.07.2003
Адрес: Россия, Тула
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
А что это за объект?
СправочникМенеджер.
Я не пробовал создавать запись, но, судя по описанию, можно.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
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, время: 10:59.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.