23.03.2015, 15:33 | #1 |
Участник
|
Проблемы с COM::getObject('Excel.Application')
Добрый день.
Столкнулся с такой проблемой: Если открыт excel и в документе начать редактировать ячейку(провалиться в него). То в AXAPTA метод COM::getObject('Excel.Application') срабатывает не корректно. При вызови любого метода на COM (Excel.visible(false)) сразу падает в ошибку. Метод "visible" не поддерживается интерфейсом Automation COM-объекта класса "<неизвестно>". Кто сталкивался с такой проблемой? Как ее можно решить? AXAPTA 2009, офис 2007 |
|
23.03.2015, 16:26 | #2 |
Молодой, подающий надежды
|
Вывод через COM всегда был крайне не стабилен. Обычно тяжелые отчеты, использующие COM, надо запустить и не дышать. В прямом смысле, даже мышкой дергать не надо и это к сожалению не шутки И даже это не гарантирует отсутствия неадекватных ошибок. А вы хотите в открытую Excel сессию вклиниться.
Есть всякие воркэраунды, типа • переписывания логики работы с офисом на .Net (Взаимодействие с Excel через .NET (семейство классов SysExcel)) • или в отдельные потоки (Ошибка времени выполнения в ComExcelDocument_RU.findRange() ) • или вызов функций через COMDispFunction (Ошибка при вызове COM-метода ) См. так же Win2008 и вызов методов COM-объектов выбор того или иного метода зависит от задачи, сроков, бюджета и т.д.
__________________
Кононов Пётр Последний раз редактировалось pedrozzz; 23.03.2015 в 16:39. |
|
|
За это сообщение автора поблагодарили: demianimp (1). |
23.03.2015, 17:42 | #3 |
Участник
|
не используйте COM
используйте .NET Microsoft уже давно говорит, что COM - deprecated |
|
|
За это сообщение автора поблагодарили: demianimp (0). |
23.03.2015, 23:51 | #4 |
Участник
|
Дело не в том, что COM - deprecated, а в том, что зачем-то в интеграцию через COM из интерфейсного потока клиента встроили таймауты для вызовов; .NET-обертки точно так же вызывают Excel через COM.
|
|
|
За это сообщение автора поблагодарили: demianimp (1). |
25.03.2015, 13:22 | #5 |
Участник
|
Всем спасибо.
Реализовал у себя такую заглушку, может кому пригодится. X++: //AX100765_fixCOMExcel_yada 24.03.2015 static COM getObject(str _className = 'Excel.Application') { COM excel; DialogButton returnButton; ; //Пытаемся получить COM объект excel = COM::getObject(_className); //Если COM объект получили и он заблокирован if(excel && excel.toString() == '') { //Выводим на экран диалоговое окно returnButton = box::okCancel('Ошибка при обращении к Excel.\n' + 'В данный момент происходит редактирование документа Excel и AXAPTA не может получить доступ.\n' + 'Прекратите редактирование документа и нажмите кнопку "ОК".', DialogButton::Cancel, 'Ошибка при обращении к Excel'); //Если пользователь нажал кнопку "OK" if(returnButton == DialogButton::Ok) { //Снова пытаемся получить доступ к COM объекту excel = ComExcel::getObject(_className); } else { //Возвращаем COM объект throw error('Операция отменена пользователем'); } } return excel; } |
|
|
|