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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.04.2004, 13:29   #1  
Tony Green is offline
Tony Green
Участник
Аватар для Tony Green
 
184 / 25 (1) +++
Регистрация: 08.10.2002
Адрес: Москва
Работа с 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 код:
    COM             c,
                    
cont;
    
int             res;

    
= new COM("V77.Application");

    
res c.Initialize(c.RMTrade(), '/D "C:\\1Cv77\\1SBDemo" /M''NO_SPLASH_SHOW');

    if (!
res) throw error('Ошибка при инициализации 1С');

    
cont c.CreateObject('Справочник.Контрагенты');
    
pause;

    
res cont.FindByCode("000001",0);

    print(
strfmt('%1 - %2',res,cont.Наименование()));
    
pause
Метод FindByCode вызывает ошибку. Пробовал самые различные комбинации с участием COMDispFunction, COMVariant - не выходит каменный цветок... Кстати, если засунуть вызывающую ошибку строчку в try .. catch, то можно увидеть, что хотя COM и ругается, но выполняет метод... Аналгоичный код на VBA под Excel, и на Delphi работает без ошибок.
И ещё: эта ошибка возникает только на win2k и winXP. Под 98-ми этот же код выполняется без эксепшенов... Присоветуйте, как бороться?
__________________
С уважением,
Tony Green
Старый 06.04.2004, 14:11   #2  
Beavis-analitik is offline
Beavis-analitik
Участник
 
7 / 10 (1) +
Регистрация: 31.03.2004
Imho самым простым решением будет дописать в глобальнике 1C что-нибудь вроде

Функция глПоискПоКоду(Назв, Код) Экспорт
спр = СоздатьОбъект("Справочник." + Назв);
если спр.НайтиПоКоду(Код, 0) = 1 тогда
Возврат спр;
конецЕсли;
КонецФункции

...и вызывать ее как метод объекта application => Возвращаемое значение можно принять в переменную типа COM и использовать.
__________________
- Зацени, Баттхед: я поставил Аксапту!
- Вот клёво! Ну ты даешь, пельмень!
Старый 06.04.2004, 14:33   #3  
Tony Green is offline
Tony Green
Участник
Аватар для Tony Green
 
