//ирПортативный Перем ирПортативный Экспорт;
//ирПортативный Перем ирОбщий Экспорт;
//ирПортативный Перем ирСервер Экспорт;
//ирПортативный Перем ирКэш Экспорт;
//ирПортативный Перем ирПривилегированный Экспорт;

Перем КомандыПоиска;
Перем дзВсеОбъекты Экспорт;
Перем ДеревоПодсистем Экспорт;
Перем стНастройки Экспорт;
Перем мСписокПолнотекстовогоПоиска; // Глобальный поиск
Перем СтатическиеВетки Экспорт;
Перем мПлатформа Экспорт;
Перем МассивСтатическихВеток;
Перем ВеткиМетаданных;
Перем RegExp; // Для поиска с помощью регулярных выражений
Перем ВерсияПлатфомы Экспорт;
Перем ИмяКорневойПодсистемы;
Перем ЕстьСправочникВнешнихОбработок Экспорт;
Перем мТекущийПользователь Экспорт;
Перем ПутьФайлаНастроек;
Перем ЕстьУниверсальныйОтчет Экспорт, Есть_РС_СохраненныеНастройки Экспорт;
//Перем Есть_СправочникОрганизаций;
Перем мСловаСтрокиУмногоПоиска Экспорт, СтрокаУмногоПоискаБезСуффикса Экспорт, СтрокаСуффиксаУмногоПоиска Экспорт, флПробоватьУмныйПоиск Экспорт, ЧислоСуффиксаУмногоПоиска, МассивПрефиксовОрганизаций, ДлинаСуффиксаУмногоПоиска;
Перем СоответствиеВидовМетаданныхДляПоискаПолногоИмени Экспорт;
Перем мВременныйФильтрИмен Экспорт;
 

///////////////////////////////////////////////////////////////////////////////
Функция СохранитьВыбраннуюСтроку(Форма)

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

	Возврат стСтрока;	
	
КонецФункции // СохранитьВыбраннуюСтроку

///////////////////////////////////////////////////////////////////////////////
Функция ВосстановитьВыбраннуюСтроку(стСтрока,Форма)
	
	ТекСтрока = Неопределено;
	
	Если стСтрока <> Неопределено тогда
		Если стСтрока.Уровень = 0 тогда
			ТекСтрока = ДеревоИнтерфейса.Строки.Найти(стСтрока.Представление, "Представление", Ложь);
		Иначе 
			стрРодитель = ДеревоИнтерфейса.Строки.Найти(стСтрока.Родитель, "Представление", Ложь);
			Если стрРодитель <> Неопределено тогда
				стПоиск = Новый Структура("Вид,Имя", стСтрока.Вид, стСтрока.Имя);
				мСтроки = стрРодитель.Строки.НайтиСтроки(стПоиск, Ложь);
				Если мСтроки.Количество() > 0 тогда
					ТекСтрока = мСтроки[0];
				Иначе
					Если стрРодитель.Строки.Количество() > 0 тогда
						ТекСтрока = стрРодитель.Строки[0];
					Иначе
						ТекСтрока = стрРодитель;
					КонецЕсли;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	Если ТекСтрока <> Неопределено Тогда
		Форма.ЭлементыФормы.ДеревоИнтерфейса.ТекущаяСтрока = ТекСтрока;
		Возврат Истина;
	Иначе
		Возврат Ложь;
	КонецЕсли; 
	
КонецФункции

///////////////////////////////////////////////////////////////////////////////
Функция СохранитьРазвернутыеВетви(Форма)

	мВетви = Новый Массив;
	
	элДеревоИнтерфейса = Форма.ЭлементыФормы.ДеревоИнтерфейса;
	
	Для каждого стрВетвь из ДеревоИнтерфейса.Строки цикл
		// Пропустим статические
		Если НЕ СтатическиеВетки[стрВетвь] = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		
		Если элДеревоИнтерфейса.Развернут(стрВетвь) тогда
			мВетви.Добавить(стрВетвь.Представление);
		КонецЕсли;
		
	КонецЦикла; 
	
	Возврат мВетви;
	
КонецФункции // СохранитьРазвернутыеВетви

///////////////////////////////////////////////////////////////////////////////
Процедура ВосстановитьРазвернутыеВетви(Знач мРазвернутыеВетви, Форма) Экспорт 

	элДеревоИнтерфейса     = Форма.ЭлементыФормы.ДеревоИнтерфейса;
	СтрокиДереваИнтерфейса = ДеревоИнтерфейса.Строки;
	
	Для каждого ПредставлениеВетви из мРазвернутыеВетви цикл
	
		стрВетвь = СтрокиДереваИнтерфейса.Найти(ПредставлениеВетви, "Представление", Ложь);
		Если стрВетвь <> Неопределено тогда
			элДеревоИнтерфейса.Развернуть(стрВетвь);
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры // ВосстановитьРазвернутыеВетви

///////////////////////////////////////////////////////////////////////////////
Процедура ДобавитьОбъект(СтрокиВетви, Знач МетаД, Знач ВидОбъекта, Знач ИндексКартинки)

	стрСтрока = СтрокиВетви.Добавить();
	стрСтрока.Вид 			 = ВеткиМетаданных.НайтиПоЗначению(ВидОбъекта).Представление;
	стрСтрока.Имя			 = МетаД.Имя;
	стрСтрока.Представление  = ?(ПустаяСтрока(МетаД.Синоним), МетаД.Имя, МетаД.Синоним);
	стрСтрока.ИндексКартинки		 = ИндексКартинки;
	
	спПодсистемы = Новый СписокЗначений;
	//Для каждого Подсистема из МетаД.Подсистемы цикл
	//	ИмяПодсистемы = Подсистема.Имя;
	//	спПодсистемы.Добавить(ИмяПодсистемы);
	//	
	//	стрПодсистема = дзВсеПодсистемы.Строки.Найти(ИмяПодсистемы, "Имя", Истина);
	//	Пока стрПодсистема.Родитель <> Неопределено цикл
	//		стрПодсистема = стрПодсистема.Родитель;
	//		
	//		Если спПодсистемы.НайтиПоЗначению(стрПодсистема.Имя) = Неопределено тогда
	//			спПодсистемы.Добавить(стрПодсистема.Имя);
	//		КонецЕсли;
	//	КонецЦикла;
	//КонецЦикла;
	стрСтрока.Подсистемы = спПодсистемы;

КонецПроцедуры // ДобавитьОбъект

///////////////////////////////////////////////////////////////////////////////
Процедура ДобавитьВетвьМетаданных(Ветвь, Знач ИмяВетви, Знач КартинкаВетви=0, Знач КартинкаОбъекта=0)

	стрВетвь = дзВсеОбъекты.Строки.Добавить();
	стрВетвь.Представление = ИмяВетви;
	стрВетвь.Имя = стрВетвь.Представление;
	стрВетвь.ИндексКартинки = КартинкаВетви;
	
	СтрокиВетви = стрВетвь.Строки;
	Для каждого МетаД из Ветвь цикл
		Попытка
			ЕстьПраво = ПравоДоступа("Просмотр", МетаД);
		Исключение
			Попытка
				ЕстьПраво = ПравоДоступа("Использование", МетаД);
			Исключение
				ЕстьПраво = Ложь;
			КонецПопытки;
		КонецПопытки;
		Если ЕстьПраво Тогда
			ДобавитьОбъект(СтрокиВетви, МетаД, ИмяВетви, КартинкаОбъекта);
		КонецЕсли;
	КонецЦикла;	

КонецПроцедуры // ДобавитьВетвьМетаданных

