Перем 
		Форма,
		ИмяКласса
		;
		
Функция Конт(Конт) Возврат Конт; КонецФункции
Функция Сам() Возврат Конт(Контекст); КонецФункции

Функция Форма()
	Возврат СоздатьОбъект("Форма");
КонецФункции
        
Процедура Конструктор()                                   
	Форма = Форма();
	ИмяКласса = "Форма";
КонецПроцедуры // Конструктор

Функция ОткрытьФормуЭлементаУправления(Параметры = "")
	Возврат Сам().ОткрытьФорму("Отчет", Параметры, КаталогИБ()+ "ExtForms\ОтчетЭлементУправления.ert");
КонецФункции

Функция ЭлементУправления()
	Возврат СоздатьОбъект("КлассЭлементУправления");
КонецФункции
    
Процедура ЗакрытьФорму(КонтФормы)
	Система = СоздатьОбъект("Система");
	Система.ЗакрытьФорму(КонтФормы);
КонецПроцедуры	// 

Процедура Тест_СоздатьОбъект() Экспорт
	Сам = Сам();
	Сам.ПроверитьРавенство(ТипЗначенияСтр(Форма), ИмяКласса);
КонецПроцедуры	// 

Процедура Тест_УстановитьФорму() Экспорт
	Сам = Сам();
	
	Конт = ОткрытьФормуЭлементаУправления();
	
	Форма.УстановитьФорму(Конт.Форма);  

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

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

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

//Процедура Тест_СброситьФорму() Экспорт
//	Сам = Сам();
//	
//	Конт = ОткрытьФормуЭлементаУправления();
//	
//	Форма.УстановитьФорму(Конт.Форма);  
//	Форма.СброситьФорму();  
//
//	Сам.ПроверитьРавенство(ТипЗначенияСтр(Форма), ИмяКласса);
//	
//	ЗакрытьФорму(Конт);
//	
//	Сам.ПроверитьРавенство(ТипЗначенияСтр(Форма), ИмяКласса);
//КонецПроцедуры	// 
//
//Процедура Тест_СброситьФормуБезВызоваУстановитьФорму() Экспорт
//	Сам = Сам();
//	
//	Конт = ОткрытьФормуЭлементаУправления();
//	
//	Форма.СброситьФорму();  
//
//	Сам.ПроверитьРавенство(ТипЗначенияСтр(Форма), ИмяКласса);
//	
//	ЗакрытьФорму(Конт);
//	
//	Сам.ПроверитьРавенство(ТипЗначенияСтр(Форма), ИмяКласса);
//КонецПроцедуры	// 

Процедура Тест_СоздатьЭлементУправленияОшибка() Экспорт
	Сам = Сам();
	
	Конт = ОткрытьФормуЭлементаУправления();

	Сам.ПроверитьИсключениеДляЛюбогоМетода(Форма, "СоздатьЭлементУправления", "НеважноЧто", "текстАктивИкс");
	
	Форма.УстановитьФорму(Конт.Форма);  
	Сам.ПроверитьИсключениеДляЛюбогоМетода(Форма, "СоздатьЭлементУправления", "ПростоСтрока", "текстАктивИкс");
	Сам.ПроверитьИсключениеДляЛюбогоМетода(Форма, "СоздатьЭлементУправления", "ООППотомок", "текстАктивИкс");
	
	ОбъектНеПотомокЭлементУправления = СоздатьОбъект("ООППредок");
	Сам.ПроверитьИсключениеДляЛюбогоМетода(Форма, "СоздатьЭлементУправления", ОбъектНеПотомокЭлементУправления, "текстАктивИкс");

	ЭлементУправления = ЭлементУправления();
	Сам.ПроверитьИсключениеДляЛюбогоМетода(Форма, "СоздатьЭлементУправления", ЭлементУправления, "НесуществующийРеквизит");

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

Процедура СоздатьЭлементУправленияЧерезАтрибутРасш(ФлагАтрибута, ФлагПростойВызов)
	Сам = Сам();
	
	Конт = ОткрытьФормуЭлементаУправления();
	                      
	Если ФлагАтрибута = 1 Тогда
		АтрибутИлиИДАтрибута = Конт.Форма.текстАктивИкс;
	Иначе
		АтрибутИлиИДАтрибута = "текстАктивИкс";
	КонецЕсли;

	ЭлементУправления = ЭлементУправления();
	Если ФлагПростойВызов = 1 Тогда
		Форма.УстановитьФорму(Конт.Форма);  
		СозданныйЭлементУправления = Форма.СоздатьЭлементУправления(ЭлементУправления, АтрибутИлиИДАтрибута);
	Иначе
		СозданныйЭлементУправления = Форма.СоздатьЭлементУправленияНаФорме(Конт.Форма, ЭлементУправления, АтрибутИлиИДАтрибута);
	КонецЕсли;

	Сам.ПроверитьРавенство(ТипЗначенияСтр(Форма), ИмяКласса);
	
