| 
			
			 | 
		#1 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
			
			 
			
			Как нужно описать в коде исключение для COM-объекта, чтобы Аксапта не генерировала сообщение об ошибке? 
		
		
		
		
		
		
		
	Объясню ситуацию: Есть две версии COM-объекта “Word.Application”. В одной версии, этого COMа, есть функция InsertRowsBelow, в другой, в место неё есть функция InsertRows. Необходимо сделать так, чтобы в случае неудачного вызова первой функции (InsertRowsBelow) вызывалась вторая (InsertRows). Вот как я пытался это сделать: try { selection.InsertRowsBelow(_num); // Здесь вываливается сообщение об ошибке } catch(exception::Error) { selection.InsertRows(_num); }  | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Насколько известно, по-хорошему сделать это нельзя. 
		
		
		
		
		
		
		
	Есть способ типа "грязный хак": нарыть в MorphX класс Info и доработать его. Например, поправить метод viewBuild, там есть код <...> if (!browser.design().visible()) { browser.design().visible(true); <...> Написанное относится к 3.0 SP1 Rus  | 
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Большое спасибо Beavis-analitik за ваш ответ. 
		
		
		
		
		
		
		
	Этот способ мне известен. Но в данной ситуации необходимо реализовать это исключение не меняя класса Info. Попробую что-нибудь придумать.  | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Расскажите поподробнее, пожалуйста, об этом способе. 
		
		
		
		
		
		
		
	Цитата: 
	
		
			Есть способ типа "грязный хак": нарыть в MorphX класс Info и доработать его.
		
	 
Хочу ещё поделиться проблемой при выгрузке в Excel Одна и та же выгрузка данных в Excel завершается успешно, условно говоря, два раза из трёх. Одна из типичных ошибок: "...Ошибка COM ...метод Value2() вызван с неверным количеством параметров". Выгрузка организована через "чистый" COM, а не класс ComExcelDocument_RU; вставка осуществляется построчно из массива (метод описан на форуме). Может, кто-то сталкивался с подобным непослушанием.  | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Не понял, наверное, потому что не пользуюсь MorphX. В AOT'е класс Info не светится...
		
	 
Имхо MorphX и AOT это одно и то же Developer's Guide: Цитата: 
	
		
			The development environment in Axapta is called MorphX.
		
	 
 | 
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			У меня есть опыт работы с комом, правда в основном не в Аксапте. На сколько я понимаю такого быть не может. Я хотел бы глянуть код, если это возможно.
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#7 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Попробуй внутри catch что-то типа 
		
		
		
		
		
		
		
	PHP код: 
	
			
	 | 
| 
	
 | 
| 
			
			 | 
		#8 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Дело втом, что сообщение об ошибке вываливается сразу после обращения к методу. До catch дело не дохдит.
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#9 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Посмотри класс SysExcelTemplateWizard методы createWorkBook() или openWorkBook(). Там идет обработка ошибок при работе с Excel через COM.
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#10 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Спасибо за совет, но я работаю с Word. И в класса которые там используются это сообщение не генерится. Может есть подобный класс для Word?
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#11 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Может я чего-то не понимаю, но вроде бы логика простая. Пусть даже сообщение об ошибке вываливается до catch, но сразу после этого в catch оно удаляется из Infolog`а. И в принципе пользователь не должен ничего увидеть. Единственный, может у тебя catch не выполняется. Такое может быть, если твой код расположен внутри ttsbegin .. ttscommit.
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#12 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			try 
		
		
		
		
		
		
		
	{ selection.InsertRowsBelow(_num); // Здесь вываливается сообщение об ошибке } catch(exception::Error) { selection.InsertRows(_num); } После того как вываливается сообщение выполнение процедуры останавливается, нет ttsbegin и ttscommit.  | 
| 
	
 | 
| 
			
			 | 
		#13 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Изначально опубликовано bms  
try { selection.InsertRowsBelow(_num); // Здесь вываливается сообщение об ошибке } catch(exception::Error) { selection.InsertRows(_num); } { infolog.clear(); selection.InsertRows(_num); }  | 
| 
	
 | 
| 
			
			 | 
		#14 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 | 
| 
	
 | 
| 
			
			 | 
		#15 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Господа CATCH ВООБЩЕ НЕ ВЫПОЛНЯЕТСЯ!!!  
		
		
		
		
		
		
		
	После selection.InsertRowsBelow(_num); выполнение процедуры прекращается.  | 
| 
	
 | 
| 
			
			 | 
		#16 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Возможножно возникает Exception не того типа, который вы обрабатываете (не Exception::Error). Попробуйте написать обработчики и для других типов исключений (Exception: 
		
		
		
		
		
		
		
	 eadlock и т.д. по списку). Не уверен,  но может что и получится
		 | 
| 
	
 | 
| 
			
			 | 
		#17 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Спасибо, но это первое что я сделал. Я перепробовал все типы Exception но результата так и не добился.
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#18 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			К сожалению ты прав. Ошибка отсутствия метода не перехватывается.  
		
		
		
		
		
		
		
	  А почему бы не воспользоваться методом version() объекта Application? И в зависмости от полученного значения вызывать тот или иной метод.
		 | 
| 
	
 | 
| 
			
			 | 
		#19 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Использовать Version() в данной ситуации не хотелось бы, но видно другого выхода нет. 
		
		
		
		
		
		
		
	Спасибо за помощь.  | 
| 
	
 | 
| 
			
			 | 
		#20 | 
| 
			
			 Роман Долгополов (RDOL) 
		
			
	 | 
	
	
	
		
		
			
			 Цитата: 
	
		
			Изначально опубликовано bms  
Использовать Version() в данной ситуации не хотелось бы, но видно другого выхода нет. static void Job151(Args _args) { COM excel = new COM("Excel.Application"); try { new COMDispFunction(excel, "badfunction",COMDispContext::METHOD).call(); } catch (Exception::Internal) { info("Error found"); } } По уму следует создавать ту версию COM объекта, в которой присутсвует нужный метод , например new COM("Excel.Application.8")  | 
| 
	
 |