//	+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++
//	|                              Базовый класс иерархии                                       |
//	+                                      ShmalevoZ                                            +
//	|                                       2009-04                                             |
//	+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++---+++

//******************************************************************************
// НормализоватьКонтекст(СсылаКонтекст)
//
// Параметры: 
//  СсылаКонтекст
//
// Возвращаемое значение:
//  Неопределенный
//
// Описание:
//  Возвращает ссылка на переданный контекст
//
Функция НормализоватьКонтекст(СсылаКонтекст)
	
	Возврат СсылаКонтекст;
	
КонецФункции // НормализоватьКонтекст()


//******************************************************************************
// _this()
//
// Параметры: 
//  СсылкаКонтекст			- контекст
//
// Возвращаемое значение:
//  ГрупповойКонтекст		- ссылка на контекст
//
// Описание:
//  Возвращает ссылку на контекст
//
Функция _this()
	
	Возврат НормализоватьКонтекст(Контекст);
	
КонецФункции // _this()


//******************************************************************************
// _ВыброситьОшибку(Текст)
//
// Параметры: 
//  Текст					- текст сообщения
//
// Возвращаемое значение:
//  Нет
//
// Описание:
//  Выбрасывает ошибку времени выполнения
//
Процедура _ВыброситьОшибку(Текст) Экспорт
	
	_this()._ВыброситьИскл(Текст);
	
КонецПроцедуры // ВыброситьОшибку()


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


//******************************************************************************
// _БазовыйКласс(Идентификатор)
//
// Параметры: 
//  Идентификатор
//
// Возвращаемое значение:
//  Неопределенный
//
// Описание:
//  Возвращает ссылку на объект базового класса указанного типа
//
Функция _БазовыйКласс(Идентификатор = "") Экспорт

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


//******************************************************************************
// _ПолучитьКаталогКласса()
//
// Параметры: 
//  
//
// Возвращаемое значение:
//  Строка
//
// Описание:
//  Возвращает каталог файла реализации класса
//
Функция _ПолучитьКаталогКласса() Экспорт
	
	Результат	= "";
	Путь		= _this().ПолучитьПуть();
	Позиция		= Найти(Путь, "\");
	Пока Позиция <> 0 Цикл
		Результат	= Результат + Лев(Путь, Позиция);
		Путь		= Прав(Путь, СтрДлина(Путь) - Позиция);
		Позиция		= Найти(Путь, "\");
	КонецЦикла;
	
	Возврат Результат;
КонецФункции // _ПолучитьКаталогКласса()


//******************************************************************************
// ЗаполнитьТаблицуОбъектовИерархии(Набор, ТипБазовогоКласса, ТипКласса, ИнформаторОКлассах, ИнформаторОбОбъектах, Уровень)
//
// Параметры: 
//  Набор, ТипБазовогоКласса, ТипКласса, ИнформаторОКлассах, ИнформаторОбОбъектах, Уровень
//
// Возвращаемое значение:
//  СписокЗначений
//
// Описание:
//  Возвращает список объектов иерархии
//
Процедура ЗаполнитьТаблицуОбъектовИерархии(Набор, ТипБазовогоКласса, СсылкаОбъект, ИнформаторОКлассах, ИнформаторОбОбъектах, АбстрактныйОбъект, Уровень)
	
	//---------------------------------------------------------------------------------------------
	// Добавим текущий объект
	Набор.НоваяСтрока();
	Набор.Объект	= СсылкаОбъект;
	Набор.Уровень	= Уровень;
	
	//---------------------------------------------------------------------------------------------
	// И пройдемся по родителям
	СписокРодителей		= ИнформаторОКлассах.ПолучитьИменаБазовыхКлассов(ТипЗначенияСтр(СсылкаОбъект));
	КоличествоРодителей	= СписокРодителей.РазмерСписка();
	
	Для НомерРодителя = 1 По КоличествоРодителей Цикл
		ТипРодителя	= СписокРодителей.ПолучитьЗначение(НомерРодителя);
		Если ИнформаторОбОбъектах.ЯвляетсяОбъектом(ТипРодителя, ТипБазовогоКласса) = 0 Тогда
			Продолжить;
		КонецЕсли;
		ЗаполнитьТаблицуОбъектовИерархии(Набор, ТипБазовогоКласса, АбстрактныйОбъект._ПолучитьБазовыйКласс(СсылкаОбъект, ТипРодителя), ИнформаторОКлассах, ИнформаторОбОбъектах, АбстрактныйОбъект, Уровень + 1);
	КонецЦикла;
	
КонецПроцедуры // ЗаполнитьТаблицуОбъектовИерархии()


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