09.12.2004, 12:07 | #1 |
Administrator
|
Так можно ли в 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 |
Administrator
|
В общем-то, ответ найден. Спасибо 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 |
Участник
|
У меня точно такая же по сути проблема возникла когда я вызывал из аксапты COM (disp) объект OPOS для сканнера штрих-кодов! Напрямую работать с этим COM-объектом из аксапты так и не удалось ввиду вышесказанного, поэтому я написал промежуточный COM-объект на Delphi - обёртку вокруг OPOS объекта и... ошибка осталась!
Тут надо сказать что я в своём промежуточном объекте на дельфи для достука к реальному OPOS объекту использовал примерно следующий по смыслу код: PHP код:
Так вот на строчке OPOSDriver.someMethod() возникало абсолютно то же самое исключение, что и при прямой работе из аксапты с OPOSDriver таким же образом! "Один или несколько аргументов имеют неправильный тип".... По какому то наитию я изменил стратегию работы с этим COM-объектом. Delphi при импорте библиотек типов ком-объектов создаёт классы-загрушки вокруг импортированных ком-объектов, которыми можно пользоваться, а можно и не пользоваться. В данном случае он создал класс TScanner, реализующий _DScanner и изменив код в промежуточном COM-объекте на примерно следующий: PHP код:
Тут то я и попух, потому что никак не смог объяснить произошедшее. До сих пор всё так и работает. |
|
09.12.2004, 13:05 | #4 |
Участник
|
Действительно... происходящее можно объяснить тем что акспта где то внутри класса COM вместо кода
if ( FAILED( dispIface.Invoke( ... ) ) ) { // raise error } использует if ( dispIface.Invoke( ... ) != 0 ) { // raise error } в ком-объектах почти все методы по идее должны возвращать значение типа HRESULT, нулевое значение которого (или константа S_OK) означает полный успех операции. Но значение это комплексное, разбито на битовые маски, из которых только часть означает фатальную ошибку. Вот часть файла winerror.h, для прояснения ситуации: PHP код:
|
|