
Функция Конт(Конт) Возврат Конт; КонецФункции // : Контекст
Функция Сам() Возврат Конт(Контекст); КонецФункции

// Модуль = // :ВыполняемыйМодуль

Функция ВМ()
	Возврат СоздатьОбъект("ВыполняемыйМодуль");
КонецФункции

Функция ТекстМодуля()
	Перем ТекстМодуля;
	ТекстМодуля = "Перем ОткрытыйАтрибут Экспорт; Перем ЗакрытыйАтрибут;
		|
		|Процедура ЗакрытаяПроцедура()
		|	ОткрытыйАтрибут = ""ЗакрытаяПроцедура"";
		|	ЗакрытыйАтрибут = ""ЗакрытаяПроцедура"";
		|КонецПроцедуры
		|
		|Функция ЗакрытаяФункция()
		|	ОткрытыйАтрибут = ""ЗакрытаяФункция"";
		|	ЗакрытыйАтрибут = ""ЗакрытаяФункция"";
		|	Возврат ""ЗакрытаяФункция"";
		|КонецФункции
		|
		|Процедура ОткрытаяПроцедура() Экспорт
		|	ОткрытыйАтрибут = ""ОткрытаяПроцедура"";
		|	ЗакрытыйАтрибут = ""ОткрытаяПроцедура"";
		|КонецПроцедуры
		|
		|Функция ОткрытаяФункция() Экспорт
		|	ОткрытыйАтрибут = ""ОткрытаяФункция"";
		|	ЗакрытыйАтрибут = ""ОткрытаяФункция"";
		|	Возврат ""ОткрытаяФункция"";
		|КонецФункции
		|
		|	ЗакрытыйАтрибут = ""ЗакрытыйАтрибут"";
		|	ОткрытыйАтрибут = ""ОткрытыйАтрибут"";
		|";
	Возврат ТекстМодуля;
КонецФункции

Процедура ТестКомпилироватьМодуль() Экспорт
	Сам = Сам();

	Модуль = ВМ(); // :ВыполняемыйМодуль
	Модуль.УстановитьМодуль(ТекстМодуля());
	Сам.ПроверитьРавенство(Модуль.КомпилироватьМодуль(), 1);

	Модуль.УстановитьМодуль("1 "+ТекстМодуля());
	Сам.ПроверитьРавенство(Модуль.КомпилироватьМодуль(), 0);

КонецПроцедуры	// ТестКомпилироватьМодуль

Процедура ТестВыполнитьМодуль() Экспорт
	Сам = Сам();

	Модуль = ВМ(); // :ВыполняемыйМодуль
	Модуль.УстановитьМодуль(ТекстМодуля());
	Сам.ПроверитьРавенство(Модуль.КомпилироватьМодуль(), 1);
	Сам.ПроверитьРавенство(Модуль.ВыполнитьМодуль(), 1);
КонецПроцедуры	// ТестВыполнитьМодуль

Процедура ТестВыполнитьМодульСНевернымВызовом() Экспорт
	Сам = Сам();

	Модуль = ВМ(); // :ВыполняемыйМодуль

	Модуль.УстановитьМодуль(ТекстМодуля()+РазделительСтрок+"; ОткрытыйАтрибут.НеверныйВызов();");
	Сам.ПроверитьРавенство(Модуль.КомпилироватьМодуль(), 1);

	// TODO здесь что-то непонятное
	// тест вылетает в любом случае, есть дальше строки или их нет
	// при этом Модуль.ВыполнитьМодуль() = 0,
	//	выполнение процедуры нормально завершается, но тест падает :(
	Сам.ПропуститьТест();
	Сам.ПроверитьРавенство(Модуль.ВыполнитьМодуль(), 0); // TODO здесь что-то непонятное

	// другие попытки, также неудачные :(
	//фИсключения = 0;
	//Попытка
	//	Сообщить("Модуль.ВыполнитьМодуль() = <"+Модуль.ВыполнитьМодуль()+">");
	//Исключение
	//	фИсключения = 1;
	//КонецПопытки;
	//Сам.ПроверитьРавенство(фИсключения, 1);

	//Если Модуль.ВыполнитьМодуль() <> 0 Тогда
	//	Сам._ВыброситьИскл("НЕУДАЧА");
	//КонецЕсли;