///////////////////////////////////////////////////////////////////////////////
Процедура ЗаполнитьДеревоВсехОбъектов() Экспорт
	
	дзВсеОбъекты = Новый ДеревоЗначений;
	дзВсеОбъекты.Колонки.Добавить("Имя");
	дзВсеОбъекты.Колонки.Добавить("Вид");
	дзВсеОбъекты.Колонки.Добавить("Представление");
	дзВсеОбъекты.Колонки.Добавить("ИндексКартинки"); 
	дзВсеОбъекты.Колонки.Добавить("Подсистемы"); 
	
	
	
	ДобавитьВетвьМетаданных(Метаданные.ОбщиеФормы, "Общие формы", 6, 7);
	ДобавитьВетвьМетаданных(Метаданные.Интерфейсы, "Интерфейсы", 54, 55);
	ДобавитьВетвьМетаданных(Метаданные.Константы, "Константы", 20, 0);
	ДобавитьВетвьМетаданных(Метаданные.Справочники, "Справочники", 2, 3);

	стрКорень = дзВсеОбъекты.Строки.Добавить();
	стрКорень.Представление = "Документы";
	стрКорень.Имя = стрКорень.Представление;
	стрКорень.ИндексКартинки		= 12;
	СтрокиКорня 			= стрКорень.Строки;
	Для каждого МетаД из Метаданные.ЖурналыДокументов цикл
		Если ПравоДоступа("Просмотр", МетаД) тогда
			ДобавитьОбъект(СтрокиКорня, МетаД, "Журналы документов", 15);
		КонецЕсли;
	КонецЦикла;
	Для каждого МетаД из Метаданные.Документы цикл
		Если ПравоДоступа("Просмотр", МетаД) тогда
			ДобавитьОбъект(СтрокиКорня, МетаД, "Документы", 13);
		КонецЕсли;
	КонецЦикла;	

	ДобавитьВетвьМетаданных(Метаданные.ПланыВидовХарактеристик, "Планы видов характеристик", 37, 38);
	ДобавитьВетвьМетаданных(Метаданные.ПланыСчетов, "Планы счетов", 39, 40);
	ДобавитьВетвьМетаданных(Метаданные.ПланыВидовРасчета, "Планы видов расчета", 47, 48);
	ДобавитьВетвьМетаданных(Метаданные.Отчеты, "Отчеты", 23, 24);
	ДобавитьВетвьМетаданных(Метаданные.Обработки, "Обработки", 18, 19);
	ДобавитьВетвьМетаданных(Метаданные.РегистрыСведений, "Регистры сведений", 33, 34);
	ДобавитьВетвьМетаданных(Метаданные.РегистрыНакопления, "Регистры накопления", 31, 32);
	ДобавитьВетвьМетаданных(Метаданные.РегистрыБухгалтерии, "Регистры бухгалтерии", 41, 42);
	ДобавитьВетвьМетаданных(Метаданные.Перечисления, "Перечисления", 9, 10);
	ДобавитьВетвьМетаданных(Метаданные.РегистрыРасчета, "Регистры расчета", 49, 50);
	ДобавитьВетвьМетаданных(Метаданные.БизнесПроцессы, "Бизнес-процессы", 43, 44);
	ДобавитьВетвьМетаданных(Метаданные.Задачи, "Задачи", 45, 46);
	ДобавитьВетвьМетаданных(Метаданные.ПланыОбмена, "Планы обмена", 51, 52);
	ВыводСодержимогоКаталогов(дзВсеОбъекты);
	ВыводСохраненныхВнешнихОбработок(дзВсеОбъекты);
	ВыводСохраненныхНастроекОтчетов(дзВсеОбъекты);
	СортироватьВторойУровеньДерева(дзВсеОбъекты);

КонецПроцедуры // ЗаполнитьДеревоВсехОбъектов

Процедура СортироватьВторойУровеньДерева(Дерево) Экспорт
	
	ИмяОсновногоПредставления = ПолучитьИмяОсновногоПредставления();
	Для каждого стрВетви из Дерево.Строки цикл
		стрВетви.Строки.Сортировать("Вид УБЫВ, " + ИмяОсновногоПредставления, Ложь);
	КонецЦикла;
	
КонецПроцедуры


///////////////////////////////////////////////////////////////////////////////
Процедура ЗаполнитьДеревоИнтерфейса(Форма) Экспорт

	стСтрока = СохранитьВыбраннуюСтроку(Форма);
	мРазвернутыеВетви = СохранитьРазвернутыеВетви(Форма);
	ДеревоИнтерфейса.Строки.Очистить();
	ЗаполнитьСтатическиеВеткиДереваИнтерфейса(Форма);
	НачатьФоновыйПоиск(Форма);
	элДерево = Форма.ЭлементыФормы.ДеревоИнтерфейса;
	ТекущаяСтрокаУстановлена = ВосстановитьВыбраннуюСтроку(стСтрока, Форма);
	//Если НЕ (СтатическиеВетки[элДерево.ТекущаяСтрока] = Неопределено) И 
	//	 элДерево.ТекущаяСтрока.Строки.Количество() > 0 
	//Тогда
	//	элДерево.ТекущаяСтрока = элДерево.ТекущаяСтрока.Строки[0];
	//КонецЕсли;
	//ВосстановитьРазвернутыеВетви(мРазвернутыеВетви, Форма);
	ИндексНачальнойСтроки = 4;
	ЧислоДинамическихСтрок = 0;
	ТаблицаТиповМетаОбъектов = мПлатформа.ТаблицаТиповМетаОбъектов;
	Счетчик = 1;
	Для Индекс = ИндексНачальнойСтроки По ДеревоИнтерфейса.Строки.Количество() - 1 Цикл
		СтрокаДерева = ДеревоИнтерфейса.Строки[Индекс];
		ВсеСтроки = ирОбщий.ПолучитьВсеСтрокиДереваЗначенийЛкс(СтрокаДерева);
		Для Каждого ДочерняяСтрокаДерева Из ВсеСтроки Цикл
			СтрокаТипаМетаОбъектов = ТаблицаТиповМетаОбъектов.Найти(ДочерняяСтрокаДерева.Вид, "Множественное");
			Если Ложь
				Или СтрокаТипаМетаОбъектов = Неопределено
				//Или СтрокаТипаМетаОбъектов.Категория <> 0
			Тогда
				Продолжить;
			КонецЕсли; 
			ДочерняяСтрокаДерева.ПолноеИмяОбъекта = "" + СтрокаТипаМетаОбъектов.Единственное + "." + ДочерняяСтрокаДерева.Имя;
			ДочерняяСтрокаДерева.Порядок = Счетчик;
			Счетчик = Счетчик + 1;
			//ОписаниеТаблицы = ирОбщий.ПолучитьОписаниеТаблицыБДИис(ДочерняяСтрокаДерева.ПолноеИмяОбъекта);
			//Если Истина
			//	И ОписаниеТаблицы <> Неопределено 
			//	И ОписаниеТаблицы.КоличествоСтрок <> Неопределено
			//Тогда
			//	ирОбщий.ДобавитьКоличествоСтрокРодителюЛкс(ДочерняяСтрокаДерева, ОписаниеТаблицы.КоличествоСтрок);
			//КонецЕсли; 
		КонецЦикла;
		СтрокаДерева.Порядок = Счетчик;
		Счетчик = Счетчик + 1;
		ЧислоДинамическихСтрок = ЧислоДинамическихСтрок + ВсеСтроки.Количество();
	КонецЦикла; 
	//ТекущаяСтрокаУстановлена = ТекущаяСтрокаУстановлена И элДерево.ТекущаяСтрока <> элДерево.Значение.Строки[ИндексНачальнойСтроки];
	Если ЧислоДинамическихСтрок > 0 Тогда
		Если ЧислоДинамическихСтрок <= 30 Тогда
			ирОбщий.ТабличноеПолеДеревоЗначений_РазвернутьВсеСтрокиЛкс(элДерево, ИндексНачальнойСтроки);
			Если Не ТекущаяСтрокаУстановлена Тогда
				элДерево.ТекущаяСтрока = элДерево.Значение.Строки[ИндексНачальнойСтроки].Строки[0];
			КонецЕсли; 
		Иначе
			Если Не ТекущаяСтрокаУстановлена Тогда
				элДерево.ТекущаяСтрока = элДерево.Значение.Строки[ИндексНачальнойСтроки];
			КонецЕсли; 
		КонецЕсли; 
	Иначе
		Если Истина
			И Не ТекущаяСтрокаУстановлена
			И НЕ (СтатическиеВетки[элДерево.ТекущаяСтрока] = Неопределено) 
			И элДерево.ТекущаяСтрока.Строки.Количество() > 0 
		Тогда
			элДерево.ТекущаяСтрока = элДерево.ТекущаяСтрока.Строки[0];
		КонецЕсли;
	КонецЕсли; 
	//ирОбщий.ЗаполнитьКоличествоСтрокТаблицВДеревеМетаданныхЛкс(ДеревоИнтерфейса);

КонецПроцедуры // ЗаполнитьДеревоИнтерфейса

#Если Клиент Тогда
	
