06.04.2004, 13:29 | #1 |
Участник
|
Работа с COM-объектом 1С - НайтиПоКоду не ест параметры :(
Приветствую всех.
Проблема с вызовом метода ком-объекта 1С - НайтиПо Коду или FindByCode. Чего установлено: Windows XP, Axapta 3.0 SP2 CIS, 1C - 7.70.018 Ошибка: Метод 'FindByCode' в COM-объекте класса '<unknown>' возвратил код ошибки 0x80070057 (E_INVALIDARG), который означает: Один или более аргументов не верен. Хотя вот тут http://www.axforum.info/forums/showt...p?threadid=920 уже обсуждалась эта проблема, мне пока не удалось заставить метод работать по человечески... Вот код. Он очень похож на тот кусок, который Маззи запостил и тогда назвал его заведомо рабочим: PHP код:
И ещё: эта ошибка возникает только на win2k и winXP. Под 98-ми этот же код выполняется без эксепшенов... Присоветуйте, как бороться?
__________________
С уважением, Tony Green |
|
06.04.2004, 14:11 | #2 |
Участник
|
Imho самым простым решением будет дописать в глобальнике 1C что-нибудь вроде
Функция глПоискПоКоду(Назв, Код) Экспорт спр = СоздатьОбъект("Справочник." + Назв); если спр.НайтиПоКоду(Код, 0) = 1 тогда Возврат спр; конецЕсли; КонецФункции ...и вызывать ее как метод объекта application => Возвращаемое значение можно принять в переменную типа COM и использовать.
__________________
- Зацени, Баттхед: я поставил Аксапту! - Вот клёво! Ну ты даешь, пельмень! |
|
06.04.2004, 14:33 | #3 |
Участник
|
Тоже вариант, конечно... Но это не спортивно
Ладно бы оно нигде не работало, так ведь местами работает всё-таки... Значит может, зараза...
__________________
С уважением, Tony Green |
|
06.04.2004, 16:13 | #4 |
Участник
|
Re: Работа с COM-объектом 1С - НайтиПоКоду не ест параметры :(
Цитата:
Изначально опубликовано Tony Green
Вот код. Он очень похож на тот кусок, который Маззи запостил и тогда назвал его заведомо рабочим: Тогда мы долго искали с 1Сниками решение, которое работало бы на всех релизах. Вроде пришли к рекомендации, что второй параметр надо передавать как строку PHP код:
|
|
06.04.2004, 16:16 | #5 |
Участник
|
Не помогает, к сожалению
__________________
С уважением, Tony Green |
|
07.04.2004, 13:02 | #6 |
Участник
|
Люююююдииии!!!
Ну почему? почему работает вот это: PHP код:
PHP код:
PHP код:
PHP код:
__________________
С уважением, Tony Green |
|
07.04.2004, 14:07 | #7 |
Участник
|
так, Tony Green, спокойствие.
Я вчера проверил. Да, не работает с 21 релизом, ни 3.0, ни 2.5. Раньше работало. Барабашки нет. Значит что-то изменилось. Задача - выяснить. Да, действительно. Сам метод отрабатывает, но Аксапта возбуждает исключение. Исключение возбуждается поскольку метод возвращает ненулевой HRESULT. Если вы знакомы с COM, то должны знать, что внутри совсем все не так как пишется в коде. У меня подозрение, что 1С в некоторых конфигурациях выполняет код правильно, но возвращает HRESULT. Аксапта это ловит. Все басикоподобные языки сильно обертывают и прячут COM-события. Обратите внимание, что в басике и дельфи вы вызываете FindByCode как МЕТОД, а не как функцию! Обратите внимание, что там где у вас работает нет Retval параметра. Аксапта же всегда вызывает как функцию и хочет получить возвращаемое значение. Здесь то ее похоже и обламывают. Я протестил и Excel VBA. Excel выполнил не возбудил никаких исключений. У меня подозрение, что он и не смотрит в HRESULT. Т.е. все произошло так, как будто в Аксапте вызов findByCode обернули в Try catch. Погодите, хочу протестировать с ключом, с соболем и с соароном. Хочу протестировать 18 и 21 релиз, DBF и SQL версию. Обязательно расскажу о результатах. Пока у меня вопрос: какой HRESULT возвращает 1С, если вызвать ее из Delphi через iDispatch? |
|
08.04.2004, 10:35 | #8 |
Участник
|
Из Delphi, если вызывать методы COM-объекта 1С явно через Dispatch интерфейс, HRESULT возвращается нулевой...
__________________
С уважением, Tony Green |
|
08.04.2004, 12:04 | #9 |
Участник
|
спасибо. похоже проблема таки в Аксапте...
но пока не могу найти 18 релиз... |
|
09.04.2004, 14:26 | #10 |
Участник
|
кстати, если в X++ вызывать FindByCode просто, как метод COM объекта, то при выполнении вылезает ошибка: Метод 'FindByCode' в COM-объекте класса '<unknown>' возвратил код ошибки 0x80070057 (E_INVALIDARG), который означает: Один или более аргументов не верен.
Если же объявить метод перед вызовом как COMDispFunction и потом вызвать через call, то получается ошибка: Метод 'FindByCode' в COM-объекте класса 'unknown' возвратил код ошибки 0x80020010 (unknown), который означает: unknown. Что это означает я тоже пока не понял
__________________
С уважением, Tony Green |
|
12.04.2004, 05:26 | #11 |
Участник
|
Куда положить искомое?
|
|
12.04.2004, 06:43 | #12 |
Участник
|
ломалки не надо.
все остальное, если не несколько мегабайт, можно сюда. если большое, то можно подумать. |
|
12.04.2004, 17:00 | #13 |
Участник
|
DSV, мне подсказали, что я мог ошибиться в трактовке вашего предложения. Извините.
Если вы имели в виду 18 релиз, то ни в коем случае сюда его класть не надо. Не нужно здесь никакого софта. Если вы говорили о работающем проекте, который вы сделали для Аксапты, то можно сюда его положить можно. А еще лушче положить его в раздел проекты. |
|
14.04.2004, 09:10 | #14 |
Участник
|
Сорри, неясно выразился.
Имелся в виду именно 18 релиз - порядка 14 метров. Но проверить работоспособность примера из-за нехватки времени все не получается. (((( |
|
14.04.2004, 11:29 | #15 |
Участник
|
Не надо релизы на форум выкладывать.
проблема та же - нужно время. |
|