КонецПроцедуры	// ТестВыполнитьМодуль

Процедура ТестОбращениеКВыполненномуМодулю() Экспорт
	Сам = Сам();

	Модуль = ВМ(); // :ВыполняемыйМодуль
	Модуль.УстановитьМодуль(ТекстМодуля());
	Сам.ПроверитьРавенство(Модуль.КомпилироватьМодуль(), 1);
	Сам.ПроверитьРавенство(Модуль.ВыполнитьМодуль(), 1);

	Сам.ПроверитьРавенство(Модуль.ОткрытыйАтрибут, "ОткрытыйАтрибут");
	Сам.ПроверитьРавенство(Модуль.ЗакрытыйАтрибут, "ЗакрытыйАтрибут");
	
	Модуль.ОткрытаяПроцедура();
	Сам.ПроверитьРавенство(Модуль.ОткрытыйАтрибут, "ОткрытаяПроцедура");
	Сам.ПроверитьРавенство(Модуль.ЗакрытыйАтрибут, "ОткрытаяПроцедура");
	
	Результат = Модуль.ОткрытаяФункция();
	Сам.ПроверитьРавенство(Результат, "ОткрытаяФункция");
	Сам.ПроверитьРавенство(Модуль.ОткрытыйАтрибут, "ОткрытаяФункция");
	Сам.ПроверитьРавенство(Модуль.ЗакрытыйАтрибут, "ОткрытаяФункция");
	
	Модуль.ЗакрытаяПроцедура();
	Сам.ПроверитьРавенство(Модуль.ОткрытыйАтрибут, "ЗакрытаяПроцедура");
	Сам.ПроверитьРавенство(Модуль.ЗакрытыйАтрибут, "ЗакрытаяПроцедура");
	
	Результат = Модуль.ЗакрытаяФункция();
	Сам.ПроверитьРавенство(Результат, "ЗакрытаяФункция");
	Сам.ПроверитьРавенство(Модуль.ОткрытыйАтрибут, "ЗакрытаяФункция");
	Сам.ПроверитьРавенство(Модуль.ЗакрытыйАтрибут, "ЗакрытаяФункция");

КонецПроцедуры	// ТестОбращениеКВыполненномуМодулю

Процедура ТестРекурсивныйВызов() Экспорт
	Сам = Сам();

	Модуль = ВМ();

	ТекстМодуля = "Процедура РекурсивныйВызов(Модуль, Строка1) Экспорт
		|Модуль.УстановитьМодуль(Строка1);
		|Модуль.КомпилироватьМодуль();
		|КонецПроцедуры
		|";

	Модуль.УстановитьМодуль(ТекстМодуля);
	Модуль.КомпилироватьМодуль();
	Модуль.ВыполнитьМодуль();
       
	Сам().ПропуститьТест(0);
	//Сам.ПроверитьИсключениеДляЛюбогоМетода(Модуль, "РекурсивныйВызов", "А=1;"); // Модуль.РекурсивныйВызов(Модуль,"А=1;"); // также ошибка - если раскомментарить, 1С вылетит
	Модуль.РекурсивныйВызов(Модуль,"А=1;"); // также ошибка - если раскомментарить, 1С вылетит

КонецПроцедуры	// ТестРекурсивныйВызов

Процедура ТестGetMethOfContext1() Экспорт
	Сам = Сам();

	Модуль = ВМ();                    
	
	табМетодов = СоздатьОбъект("ТаблицаЗначений");
	ТабСвойств = СоздатьОбъект("ТаблицаЗначений");
	
	Модуль.GetMethOfContext("Строка", табМетодов, ТабСвойств);	

	Сам.ПроверитьРавенство(ТипЗначенияСтр(табМетодов), "ТаблицаЗначений");
	Сам.ПроверитьРавенство(табМетодов.КоличествоСтрок(), 0);
	
	Сам.ПроверитьРавенство(ТипЗначенияСтр(ТабСвойств), "ТаблицаЗначений");
	Сам.ПроверитьРавенство(ТабСвойств.КоличествоСтрок() , 0);