Процедура ПрочитатьНастройки() Экспорт 
	
	стНастройки = ирОбщий.ВосстановитьЗначениеЛкс("ирИнтерфейснаяПанель.Настройки");
	
	Если ТипЗнч(стНастройки) <> Тип("Структура") тогда
		стНастройки = Новый Структура;
	КонецЕсли;
	
	Если НЕ стНастройки.Свойство("ФильтрПодсистем") тогда
		стНастройки.Вставить("ФильтрПодсистем");
	КонецЕсли;
	
	Если НЕ стНастройки.Свойство("ФильтрИмен") тогда
		стНастройки.Вставить("ФильтрИмен");
	КонецЕсли;
	
	Если НЕ стНастройки.Свойство("ИсторияФильтраИмен") тогда
		стНастройки.Вставить("ИсторияФильтраИмен");
		стНастройки.ИсторияФильтраИмен = Новый Массив;
	КонецЕсли;
	
	Если НЕ стНастройки.Свойство("РазвернутыеСтроки") тогда
		стНастройки.Вставить("РазвернутыеСтроки");
		стНастройки.РазвернутыеСтроки = Новый Массив;
	КонецЕсли;
	
	Если НЕ стНастройки.Свойство("ВыбраннаяСтрока") тогда
		стНастройки.Вставить("ВыбраннаяСтрока");
	КонецЕсли;
	
	Если НЕ стНастройки.Свойство("СтатистикаИспользования") тогда
		стНастройки.Вставить("СтатистикаИспользования");
		
		тзСтатистикаИспользования = Новый ТаблицаЗначений;
		тзСтатистикаИспользования.Колонки.Добавить("Вид");
		тзСтатистикаИспользования.Колонки.Добавить("Имя");
		тзСтатистикаИспользования.Колонки.Добавить("КоличествоИспользований");
		тзСтатистикаИспользования.Колонки.Добавить("ПоследнееИспользование");
		
		стНастройки.СтатистикаИспользования = тзСтатистикаИспользования;
	КонецЕсли;	
	
	// ДЛя произвольных статических веток
	Для каждого КлючЗначение Из МассивСтатическихВеток Цикл
		ИмяКолонки = КлючЗначение.Имя;
		Если стНастройки.СтатистикаИспользования.Колонки.Найти(ИмяКолонки) = Неопределено Тогда
			// Эта колонка была добавлена позже, ее может не быть в сохраненных настройках
			Попытка
				стНастройки.СтатистикаИспользования.Колонки.Добавить(ИмяКолонки);
			Исключение
			КонецПопытки;
		КонецЕсли;
	КонецЦикла;
	
	Если НЕ стНастройки.Свойство("Каталоги") тогда
		стНастройки.Вставить("Каталоги", Новый Соответствие);
	КонецЕсли;
	
	///////////////////////////////////////////////////////////////////////////////
	// Параметры обработки 
	
	Если НЕ стНастройки.Свойство("ИсторияКоманд") Тогда
		стНастройки.Вставить("ИсторияКоманд", ИсторияКоманд);
	КонецЕсли;
	Если НЕ стНастройки.Свойство("ИспользоватьРегулярныеВыражения") Тогда
		стНастройки.Вставить("ИспользоватьРегулярныеВыражения", ИспользоватьРегулярныеВыражения);	
	КонецЕсли;
	Если стНастройки.ИспользоватьРегулярныеВыражения Тогда
		RegExp = Новый COMОбъект("VBScript.RegExp");
		RegExp.MultiLine = Ложь;
		RegExp.Global = Истина; 
		RegExp.IgnoreCase = Истина;
	КонецЕсли;
	
	
	// Глобальный поиск
	Если НЕ стНастройки.Свойство("ПолнотекстовыйПоискПорогНечеткости") Тогда
		стНастройки.Вставить("ПолнотекстовыйПоискПорогНечеткости",ПолнотекстовыйПоискПорогНечеткости);
	КонецЕсли;
	Если НЕ стНастройки.Свойство("ПолнотекстовыйПоискРазмерПорции") Тогда
		стНастройки.Вставить("ПолнотекстовыйПоискРазмерПорции",ПолнотекстовыйПоискРазмерПорции);
	КонецЕсли;
	
	// Порядок форм
	Если НЕ стНастройки.Свойство("ПриАвтозапускеОткрыватьФормуСписка") Тогда
		стНастройки.Вставить("ПриАвтозапускеОткрыватьФормуСписка", ПриАвтозапускеОткрыватьФормуСписка);
	КонецЕсли;
	
	Если НЕ стНастройки.Свойство("флИспользоватьУмныйПоиск") Тогда
		стНастройки.Вставить("флИспользоватьУмныйПоиск", Ложь);
	КонецЕсли;
	
	Если НЕ стНастройки.Свойство("флИмяСиноним") Тогда
		стНастройки.Вставить("флИмяСиноним", флИмяСиноним);
	КонецЕсли;
	
	Если НЕ стНастройки.Свойство("флИскатьВПодкаталогах") Тогда
		стНастройки.Вставить("флИскатьВПодкаталогах", Истина);
	КонецЕсли;
	
	Если НЕ стНастройки.Свойство("флВложенныеПодсистемы") Тогда
		стНастройки.Вставить("флВложенныеПодсистемы", Истина);
	КонецЕсли;

КонецПроцедуры // ЗагрузитьНастройки

Процедура СохранитьНастройки(Форма) Экспорт

	стНастройки.ФильтрПодсистем   = ФильтрПодсистем;
	стНастройки.ФильтрИмен		  = ФильтрИмен;
	стНастройки.РазвернутыеСтроки = СохранитьРазвернутыеВетви(Форма);
	стНастройки.ВыбраннаяСтрока   = СохранитьВыбраннуюСтроку(Форма);

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

#КонецЕсли

///////////////////////////////////////////////////////////////////////////////
Процедура ОбновитьСтатистикуИспользования(стрОбъект, Форма) Экспорт

	ТекДата = ТекущаяДата();
	
	тзСтатистикаИспользования = стНастройки.СтатистикаИспользования;

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

	// Сохраним старую выделенную строку
	ТекСтрока = Форма.ЭлементыФормы.ДеревоИнтерфейса.ТекущаяСтрока;
	стСтрока = Неопределено;
	Для каждого СтатическаяВетка  Из СтатическиеВетки Цикл
		Если НЕ (СтатическиеВетки[ТекСтрока.Родитель] = Неопределено) тогда
			стСтрока = СохранитьВыбраннуюСтроку(Форма);
		КонецЕсли;
	КонецЦикла;
	
	ЗаполнитьСтатическиеВеткиДереваИнтерфейса(Форма);
	
	// Восстановим старую выделенную строку
	Если стСтрока <> Неопределено тогда
		ВосстановитьВыбраннуюСтроку(стСтрока, Форма);
	КонецЕсли;
	
КонецПроцедуры // ОбновитьСтатистикуИспользования

// Добавляет строку в статическую ветку (автозапуск, избранное и т.п.)
//
// Параметры
//  СтрокаДерева - строка дерева значений, которую требуется добавить в статическую ветку
//
Функция ДобавитьСтрокуВСтатическуюВетку(СтрокаДерева, ИмяКолонки) Экспорт

	тзСтатистикаИспользования = стНастройки.СтатистикаИспользования;
	СтрокаСтатическойВетки = тзСтатистикаИспользования.Добавить();
	ЗаполнитьЗначенияСвойств(СтрокаСтатическойВетки, СтрокаДерева);
	СтрокаСтатическойВетки[ИмяКолонки] = 1;
	Возврат СтрокаСтатическойВетки;

КонецФункции // 

// Открывает форму обработки.
// Предназначена для автооткрытия формы в 1С при запуске. 
// Помещаем в табло команду ВнешниеОбработки.Создать("<путь>ip8.epf").Открыть() и при каждом запуске, если окно табло включено, обработка будет запускаться автоматически
// Параметры
//
// Возвращаемое значение:
//   булево - статус открытия (октрылась или нет)
//
Функция Открыть() экспорт

	Форма = ЭтотОбъект.ПолучитьФорму();
	Форма.Открыть();
	Возврат Форма.Открыта()

КонецФункции // Открыть()

//////////////////////////////////////////////////////////////////////////////
// проверяет условия с помощью регулярных выражений, 
// если НЕ ТолькоПроверка - заменяет выражение с помощью шаблона ШаблонЗамены и возвращает в переменной ИтоговаяСтрока 
Функция ПроверитьУсловие(СтрокаПоиска, ШаблонПоиска, ТолькоПроверка = Истина, ШаблонЗамены = "", ИтоговаяСтрока = "") Экспорт 
	
	Попытка
		RegExp.Pattern = ШаблонПоиска;
		Найдено = RegExp.Test(СтрокаПоиска); 
	Исключение
		//Сообщить(ОписаниеОшибки());
		Возврат Ложь;
	КонецПопытки;
		
	Если Не Найдено Или ТолькоПроверка тогда 
		ИтоговаяСтрока = ""; 
		возврат Найдено ; 
	Иначе 
		ИтоговаяСтрока = RegExp.Replace(СтрокаПоиска, ШаблонЗамены); 
		возврат Найдено; 
	КонецЕсли; 
	
КонецФункции // ПроверитьУсловие()

Функция ПолучитьИмяОсновногоПредставления()
	
	Если флИмяСиноним Тогда
		ИмяКолонкиПредставления = "Имя";
	Иначе
		ИмяКолонкиПредставления = "Представление";
	КонецЕсли; 
	Возврат ИмяКолонкиПредставления;
	
КонецФункции

