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

Перем КоманднаяСтрока Экспорт;

Перем 	_ОбАнализаКоманднойСтроки,
		//_фИспользоватьКомпонентуДляРазбора,
		_КоличествоПараметров,
		_ТЗПараметров;

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

// ---------------------------------------  ---------------------------------
процедура ПриЗаписи_КоманднаяСтрока(ЗначениеДляУст)
	Модуль = СоздатьОбъект("ВыполняемыйМодуль");
	Модуль.ВыброситьИскл(, "Нельзя выполнять запись в переменную КоманднаяСтрока класса Общие.АнализКоманднойСтроки1С");
КонецПроцедуры // ПриЗаписи_КоманднаяСтрока

// -------------------------------- -------------------------------------
Процедура ПолучитьКоманднуюСтроку()
	Попытка
		Информатор = СоздатьОбъект("Информатор"); //1С++ v2.5
		КоманднаяСтрока = Информатор.КоманднаяСтрока();
		Возврат; // будет поддерживаться именно эта редакция
	Исключение   
	КонецПопытки;
	Попытка
		Источник = СоздатьОбъект("Система"); //совместимость, 1С++ v2.5 сборка до 16.11.06
	Исключение   
		Источник = СоздатьОбъект("Сервис"); //1С++ v2.0.3, FormEx
	КонецПопытки;
	КоманднаяСтрока = Источник.КоманднаяСтрока();
КонецПроцедуры

// -------------------------------- -------------------------------------
Процедура Конструктор()
	_ТЗПараметров = СоздатьОбъект("ТаблицаЗначений");
	_ТЗПараметров.НоваяКолонка("Параметр", "Строка");
	_ТЗПараметров.НоваяКолонка("ПараметрНРег", "Строка");

//	Попытка 
//		_ОбАнализаКоманднойСтроки =СоздатьОбъект( "Addin.CLProc" );
//	Исключение
//		Если ЗагрузитьВнешнююКомпоненту( "CLProc.dll" ) = 0 Тогда
//			_ОбАнализаКоманднойСтроки = 0;
//		Иначе
//			_ОбАнализаКоманднойСтроки =СоздатьОбъект( "Addin.CLProc" );
//		КонецЕсли;
//	КонецПопытки;
//	Если _ОбАнализаКоманднойСтроки <> 0 Тогда
//		КоманднаяСтрока = СокрЛП(_ОбАнализаКоманднойСтроки.ПолучитьПараметр());
//
//		//_фИспользоватьКомпонентуДляРазбора = 1;
//
//		Сам().РазобратьКоманднуюСтроку(Сам().КоманднаяСтрока);
//	КонецЕсли;

	ПолучитьКоманднуюСтроку();

	Сам().РазобратьКоманднуюСтроку(Сам().КоманднаяСтрока);
КонецПроцедуры // Конструктор

//------------------------------------ ------------------------------------
Функция СтрокуВСписок(Знач Стр, Разделитель = "")
    СЗ = СоздатьОбъект("СписокЗначений");
	ДлинаРазделителя = СтрДлина(Разделитель);
	Пока 1=1 Цикл
		Поз = Найти(Стр,Разделитель);
		Если Поз=0 Тогда
			СЗ.ДобавитьЗначение(Стр);
			Возврат СЗ;
		КонецЕсли;
		СЗ.ДобавитьЗначение(Лев(Стр,Поз-1));
		Стр = Сред(Стр,Поз+ДлинаРазделителя);
	КонецЦикла;
КонецФункции // СтрокуВСписок