КонецПроцедуры

Процедура ТестGetMethOfContext2() Экспорт
	Сам = Сам();

	Модуль = ВМ();                    
	
	Таб = СоздатьОбъект("ТаблицаЗначений");
	
	табМетодов = СоздатьОбъект("ТаблицаЗначений");
	ТабСвойств = СоздатьОбъект("ТаблицаЗначений");
	Модуль.GetMethOfContext(Таб, табМетодов, ТабСвойств);

	Сам.ПроверитьРавенство(ТипЗначенияСтр(табМетодов), "ТаблицаЗначений");
	Сам.ПроверитьРавенство(табМетодов.КоличествоСтрок(), 30);
	
	Сам.ПроверитьРавенство(ТипЗначенияСтр(ТабСвойств), "ТаблицаЗначений");
	Сам.ПроверитьРавенство(ТабСвойств.КоличествоСтрок() , 1);

КонецПроцедуры

Процедура ТестGetMethOfContext3() Экспорт
	Сам = Сам();

	Модуль = ВМ();                    
	
	Таб = СоздатьОбъект("ТаблицаЗначений");
	
	табМетодов = СоздатьОбъект("ТаблицаЗначений");
	Модуль.GetMethOfContext(Таб, табМетодов);

	Сам.ПроверитьРавенство(ТипЗначенияСтр(табМетодов), "ТаблицаЗначений");
	Сам.ПроверитьРавенство(табМетодов.КоличествоСтрок(), 30);

КонецПроцедуры

Процедура ТестGetMethOfContext4() Экспорт
	Сам = Сам();

	Модуль = ВМ();                    
	
	Таб = СоздатьОбъект("ТаблицаЗначений");
	
	Модуль.GetMethOfContext(Таб);

КонецПроцедуры

Процедура ТестGetMethOfContextПроизвольногоМодуля() Экспорт
	Сам = Сам();

	Модуль = ВМ();                    
	
	Модуль.УстановитьМодуль(ТекстМодуля());
	Сам.ПроверитьРавенство(Модуль.КомпилироватьМодуль(), 1);
	Сам.ПроверитьРавенство(Модуль.ВыполнитьМодуль(), 1);

	ОбПроверкаОбразов = СоздатьОбъект("ВыполняемыйМодуль_ОбразыКлассов");
	
	табМетодовИсходная = ОбПроверкаОбразов.ТаблицаМетодов_Создать(); 
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 0, "ЗакрытаяПроцедура", "ЗакрытаяПроцедура", 0, 0);
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 1, "ЗакрытаяФункция", "ЗакрытаяФункция", 1, 0);
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 2, "ОткрытаяПроцедура", "ОткрытаяПроцедура", 0, 0);
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 3, "ОткрытаяФункция", "ОткрытаяФункция", 1, 0);
	
	ТабСвойствИсходная = ОбПроверкаОбразов.ТаблицаСвойств_Создать();
	ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 0, "ОткрытыйАтрибут", "ОткрытыйАтрибут", 1, 1);
	ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 1, "ЗакрытыйАтрибут", "ЗакрытыйАтрибут", 1, 1);
	
	//ОбПроверкаОбразов.СверитьМетодыИСвойстваОбъектаБезБазовыхМетодовИСвойств(Контекст, Модуль, 4, 2);
	ОбПроверкаОбразов.СверитьМетодыИСвойстваОбъектаБезБазовыхМетодовИСвойств(Контекст, Модуль, табМетодовИсходная, ТабСвойствИсходная);
КонецПроцедуры