///////////////////////////////////////////////////////////////////////////////
Функция ОбъектПроходитФильтры(стрОбъект, Знач СтрокаПоиска = "", ПроверятьПодсистему = Ложь, ОбъектыВыбранныхПодсистем = Неопределено) 
	
	Если СтрокаПоиска = "" Тогда
		СтрокаПоиска = мВременныйФильтрИмен;
	КонецЕсли;
	
	// Поиск - по представлению
	Если ТипЗнч(СтрОбъект) = Тип("СтрокаДереваЗначений") Тогда
		ИмяКолонкиПредставления = ПолучитьИмяОсновногоПредставления();
		Представление = стрОбъект[ИмяКолонкиПредставления];
	Иначе
		// В случае передачи имени файла
		Представление = стрОбъект;
	КонецЕсли;

	МассивФрагментов = ирОбщий.ПолучитьМассивИзСтрокиСРазделителемЛкс(СтрокаПоиска, " ", Истина);
	Для Каждого СтрокаПоиска Из МассивФрагментов Цикл
		// Собственно, поиск по подстроке
		Если НЕ ПустаяСтрока(СокрЛП(СтрокаПоиска)) Тогда
			Если Ложь
				Или (Истина
					И стНастройки.ИспользоватьРегулярныеВыражения 
					И Не ПроверитьУсловие(Представление, СтрокаПоиска)) // Проверка регулярным выражением
				Или (Истина
					И Не стНастройки.ИспользоватьРегулярныеВыражения 
					И Найти(НРег(Представление), НРег(СтрокаПоиска)) = 0) // Проверка обычным поиском
			Тогда
				// Полная строка не нашлась, попробуем найти строку без уточняющего суффикса
				Если флПробоватьУмныйПоиск = Истина Тогда
					Если  Ложь
						Или (Истина
							И стНастройки.ИспользоватьРегулярныеВыражения 
							И Не ПроверитьУсловие(Представление, СтрокаУмногоПоискаБезСуффикса)) // Проверка регулярным выражением
						Или (Истина
							И Не стНастройки.ИспользоватьРегулярныеВыражения 
							И Найти(НРег(Представление), НРег(СтрокаУмногоПоискаБезСуффикса)) = 0) // Проверка обычным поиском
					Тогда
						Возврат Ложь;
					КонецЕсли
				Иначе
					Возврат Ложь;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла; 
	
	// Отбор по подсистемам - самый медленный, оставим его напоследок
	Если Истина
		И ПроверятьПодсистему 
		И ФильтрПодсистем.Количество() > 0
	Тогда
		// Убрать мусор, который не относится к подсистемам
		Если стрОбъект.Вид = "СправочникВнешниеОбработки" Тогда
			Возврат Ложь;
		КонецЕсли;
		Если ирКэш.НомерИзданияПлатформыЛкс() >= "82" Тогда
			ОбъектМД = Метаданные[стрОбъект.Вид][стрОбъект.Имя];
			Если ОбъектыВыбранныхПодсистем[ОбъектМД] = Неопределено тогда
				Возврат Ложь;
			КонецЕсли;
		Иначе
			Если Не ирОбщий.ЛиСпискиПодсистемПересекаютсяЛкс(ФильтрПодсистем, стрОбъект.Подсистемы) тогда
				Возврат Ложь;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
		
	Возврат Истина;
	
КонецФункции // ОбъектПроходитФильтры

///////////////////////////////////////////////////////////////////////////////
Процедура ЗаполнитьСтатическиеВеткиДереваИнтерфейса(Форма, УстановитьТекущуюСтроку = Неопределено) Экспорт
	
	Если УстановитьТекущуюСтроку <> Неопределено Тогда
		ИмяДляУстановкиТекущейСтроки = УстановитьТекущуюСтроку.Имя;
	КонецЕсли; 
	Если СтатическиеВетки = Неопределено ИЛИ ДеревоИнтерфейса.Строки.Количество() = 0 Тогда
		СтатическиеВетки = Новый Соответствие();
		Для каждого ЭлементМассива Из МассивСтатическихВеток Цикл
			Если ЭлементМассива.Использовать = Истина Тогда
				СтрокаКорняСтатическойВетки = ДеревоИнтерфейса.Строки.Добавить();
				СтрокаКорняСтатическойВетки.Имя = ЭлементМассива.Имя;
				СтрокаКорняСтатическойВетки.Представление = ЭлементМассива.Представление;
				СтатическиеВетки.Вставить(СтрокаКорняСтатическойВетки, ЭлементМассива);
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	
	элДеревоИнтерфейса = Форма.ЭлементыФормы.ДеревоИнтерфейса;

	// Для избежания дублей статистику надо свернуть
	тзСтатистикаИспользования = стНастройки.СтатистикаИспользования;
	СтрокаКолонокДляСвертки = "";
	Для каждого СтатическаяВетка Из СтатическиеВетки Цикл
		Если СтатическаяВетка.Значение.РазрешитьПеретаскивание = Истина Тогда
			СтрокаКолонокДляСвертки = СтрокаКолонокДляСвертки + "," + СтатическаяВетка.Значение.Имя;
		КонецЕсли;
	КонецЦикла;
	тзСтатистикаИспользования.Свернуть("Вид,Имя,ПоследнееИспользование","КоличествоИспользований"+СтрокаКолонокДляСвертки);
	
	стПоиск = Новый Структура("Вид,Имя");
	Для каждого СтатическаяВетка Из СтатическиеВетки Цикл
		Если СтатическаяВетка.Значение.Использовать = Ложь Тогда
			Продолжить;
		КонецЕсли;
		
		//
		тзСтатистикаИспользования.Сортировать(СтатическаяВетка.Значение.СтрокаСортировки);
		
		СтрокиКорня = СтатическаяВетка.Ключ.Строки; 
		СтрокиКорня.Очистить();
		
		нВставленоПозиций = 0;
		Для каждого стрСтатистика из тзСтатистикаИспользования цикл
			ЗаполнитьЗначенияСвойств(стПоиск, стрСтатистика);
			Если СтатическаяВетка.Ключ.Строки.НайтиСтроки(стПоиск, Истина).Количество() = 0 Тогда
				Если нВставленоПозиций > СтатическаяВетка.Значение.КоличествоОтображаемыхЭлементов Тогда
					Прервать;
				КонецЕсли;
				ЗначениеСортировки = стрСтатистика[Лев(СтатическаяВетка.Значение.СтрокаСортировки,Найти(СтатическаяВетка.Значение.СтрокаСортировки, " ")-1)];
				Если ЗначениеСортировки = Неопределено ИЛИ ЗначениеСортировки = 0 ИЛИ ЗначениеСортировки = '00010101'  // Попытка универсального подхода к отсечке пустых значений
				тогда
					Прервать;
				КонецЕсли;
				
				Если ирОбщий.ЛиСсылкаНаОбъектБДЛкс(стПоиск.Имя) Тогда
					//СсылкаПоИД = ПолучитьСсылкуПоУИД(стПоиск.Вид, стПоиск.Имя);	// Попытка открыть результат полнотекстового поиска
					//Если СсылкаПоИД = Неопределено Тогда
					//	Продолжить;
					//КонецЕсли; 
					СсылкаПоИД = стПоиск.Имя;
					Представление = Строка(СсылкаПоИД);
					Если Истина
						И СтатическаяВетка.Значение.Фильтровать 
						И НЕ ?(стНастройки.ИспользоватьРегулярныеВыражения, 
							ПроверитьУсловие(Представление, мВременныйФильтрИмен),
							Найти(НРег(Представление), НРег(мВременныйФильтрИмен)) > 0)
					Тогда
						Продолжить;
					КонецЕсли;

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

	КонецЦикла;
	Если ИмяДляУстановкиТекущейСтроки <> Неопределено Тогда
		НоваяТекущаяСтрока = ДеревоИнтерфейса.Строки.Найти(ИмяДляУстановкиТекущейСтроки, "Имя", Истина);
		Если НоваяТекущаяСтрока <> Неопределено Тогда
			элДеревоИнтерфейса.ТекущаяСтрока = НоваяТекущаяСтрока;
		КонецЕсли; 
	КонецЕсли; 
	
КонецПроцедуры // ЗаполнитьСтатическиеВеткиДереваИнтерфейса

//////////////////
// Фоновые команды

Процедура НачатьФоновыйПоиск(Форма) Экспорт

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

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

Функция ВыполнитьФоновыйПоиск() Экспорт

	Если КомандыПоиска.Количество()>0 Тогда
		Выполнить(КомандыПоиска[0]+"()");
		КомандыПоиска.Удалить(0);
	    Возврат Истина
	КонецЕсли;
	Возврат Ложь;
	
КонецФункции

