// Общие.Автозагрузка
// обязательно наличие компоненты _ОбАнализаКоманднойСтроки.dll
// Получение параметров коммандной строки запуска 1С
// взять можно с http://1c.hippo.ru/files/tmp/_ОбАнализаКоманднойСтроки.zip

///#define _DEBUG

Перем _ОбАнализаКоманднойСтроки;

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

// -------------------------------- -------------------------------------
Процедура Конструктор()
	_ОбАнализаКоманднойСтроки = СоздатьОбъект("Общие.АнализКоманднойСтроки1С");
	//сообщить( _ОбАнализаКоманднойСтроки.КоманднаяСтрока);

	//Этот(Контекст).ВыполнитьАнализ();
КонецПроцедуры // Конструктор

//------------------------------------ ------------------------------------
// основная работа по анализу
// для переопределения в подчиненных классах
Функция ВыполнитьАнализ() Экспорт
    
	Перем фВыполнения;
	фВыполнения = 0;
	
	Команда = _ОбАнализаКоманднойСтроки.ПолучитьПараметр( "/Команда" );
	Команда = ?(Команда = 0, 0, Команда);

	ЗапускаемаяОбработка = 	_ОбАнализаКоманднойСтроки.ПолучитьПараметр("/Обработка");
	ЗапускаемаяОбработка = ?(ЗапускаемаяОбработка = 0, "", ЗапускаемаяОбработка);
	//#if _DEBUG
		Сообщить("ЗапускаемаяОбработка - "+ЗапускаемаяОбработка);
	//#endif

// если есть параметры для выполнения команды какого-нибудь класса 1С++, то они имеют приоритет перед параметрами обработки
	СоздаваемыйКласс = 	_ОбАнализаКоманднойСтроки.ПолучитьПараметр("/Класс");
	СоздаваемыйКласс = ?(СоздаваемыйКласс = 0, "", СоздаваемыйКласс);
	МетодКласса = 	_ОбАнализаКоманднойСтроки.ПолучитьПараметр("/МетодКласса");
	МетодКласса = ?(МетодКласса = 0, "", МетодКласса);
	//#if _DEBUG
		Сообщить("класс - "+СоздаваемыйКласс);
		Сообщить("методкласса - "+МетодКласса);
	//#endif

	фНеВыполненияОбработки = 0;
	МетаКласс = СоздатьОбъект("MetaInfoClasses");
    Если (ПустаяСтрока(СоздаваемыйКласс) = 1) Тогда

    ИначеЕсли (ПустаяСтрока(МетодКласса) = 1) и (МетаКласс.КлассСуществует(СоздаваемыйКласс) = 1) Тогда
		фНеВыполненияОбработки = Этот(Контекст).ВыполнитьМетодКласса(СоздаваемыйКласс);
		фВыполнения = 1;

	ИначеЕсли (ПустаяСтрока(МетодКласса) = 0) и (МетаКласс.МетодСуществует(СоздаваемыйКласс, МетодКласса) = 1) Тогда
		фНеВыполненияОбработки = Этот(Контекст).ВыполнитьМетодКласса(СоздаваемыйКласс, МетодКласса);
		фВыполнения = 1;
	КонецЕсли;

	Если фНеВыполненияОбработки = 0 Тогда
		Если (ПустаяСтрока(ЗапускаемаяОбработка) = 0) Тогда
			Этот(Контекст).ВыполнитьОбработку(ЗапускаемаяОбработка, Строка(Команда));
			фВыполнения = 1;
		КонецЕсли;
	КонецЕсли;

	фЗавершенияРаботыСистемы = _ОбАнализаКоманднойСтроки.ПолучитьПараметр( "/Close" );
	фЗавершенияРаботыСистемы = ?(фЗавершенияРаботыСистемы = 0, 0, 1);
	Если фЗавершенияРаботыСистемы = 1 Тогда
		Сообщить("Успешно! Работа будет завершена");
		//глКонфигурация.ЗавершитьРаботу(0);
		ЗавершитьРаботуСистемы(0);
		
		Возврат фВыполнения;
		
		// выбрасываю исключение, чтобы работа немедленно завершалась
		// иначе продолжится выполнение модуля до конца и только после этого будет завершение работы системы, что неверно !
		Модуль = СоздатьОбъект("ВыполняемыйМодуль");
		Модуль.ВыброситьИскл(, "Специальное исключение для выхода из программы");

	КонецЕсли;
	
	Возврат фВыполнения;
КонецФункции // ВыполнитьАнализ

//------------------------------------ ------------------------------------
// для переопределения в подчиненных классах
// выполнить обработку, название которой передано в параметрах
//
Процедура ВыполнитьОбработку(ИмяОбработки, Команда) Экспорт
	//#if _DEBUG
		Сообщить("ИмяОбработки - "+ИмяОбработки);
	//#endif

	Общие = СоздатьОбъект("Артур.Общие");
	Параметр = Команда;

	Общие._ОткрытьФорму(ИмяОбработки, Параметр, 0, 1);
КонецПроцедуры // ВыполнитьОбработку

//------------------------------------ ------------------------------------
// для переопределения в подчиненных классах
// выполнить метод класса, название которого передано в параметрах
// если метод не задан, просто создаем класс (считаю, что основное действие в конструкторе)
 // перед этим проверяю наличие такого класса и такого метода
 // в случае наличия наименования класса, но отсутствия подобного метода никаких действий не выполняется
//
Функция ВыполнитьМетодКласса(ИмяКласса, МетодКласса) Экспорт
	СоздаваемыйКласс = ИмяКласса;

    Если (ПустаяСтрока(МетодКласса) = 1) Тогда
		Объект = СоздатьОбъект(СоздаваемыйКласс);
		//фВыполненияОбработки = 0;
	//#if _DEBUG
		Сообщить("Создаю класс - "+СоздаваемыйКласс);
	//#endif
		Возврат 1;
	ИначеЕсли (ПустаяСтрока(МетодКласса) = 0) Тогда
		//#if _DEBUG
			Сообщить("подготовка к выполнению метода");
		//#endif
		Текст = "Процедура Выполнить() Экспорт
		|Объект = СоздатьОбъект("+""""+СоздаваемыйКласс+""""+");
		|Объект."+МетодКласса+"();
		|КонецПроцедуры;";
		Модуль = СоздатьОбъект("ВыполняемыйМодуль");
		Модуль.УстановитьМодуль(Текст);
		Если Модуль.КомпилироватьМодуль() = 1 Тогда
		//#if _DEBUG
			Сообщить("Создаю класс - "+СоздаваемыйКласс);
			Сообщить("Выполняю его метод класса - "+МетодКласса);
		//#endif
			Модуль.ВыполнитьМодуль();
			Модуль.Выполнить();
			Возврат 1; //фВыполненияОбработки = 0;
		КонецЕсли;
	КонецЕсли;
	Возврат 0;
КонецФункции // ВыполнитьМетодКласса

////------------------------------------ ------------------------------------
//Процедура ПриОткрытии()
//	ФОрма.Параметр._ПриОткрытии();
//КонецПроцедуры // ПриОткрытии