Процедура ТестGetMethOfContextБазовогоКласса() Экспорт
	Сам = Сам();

	Модуль = ВМ();                    
	Объект = СоздатьОбъект("ВыполняемыйМодуль_Предок");

	ОбПроверкаОбразов = СоздатьОбъект("ВыполняемыйМодуль_ОбразыКлассов");
	
	табМетодовИсходная = ОбПроверкаОбразов.ТаблицаМетодов_Создать(); 
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 0, "ПолучитьПоследнийВызванныйМетод", "", 1, 0);
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 1, "ОткрытаяПроцедура", "", 0, 0);
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 2, "ОткрытаяФункция", "", 1, 0);
	
	ТабСвойствИсходная = ОбПроверкаОбразов.ТаблицаСвойств_Создать();
	ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 0, "АтрибутБазовогоКласса", "АтрибутБазовогоКласса", 1, 1);
	ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 1, "АтрибутКласса", "АтрибутКласса", 1, 1);
	ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 2, "_ПоследнийВызванныйМетод", "_ПоследнийВызванныйМетод", 1, 1);

	ОбПроверкаОбразов.СверитьМетодыИСвойстваОбъектаБезБазовыхМетодовИСвойств(Контекст, Объект, табМетодовИсходная, ТабСвойствИсходная);
КонецПроцедуры

//Процедура ТестGetMethOfContextКлассаПотомка() Экспорт
//	Сам = Сам();
//
//	Модуль = ВМ();                    
////	Объект = СоздатьОбъект("ВыполняемыйМодуль_Потомок");
////
////	ОбПроверкаОбразов = СоздатьОбъект("ВыполняемыйМодуль_ОбразыКлассов");
////	
////	табМетодовИсходная = ОбПроверкаОбразов.ТаблицаМетодов_Создать(); 
////	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 0, "", "Функция1", 1, 0);
////	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 1, "", "Процедура1", 0, 1);
////	
////	ТабСвойствИсходная = ОбПроверкаОбразов.ТаблицаСвойств_Создать();
////	ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 0, "АтрибутБазовогоКласса", "АтрибутБазовогоКласса", 1, 1);
////	ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 1, "АтрибутКласса", "АтрибутКласса", 1, 1);
////	ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 2, "_ПоследнийВызванныйМетод", "_ПоследнийВызванныйМетод", 1, 1);
////	
////	ОбПроверкаОбразов.СверитьМетодыИСвойстваОбъектаБезБазовыхМетодовИСвойств(Контекст, Объект, табМетодовИсходная, ТабСвойствИсходная);
//	
//	// !! ПОКА НЕ РЕАЛИЗОВАНО !!
//КонецПроцедуры

Процедура ТестСформироватьОшибку() Экспорт
	Сам = Сам();
	Модуль = ВМ();
	
	//Модуль.СформироватьОшибку("Тестовая ошибка");
	Сам.ПроверитьИсключениеДляЛюбогоМетода(Модуль, "СформироватьОшибку", "Тестовая ошибка");
КонецПроцедуры	// ТестСформироватьОшибку

Процедура ТестВыброситьИскл() Экспорт
	Сам = Сам();
	Модуль = ВМ();
	
	//Модуль.ВыброситьИскл("ТестовоеИсключение", "ТекстТестовогоИсключения");
	Сам.ПроверитьИсключениеДляЛюбогоМетода(Модуль, "ВыброситьИскл", "ТестовоеИсключение", "ТекстТестовогоИсключения");
КонецПроцедуры

Процедура ТестВыброситьИскл2() Экспорт
	Сам = Сам();
	Модуль = ВМ();
	
	//Модуль.ВыброситьИскл("ТестовоеИсключение");
	Сам.ПроверитьИсключениеДляЛюбогоМетода(Модуль, "ВыброситьИскл", "ТестовоеИсключение");
КонецПроцедуры

Процедура ТестПолучитьИсключение() Экспорт
	Сам = Сам();
	Модуль = ВМ();
	    
	ОбИсключение = "";
	Попытка
		Модуль.ВыброситьИскл("ТестовоеИсключение");
	Исключение
		ОбИсключение = Модуль.ПолучитьИсключение();
	КонецПопытки;     
	
	Сам.ПроверитьРавенство(ОбИсключение, "ТестовоеИсключение");
КонецПроцедуры