Процедура ПоискПоМетаданным()
	Перем НайденныйОбъект;
	ОбновитьФильтрУмногоПоиска();
	СтрокаНулей = "00000000000000";
	ОбъектыВыбранныхПодсистем = ирОбщий.ОбъектыПодсистемЛкс(ФильтрПодсистем);
	Для каждого стрКорень из дзВсеОбъекты.Строки цикл
	
		СтрокиКорня = Неопределено;
		Для каждого стрОбъект из стрКорень.Строки цикл
			Если НЕ ОбъектПроходитФильтры(стрОбъект,, ВеткиМетаданных.НайтиПоЗначению(стрКорень.Имя) <> Неопределено, ОбъектыВыбранныхПодсистем) тогда
				Продолжить;
			КонецЕсли;		
			
			Если СтрокиКорня = Неопределено тогда
				стрКореньИнтерфейса = ДеревоИнтерфейса.Строки.Добавить();
				стрКореньИнтерфейса.Представление  = стрКорень.Представление;
				стрКореньИнтерфейса.Имя = стрКореньИнтерфейса.Представление;
				стрКореньИнтерфейса.ИндексКартинки = стрКорень.ИндексКартинки;
				
				СтрокиКорня = стрКореньИнтерфейса.Строки;
			КонецЕсли;
		
			стрОбъектИнтерфейса = СтрокиКорня.Добавить();
			стрОбъектИнтерфейса.Вид 		   = стрОбъект.Вид;
			стрОбъектИнтерфейса.Имя			   = стрОбъект.Имя;
			стрОбъектИнтерфейса.Представление  = стрОбъект.Представление;
			стрОбъектИнтерфейса.ИндексКартинки = стрОбъект.ИндексКартинки;
			
			Если флПробоватьУмныйПоиск = Истина Тогда
				Попытка
					ОбъектМД = Метаданные[стрОбъект.Вид][стрОбъект.Имя];
				Исключение
					// Метаданные кончились
				    Возврат
				КонецПопытки;

				Если Ложь 
					Или стрОбъект.Вид = "Справочники"
					ИЛИ стрОбъект.Вид = "ПланыВидовХарактеристик" 
					ИЛИ стрОбъект.Вид = "ПланыСчетов" 
					ИЛИ стрОбъект.Вид = "ПланыВидовРасчета"  
					ИЛИ стрОбъект.Вид = "Документы" 
					ИЛИ стрОбъект.Вид = "БизнесПроцессы" 
					ИЛИ стрОбъект.Вид = "Задачи" 
				Тогда
					Если Ложь
						Или стрОбъект.Вид = "Справочники" 
						ИЛИ стрОбъект.Вид = "ПланыВидовХарактеристик" 
						ИЛИ стрОбъект.Вид = "ПланыСчетов" 
						ИЛИ стрОбъект.Вид = "ПланыВидовРасчета" 
					Тогда
						ДлинаКода = ОбъектМД.ДлинаКода;
						Если  Истина
							И ДлинаКода > 0 
							И (Ложь// Есть где искать по коду
								Или стрОбъект.Вид = "ПланыВидовХарактеристик"   // Либо это план видов характеристик (только строковые коды)
								Или стрОбъект.Вид = "ПланыСчетов"  				// Либо это план счетов (только строковые коды)
								Или (ЧислоСуффиксаУмногоПоиска = 0 И Строка(ОбъектМД.ТипКода)="Строка") 	// Либо тип кода строковый
								Или (ЧислоСуффиксаУмногоПоиска>0 И Строка(ОбъектМД.ТипКода)="Число")		// Искомый суффикс похож на число
							) 
						Тогда
							Выполнить("НайденныйОбъект = " + стрОбъект.Вид + "." + стрОбъект.Имя + ".НайтиПоКоду(СтрокаСуффиксаУмногоПоиска)" );
							Если НЕ НайденныйОбъект.Пустая() Тогда
								СтрокаОбъекта = ДеревоИнтерфейса.Строки.Вставить(0);
								//СтрокаОбъекта.Имя = НайденныйОбъект.УникальныйИдентификатор();
								СтрокаОбъекта.Имя = НайденныйОбъект;
								СтрокаОбъекта.Вид = НайденныйОбъект.Метаданные().ПолноеИмя();
								СтрокаОбъекта.Представление	= НайденныйОбъект;
								СтрокаОбъекта.ИндексКартинки = 62;
								Продолжить
							КонецЕсли
						ИначеЕсли (ЧислоСуффиксаУмногоПоиска > 0 И Строка(ОбъектМД.ТипКода)="Строка") Тогда		
							// Номер может быть частичным - автодополняем префиксами и нулями	
							Для каждого Префикс Из МассивПрефиксовОрганизаций Цикл
								Для сч=0 По ДлинаКода-СтрДлина(Префикс)-ДлинаСуффиксаУмногоПоиска Цикл
							    	КодСПрефиксом = Префикс + Лев(СтрокаНулей, сч) + СтрокаСуффиксаУмногоПоиска;
									Выполнить("НайденныйОбъект = " + стрОбъект.Вид + "." + стрОбъект.Имя + ".НайтиПоКоду(КодСПрефиксом)" );
									Если НЕ НайденныйОбъект.Пустая() Тогда
										СтрокаОбъекта = ДеревоИнтерфейса.Строки.Вставить(0);
										//СтрокаОбъекта.Имя = НайденныйОбъект.УникальныйИдентификатор();
										СтрокаОбъекта.Имя = НайденныйОбъект;
										СтрокаОбъекта.Вид = НайденныйОбъект.Метаданные().ПолноеИмя();
										СтрокаОбъекта.Представление	= НайденныйОбъект;
										СтрокаОбъекта.ИндексКартинки = 62;
										Продолжить
									КонецЕсли
								КонецЦикла;
							КонецЦикла;
						КонецЕсли;
						
						Если ОбъектМД.ДлинаНаименования > 0 Тогда
							Выполнить("НайденныйОбъект = " +  стрОбъект.Вид + "." + стрОбъект.Имя + ".НайтиПоНаименованию(СтрокаСуффиксаУмногоПоиска, Ложь" +  ?(стрОбъект.Вид="ПланыСчетов", ", " + стрОбъект.Вид + "." + стрОбъект.Имя + ".ПустаяСсылка())", ")") );
							Если НЕ НайденныйОбъект.Пустая() Тогда
								
								СтрокаОбъекта = ДеревоИнтерфейса.Строки.Вставить(0);
								//СтрокаОбъекта.Имя = НайденныйОбъект.УникальныйИдентификатор();
								СтрокаОбъекта.Имя = НайденныйОбъект;
								СтрокаОбъекта.Вид = НайденныйОбъект.Метаданные().ПолноеИмя();
								СтрокаОбъекта.Представление	= НайденныйОбъект;
								СтрокаОбъекта.ИндексКартинки = 62;
								Продолжить
								
							КонецЕсли;				
						КонецЕсли;	
						
					ИначеЕсли Ложь
						Или стрОбъект.Вид = "Документы" 
						ИЛИ стрОбъект.Вид = "БизнесПроцессы" 
						ИЛИ стрОбъект.Вид = "Задачи" 
					Тогда
						ДлинаНомера = ОбъектМД.ДлинаНомера ;
						Если ДлинаНомера > 0 И ((ЧислоСуффиксаУмногоПоиска>0 И Строка(ОбъектМД.ТипНомера) = "Число") ИЛИ  (ЧислоСуффиксаУмногоПоиска=0 И Строка(ОбъектМД.ТипНомера)="Строка")) Тогда	
							Выполнить("НайденныйОбъект = " +  стрОбъект.Вид + "." + стрОбъект.Имя + ".НайтиПоНомеру("+?(стрОбъект.Вид="Задачи", "СтрокаСуффиксаУмногоПоиска)", "СтрокаСуффиксаУмногоПоиска, РабочаяДата)" ));
							Если НЕ НайденныйОбъект.Пустая() Тогда
								
								СтрокаОбъекта = ДеревоИнтерфейса.Строки.Вставить(0);
								//СтрокаОбъекта.Имя = НайденныйОбъект.УникальныйИдентификатор();
								СтрокаОбъекта.Имя = НайденныйОбъект;
								СтрокаОбъекта.Вид = НайденныйОбъект.Метаданные().ПолноеИмя();
								СтрокаОбъекта.Представление	= НайденныйОбъект;
								СтрокаОбъекта.ИндексКартинки = 62;
								Продолжить
								
							КонецЕсли;				
							
						ИначеЕсли (ЧислоСуффиксаУмногоПоиска > 0 И Строка(ОбъектМД.ТипНомера)="Строка") Тогда		
							// Номер может быть частичным - автодополняем префиксами и нулями	
							Для каждого Префикс Из МассивПрефиксовОрганизаций Цикл
								Для сч=0 По ДлинаНомера - СтрДлина(Префикс)-ДлинаСуффиксаУмногоПоиска Цикл
									НомерСПрефиксом = Префикс + Лев(СтрокаНулей, сч) + СтрокаСуффиксаУмногоПоиска;
									Выполнить("НайденныйОбъект = " + стрОбъект.Вид + "." + стрОбъект.Имя + ".НайтиПоНомеру("+?(стрОбъект.Вид="Задачи", "НомерСПрефиксом)", "НомерСПрефиксом, РабочаяДата)" ));
									Если НЕ НайденныйОбъект.Пустая() Тогда
										
										СтрокаОбъекта = ДеревоИнтерфейса.Строки.Вставить(0);
										//СтрокаОбъекта.Имя = НайденныйОбъект.УникальныйИдентификатор();
										СтрокаОбъекта.Имя = НайденныйОбъект;
										СтрокаОбъекта.Вид = НайденныйОбъект.Метаданные().ПолноеИмя();
										СтрокаОбъекта.Представление	= НайденныйОбъект;
										СтрокаОбъекта.ИндексКартинки = 62;
										Продолжить
										
									КонецЕсли
								КонецЦикла; 				
							КонецЦикла;
	
						КонецЕсли;
						
					КонецЕсли;					
					
					// Если поиск по коду, наименованию, номеру не удался, попробуем поискать по индексируемым реквизитам
					Для каждого РеквизитОбъектаМД Из ОбъектМД.Реквизиты Цикл
						Если РеквизитОбъектаМД.Индексирование <> Метаданные.СвойстваОбъектов.Индексирование.НЕИндексировать Тогда
							Выполнить("НайденныйОбъект = " +  стрОбъект.Вид + "." + стрОбъект.Имя + ".НайтиПоРеквизиту(РеквизитОбъектаМД.Имя, СтрокаСуффиксаУмногоПоиска)");
							Если НЕ НайденныйОбъект.Пустая() Тогда
								
								СтрокаОбъекта = ДеревоИнтерфейса.Строки.Вставить(0);
								//СтрокаОбъекта.Имя = НайденныйОбъект.УникальныйИдентификатор();
								СтрокаОбъекта.Имя = НайденныйОбъект;
								СтрокаОбъекта.Вид = НайденныйОбъект.Метаданные().ПолноеИмя();
								СтрокаОбъекта.Представление	= НайденныйОбъект;
								СтрокаОбъекта.ИндексКартинки = 62;
								Продолжить
								
							КонецЕсли;
						КонецЕсли;
					КонецЦикла;
				КонецЕсли;
				
			КонецЕсли;
		КонецЦикла;
		
	КонецЦикла;
	

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