184 / 25 (1) +++
Регистрация: 08.10.2002
Адрес: Москва
Тоже вариант, конечно... Но это не спортивно
Ладно бы оно нигде не работало, так ведь местами работает всё-таки... Значит может, зараза...
__________________
С уважением,
Tony Green
Старый 06.04.2004, 16:13   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Re: Работа с COM-объектом 1С - НайтиПоКоду не ест параметры :(
Цитата:
Изначально опубликовано Tony Green
Вот код. Он очень похож на тот кусок, который Маззи запостил и тогда назвал его
заведомо рабочим:
Рабочий, рабочий. Тогда я проверял.

Тогда мы долго искали с 1Сниками решение, которое работало бы на всех релизах. Вроде пришли к рекомендации, что второй параметр надо передавать как строку
PHP код:
res cont.FindByCode("000001","0"); 
В этот раз не проверял. Если будут сложности - попробую вернутся к этой проблеме вечером.
Старый 06.04.2004, 16:16   #5  
Tony Green is offline
Tony Green
Участник
Аватар для Tony Green
 
184 / 25 (1) +++
Регистрация: 08.10.2002
Адрес: Москва
Не помогает, к сожалению
__________________
С уважением,
Tony Green
Старый 07.04.2004, 13:02   #6  
Tony Green is offline
Tony Green
Участник
Аватар для Tony Green
 
184 / 25 (1) +++
Регистрация: 08.10.2002
Адрес: Москва
:(
Люююююдииии!!!

Ну почему? почему работает вот это:

PHP код:
Dim ApplCust As Object

Set Appl 
CreateObject("V77.Application")
result Appl.Initialize(Appl.RMTrade"/D""C:\1Cv77\1SBDemo"" /M""NO_SPLASH_SHOW")

If 
result 0 Then
    MsgBox 
("Приложение не инициализировано")
Else
    
Set Cust Appl.CreateObject("Справочник.Контрагенты")
    
Cust.FindByCode ("000031")
    
MsgBox (Cust.Наименование)
End If 
или вот это:

PHP код:
var
  
V,Variant;
begin
    V 
:= CreateOleObject('V77.Application');
    
V.Initialize(V.RMTrade'/D "C:\1Cv77\1SBDemo" /M''NO_SPLASH_SHOW');

    
:= V.CreateObject('Справочник.Контрагенты');

    
C.FindByCode('000031');
    
ShowMessage(C.Наименование);
end
а в аксапте под WinXP не пашет ни вот это:
PHP код:
    COM             v77,
                    
cust;
    
int             res;

    
v77 = new COM("V77.Application");

    
res v77.Initialize(v77.RMTrade(), '/D "C:\\1Cv77\\1SBDemo" /M''NO_SPLASH_SHOW');

    if (!
res) throw error('Ошибка при инициализации 1С');

    
cust v77.CreateObject('Справочник.Контрагенты');
    
res cust.FindByCode("000031",0);
    print(
cust.Наименование());
    
pause
ни вот так:
PHP код:
    COMDispFunction find = new COMDispFunction(dict'НайтиПоКоду'COMDispContext::Method);

    
COMVariant      code        = new COMVariant(COMVariantInOut::In,COMVariantType::VT_BSTR);
    
COMVariant      attr        = new COMVariant(COMVariantInOut::In,COMVariantType::VT_INT);
    
COMVariant      ret         = new COMVariant(COMVariantInOut::Out_retVal,COMVariantType::VT_BOOL);

    
code.bStr('000031');
    
attr.int(0);

    
find.call(code,attr,ret); 
Причем тот же код работает под 98-ми виндами... Не понимаю
__________________
С уважением,
Tony Green
Старый 07.04.2004, 14:07   #7  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
так, 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  
Tony Green is offline
Tony Green
Участник
Аватар для Tony Green
 
184 / 25 (1) +++
Регистрация: 08.10.2002
Адрес: Москва
Из Delphi, если вызывать методы COM-объекта 1С явно через Dispatch интерфейс, HRESULT возвращается нулевой...
__________________
С уважением,
Tony Green
Старый 08.04.2004, 12:04   #9  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
спасибо. похоже проблема таки в Аксапте...
но пока не могу найти 18 релиз...
Старый 09.04.2004, 14:26   #10  
Tony Green is offline
Tony Green
Участник
Аватар для Tony Green
 
184 / 25 (1) +++
Регистрация: 08.10.2002
Адрес: Москва
кстати, если в 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  
DSV is offline
DSV
Участник
 
129 / 10 (1) +
Регистрация: 12.06.2003
Адрес: Novocybers
Куда положить искомое?
Старый 12.04.2004, 06:43   #12  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
ломалки не надо.
все остальное, если не несколько мегабайт, можно сюда.
если большое, то можно подумать.
Старый 12.04.2004, 17:00   #13  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
DSV, мне подсказали, что я мог ошибиться в трактовке вашего предложения. Извините.

Если вы имели в виду 18 релиз, то ни в коем случае сюда его класть не надо. Не нужно здесь никакого софта.

Если вы говорили о работающем проекте, который вы сделали для Аксапты, то можно сюда его положить можно. А еще лушче положить его в раздел проекты.
Старый 14.04.2004, 09:10   #14  
DSV is offline
DSV
Участник
 
129 / 10 (1) +
Регистрация: 12.06.2003
Адрес: Novocybers
Сорри, неясно выразился.
Имелся в виду именно 18 релиз - порядка 14 метров.
Но проверить работоспособность примера из-за нехватки времени все не получается. ((((
Старый 14.04.2004, 11:29   #15  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Не надо релизы на форум выкладывать.
проблема та же - нужно время.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
работа 1С из Аксапты через COM _scorp_ DAX: Программирование 7 22.08.2008 15:45
Работа с Excel через COM и ошибка 0x800A03EC (Range.AutoFilter) gl00mie DAX: Программирование 15 30.03.2007 18:37
Так можно ли в 1С передавать параметры, используя COM? Maxim Gorbunov DAX: Программирование 3 09.12.2004 13:05
COM и работа с шаблонами Excel skvach DAX: Программирование 6 04.12.2003 16:58

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

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

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