Процедура ТестКомпилироватьИВыполнитьМодуль() Экспорт
	Сам = Сам();

	Модуль = ВМ(); // :ВыполняемыйМодуль

	Модуль.УстановитьМодуль(ТекстМодуля());
	//Сам().ПроверитьИсключениеДляЛюбогоМетода(Модуль, "КомпилироватьИВыполнитьМодуль"); //Модуль.КомпилироватьИВыполнитьМодуль();
	Модуль.КомпилироватьИВыполнитьМодуль();
КонецПроцедуры	// ТестКомпилироватьМодуль

Процедура ТестКомпилироватьИВыполнитьМодульСОшибкой() Экспорт
	Сам = Сам();

	Модуль = ВМ(); // :ВыполняемыйМодуль

	Модуль.УстановитьМодуль("1 "+ТекстМодуля());

	Сам().ПроверитьИсключениеДляЛюбогоМетода(Модуль, "КомпилироватьИВыполнитьМодуль"); //Модуль.КомпилироватьИВыполнитьМодуль();
КонецПроцедуры	// ТестКомпилироватьМодуль

Процедура ТестНеверныйВызов() Экспорт
	Сам = Сам();

	Модуль = ВМ(); // :ВыполняемыйМодуль
	
	Сам().ПроверитьИсключениеДляЛюбогоМетода(Модуль, "НеверныйВызов"); // Модуль.НеверныйВызов();
КонецПроцедуры	// ТестНеверныйВызов

Процедура ТестКомпилироватьИВыполнитьМодульССинтаксическойОшибкой() Экспорт
	Сам = Сам();

	Модуль = ВМ(); // :ВыполняемыйМодуль

	Модуль.УстановитьМодуль("1 "+ТекстМодуля());

	 Сам().ПроверитьИсключениеДляЛюбогоМетода(Модуль, "КомпилироватьИВыполнитьМодуль"); // Модуль.КомпилироватьИВыполнитьМодуль();

КонецПроцедуры

Процедура ТестКомпилироватьИВыполнитьМодульСНевернымВызовом() Экспорт
	Сам = Сам();

	Модуль = ВМ(); // :ВыполняемыйМодуль

	Модуль.УстановитьМодуль(ТекстМодуля()+РазделительСтрок+"ОткрытыйАтрибут.НеверныйВызов();");

	// TODO здесь что-то непонятное
	// тест вылетает в любом случае, есть дальше строки или их нет
	// при этом Модуль.ВыполнитьМодуль() = 0,
	//	выполнение процедуры нормально завершается, но тест падает :(
	
	//Сам().ПроверитьИсключениеДляЛюбогоМетода(Модуль, "КомпилироватьИВыполнитьМодуль"); // Модуль.КомпилироватьИВыполнитьМодуль();

	Сам.ПропуститьТест();
	Модуль.КомпилироватьИВыполнитьМодуль();
	// Сам.ПроверитьРавенство(Модуль.ВыполнитьМодуль(), 0); // TODO здесь что-то непонятное

	// другие попытки, также неудачные :(
	//фИсключения = 0;
	//Попытка
	//	Сообщить("Модуль.ВыполнитьМодуль() = <"+Модуль.ВыполнитьМодуль()+">");
	//Исключение
	//	фИсключения = 1;
	//КонецПопытки;
	//Сам.ПроверитьРавенство(фИсключения, 1);

	//Если Модуль.ВыполнитьМодуль() <> 0 Тогда
	//	Сам._ВыброситьИскл("НЕУДАЧА");
	//КонецЕсли;

КонецПроцедуры
          
Процедура ТестGetMethOfContextПустогоКонтекста() Экспорт
	Сам = Сам();
	
	Конт = "";    
	
	табМетодов = СоздатьОбъект("ТаблицаЗначений");
	ТабСвойств = СоздатьОбъект("ТаблицаЗначений");
	
	Модуль = ВМ(); // :ВыполняемыйМодуль
	
	Модуль.GetMethOfContext("Строка", табМетодов, ТабСвойств);	

	Сам.ПроверитьРавенство(ТипЗначенияСтр(табМетодов), "ТаблицаЗначений");
	Сам.ПроверитьРавенство(табМетодов.КоличествоСтрок(), 0);
	
	Сам.ПроверитьРавенство(ТипЗначенияСтр(ТабСвойств), "ТаблицаЗначений");
	Сам.ПроверитьРавенство(ТабСвойств.КоличествоСтрок() , 0);
	
