Перем КонтекстФормы Экспорт;
Перем РасширениеФормы;

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

Процедура Конструктор()
	РасширениеФормы=СоздатьОбъект("РасширениеФормы");
КонецПроцедуры
//--------------------------------------------

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

Процедура Деструктор()
	ЗакрытьФорму();
КонецПроцедуры
//--------------------------------------------

Процедура УстановитьКонтекст(Конт) Экспорт
	КонтекстФормы=Конт;
	РасширениеФормы.УстановитьФорму(КонтекстФормы.Форма);
	//спОткрытыеКонтексты.ДобавитьЗначение(КонтекстФормы);
КонецПроцедуры
//--------------------------------------------

Функция ОткрытьФорму() Экспорт
Перем Пар[5];
	Если ТипЗначенияСтр(КонтекстФормы)="ГрупповойКонтекст" Тогда
		Модуль=СоздатьОбъект("ВыполняемыйМодуль");
		Модуль.ВыброситьИскл("Форма уже открыта");
	КонецЕсли;
	
	спПараметры=Сам().ПолучитьСписокПараметров("ОткрытьФорму");
	Для ъ=1 По спПараметры.РазмерСписка() Цикл
		Пар[ъ]=спПараметры.ПолучитьЗначение(ъ);
	КонецЦикла;
	
	КонтекстФормы="";
	Конт=Пар[2];
	Если OpenForm(Пар[1], Конт, Пар[3], Пар[4], Пар[5])=0 Тогда
		Модуль=СоздатьОбъект("ВыполняемыйМодуль");
		Модуль.ВыброситьИскл("Ошибка открытия формы");
	КонецЕсли;
	УстановитьКонтекст(Конт);
	Возврат Конт;
КонецФункции
//--------------------------------------------

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

Процедура дфВвестиЗначение(идРеквизита, Значение) Экспорт 
	Атрибут=РасширениеФормы.ПолучитьАтрибут(идРеквизита);
	Атрибут.Значение=Значение;
	дфВыполнитьФормулу(Атрибут);
КонецПроцедуры
//--------------------------------------------