Процедура ВыводСодержимогоКаталогов(ДеревоОбъектов = Неопределено, СтрокаПоиска="")

// Вывод содержимого каталогов
	Для каждого Каталог Из стНастройки.Каталоги Цикл
		СтрокиКорня = Неопределено;
		МассивНайденныхФайлов = НайтиФайлы(Каталог.Ключ, "*", флИскатьВПодкаталогах=Истина);
		Для каждого НайденныйФайл Из МассивНайденныхФайлов Цикл
			Расширение = ВРЕГ(НайденныйФайл.Расширение);
			Если Расширение = ".EPF" Тогда
				ВидФайла = "Внешние обработки";
				ИндексКартинки = 19; // 56;
			ИначеЕсли ВерсияПлатфомы >= "8.1" И Расширение = ".ERF" Тогда
				ВидФайла = "Внешние отчеты";
				ИндексКартинки = 19; // 57;
			ИначеЕсли Расширение = ".TXT" Тогда
				ВидФайла = "Текстовые документы";
				ИндексКартинки = 58;
			ИначеЕсли Расширение = ".MXL" Тогда
				ВидФайла = "Табличные документы";
				ИндексКартинки = 59;
			ИначеЕсли Расширение = ".RCF" Тогда
				ВидФайла = "Настройки консоли отчетов";
				ИндексКартинки = 60;
			ИначеЕсли Расширение = ".SEL" Тогда
				ВидФайла = "Настройки консоли запросов";
				ИндексКартинки = 61;
			Иначе
				Продолжить;
			КонецЕсли;
			
			Если НЕ ОбъектПроходитФильтры(НайденныйФайл.ИмяБезРасширения, СтрокаПоиска) Тогда
				Продолжить;
			КонецЕсли;
			
			Если СтрокиКорня = Неопределено тогда
				стрКореньИнтерфейса = ?(ДеревоОбъектов = Неопределено, ДеревоИнтерфейса.Строки.Добавить(), ДеревоОбъектов.Строки.Добавить()) ;
				стрКореньИнтерфейса.Представление  = Каталог.Значение;
				стрКореньИнтерфейса.Имя = стрКореньИнтерфейса.Представление;
				стрКореньИнтерфейса.ИндексКартинки = 12;
				СтрокиКорня = стрКореньИнтерфейса.Строки;		
			КонецЕсли;
			стрОбъектИнтерфейса = СтрокиКорня.Добавить();
			стрОбъектИнтерфейса.Вид 		   = ВидФайла;
			стрОбъектИнтерфейса.Имя			   = НайденныйФайл.ПолноеИмя;
			стрОбъектИнтерфейса.Представление  = НайденныйФайл.ИмяБезРасширения;
			стрОбъектИнтерфейса.ИндексКартинки = ИндексКартинки;
		КонецЦикла;
	КонецЦикла;

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

Процедура ВыводСохраненныхНастроекОтчетов(ДеревоОбъектов = Неопределено, СтрокаПоиска = "")

	// Вывод сохраненных настроек отчетов
	Если ЕстьУниверсальныйОтчет И Есть_РС_СохраненныеНастройки Тогда
		Запрос = Новый Запрос;
		Запрос.Текст = "ВЫБРАТЬ
		|	СохраненныеНастройки.ИмяОбъекта КАК Вид,
		|	СохраненныеНастройки.НаименованиеНастройки как Имя,
		|	СохраненныеНастройки.НаименованиеНастройки как Представление,
		|	24 как ИндексКартинки
		|ИЗ
		|	РегистрСведений.СохраненныеНастройки КАК СохраненныеНастройки
		|ГДЕ
		|	Выразить(СохраненныеНастройки.ИмяОбъекта как Строка(12)) = ""ОтчетОбъект.""
		|   И СохраненныеНастройки.Пользователь = &ТекущийПользователь";
		
		Запрос.УстановитьПараметр("ТекущийПользователь", мТекущийПользователь);
		
		РезультатЗапросаПоНастройкам = Запрос.Выполнить();
		Если НЕ РезультатЗапросаПоНастройкам.Пустой() Тогда
		
			СтрокаКорняОтчетов = ?(ДеревоОбъектов = Неопределено, ДеревоИнтерфейса, ДеревоОбъектов).Строки.Найти("Отчеты");
			ВыборкаНастроек = РезультатЗапросаПоНастройкам.Выбрать();
			Пока ВыборкаНастроек.Следующий() Цикл
				Если НЕ ОбъектПроходитФильтры(ВыборкаНастроек.Представление, СтрокаПоиска) Тогда
					Продолжить;
				КонецЕсли;
				
				Если СтрокаКорняОтчетов = Неопределено Тогда
					стрКореньИнтерфейса = ?(ДеревоОбъектов = Неопределено, ДеревоИнтерфейса, ДеревоОбъектов).Строки.Добавить();
					стрКореньИнтерфейса.Представление  = "Отчеты";
					стрКореньИнтерфейса.Имя = стрКореньИнтерфейса.Представление;
					стрКореньИнтерфейса.ИндексКартинки = 23;
					СтрокиКорня = стрКореньИнтерфейса.Строки;
				Иначе
					СтрокиКорня = СтрокаКорняОтчетов.Строки;
				КонецЕсли;

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

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

Процедура ВыводСохраненныхВнешнихОбработок(ДеревоОбъектов = Неопределено, СтрокаПоиска = "")

	// Вывод сохраненных внешних обработок
	Если ЕстьСправочникВнешнихОбработок Тогда
		Если Не ПравоДоступа("Чтение", Метаданные.Справочники.ВнешниеОбработки) Тогда
			Возврат;
		КонецЕсли; 
		Запрос = Новый Запрос;
		Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|	Наименование как Представление, Код как Имя, ""СправочникВнешниеОбработки"" как Вид,
		|	19 как ИндексКартинки
		|ИЗ
		|	Справочник.ВнешниеОбработки";
		
		РезультатЗапросаПоСправочникуОбработок = Запрос.Выполнить();
		Если НЕ РезультатЗапросаПоСправочникуОбработок.Пустой() Тогда
		    ПредставлениеКорняВнешнихОбработок = "Справочник ""Внешние обработки""";
			СтрокаКорняВнешнихОбработок = ?(ДеревоОбъектов = Неопределено, ДеревоИнтерфейса, ДеревоОбъектов).Строки.Найти(ПредставлениеКорняВнешнихОбработок);
			Если СтрокаКорняВнешнихОбработок = Неопределено Тогда
				СтрокаКорняВнешнихОбработок = ?(ДеревоОбъектов = Неопределено, ДеревоИнтерфейса, ДеревоОбъектов).Строки.Добавить();
				СтрокаКорняВнешнихОбработок.Представление = ПредставлениеКорняВнешнихОбработок;
				СтрокаКорняВнешнихОбработок.Имя = СтрокаКорняВнешнихОбработок.Представление;
				СтрокаКорняВнешнихОбработок.ИндексКартинки = 18;
			КонецЕсли;
			СтрокиКорня = СтрокаКорняВнешнихОбработок.Строки;
			ВыборкаПоСправочникуВнешнихОбработок = РезультатЗапросаПоСправочникуОбработок.Выбрать();				
			Пока ВыборкаПоСправочникуВнешнихОбработок.Следующий() Цикл
				Если ОбъектПроходитФильтры(ВыборкаПоСправочникуВнешнихОбработок.Представление, СтрокаПоиска) Тогда
					стрОбъектИнтерфейса 				= СтрокаКорняВнешнихОбработок.Строки.Добавить();
					ЗаполнитьЗначенияСвойств(стрОбъектИнтерфейса, ВыборкаПоСправочникуВнешнихОбработок);
				КонецЕсли;
			КонецЦикла; 
		КонецЕсли;
	КонецЕсли;

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