КонецПроцедуры	// ТестПустогоКонтекста

Процедура ТестGetMethOfContextДляМодуляВстроенногоОтчета() Экспорт
	Конт = "";    
	Сам().ОткрытьФорму("Отчет.ПолучениеМетодовИСвойств", Конт);
	Конт = Сам().КонтекстФормы;
	
	табМетодов = СоздатьОбъект("ТаблицаЗначений");
	ТабСвойств = СоздатьОбъект("ТаблицаЗначений");
	
	Модуль = ВМ(); // :ВыполняемыйМодуль
	Модуль.GetMethOfContext(Конт, табМетодов, ТабСвойств);
//табМетодов.ВыбратьСтроку("");	
//ТабСвойств.ВыбратьСтроку("");
//	Модуль.GetMethOfContext(Конт);
	
	табМетодов = СоздатьОбъект("ТаблицаЗначений");
	ТабСвойств = СоздатьОбъект("ТаблицаЗначений");
	
	Модуль = ВМ(); // :ВыполняемыйМодуль

	ОбПроверкаОбразов = СоздатьОбъект("ВыполняемыйМодуль_ОбразыКлассов");
	
	табМетодовИсходная = ОбПроверкаОбразов.ТаблицаМетодов_Создать(); 
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 0, "", "УстановитьРеквизит_АтрибутМодуля", 0, 1);
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 1, "", "ПолучитьРеквизит_АтрибутМодуля", 1, 0);
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 2, "", "ПриОткрытии", 0, 0);
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 3, "", "ПриПовторномОткрытии", 0, 0);
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 4, "", "Сформировать", 0, 0);
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 5, "", "ПолучитьТаблицу", 1, 0);
	
	ТабСвойствИсходная = ОбПроверкаОбразов.ТаблицаСвойств_Создать();
	// TODO для встроенных отчетов пока не выдает список реквизитов, а для внешних выдает :(
	//ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 0, "", "Флажок", 1, 1);
	//ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 1, "", "Реквизит", 1, 1);
	//ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 2, "", "ПолеСоСписком", 1, 0);
	//ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 3, "АтрибутМодуля", "", 1, 1);
	ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 0, "", "АтрибутМодуля", 1, 1);
	
	ОбПроверкаОбразов.СверитьМетодыИСвойстваОбъектаБезБазовыхМетодовИСвойств(Контекст, Конт, табМетодовИсходная, ТабСвойствИсходная);
	
	Конт.Форма.Закрыть(0);
КонецПроцедуры	// ТестМодуляФормыОтчета

Процедура ТестGetMethOfContextДляМодуляВнешнегоОтчета() Экспорт
	Сам().ПроверитьРавенство(ФС.СуществуетФайл(КаталогИБ()+"ExtForms\ПолучениеМетодовИСвойств.ert"), 1);

	Конт = 0;    
	Сам().ОткрытьФорму("Отчет", Конт, КаталогИБ()+"ExtForms\ПолучениеМетодовИСвойств.ert");
	Конт = Сам().КонтекстФормы;
	
	табМетодов = СоздатьОбъект("ТаблицаЗначений");
	ТабСвойств = СоздатьОбъект("ТаблицаЗначений");
	
	Модуль = ВМ(); // :ВыполняемыйМодуль
	Модуль.GetMethOfContext(Конт, табМетодов, ТабСвойств);