//------------------------------------ ------------------------------------
//Число РазобратьКоманднуюСтроку(Знач Строка РазбираемаяСтрока)
// в конструкторе по умолчанию разбирается командная строка запуска 1С,
// т.е. в вызове метода "РазобратьКоманднуюСтроку" в принципе нет необходимости
Функция РазобратьКоманднуюСтроку(РазбираемаяСтрока) Экспорт
	//// если в команд.строке есть сочетание \" , тогда компонента отрабатывает неверно
	//// и нужно выполнить разбор вручную
	//_фИспользоватьКомпонентуДляРазбора = 0;
	//Если СокрЛП(РазбираемаяСтрока) = Сам().КоманднаяСтрока Тогда
	//	_фИспользоватьКомпонентуДляРазбора = ?(найти(РазбираемаяСтрока,"\""") > 0, 0, 1);
	//	Сообщить("_фИспользоватьКомпонентуДляРазбора = "+_фИспользоватьКомпонентуДляРазбора);
	//КонецЕсли;
	//Если _фИспользоватьКомпонентуДляРазбора = 1 Тогда
	//	// просто найти количество параметров
	//	Для к=1 По 255 Цикл
	//		Очередной = _ОбАнализаКоманднойСтроки.ПолучитьПараметр(к);
	//		Если Очередной = "" Тогда
	//			Прервать;
	//		КонецЕсли;
	//		//Сообщить("Очередной: "+Очередной);
	//	КонецЦикла;
	//	_КоличествоПараметров = к+1; // с учетом нулевого параметра
	//	//Сообщить("_КоличествоПараметров  = "+_КоличествоПараметров);
	//	Возврат 1;
	//КонецЕсли;

	// собственный разбор командной строки
	Список = СтрокуВСписок(РазбираемаяСтрока, " ");
	_ТЗПараметров.УдалитьСтроки();
	к = 1;
	Пока к <= Список.РазмерСписка() Цикл
		Значение = Список.ПолучитьЗначение(к);
		РезЗначение = Значение;
		Если Найти(Значение, """") = 0 Тогда // случай типа /D - обычный, все просто
		ИначеЕсли СтрЧислоВхождений(Значение, """") = 2 Тогда // случай типа /D"C:\Base"
		Иначе // случай типа ./D"W:\Дополнительные конфигурации\Разработка 1С++"
			к = к + 1;
			Если СтрЧислоВхождений(Значение, """") = 2 Тогда
				Продолжить;
			КонецЕсли;
			Значение2 = Список.ПолучитьЗначение(к);
			Пока (к <= Список.РазмерСписка()) и (Найти(Значение2, """") = 0) Цикл
				РезЗначение =  РезЗначение + " "+Значение2;
				к = к + 1;
				Значение2 = Список.ПолучитьЗначение(к);
			КонецЦикла;
			Если к > Список.РазмерСписка() Тогда
				// Ошибка разбора строки
				Модуль = СоздатьОбъект("ВыполняемыйМодуль");
				Модуль.ВыброситьИскл(, "Общие.АнализКоманднойСтроки1С: неверная строка для разбора");
			КонецЕсли;
			РезЗначение =  РезЗначение + " "+Значение2;

		КонецЕсли;
		РезЗначение = СтрЗаменить(РезЗначение, """", "");
		_ТЗПараметров.НоваяСтрока();
		_ТЗПараметров.Параметр = РезЗначение;
		_ТЗПараметров.ПараметрНРег = НРег(РезЗначение);
		к = к + 1;
	КонецЦикла;
	_КоличествоПараметров = _ТЗПараметров.КоличествоСтрок();
	Возврат 1;
КонецФункции //РазобратьКоманднуюСтроку

//------------------------------------ ------------------------------------
// с учетом нулевого параметра
Функция ПолучитьКоличествоПараметров() Экспорт
	Если _ОбАнализаКоманднойСтроки = 0 Тогда
		Возврат 0;
	КонецЕсли;
	Возврат _КоличествоПараметров;
КонецФункции //ПолучитьКоличествоПараметров

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

//------------------------------------ ------------------------------------
// пример вызова: ПолучитьПараметрПоНаименованию("/D")
// 1) для параметра /D выдается /D
// 2) для параметра /DC:\Base выдается C:\Base
// 3) для параметра /D"C:\Base" выдается C:\Base
// 3) для параметра /D"C:\Base\" (внимание, на последний слеш перед кавычкой) все равно выдается C:\Base\
// 5) возможен также вариант /D:"C:\Base\" (внимание на двоеточие после /D) поведение аналогично п.2-4
//
Функция ПолучитьПараметрПоНаименованию(Параметр) Экспорт
	Парам2 = НРег(СокрЛП(Параметр));
	_ТЗПараметров.ВыбратьСтроки();
	Пока _ТЗПараметров.ПолучитьСтроку() = 1 Цикл
		Значение = _ТЗПараметров.ПараметрНРег;
		Если Значение = Парам2 Тогда
			Возврат Параметр; // нашли, тогда возврат исходного параметра
		КонецЕсли;
		Если Найти(Значение, Парам2) = 1 Тогда
			Если Найти(Значение, Парам2+":") = 0 Тогда // типа /DБаза
				Возврат Сред(_ТЗПараметров.Параметр, СтрДлина(Парам2)+1); // тогда возврат База
			Иначе  // типа /D:База
				Возврат Сред(_ТЗПараметров.Параметр, СтрДлина(Парам2)+2); // тогда возврат База
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	Возврат 0; // неуспешно
КонецФункции //ПолучитьПараметрПоНаименованию

//------------------------------------ ------------------------------------
// если	Параметр это число, возвращается параметр по номеру
// если	Параметр это строка, возвращается параметр по наименованию
//
Функция ПолучитьПараметр(Параметр) Экспорт
	Если ТипЗначенияСтр(Параметр) = "Число" Тогда
		Возврат Сам().ПолучитьПараметрПоНомеру(Параметр);
	КонецЕсли;

	Возврат Сам().ПолучитьПараметрПоНаименованию(Параметр);
КонецФункции //ПолучитьПараметр

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