//////////////////////////////////////////////////////////////////////////////
// Глобальный поиск

Процедура ПолнотекстовыйПоиск()

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

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

Функция ПолнотекстовыйПоискВыполнен()
	Если ФильтрИмен = "" ИЛИ мСписокПолнотекстовогоПоиска = Неопределено Тогда 
		Возврат Ложь;
	КонецЕсли;
	МассивМД = Новый Массив();
	Если ФильтрПодсистем.Количество() > 0 Тогда
		//ПодсистемаФильтра = Метаданные.Подсистемы.Найти(ФильтрПодсистем);
		//Для каждого ВидМД Из ВеткиМетаданных Цикл
		//	Если 
		//		ВидМД.Значение = "Справочники" ИЛИ
		//		ВидМД.Значение = "Документы"ИЛИ
		//		ВидМД.Значение = "ПланыВидовХарактеристик"ИЛИ
		//		ВидМД.Значение = "ПланыСчетов"ИЛИ
		//		ВидМД.Значение = "ПланыВидовРасчета"ИЛИ
		//		ВидМД.Значение = "БизнесПроцессы"ИЛИ
		//		ВидМД.Значение = "Задачи"ИЛИ
		//		ВидМД.Значение = "ПланыОбмена"
		//		
		//	Тогда
		//		Для Каждого МД Из Метаданные[ВидМД.Представление] Цикл
		//			Если МД.Подсистемы.Содержит(ПодсистемаФильтра) Тогда
		//				МассивМД.Добавить(МД);
		//			КонецЕсли;
		//		КонецЦикла;
		//	КонецЕсли;
		//КонецЦикла;
	Иначе	
		Для каждого ВидМД Из ВеткиМетаданных Цикл
			Если 
				ВидМД.Значение = "Справочники" ИЛИ
				ВидМД.Значение = "Документы"ИЛИ
				ВидМД.Значение = "ПланыВидовХарактеристик"ИЛИ
				ВидМД.Значение = "ПланыСчетов"ИЛИ
				ВидМД.Значение = "ПланыВидовРасчета"ИЛИ
				ВидМД.Значение = "БизнесПроцессы"ИЛИ
				ВидМД.Значение = "Задачи"ИЛИ
				ВидМД.Значение = "ПланыОбмена"
				
			Тогда
				Для Каждого МД Из Метаданные[ВидМД.Представление] Цикл
					МассивМД.Добавить(МД);
				КонецЦикла;
			КонецЕсли;	
		КонецЦикла;
	КонецЕсли;
	мСписокПолнотекстовогоПоиска.ОбластьПоиска = МассивМД;
	
	мСписокПолнотекстовогоПоиска.ПорогНечеткости = стНастройки.ПолнотекстовыйПоискПорогНечеткости;
	
	мСписокПолнотекстовогоПоиска.СтрокаПоиска = ФильтрИмен;
	мСписокПолнотекстовогоПоиска.РазмерПорции = стНастройки.ПолнотекстовыйПоискРазмерПорции;
	мСписокПолнотекстовогоПоиска.ПерваяЧасть();
	Возврат мСписокПолнотекстовогоПоиска.ПолноеКоличество()>0;
КонецФункции

///////////////////////////////////////////////////////
// Служебные процедуры и функции

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

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

//ирПортативный лФайл = Новый Файл(ИспользуемоеИмяФайла);
//ирПортативный ПолноеИмяФайлаБазовогоМодуля = Лев(лФайл.Путь, СтрДлина(лФайл.Путь) - СтрДлина("Модули\")) + "ирПортативный.epf";
//ирПортативный #Если Клиент Тогда
//ирПортативный 	Контейнер = Новый Структура();
//ирПортативный 	Оповестить("ирПолучитьБазовуюФорму", Контейнер);
//ирПортативный 	Если Не Контейнер.Свойство("ирПортативный", ирПортативный) Тогда
//ирПортативный 		ирПортативный = ВнешниеОбработки.ПолучитьФорму(ПолноеИмяФайлаБазовогоМодуля);
//ирПортативный 		ирПортативный.Открыть();
//ирПортативный 	КонецЕсли; 
//ирПортативный #Иначе
//ирПортативный 	ирПортативный = ВнешниеОбработки.Создать(ПолноеИмяФайлаБазовогоМодуля, Ложь); // Это будет второй экземпляр объекта
//ирПортативный #КонецЕсли
//ирПортативный ирОбщий = ирПортативный.ПолучитьОбщийМодульЛкс("ирОбщий");
//ирПортативный ирКэш = ирПортативный.ПолучитьОбщийМодульЛкс("ирКэш");
//ирПортативный ирСервер = ирПортативный.ПолучитьОбщийМодульЛкс("ирСервер");
//ирПортативный ирПривилегированный = ирПортативный.ПолучитьОбщийМодульЛкс("ирПривилегированный");

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// РАЗДЕЛ НАСТРОЕК 

ИсторияКоманд								= 50;
ИспользоватьРегулярныеВыражения				= Истина;
ПолнотекстовыйПоискПорогНечеткости			= 0;
ПолнотекстовыйПоискРазмерПорции				= 0; // Если 0 - то полнотекстовый поиск отключен

	//////////////////////////////////////////////////////////////////////////////////////////////	
	// Соответствие статических веток (История использования и Избранное) и настроек для них
	//Представление, - отображение в интерфейсе
	//СтрокаСортировки, - строка сортировки в таблице статистики
	//КоличествоОтображаемыхЭлементов, - сколько элементов выводить
	//Фильтровать - фильтровать ли данную ветку вместе с деревом
	
	МассивСтатическихВеток = Новый Массив;
	
	//// Быстрый поиск
	//МассивСтатическихВеток.Добавить(Новый Структура(
	//																					"Имя,Использовать,Представление,СтрокаСортировки,КоличествоОтображаемыхЭлементов,Фильтровать,СортировкаПриОтображении,РазрешитьПеретаскивание,Автозапуск,Развернуть", 
	//																					"БыстрыйПоиск",
	//																					Истина, 				// Использовать ли данную ветку
	//																					"Быстрый поиск", 			// Представление ветки в дереве
	//																					"БыстрыйПоиск УБЫВ",  	// Строка сортировки статистической таблицы. Определяет, какие элементы выводятся
	//																					5,                     // Количество элементов, отображаемых в данной ветке
	//																					Истина,                   // Фильтровать ли ветку при непустой строке фильтра
	//																					"",                     // не сортировать
	//																					Ложь, 				// Разрешить перетаскивание
	//																					Ложь					// Автозапуск команд в данной ветке при открытии обработки
	//																					,Истина			// Ветка развернута
	//																				)
	//									);

	// Недавние
	МассивСтатическихВеток.Добавить(Новый Структура(
			"Имя,Использовать,Представление,СтрокаСортировки,КоличествоОтображаемыхЭлементов,Фильтровать,СортировкаПриОтображении,РазрешитьПеретаскивание,Автозапуск,Развернуть", 
			"НедавноИспользованные",
			Истина, // Использовать ли данную ветку
			"Недавно использованные", // Представление ветки в дереве
			"ПоследнееИспользование УБЫВ", // Строка сортировки статистической таблицы. Сортировка определяет, какие элементы выводятся
			10, // Количество элементов, отбражаемых в данной ветке
			Ложь, // Фильтровать ли ветку при непустой строке фильтра
			// Сортировка отображаемых элементов
			// "Вид,Имя" - обычная сортировка
			"", // сортировка по дате использования
			Ложь, // Перетаскивание
			Ложь			// Автозапуск
			,Ложь			// Ветка свернута
		)
	);
	// Часто используемые
	МассивСтатическихВеток.Добавить(Новый Структура(
			"Имя,Использовать,Представление,СтрокаСортировки,КоличествоОтображаемыхЭлементов,Фильтровать,СортировкаПриОтображении,РазрешитьПеретаскивание,Автозапуск,Развернуть", 
			"ЧастоИспользуемые",
			Истина,
			"Часто используемые", 
			"КоличествоИспользований УБЫВ,ПоследнееИспользование",
			10,
			Ложь,
			// Сортировка отображаемых элементов
			"Вид,Имя",
			Ложь, 			// Перетаскивание
			Ложь			// Автозапуск
			,Ложь			// Ветка свернута
		)
	);
	// Избранное									
	МассивСтатическихВеток.Добавить(Новый Структура(
			"Имя,Использовать,Представление,СтрокаСортировки,КоличествоОтображаемыхЭлементов,Фильтровать,СортировкаПриОтображении,РазрешитьПеретаскивание,Автозапуск,Развернуть", 
			"Избранное",
			Истина, // Использовать ли данную ветку
			"Избранное", // Представление ветки в дереве 
			"Избранное УБЫВ",
			10,
			Ложь,
			// Сортировка отображаемых элементов
			"Вид,Имя",
			Истина, 			// Перетаскивание
			Ложь			// Автозапуск
			,Ложь			// Ветка свернута
		)
	);
	// Автозапуск									
	МассивСтатическихВеток.Добавить(Новый Структура(
			"Имя,Использовать,Представление,СтрокаСортировки,КоличествоОтображаемыхЭлементов,Фильтровать,СортировкаПриОтображении,РазрешитьПеретаскивание,Автозапуск,Развернуть", 
			"Автозапуск",
			Истина, 				// Использовать ли данную ветку
			"Автозапуск", 			// Представление ветки в дереве
			"Автозапуск УБЫВ",  	// Строка сортировки статистической таблицы. Определяет, какие элементы выводятся
			10,                     // Количество элементов, отображаемых в данной ветке
			Ложь,                   // Фильтровать ли ветку при непустой строке фильтра
			"",                     // не сортировать
			Истина, 				// Разрешить перетаскивание
			Истина					// Автозапуск команд в данной ветке при открытии обработки
			,Ложь			// Ветка свернута
		)
	);