//табМетодов.ВыбратьСтроку("");	
//ТабСвойств.ВыбратьСтроку("");
//	Модуль.GetMethOfContext(Конт);

	ОбПроверкаОбразов = СоздатьОбъект("ВыполняемыйМодуль_ОбразыКлассов");
	
	табМетодовИсходная = ОбПроверкаОбразов.ТаблицаМетодов_Создать(); 
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 0, "", "УстановитьРеквизит_АтрибутМодуля", 0, 1);
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 1, "", "ПолучитьРеквизит_АтрибутМодуля", 1, 0);
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 2, "", "УстановитьПараметр", 0, 2);
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 3, "", "ПриОткрытии", 0, 0);
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 4, "", "ПриПовторномОткрытии", 0, 0);
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 5, "", "Сформировать", 0, 0);
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 6, "", "ПолучитьТаблицу", 1, 0);
	ОбПроверкаОбразов.ТаблицаМетодов_ДобавитьСтроку(табМетодовИсходная, 7, "", "ПриЗакрытии", 0, 0);
	
	ТабСвойствИсходная = ОбПроверкаОбразов.ТаблицаСвойств_Создать();          
	
	// сначала список реквизитов, затем список переменных модуля
	ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 0, "", "Флажок", 1, 1);
	ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 1, "", "Реквизит", 1, 1);
	ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 2, "", "ПолеВвода", 1, 1);
	ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 3, "", "ПолеСоСписком", 1, 0);
	ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 4, "", "тзНаФорме", 1, 0);
	ОбПроверкаОбразов.ТаблицаСвойств_ДобавитьСтроку(ТабСвойствИсходная, 5, "", "АтрибутМодуля", 1, 1);
	
	ОбПроверкаОбразов.СверитьМетодыИСвойстваОбъектаБезБазовыхМетодовИСвойств(Контекст, Конт, табМетодовИсходная, ТабСвойствИсходная);
	
	Конт.Форма.Закрыть(0);
КонецПроцедуры	// ТестМодуляФормыОтчета

Процедура ТестРазрешитьИсключения1() Экспорт
	Перем Модуль;
	Сам = Сам();

	Модуль = ВМ(); // :ВыполняемыйМодуль
	Модуль.РазрешитьИсключения();
                       
	Модуль.УстановитьМодуль("1 "+ТекстМодуля());

	 Сам().ПроверитьИсключениеДляЛюбогоМетода(Модуль, "Компилировать"); // Модуль.Компилировать();
КонецПроцедуры	// ТестРазрешитьИсключения

Процедура ТестРазрешитьИсключения2() Экспорт
	Сам = Сам();

	Модуль = ВМ(); // :ВыполняемыйМодуль
	Модуль.РазрешитьИсключения();

	Модуль.УстановитьМодуль(ТекстМодуля()+РазделительСтрок+"ОткрытыйАтрибут.НеверныйВызов();");

	// TODO здесь что-то непонятное          
	// смотри описание в "ТестВыполнитьМодульСНевернымВызовом"
	 Модуль.ВыполнитьМодуль();
КонецПроцедуры	// ТестРазрешитьИсключения

Процедура ТестРазрешитьИсключения3() Экспорт
	Перем Модуль;
	Сам = Сам();

	Модуль = ВМ(); // :ВыполняемыйМодуль
	Модуль.РазрешитьИсключения();

	Модуль.УстановитьМодуль("1 "+ТекстМодуля());

	 Сам().ПроверитьИсключениеДляЛюбогоМетода(Модуль, "КомпилироватьИВыполнитьМодуль"); // Модуль.КомпилироватьИВыполнитьМодуль();
КонецПроцедуры	// ТестРазрешитьИсключения

Процедура ТестРазрешитьИсключения4() Экспорт
	Сам = Сам();

	Модуль = ВМ(); // :ВыполняемыйМодуль
	Модуль.РазрешитьИсключения();

	Модуль.УстановитьМодуль(ТекстМодуля()+РазделительСтрок+"ОткрытыйАтрибут.НеверныйВызов();");

	// TODO здесь что-то непонятное          
	// смотри описание в "ТестВыполнитьМодульСНевернымВызовом"
	Сам.ПропуститьТест();
	Модуль.КомпилироватьИВыполнитьМодуль();
КонецПроцедуры	// ТестРазрешитьИсключения

Процедура ТестВыполнитьПроцедуруКонтекста() Экспорт
	Сам = Сам();

	Модуль = ВМ(); // :ВыполняемыйМодуль
	
	Таб = СоздатьОбъект("ТаблицаЗначений");
	фРез = Модуль.ВыполнитьПроцедуруКонтекста(Таб, "ВыбратьСтроки", СоздатьОбъект("СписокЗначений"));
	Сам.ПроверитьРавенство(фРез, 1);