КонецПроцедуры	// 

Процедура СоздатьЭлементУправленияЧерезАтрибут(ФлагАтрибута)
	СоздатьЭлементУправленияЧерезАтрибутРасш(ФлагАтрибута, 1);
КонецПроцедуры	// 

Процедура Тест_СоздатьЭлементУправленияЧерезИДАтрибута() Экспорт
	СоздатьЭлементУправленияЧерезАтрибут(0);
КонецПроцедуры	// 

Процедура Тест_СоздатьЭлементУправленияЧерезСамАтрибут() Экспорт
	СоздатьЭлементУправленияЧерезАтрибут(1);
КонецПроцедуры	// 

Процедура СоздатьЭлементУправленияНаФормеЧерезАтрибут(ФлагАтрибута)
	СоздатьЭлементУправленияЧерезАтрибутРасш(ФлагАтрибута, 0);
КонецПроцедуры	// 

Процедура Тест_СоздатьЭлементУправленияНаФормеЧерезИДАтрибута() Экспорт
	СоздатьЭлементУправленияНаФормеЧерезАтрибут(0);
КонецПроцедуры	// 

Процедура Тест_СоздатьЭлементУправленияНаФормеЧерезСамАтрибут() Экспорт
	СоздатьЭлементУправленияНаФормеЧерезАтрибут(1);
КонецПроцедуры	// 

Процедура Тест_СоздатьЭлементУправленияНаФормеОшибка() Экспорт
	Сам = Сам();
	
	Конт = ОткрытьФормуЭлементаУправления();

	Сам.ПроверитьИсключениеДляЛюбогоМетода(Форма, "СоздатьЭлементУправленияНаФорме", Конт.Форма, "НеважноЧто", "текстАктивИкс");
	
	Форма.УстановитьФорму(Конт.Форма);  
	Сам.ПроверитьИсключениеДляЛюбогоМетода(Форма, "СоздатьЭлементУправленияНаФорме", Конт.Форма, "ПростоСтрока", "текстАктивИкс");
	Сам.ПроверитьИсключениеДляЛюбогоМетода(Форма, "СоздатьЭлементУправленияНаФорме", Конт.Форма, "ООППотомок", "текстАктивИкс");
	
	ОбъектНеПотомокЭлементУправления = СоздатьОбъект("ООППредок");
	Сам.ПроверитьИсключениеДляЛюбогоМетода(Форма, "СоздатьЭлементУправленияНаФорме", Конт.Форма, ОбъектНеПотомокЭлементУправления, "текстАктивИкс");

	ЭлементУправления = ЭлементУправления();
	Сам.ПроверитьИсключениеДляЛюбогоМетода(Форма, "СоздатьЭлементУправленияНаФорме", Конт.Форма, ЭлементУправления, "НесуществующийРеквизит");

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

Процедура СоздатьЭлементУправленияНаФормеСВызовомСобытия(Событие, СтрокаЖурнала)
	Сам = Сам();
	                     
	Конт = ОткрытьФормуЭлементаУправления(Событие);

	Журнал = Конт.Форма.Параметр; // TurboBL
	Сам.ПроверитьРавенство(ТипЗначенияСтр(Журнал), "ЖурналВызоваМетодов");
	
	Форма.УстановитьФорму(Конт.Форма);  
	
	ЭлементУправления = ЭлементУправления();
	СозданныйЭлементУправления = Форма.СоздатьЭлементУправленияНаФорме(Конт.Форма, ЭлементУправления, "текстАктивИкс");

	Сам.ПроверитьРавенство(Журнал.стрЖурнал, СтрокаЖурнала);
	
КонецПроцедуры	// 

Процедура Тест_СоздатьЭлементУправленияНаФормеБезВызоваСобытия() Экспорт
	СоздатьЭлементУправленияНаФормеСВызовомСобытия("", "Форма::ПриОткрытии");
КонецПроцедуры	// 

Процедура Тест_СоздатьЭлементУправленияНаФормеСВызовомСобытия() Экспорт
	СоздатьЭлементУправленияНаФормеСВызовомСобытия("ВызватьСобытие", "Форма::ПриОткрытии, КлассФорма::УстановитьФорму, Форма::ФормаПриСоздании, Источник=Форма");
КонецПроцедуры	// 

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

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