// Пример пользовательской статической ветки (раскомментируйте и добавьте необходимое количество экземпляров)									
	//СтатическиеВетки.Вставить(ДеревоИнтерфейса.Строки.Добавить(), 		Новый Структура(
	//																					"Имя,Использовать,Представление,СтрокаСортировки,КоличествоОтображаемыхЭлементов,Фильтровать,СортировкаПриОтображении,РазрешитьПеретаскивание,Автозапуск", 
	//																					"МойСборникКоманд", 			// Представление ветки в дереве
	//																					Истина, 				// Использовать ли данную ветку
	//																					"Мой сборник команд", 			// Представление ветки в дереве
	//																					"МойСборникКоманд УБЫВ",  	// Строка сортировки статистической таблицы. Определяет, какие элементы выводятся
	//																					10,                     // Количество элементов, отображаемых в данной ветке
	//																					Ложь,                   // Фильтровать ли ветку при непустой строке фильтра
	//																					"",                     // не сортировать
	//																					Истина, 				// Разрешить перетаскивание
	//																					Ложь					// Автозапуск команд в данной ветке при открытии обработки
	//																				)
	//									);
	//										

	
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ИНИЦИАЛИЗАЦИЯ ОБРАБОТКИ
	

КолонкиДерева = ДеревоИнтерфейса.Колонки;
Если КолонкиДерева.Найти("Представление") = Неопределено Тогда
	КолонкиДерева.Добавить("Представление");
	КолонкиДерева.Добавить("Имя");
	КолонкиДерева.Добавить("Вид");
	КолонкиДерева.Добавить("ИндексКартинки");
	КолонкиДерева.Добавить("ПолноеИмяОбъекта");
	КолонкиДерева.Добавить("КоличествоСтрок");
	КолонкиДерева.Добавить("Порядок");
КонецЕсли;
мПлатформа = ирКэш.Получить();
КомандыПоиска = Новый Массив();

ВеткиМетаданных = Новый СписокЗначений;
ВеткиМетаданных.Добавить("Общие формы", "ОбщиеФормы");
ВеткиМетаданных.Добавить("Интерфейсы", "Интерфейсы");
ВеткиМетаданных.Добавить("Константы", "Константы");
ВеткиМетаданных.Добавить("Справочники", "Справочники");
ВеткиМетаданных.Добавить("Перечисления", "Перечисления");
ВеткиМетаданных.Добавить("Документы", "Документы");
ВеткиМетаданных.Добавить("Журналы документов", "ЖурналыДокументов");
ВеткиМетаданных.Добавить("Отчеты", "Отчеты");
ВеткиМетаданных.Добавить("Обработки", "Обработки");
ВеткиМетаданных.Добавить("Планы видов характеристик", "ПланыВидовХарактеристик");
ВеткиМетаданных.Добавить("Регистры сведений", "РегистрыСведений");
ВеткиМетаданных.Добавить("Регистры накопления", "РегистрыНакопления");
ВеткиМетаданных.Добавить("Планы счетов", "ПланыСчетов");
ВеткиМетаданных.Добавить("Планы видов расчета", "ПланыВидовРасчета");
ВеткиМетаданных.Добавить("Регистры бухгалтерии", "РегистрыБухгалтерии");
ВеткиМетаданных.Добавить("Регистры расчета", "РегистрыРасчета");
ВеткиМетаданных.Добавить("Бизнес-процессы", "БизнесПроцессы");
ВеткиМетаданных.Добавить("Задачи","Задачи");
ВеткиМетаданных.Добавить("Планы обмена", "ПланыОбмена");

СоответствиеВидовМетаданныхДляПоискаПолногоИмени = Новый Соответствие;
СоответствиеВидовМетаданныхДляПоискаПолногоИмени.Вставить("ОбщиеФормы", "ОбщаяФорма");
СоответствиеВидовМетаданныхДляПоискаПолногоИмени.Вставить("Интерфейсы","Интерфейс");
СоответствиеВидовМетаданныхДляПоискаПолногоИмени.Вставить("Константы","Константа");
СоответствиеВидовМетаданныхДляПоискаПолногоИмени.Вставить("Справочники","Справочник");
СоответствиеВидовМетаданныхДляПоискаПолногоИмени.Вставить("Перечисления","Перечисление");
СоответствиеВидовМетаданныхДляПоискаПолногоИмени.Вставить("Документы","Документ");
СоответствиеВидовМетаданныхДляПоискаПолногоИмени.Вставить("ЖурналыДокументов","ЖурналДокументов");
СоответствиеВидовМетаданныхДляПоискаПолногоИмени.Вставить("Отчеты","Отчет");
СоответствиеВидовМетаданныхДляПоискаПолногоИмени.Вставить("Обработки","Обработка");
СоответствиеВидовМетаданныхДляПоискаПолногоИмени.Вставить("ПланыВидовХарактеристик", "ПланВидовХарактеристик");
СоответствиеВидовМетаданныхДляПоискаПолногоИмени.Вставить("РегистрыСведений","РегистрСведений");
СоответствиеВидовМетаданныхДляПоискаПолногоИмени.Вставить("РегистрыНакопления","РегистрНакопления");
СоответствиеВидовМетаданныхДляПоискаПолногоИмени.Вставить("ПланыСчетов","ПланСчетов");
СоответствиеВидовМетаданныхДляПоискаПолногоИмени.Вставить("ПланыВидовРасчета","ПланВидовРасчета");
СоответствиеВидовМетаданныхДляПоискаПолногоИмени.Вставить("РегистрыБухгалтерии","РегистрБухгалтерии");
СоответствиеВидовМетаданныхДляПоискаПолногоИмени.Вставить("РегистрыРасчета","РегистрРасчета");
СоответствиеВидовМетаданныхДляПоискаПолногоИмени.Вставить("БизнесПроцессы","БизнесПроцесс");
СоответствиеВидовМетаданныхДляПоискаПолногоИмени.Вставить("Задачи","Задача");
СоответствиеВидовМетаданныхДляПоискаПолногоИмени.Вставить("ПланыОбмена","ПланОбмена");

ЕстьУниверсальныйОтчет = (Метаданные.Отчеты.Найти("УниверсальныйОтчет") <> Неопределено);
Есть_РС_СохраненныеНастройки = (Метаданные.РегистрыСведений.Найти("СохраненныеНастройки") <> Неопределено);
//Есть_СправочникОрганизаций = (Метаданные.Справочники.Найти("Организации") <> Неопределено);
ЕстьСправочникВнешнихОбработок = (Метаданные.Справочники.Найти("ВнешниеОбработки") <> Неопределено);
ИмяКорневойПодсистемы = "Конфигурация." + Метаданные.Имя;
 
Если Метаданные.ПараметрыСеанса.Найти("ТекущийПользователь") = Неопределено Тогда
	мТекущийПользователь = Неопределено;
Иначе
	Попытка
		мТекущийПользователь = ПараметрыСеанса.ТекущийПользователь;
	Исключение
	КонецПопытки; 
КонецЕсли;

СистемнаяИнформация = Новый СистемнаяИнформация;
ВерсияПлатфомы = Лев(СистемнаяИнформация.ВерсияПриложения,3);
Если Истина
	И ПолнотекстовыйПоискРазмерПорции > 0 // Включен
	И ВерсияПлатфомы >= "8.1" // и платформа позволяет
Тогда 
	Если ПолнотекстовыйПоиск.ПолучитьРежимПолнотекстовогоПоиска() = РежимПолнотекстовогоПоиска.Разрешить Тогда
		мСписокПолнотекстовогоПоиска = ПолнотекстовыйПоиск.СоздатьСписок(); 
		мСписокПолнотекстовогоПоиска.ПолучатьОписание = Ложь;
	КонецЕсли;
КонецЕсли;
	