КонецПроцедуры	// ТестРазрешитьИсключения

Процедура ТестВыполнитьФункциюКонтекста() Экспорт
	Сам = Сам();

	Модуль = ВМ(); // :ВыполняемыйМодуль
	
	Таб = СоздатьОбъект("ТаблицаЗначений");
	лРез = -1;
	фРез = Модуль.ВыполнитьФункциюКонтекста(Таб, "НоваяСтрока", СоздатьОбъект("СписокЗначений"), лРез);
	Сам.ПроверитьРавенство(фРез, 1);
	Сам.ПроверитьРавенство(Таб.КоличествоСтрок(), 1);

	лРез = -1;
	фРез = Модуль.ВыполнитьФункциюКонтекста(Таб, "КоличествоСтрок", СоздатьОбъект("СписокЗначений"), лРез);
	Сам.ПроверитьРавенство(фРез, 1);
	Сам.ПроверитьРавенство(лРез, 1);
КонецПроцедуры	// ТестРазрешитьИсключения

Процедура ТестВыполнитьПроцедуруГрупповогоКонтекста() Экспорт
	Сам = Сам();

	Модуль = ВМ(); // :ВыполняемыйМодуль
	
	Конт = 0;
	Сам().ОткрытьФорму("Отчет#", Конт, КаталогИБ()+"ExtForms\ОтчетНовый1.ert");
	Конт = Сам().КонтекстФормы;
	
	фРез = Модуль.ВыполнитьПроцедуруКонтекста(Конт, "Сформировать", СоздатьОбъект("СписокЗначений"));
	Сам.ПроверитьРавенство(фРез, 1);
	
	Конт.Форма.Закрыть(0);
КонецПроцедуры	// ТестРазрешитьИсключения

Процедура ТестВыполнитьФункциюГрупповогоКонтекста() Экспорт
	Сам = Сам();

	Модуль = ВМ(); // :ВыполняемыйМодуль
	
	Конт = 0;
	Сам().ОткрытьФорму("Отчет#", Конт, КаталогИБ()+"ExtForms\ОтчетНовый1.ert");
	Конт = Сам().КонтекстФормы;
	
	лРез = -1;
	фРез = Модуль.ВыполнитьФункциюКонтекста(Конт, "ПолучитьРеквизит_АтрибутМодуля", СоздатьОбъект("СписокЗначений"), лРез);
	Сам.ПроверитьРавенство(фРез, 1);
	Сам.ПроверитьРавенство(лРез, 1);
КонецПроцедуры	// ТестРазрешитьИсключения

Процедура ТестВыполнитьПроцедуруГрупповогоКонтекста2() Экспорт
	Сам = Сам();

	Модуль = ВМ(); // :ВыполняемыйМодуль
	
	Конт = 0;
	Сам().ОткрытьФорму("Отчет.новый1#", Конт);
	Конт = Сам().КонтекстФормы;
	
	фРез = Модуль.ВыполнитьПроцедуруКонтекста(Конт, "Сформировать", СоздатьОбъект("СписокЗначений"));
	Сам.ПроверитьРавенство(фРез, 1);
	
	Конт.Форма.Закрыть(0);
КонецПроцедуры	// ТестРазрешитьИсключения

Процедура ТестВыполнитьФункциюГрупповогоКонтекста2() Экспорт
	Сам = Сам();

	Модуль = ВМ(); // :ВыполняемыйМодуль
	
	Конт = 0;
	Сам().ОткрытьФорму("Отчет.новый1#", Конт);
	Конт = Сам().КонтекстФормы;
	
	лРез = -1;
	фРез = Модуль.ВыполнитьФункциюКонтекста(Конт, "ПолучитьРеквизит_АтрибутМодуля", СоздатьОбъект("СписокЗначений"), лРез);
	Сам.ПроверитьРавенство(фРез, 1);
	Сам.ПроверитьРавенство(лРез, 1);
КонецПроцедуры	// ТестРазрешитьИсключения
