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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.12.2004, 12:07   #1  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
? Так можно ли в 1С передавать параметры, используя COM?
Хотелось бы реанимировать:
http://www.axforum.info/forums/showt...?threadid=5054
http://www.axforum.info/forums/showt...hp?postid=5005

Суть проблемы:
Цитата:
Изначально опубликовано Andrew Besedin
При работе с COM-компонентой 1С столкнулись с неожиданной проблемой. Следущий код не работает - почему, неясно.

COM InventLocations;
s = "СоздатьОбъект(\"Справочник.Склады\")";
InventLocations = v77.EvalExpr(s); //v77 - объект 1С
InventLocations.FindByCode("La-la-la");//Строка с ошибкой

Ошибка при выполнении "Один или несколько аргументов имеют неправильный тип"
однако, если искать в другом справочнике - например, Конрагенты, то все проходит ОК.
Эквивалентный код на VBA(Excel) работает ОК.
Пробовали использовать COMDispFunction - та же ошибка .
Участникам предыдущих дискуссий: ну и как, удалось решить? или пришлось идти обходными путями?
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 09.12.2004, 12:30   #2  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
В общем-то, ответ найден. Спасибо mazzy, за одно из его сообщений в упомянутых топиках (там он пишет, что реально метод выполняется).

Просто сделал try-catch с последующим вырезанием сообщения из Infolog. Остался только вопрос, как получить значение, которое возвращает функция из 1С.

Чуть позже, когда будет время, размещу здесь блок кода, который делает то, о чем я написал.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 09.12.2004, 12:42   #3  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
У меня точно такая же по сути проблема возникла когда я вызывал из аксапты COM (disp) объект OPOS для сканнера штрих-кодов! Напрямую работать с этим COM-объектом из аксапты так и не удалось ввиду вышесказанного, поэтому я написал промежуточный COM-объект на Delphi - обёртку вокруг OPOS объекта и... ошибка осталась!
Тут надо сказать что я в своём промежуточном объекте на дельфи для достука к реальному OPOS объекту использовал примерно следующий по смыслу код:
PHP код:
var OPOSDriver_DScanner;
....
OPOSDriver := CreateOleObject'oleobjectname' );
OPOSDriver.someMethod(...) 
_DScanner - это интерфейс OPOS драйвера, вытащенный из его библиотеки типов стандартными средствами дельфи.

Так вот на строчке OPOSDriver.someMethod() возникало абсолютно то же самое исключение, что и при прямой работе из аксапты с OPOSDriver таким же образом! "Один или несколько аргументов имеют неправильный тип"....

По какому то наитию я изменил стратегию работы с этим COM-объектом. Delphi при импорте библиотек типов ком-объектов создаёт классы-загрушки вокруг импортированных ком-объектов, которыми можно пользоваться, а можно и не пользоваться. В данном случае он создал класс TScanner, реализующий _DScanner и изменив код в промежуточном COM-объекте на примерно следующий:
PHP код:
var OPOSDriverTScanner;
...
OPOSDriver := TScanner.Createnil );
OPOSDriver.someMethod(...) 
...и получил корректно работающий код без всяких сообщений об ошибках со стороны аксапты.
Тут то я и попух, потому что никак не смог объяснить произошедшее.
До сих пор всё так и работает.
Старый 09.12.2004, 13:05   #4  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Действительно... происходящее можно объяснить тем что акспта где то внутри класса COM вместо кода

if ( FAILED( dispIface.Invoke( ... ) ) )
{
// raise error
}

использует

if ( dispIface.Invoke( ... ) != 0 )
{
// raise error
}

в ком-объектах почти все методы по идее должны возвращать значение типа HRESULT, нулевое значение которого (или константа S_OK) означает полный успех операции. Но значение это комплексное, разбито на битовые маски, из которых только часть означает фатальную ошибку.
Вот часть файла winerror.h, для прояснения ситуации:

PHP код:
//
// Generic test for success on any status value (non-negative numbers
// indicate success).
//

#define SUCCEEDED(Status) ((HRESULT)(Status) >= 0)

//
// and the inverse
//

#define FAILED(Status) ((HRESULT)(Status)<0)


//
// Generic test for error on any status value.
//

#define IS_ERROR(Status) ((unsigned long)(Status) >> 31 == SEVERITY_ERROR) 
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Dynamics AX: ERPLive.com - What's this? Blog bot DAX Blogs 0 26.09.2008 04:19
Dynamics AX: MicrosoftDynamicsAddons.com Blog bot DAX Blogs 0 22.01.2008 03:29
Arijit Basu: Reporting & BI in AX: An Overview [Level 100] Blog bot DAX Blogs 0 07.01.2008 16:01
Работа с COM-объектом 1С - НайтиПоКоду не ест параметры :( Tony Green DAX: Программирование 14 14.04.2004 11:29

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 17:14.