Ошибка 0x800401FD

classic Classic list List threaded Threaded
7 messages Options
man2000 man2000
Reply | Threaded
Open this post in threaded view
|

Ошибка 0x800401FD

https://bitbucket.org/IgorKonovalov/octitbit/issue/2/message-not-found-for-errorcode-0x800401fd

По ссылке выше сказано, что ошибка "пофиксена", но вот у меня проявилась на версии OCTitbit 1.8.4, а именно: последовательно в цикле добавляю записи в справочник, при этом устанавливаю для каждой из них владельца (типа OCCatalogRef) и ... в какой-то итерации "Бах !" - ошибка 0x800401fd при вызове OCCatalogObject.setOwner().

Как бороться ?
 

IgorKonovalov IgorKonovalov
Reply | Threaded
Open this post in threaded view
|

Re: Ошибка 0x800401FD

This post was updated on .
OCTitbit 1.8.4??
Про 0x800401fd :
А можно кусок кода где она вываливается. По указанной ссылке я боролся несколько с другой проблемой - статическими полями. У Вас, мне кажется, отваливается именно OCCatalogObject от сервера. ...или даже тот кого Вы сеттите, т.е. ref
OCTitbit developer.
man2000 man2000
Reply | Threaded
Open this post in threaded view
|

Re: Ошибка 0x800401FD

Собственно вот фрагмент кода:

OCCatalogManager manCP = app.getCatalogManager("ВариантыКалендарныхПланов");
OCCatalogRef vlRef = manCP.findByCode(CodeVCP);
manCP = app.getCatalogManager("КалендарныеПланы");
while ( iWBS.hasNext() ) {
   WBS oWBS = iWBS.next();
   createGroupUSP(manCP,vlRef,oWBS,null);
}
...
private void createGroupUSP (
   OCCatalogManager sprCP,
   OCCatalogRef vCP,
   WBS oWBS,
   OCCatalogRef parGr ) {
try {
   OCCatalogObject newGr = sprCP.createItem();
   newGr.setOwner(vCP); // !!! Здесь ошибка !!!
   newGr.setCode(oWBS.getCode());
   newGr.setDescription(oWBS.getName());
   if (parGr!=null) newGr.setParent(parGr);
   newGr.write();
   BOIterator<WBS> icWBS = oWBS.loadAllWBS(new String[]{"Code","Name"},null,null );
   while ( icWBS.hasNext() ) {
      WBS ocWBS = icWBS.next();
      createGroupUSP(sprCP,vCP,ocWBS,newGr.getRef()); // Рекурсия
   }
   } catch(Exception e) {
      e.printStackTrace();
      return;
   }
}


Но вообще ссылка на запись справочника, полученная методом findByCode(), у меня и раньше отваливалась, но я это обошёл, переписав фрагмент так, что ссылку получал из запроса 1С.
Тут запрос совсем не к месту, но если только так, то придётся.
IgorKonovalov IgorKonovalov
Reply | Threaded
Open this post in threaded view
|

Re: Ошибка 0x800401FD

А попробуйте
createGroupUSP(manCP,vlRef.getRef(),oWBS,null);

А лучше
vlRef = vlRef.getRef();
createGroupUSP(manCP,vlRef,oWBS,null);
OCTitbit developer.
man2000 man2000
Reply | Threaded
Open this post in threaded view
|

Re: Ошибка 0x800401FD

This post was updated on .
Хех...
createGroupUSP(manCP,vlRef.getRef(),oWBS,null); заработало без ошибок !

Спасибо, Игорь ! А поделитесь "тайным знанием" зачем у ссылки запрашивать ссылку ещё раз и когда это надо делать?

И, кстати, а можно ли вызвать процедуру из модуля справочника 1С, если да, то как ?
IgorKonovalov IgorKonovalov
Reply | Threaded
Open this post in threaded view
|

Re: Ошибка 0x800401FD

К сожалению это "не бага, а фича".
Получение рефа от рефа - это в самом 1С. Зачем это там, я, признаться, не понял - практического применения этому не найдено. Возвращаясь к нашему случаю...
Когда Вы в цикле используете некую ссылку (именно извне цикла как в Вашем случае) и не обращаетесь к ней, а просто подставляете в какой-нибудь метод (например setOwner), то DCOM на стороне 1С решает ее... ну как garbage collecting в java.. удалить\отключить.
Workarounds:
1) createGroupUSP(manCP,vlRef.getRef(),oWBS,null); - это как раз обращение к бедной ссылке и, так сказать, поддержание ее в состоянии "она все еще нам нужна".
2) vlRef = vlRef.getRef() - более предпочтителен, так как мы всегда имеем свежий вариант ссылки как с точки зрения DCOM\1С, так и java.

Внимание вопрос: почему раньше такое не происходило? Самый тривиальный ответ, что все ссылки были весьма "активны" и\или не попадались длинные\долгие циклы. А теперь немного "вуду": не все ссылки и объекты одинаковы с точки зрения именно 1С. Например DocumentRef живет дольше CatalogRef, а с DocumentObject можно работать часами. А бывают ссылки, какие-то избранные CatalogRef, которые живую ровно(!!!) N-оборотов цикла (у меня был какой-то справочник который жил без "обновления" ровно 5 оборотов и хоть убейся).
Резюме: обойти это вполне можно, но исправить полностью можно видимо только на стороне 1С.
OCTitbit developer.
IgorKonovalov IgorKonovalov
Reply | Threaded
Open this post in threaded view
|

Re: Ошибка 0x800401FD

In reply to this post by man2000
man2000 wrote
...у меня и раньше отваливалась, но я это обошёл, переписав фрагмент так, что ссылку получал из запроса 1С.
Тут запрос совсем не к месту, но если только так, то придётся.
Кстати такой workaround тоже рабочий, но по сравнению с *.getRef()
OCTitbit developer.