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

Перем мКоличествоСтатическихКнопокКоманднойПанели;
//Перем мСписокВыбораПодсистем;
//Перем мСвязанныйДинамическийСписок;
Перем мХранимыеТипыМетаобъектов;

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

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

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

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

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

// В зависимости от выбранного объекта, генерирует команды контекстного меню
Процедура СгенерироватьКомандыКонтекстногоМенюДерева()
	СгенерироватьКомандыКонтекстногоМеню(ЭлементыФормы.Дерево);
КонецПроцедуры

// Параметры:
//    ТабличноеПоле - ? - 
Процедура СгенерироватьКомандыКонтекстногоМеню(ТабличноеПоле) Экспорт 
	ТекущаяСтрока = ТабличноеПоле.ТекущаяСтрока;
	Если ТекущаяСтрока = мПредыдущиеСтроки[ТабличноеПоле.Имя] Тогда
		Возврат;
	КонецЕсли;
	мПредыдущиеСтроки[ТабличноеПоле.Имя] = ТекущаяСтрока; 
	СгенерироватьКомандыКонтекстногоМенюПоСтроке(ТабличноеПоле, ТекущаяСтрока);
КонецПроцедуры

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

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

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

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

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

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

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

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

Процедура Избранное_ВыгрузитьСсылки()
	
	СтрокиИзбранного = мНастройкиФормы.СтатистикаИспользования.НайтиСтроки(Новый Структура("Избранное", 1)); 
	СписокСсылок = Новый СписокЗначений;
	Для Каждого СтрокаИзбранного Из СтрокиИзбранного Цикл
		Если ирОбщий.ЛиСсылкаНаОбъектБДЛкс(СтрокаИзбранного.Имя, Ложь) Тогда
			СписокСсылок.Добавить(СтрокаИзбранного.Имя);
		КонецЕсли; 
	КонецЦикла;
	Если СписокСсылок.Количество() > 0 Тогда
		ирКлиент.ОткрытьЗначениеЛкс(СписокСсылок,,,, Ложь);
	КонецЕсли; 
	
КонецПроцедуры

Процедура УдалитьКонтекстныеКнопкиКоманднойПанели(ТабличноеПоле)

	#Если Сервер И Не Сервер Тогда
		ТабличноеПоле = Новый ТабличноеПоле;
	#КонецЕсли
	КнопкиКоманднойПанели = ТабличноеПоле.КонтекстноеМеню.Кнопки;
	КоличествоКнопок = КнопкиКоманднойПанели.Количество();
	Для Сч = 1 По КоличествоКнопок - мКоличествоСтатическихКнопокКоманднойПанели[ТабличноеПоле.Имя] Цикл
		КнопкиКоманднойПанели.Удалить(КоличествоКнопок - Сч);
	КонецЦикла;

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

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

Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
	Если Не Отказ Тогда
		ПоказатьСвернутьЧастое(Истина);
	КонецЕсли; 
КонецПроцедуры

Процедура ПриОткрытии()
	
	#Если Сервер И Не Сервер Тогда
	    мПлатформа = Обработки.ирПлатформа.Создать();
	#КонецЕсли
	ирКлиент.Форма_ПриОткрытииЛкс(ЭтаФорма);
	мХранимыеТипыМетаобъектов = ирКэш.ТипыМетаОбъектов(Ложь, Ложь, Ложь);
	ПрименитьПараметрыФормы(Истина);
	ТабличныйДокумент = ПолучитьМакет("Картинки");
	КартинкаСтрок = ТабличныйДокумент.Рисунки[0].Картинка;
	Для Каждого СтатическаяВетка Из МассивСтатическихВеток Цикл
		ЭлементыФормы[СтатическаяВетка.Имя].Колонки.Имя.КартинкиСтрок = КартинкаСтрок;
		КолонкаПредставление = ЭлементыФормы[СтатическаяВетка.Имя].Колонки.Представление;
		КолонкаПредставление.КартинкиСтрок = КартинкаСтрок;
		КолонкаПредставление.ПодсказкаВШапке = СтрЗаменить(КолонкаПредставление.ПодсказкаВШапке, "666", XMLСтрока(СтатическаяВетка.КоличествоОтображать));
	КонецЦикла;
	ОбновитьПредставлениеБуфераОбмена();
	ЭлементыФормы.Дерево.Колонки.Имя.КартинкиСтрок = КартинкаСтрок;
	ЭлементыФормы.Дерево.Колонки.Представление.КартинкиСтрок = КартинкаСтрок;
	ЭлементыФормы.Дерево.Колонки.КоличествоСтрок.Видимость = Ложь; 
	Если ЗначениеЗаполнено(ДеревоСтрокаПоиска) Тогда
		ВосстановитьВыбраннуюСтроку(мНастройкиФормы.ВыбраннаяСтрока);
	КонецЕсли;
	Если Истина
		И мНастройкиФормы.ТекущееИзбранное <> Неопределено 
		И Избранное.Количество() > мНастройкиФормы.ТекущееИзбранное 
	Тогда
		ЭлементыФормы.Избранное.ТекущаяСтрока = Избранное[мНастройкиФормы.ТекущееИзбранное];
	КонецЕсли;
	ирКлиент.ДопСвойстваЭлементаФормыЛкс(ЭтаФорма, ЭлементыФормы.Дерево).МенеджерПоиска = ирКлиент.СоздатьМенеджерПоискаВТабличномПолеЛкс(,,,, Истина); // Для отключения раскраски
	ирКлиент.ДопСвойстваЭлементаФормыЛкс(ЭтаФорма, ЭлементыФормы.Последнее).МенеджерПоиска = ирКлиент.СоздатьМенеджерПоискаВТабличномПолеЛкс(,,,,, ЭлементыФормы.Дерево.Имя);
	//Активизировать(); // Ломает привязки https://www.hostedredmine.com/issues/901975
	Если ПрикреплятьОкноПослеОткрытия Тогда
		ирКлиент.УстановитьПрикреплениеФормыВУправляемомПриложенииЛкс(Этаформа);
	КонецЕсли;
	
	СвернутьЧастоеОтложенно();
	//ПодключитьОбработчикОжидания("СвернутьЧастоеОтложенно", 0.1, Истина);

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

Процедура СвернутьЧастоеОтложенно()
	
	ПоказатьСвернутьЧастое(Ложь);

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

Процедура ПрименитьПараметрыФормы(ПриОткрытии = Ложь) Экспорт  
	
	Если Не ПриОткрытии И Не Открыта() Тогда
		Открыть();
		Возврат;
	КонецЕсли; 
	Если Дерево.Строки.Количество() = 0 Тогда
		ПриИзмененииФильтраИмен();
	КонецЕсли; 
	Если ЗначениеЗаполнено(ПараметрИмяОбъектаМетаданных) Тогда
		Если Не НайтиАктивироватьСтрокуОбъектаИзПараметраФормы() Тогда
			ЭтаФорма.ДеревоСтрокаПоиска = "";
			ЭтаФорма.ФильтрПодсистем.Очистить();
			ПриИзмененииФильтраИмен();
			НайтиАктивироватьСтрокуОбъектаИзПараметраФормы();
		КонецЕсли; 
	КонецЕсли;
	ЭтаФорма.ПараметрИмяОбъектаМетаданных = "";
	Если Не ПриОткрытии Тогда
		Открыть();
	Иначе
		// Ломаются привязки https://www.hostedredmine.com/issues/901975
	КонецЕсли; 

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

Функция НайтиАктивироватьСтрокуОбъектаИзПараметраФормы()
	
	НайденнаяСтрока = Дерево.Строки.Найти(ПараметрИмяОбъектаМетаданных, "ПолноеИмяОбъекта", Истина);
	ЛиНашли = НайденнаяСтрока <> Неопределено;
	Если ЛиНашли Тогда
		ЭлементыФормы.Дерево.ТекущаяСтрока = НайденнаяСтрока;
	КонецЕсли;
	Возврат ЛиНашли;

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

Процедура ПриЗакрытии()

	СохранитьНастройки();
	ирКлиент.Форма_ПриЗакрытииЛкс(ЭтаФорма);
	
КонецПроцедуры

// Вызывается регулярно для очистки фильра
//
//
Процедура ОчисткаСтрокиФильтра()
	
	ДеревоСтрокаПоиска = "";
	ФильтрИмен_ПриИзменении();
	ЗаполнитьДеревоИнтерфейса();
	//ЭлементыФормы.Дерево.ТекущаяСтрока = Дерево.Строки[0];
	 
КонецПроцедуры // ОчисткаСтрокиФильтра()

Процедура ПриИзмененииФильтраПодсистем()

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

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

Процедура ФильтрПодсистем_Очистка(Элемент, СтандартнаяОбработка)

	ФильтрПодсистем_ПриИзменении(Элемент);
	
КонецПроцедуры

Процедура ФильтрПодсистем_ПриИзменении(Элемент)

	ПриИзмененииФильтраПодсистем();
	ирКлиент.ПолеВводаСИсториейВыбора_ПриИзмененииЛкс(Элемент, ЭтаФорма);
	
КонецПроцедуры

Процедура ЗаполнитьДеревоПодсистем() Экспорт
	
	////мСписокВыбораПодсистем = ДобавитьПодсистему();
	//ДобавитьПодсистему();
	
КонецПроцедуры

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

Процедура ФильтрИмен_ПриИзменении(Элемент="")

	ПриИзмененииФильтраИмен();
	ирКлиент.ПолеВводаСИсториейВыбора_ПриИзмененииЛкс(Элемент, "СтрокаПоискаМетаданных");
	
КонецПроцедуры

Процедура ФильтрИменОткрытие(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ПриИзмененииФильтраИмен();
	
КонецПроцедуры

Процедура ФильтрИмен_АвтоПодборТекста(Элемент, Текст, ТекстАвтоПодбора, СтандартнаяОбработка)

	Если ирКлиент.ПромежуточноеОбновлениеСтроковогоЗначенияПоляВводаЛкс(ЭтаФорма, Элемент, Текст) Тогда 
		ПриИзмененииФильтраИмен();
	КонецЕсли;
	
КонецПроцедуры

// Предлагает выбор формы и открывает ее для текущей строки дерева
//
// Параметры
//  Команда - строка команды. Если указана, то выбор формы не предлагается, а сразу открывается форма по умолчанию
//
Процедура ОткрытиеФормы(ГрупповаяКоманда = "", ТабличноеПоле = Неопределено)
	
	#Если Сервер И Не Сервер Тогда
		ТабличноеПоле = Новый ТабличноеПоле;
	#КонецЕсли
	Если ТабличноеПоле = Неопределено Тогда
		ТабличноеПоле = ЭтаФорма.ТекущийЭлемент;
	КонецЕсли; 
	Для Каждого ТекущаяСтрока Из ТабличноеПоле.ВыделенныеСтроки Цикл
		Команда = ГрупповаяКоманда;
		Если Команда = "" Тогда
			// Вызов первой и одновременно основной из доступных команд
			СгенерироватьКомандыКонтекстногоМенюПоСтроке(ТабличноеПоле, ТекущаяСтрока);
			КнопкиКоманднойПанели = ТабличноеПоле.КонтекстноеМеню.Кнопки;
			Если КнопкиКоманднойПанели.Количество() > мКоличествоСтатическихКнопокКоманднойПанели[ТабличноеПоле.Имя] Тогда
				Команда = КнопкиКоманднойПанели[мКоличествоСтатическихКнопокКоманднойПанели[ТабличноеПоле.Имя]];
			КонецЕсли;
		КонецЕсли; 
		СтруктураТекущейСтроки = ирОбщий.СтруктураИзСтрокиТаблицыИлиДереваИлиВыборкиЛкс(ТекущаяСтрока);
		НоваяФорма = Неопределено;
		Если ТипЗнч(Команда) = Тип("КнопкаКоманднойПанели") Тогда
			Кнопка = Команда;
			ВидОбъекта = ТекущаяСтрока.Вид;
			ИмяОбъекта = ТекущаяСтрока.Имя;
			Попытка
				Если Истина
					И ЗначениеЗаполнено(ВидОбъекта) 
					И ЗначениеЗаполнено(ИмяОбъекта) 
				Тогда
					ОткрытьФормуПоПолномуИмени = Ложь; 
					СтрокаПолногоИмени = "";
					ОбъектМД = ОбъектМДСтрокиСписка(ТекущаяСтрока);
					Если ОбъектМД <> Неопределено Тогда
						СтрокаПолногоИмени = ОбъектМД.ПолноеИмя();
					КонецЕсли; 
					Если Кнопка.Имя = "ФункциональныеОпции" Тогда
						НоваяФорма = ОткрытьФункциональныеОпцииОбъекта(СтрокаПолногоИмени);
					ИначеЕсли Кнопка.Имя = "ИсследоватьОбъект" Тогда
						Если ирОбщий.ЛиСсылкаНаОбъектБДЛкс(ИмяОбъекта, Ложь) Тогда
							НоваяФорма = ИсследоватьОбъект(ИмяОбъекта);
						Иначе
							НоваяФорма = ИсследоватьОбъект(ОбъектМД);
						КонецЕсли; 
					ИначеЕсли Кнопка.Имя = "НайтиСсылки" Тогда
						НоваяФорма = НайтиСсылкиВМетаданных(ОбъектМД);
					ИначеЕсли Кнопка.Имя = "СправкаМетаданного" Тогда
						ОткрытьСправку(ОбъектМД);
					ИначеЕсли Кнопка.Имя = "УниверсальныйОтчетПоРегиструНакопления" Тогда
						НоваяФорма = УниверсальныйОтчетПоРегиструНакопления(ИмяОбъекта);
					ИначеЕсли Кнопка.Имя = "ОткрытьВКонфигураторе" Тогда
						ирКлиент.ПерейтиКОбъектуМетаданныхВКонфигуратореЛкс(СтрокаПолногоИмени);
					ИначеЕсли Ложь
						Или Кнопка.Имя = "МодульМенеджера" 
						Или Кнопка.Имя = "МодульОбъекта"
					Тогда
						ирКлиент.ПоказатьСсылкуНаМодульКонфигурацииЛкс(СтрокаПолногоИмени + "." + Кнопка.Имя);
					ИначеЕсли Кнопка.Имя = "Макеты" Тогда
						НоваяФорма = ирКлиент.ФормаВыбораМакетаКонфигурацииЛкс(, СтрокаПолногоИмени);
						НоваяФорма.ПараметрОбъектМетаданных = СтрокаПолногоИмени;
					ИначеЕсли Кнопка.Имя = "ДинамическийСписок" Тогда
						НоваяФорма = ирКлиент.ПолучитьФормуСпискаЛкс(СтрокаПолногоИмени,, Истина, ЭтаФорма);
						СтруктураТекущейСтроки = Неопределено; // Чтобы 2 раза не добавлять в статистику эту сроку
					ИначеЕсли Кнопка.Имя = "ОткрытьВОсновнойФорме" Тогда
						Если ирОбщий.ЛиТипСсылкиВнешнейТаблицыЛкс(ТипЗнч(ИмяОбъекта)) Тогда
							// https://www.hostedredmine.com/issues/917016
							ирКлиент.ОткрытьЗначениеЛкс(ИмяОбъекта);
						ИначеЕсли ирОбщий.ЛиСсылкаНаОбъектБДЛкс(ИмяОбъекта) Тогда
							НоваяФорма = ИмяОбъекта.ПолучитьФорму();
						КонецЕсли; 
					ИначеЕсли Кнопка.Имя = "РедакторОбъектаБД" Тогда
						Если ирОбщий.ЛиСсылкаНаОбъектБДЛкс(ИмяОбъекта, Ложь) Тогда
							// В первую очередь нужны исследователь объектов и редактор реквизитов - у них нет ограничений на открытие формы и тп
							НоваяФорма = ирКлиент.ОткрытьСсылкуВРедактореОбъектаБДЛкс(ИмяОбъекта);
						Иначе
							НоваяФорма = ирКлиент.ОткрытьРедакторОбъектаБДЛкс(СтрокаПолногоИмени);
						КонецЕсли; 
					ИначеЕсли Кнопка.Имя = "АнализПравДоступа" Тогда
						НоваяФорма = ирКлиент.ПолучитьФормуЛкс("Отчет.ирАнализПравДоступа.Форма",,, СтрокаПолногоИмени);
						НоваяФорма.ОбъектМетаданных = СтрокаПолногоИмени;  
						НоваяФорма.ПараметрКлючВарианта = "ПоПользователям";
					ИначеЕсли Кнопка.Имя = "ПодпискиНаСобытия" Тогда
						НоваяФорма = ирКлиент.ПолучитьФормуЛкс("Отчет.ирПодпискиНаСобытия.Форма",,, СтрокаПолногоИмени);
						НоваяФорма.ОбъектМетаданных = СтрокаПолногоИмени;
					ИначеЕсли Кнопка.Имя = "ИсторияДанных" Тогда
						НоваяФорма = ирКлиент.ПолучитьФормуЛкс("Обработка.ирИсторияДанных.Форма");
						НоваяФорма.ПараметрПолноеИмяМД = ОбъектМД.ПолноеИмя();
					//ИначеЕсли Кнопка.Имя = "СвязанныйДинамическийСписок" Тогда
					//	НоваяФорма = ирКлиент.ПолучитьФормуСпискаЛкс(СтрокаПолногоИмени,, Истина,,,,,, "Связанный");
					//	мСвязанныйДинамическийСписок = НоваяФорма;
					ИначеЕсли Кнопка.Имя = "КонсольЗапросов" Тогда
						КонсольЗапросов = ирОбщий.СоздатьОбъектПоИмениМетаданныхЛкс("Обработка.ирКонсольЗапросов");
						#Если Сервер И Не Сервер Тогда
							КонсольЗапросов = Обработки.ирКонсольЗапросов.Создать();
						#КонецЕсли
						НоваяФорма = КонсольЗапросов.ОткрытьПоОбъектуМетаданных(ОбъектМД.ПолноеИмя()); 
					ИначеЕсли Кнопка.Имя = "КонсольКомпоновки" Тогда
						КонсольКомпоновокДанных = ирОбщий.СоздатьОбъектПоИмениМетаданныхЛкс("Обработка.ирКонсольКомпоновокДанных");
						#Если Сервер И Не Сервер Тогда
							КонсольКомпоновокДанных = Обработки.ирКонсольКомпоновокДанных.Создать();
						#КонецЕсли
						НоваяФорма = КонсольКомпоновокДанных.ОткрытьПоОбъектуМетаданных(ОбъектМД.ПолноеИмя());
					ИначеЕсли Кнопка.Имя = "ПодборИОбработкаОбъектов" Тогда
						НоваяФорма = ирКлиент.ПолучитьФормуЛкс("Обработка.ирПодборИОбработкаОбъектов.Форма",,, ОбъектМД.ПолноеИмя());
					ИначеЕсли Кнопка.Имя = "КолонкиБД" Тогда
						НоваяФорма = ирКлиент.ПолучитьФормуЛкс("Обработка.ирКолонкиБД.Форма",,, ирКэш.ИмяТаблицыИзМетаданныхЛкс(ОбъектМД.ПолноеИмя()));
					ИначеЕсли Кнопка.Имя = "СтруктураХранения" Тогда
						НоваяФорма = ирКлиент.ФормаСтруктурыХраненияТаблицыБДЛкс();
						НоваяФорма.ПараметрИмяТаблицы = ирКэш.ИмяТаблицыИзМетаданныхЛкс(ОбъектМД.ПолноеИмя(),, Ложь);
					ИначеЕсли Кнопка.Имя = "ПолнотекстовыйПоискДанных" Тогда
						НоваяФорма = ирКлиент.ПолучитьФормуЛкс("Обработка.ирПолнотекстовыйПоискДанных.Форма",,, ОбъектМД.ПолноеИмя());
					ИначеЕсли Кнопка.Имя = "ЖурналРегистрации" Тогда
						АнализЖурналаРегистрации = ирОбщий.СоздатьОбъектПоИмениМетаданныхЛкс("Обработка.ирАнализЖурналаРегистрации");
						#Если Сервер И Не Сервер Тогда
							АнализЖурналаРегистрации = Обработки.ирАнализЖурналаРегистрации.Создать();
						#КонецЕсли
						НоваяФорма = АнализЖурналаРегистрации.ОткрытьСПараметром("Метаданные", СтрокаПолногоИмени);
					Иначе
						ОткрытьФормуПоПолномуИмени = Истина;
					КонецЕсли; 
					Если Не ОткрытьФормуПоПолномуИмени Тогда
						Если НоваяФорма = Неопределено Тогда 
							Продолжить;
						КонецЕсли;
						Если НоваяФорма.Открыта() Тогда
							НоваяФорма.Открыть(); // Для активации
							Продолжить;
						КонецЕсли;
					КонецЕсли; 
					Если Истина
						И (Ложь
							Или НоваяФорма <> Неопределено
							Или (Истина
								И мХранимыеТипыМетаобъектов.Найти(ВидОбъекта, "Единственное") <> Неопределено 
								И ВидОбъекта <> "Константа")
							Или ВидОбъекта = "Обработка"
							Или ВидОбъекта = "Отчет"
							Или ирОбщий.СтрНачинаетсяСЛкс(ВидОбъекта, "ВнешнийИсточникДанных."))
					Тогда
						//
					Иначе
						ОткрытьФормуПоПолномуИмени = Ложь;
						Если ВидОбъекта = "ОбщаяФорма" Тогда
							// Баг платформы 8.3.5 общая форма так каждый раз новая получается
							Попытка
								НоваяФорма = ПолучитьОбщуюФорму(ИмяОбъекта);
								Если ТипЗнч(НоваяФорма) <> Тип("Форма") Тогда
									НоваяФорма = Неопределено; // https://partners.v8.1c.ru/forum/t/1948332/m/1948332 , https://www.hostedredmine.com/issues/893536
								КонецЕсли; 
							Исключение
								НоваяФорма = Неопределено;
							КонецПопытки; 
							Если НоваяФорма = Неопределено Тогда
								// https://partners.v8.1c.ru/forum/t/1809753/m/1809753
								НоваяФорма = ирКлиент.ПолучитьФормуЛкс("ОбщаяФорма." + ИмяОбъекта);
							КонецЕсли; 
						ИначеЕсли ВидОбъекта = "Интерфейс" Тогда
							ГлавныйИнтерфейс.ПереключитьИнтерфейс(ИмяОбъекта);
						ИначеЕсли ВидОбъекта = "Внешние обработки" Тогда
							лОбработка = ВнешниеОбработки.Создать(ИмяОбъекта);
							Если лОбработка.Метаданные().ОсновнаяФорма = Неопределено Тогда
								ирОбщий.СообщитьЛкс("У внешней обработки не назначена основная форма");
							Иначе
								НоваяФорма = лОбработка.ПолучитьФорму();
								Если НоваяФорма = Неопределено Тогда
									ирОбщий.СообщитьЛкс("У внешней обработки не назначена основная форма для текущего режима запуска приложения");
								КонецЕсли; 
							КонецЕсли; 
						ИначеЕсли ВидОбъекта = "Внешние отчеты" Тогда
							НоваяФорма = ВнешниеОтчеты.Создать(ИмяОбъекта).ПолучитьФорму();
						ИначеЕсли ВидОбъекта = "Табличные документы" Тогда
							ТабличныйДокумент = Новый ТабличныйДокумент;
							ТабличныйДокумент.Прочитать(ИмяОбъекта);
							ирКлиент.ОткрытьЗначениеЛкс(ТабличныйДокумент, Ложь,, ИмяОбъекта);
						ИначеЕсли ВидОбъекта = "Текстовые документы" Тогда
							ТекстовыйДокумент = Новый ТекстовыйДокумент;
							ТекстовыйДокумент.Прочитать(ИмяОбъекта);
							ирКлиент.ОткрытьТекстЛкс(ТекстовыйДокумент.ПолучитьТекст(), ИмяОбъекта, "Обычный", Истина);
						ИначеЕсли Найти(ВидОбъекта, "Настройки консоли") > 0 Тогда
							НоваяФорма = ОткрытьНастройкуКонсолиЗапросовПостроителейКомпоновок(ИмяОбъекта);
						ИначеЕсли Истина
							И ЕстьУниверсальныйОтчет 
							И Есть_РС_СохраненныеНастройки
							И Лев(ТекущаяСтрока.Вид, 11) = "ОтчетОбъект" 
							И Метаданные.Отчеты.Найти(Сред(ТекущаяСтрока.Вид, Найти(ТекущаяСтрока.Вид, ".")+1)) <> Неопределено
						Тогда
							// Восстановление сохраненной настройки
							НоваяФорма = ОткрытьНастройкуОтчета(ВидОбъекта, ИмяОбъекта);
						ИначеЕсли мЕстьСправочникВнешнихОбработок И ВидОбъекта = "СправочникВнешниеОбработки" Тогда
							Если Кнопка.Имя = "Открыть" Тогда 
								НоваяФорма = ПолучитьФормуИзСправочникаВнешнихОбработок(ИмяОбъекта);
							Иначе //НайтиВСправочникеВнешнихОбработок
								СсылкаВнешнейОбработки = НайтиЭлементСправочникаВнешнихОбработок(ИмяОбъекта);
								НоваяФорма = СсылкаВнешнейОбработки.ПолучитьФорму();
							КонецЕсли; 
						ИначеЕсли ирОбщий.ЛиСсылкаНаОбъектБДЛкс(ИмяОбъекта) Тогда
							НоваяФорма = ИмяОбъекта.ПолучитьФорму(ирОбщий.ПоследнийФрагментЛкс(Кнопка.Имя));
						ИначеЕсли ВидОбъекта = "Константа" Тогда
							НоваяФорма = ОткрытьРедакторКонстант();
						Иначе
							ОткрытьФормуПоПолномуИмени = Истина;
						КонецЕсли; 
					КонецЕсли; 
					Если НоваяФорма = Неопределено И ОткрытьФормуПоПолномуИмени Тогда 
						НоваяФорма = ирКлиент.ПолучитьФормуЛкс(ОбъектМД.ПолноеИмя() + "." + Кнопка.Имя);
					КонецЕсли; 
				КонецЕсли;
			Исключение
				ирОбщий.СообщитьЛкс(ОписаниеОшибки(), СтатусСообщения.Внимание);
				Продолжить;
			КонецПопытки;
		Иначе
			Если Истина
				И Не ирОбщий.ЛиКорневойТипКритерияОтбораЛкс(ТекущаяСтрока.Вид)
				И ирОбщий.СтрКончаетсяНаЛкс(Команда, ".ФормаСписка") 
			Тогда
				ИмяМД = ирОбщий.СтрокаБезКонцаЛкс(Команда, СтрДлина(".ФормаСписка"));
				ИспользоватьДинамическийСписокИРСейчас = Ложь;
				Если ИспользоватьДинамическийСписокИР Тогда
					ИспользоватьДинамическийСписокИРСейчас = ирОбщий.ИспользованиеДинамическогоСпискаВместоОсновнойФормыЛкс(ИмяМД);
					Если ИспользоватьДинамическийСписокИРСейчас Тогда
						СтруктураТекущейСтроки = Неопределено; // Чтобы 2 раза не добавлять в статистику эту сроку
					КонецЕсли;
				КонецЕсли;
				ВладелецФормыСписка = Неопределено;
				Если ИспользоватьДинамическийСписокИР Тогда
					ВладелецФормыСписка = ЭтаФорма;
				КонецЕсли;
				Попытка
					НоваяФорма = ирКлиент.ПолучитьФормуСпискаЛкс(ИмяМД,, ИспользоватьДинамическийСписокИРСейчас, ВладелецФормыСписка);
				Исключение
					ирОбщий.СообщитьЛкс(ОписаниеОшибки(), СтатусСообщения.Внимание);
					Продолжить;
				КонецПопытки;
				Если ИспользоватьДинамическийСписокИР Тогда
					#Если Сервер И Не Сервер Тогда
						НоваяФорма = ОткрытьФорму();
					#КонецЕсли
					НоваяФорма.ВладелецФормы = ЭтаФорма;
					НоваяФорма.ЗакрыватьПриЗакрытииВладельца = Ложь;
				КонецЕсли;
			Иначе
				Попытка
					НоваяФорма = ирКлиент.ПолучитьФормуЛкс(Команда);
				Исключение
					ирОбщий.СообщитьЛкс(ОписаниеОшибки(), СтатусСообщения.Внимание);
					Продолжить;
				КонецПопытки;
			КонецЕсли; 
		КонецЕсли;
		Если НоваяФорма = Неопределено тогда
			Продолжить;
		// закомментировал для Антибаг платформы 8.2.15 http://partners.v8.1c.ru/forum/thread.jsp?id=1032819#1032819
		//ИначеЕсли НоваяФорма.Открыта() тогда
		//	НоваяФорма.Активизировать();
		Иначе
			НоваяФорма.Открыть();
			ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.ДеревоСтрокаПоиска;
		КонецЕсли;
		Если Истина
			И СтруктураТекущейСтроки <> Неопределено
			И Не ирОбщий.ЛиСсылкаНаОбъектБДЛкс(ИмяОбъекта, Ложь) 
		Тогда
			ДобавитьСтрокуВСтатическуюВетку(СтруктураТекущейСтроки);
		КонецЕсли;
		ирКлиент.НачатьОтслеживаниеФормыЛкс(НоваяФорма);
	КонецЦикла;
	СгенерироватьКомандыКонтекстногоМенюПоСтроке(ТабличноеПоле, ТабличноеПоле.ТекущаяСтрока); // Восстанавливаем контекстное меню текущей строки
	
КонецПроцедуры

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

Процедура ДеревоИнтерфейса_ПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки) Экспорт
	
	ирКлиент.ТабличноеПолеПриВыводеСтрокиЛкс(ЭтаФорма, Элемент, ОформлениеСтроки, ДанныеСтроки);
	ирКлиент.ТабличноеПолеОформитьЯчейкиИмяСинонимЛкс(Элемент, ОформлениеСтроки);
	//Если ДанныеСтроки.КоличествоСтрок = Неопределено Тогда
	//	ОформлениеСтроки.Ячейки.КоличествоСтрок.УстановитьТекст("?");
	//КонецЕсли; 
	Если ДанныеСтроки.ЕстьДоступ = Ложь Тогда 
		ОформлениеСтроки.ЦветТекста = WebЦвета.Красный;
	КонецЕсли; 
	
КонецПроцедуры

Процедура ДеревоИнтерфейсаПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель)
	Отказ = Истина;
КонецПроцедуры

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

Процедура ОповеститьСвязанныеФормы(Знач ТабличноеПоле = Неопределено)
	
	Если ТабличноеПоле = Неопределено Тогда
		ТабличноеПоле = ТекущееТабличноеПоле();
	КонецЕсли;
	Если ТабличноеПоле.ТекущаяСтрока <> Неопределено Тогда 
		ОбъектМД = ОбъектМДСтрокиСписка(ТабличноеПоле.ТекущаяСтрока);
		Если ОбъектМД <> Неопределено Тогда
			ирКлиент.ОповеститьИсследователиОбъектовЛкс(ЭтаФорма, ОбъектМД, "ОбъектМД");
			ИмяТаблицы = ирКэш.ИмяТаблицыИзМетаданныхЛкс(ОбъектМД.ПолноеИмя());
			Если Истина
				И ЗначениеЗаполнено(ИмяТаблицы) 
				И ирОбщий.ЛиТаблицаБДСуществуетЛкс(ИмяТаблицы) 
			Тогда
				ирКлиент.ОповеститьФормыПодсистемыЛкс("ТаблицаБД", ИмяТаблицы, ЭтаФорма);
			КонецЕсли;
		КонецЕсли; 
	КонецЕсли;

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

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

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

Процедура ДеревоИнтерфейсаПередНачаломИзменения(Элемент, Отказ)
	Отказ = Истина;
КонецПроцедуры

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

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

Функция ПодготовитьЗначениеПеретаскивания(Знач ЗначениеПеретаскивания, Знач НомерЭлементаМассива = 1)
	
	Результат = ЗначениеПеретаскивания;
	Если ТипЗнч(ЗначениеПеретаскивания) = Тип("Массив") Тогда
		Если ЗначениеПеретаскивания.Количество() >= НомерЭлементаМассива Тогда
			ЗначениеПеретаскивания = ЗначениеПеретаскивания[НомерЭлементаМассива - 1];
			ХмлТип = XMLТипЗнч(ЗначениеПеретаскивания);
			Если ХмлТип <> Неопределено Тогда
				Если Найти(ХмлТип.ИмяТипа, "Ref.") > 0 Тогда
					Результат = Новый Структура();
					Результат.Вставить("Вид", ирОбщий.ПолучитьПолноеИмяМДТипаЛкс(ТипЗнч(ЗначениеПеретаскивания)));
					Результат.Вставить("Имя", ЗначениеПеретаскивания);
					Результат.Вставить("Представление", ЗначениеПеретаскивания);
				КонецЕсли; 
			Иначе
				Результат = ЗначениеПеретаскивания;
			КонецЕсли; 
		Иначе 
			Результат = Неопределено;
		КонецЕсли;   
	ИначеЕсли НомерЭлементаМассива > 1 Тогда
		Результат = Неопределено;
	КонецЕсли; 
	Возврат Результат;

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

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

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

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

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

Функция СохранитьВыбраннуюСтроку(ВыбраннаяСтрока = Неопределено)

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

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

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

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

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

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

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

Процедура ОчиститьКэшПоискаПоСтатистике(ОчищатьКэшСвязейСДеревом = Ложь)
	
	СтатистикаИспользования = мНастройкиФормы.СтатистикаИспользования;
	Если СтатистикаИспользования.Колонки.Найти("ПредставлениеСсылки") <> Неопределено Тогда
		СтатистикаИспользования.Колонки.Удалить("ПредставлениеСсылки");
	КонецЕсли;
	Если ОчищатьКэшСвязейСДеревом И СтатистикаИспользования.Колонки.Найти("СтрокаДерева") <> Неопределено Тогда
		СтатистикаИспользования.Колонки.Удалить("СтрокаДерева");
	КонецЕсли;

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

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

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

Функция НайтиСтрокуДеревоПоКлючу(КлючСтроки)
	
	мСтроки = дзВсеОбъекты.Строки.НайтиСтроки(КлючСтроки, Истина);
	Если мСтроки.Количество() = 0 тогда
		// Попытка поиска среди объектов - не метаданных (работает только с теми элементами, которые видны)
		мСтроки = Дерево.Строки.НайтиСтроки(КлючСтроки, Истина);
		Если мСтроки.Количество() > 0 тогда
			стрОбъект = мСтроки[0];
		Иначе
			стрОбъект = Null;
		КонецЕсли;
	Иначе
		стрОбъект = мСтроки[0];
	КонецЕсли;
	Возврат стрОбъект;

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

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

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

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

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

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

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

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

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

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

Процедура ДобавитьОбъект(СтрокиВетви, Знач ОбъектМД, Знач ВидОбъекта, Знач ИндексКартинки, ИспользоватьПолноеИмя = Ложь)

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

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

Процедура ДобавитьВетвьМетаданных(Знач ИмяЕдинственное, Знач КартинкаВетви = 0, Знач КартинкаОбъекта = 0, Знач ИспользоватьПолноеИмя = Ложь, Знач ЕстьДоступ = Истина, 
	Знач КоллекцияМД = Неопределено, Знач Представление = "")

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

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

Процедура ЗаполнитьДеревоВсехОбъектов() Экспорт
	
	ВеткиМетаданных = Новый СписокЗначений;
	дзВсеОбъекты = Новый ДеревоЗначений;
	дзВсеОбъекты.Колонки.Добавить("Имя");
	дзВсеОбъекты.Колонки.Добавить("Вид");
	дзВсеОбъекты.Колонки.Добавить("Представление");
	дзВсеОбъекты.Колонки.Добавить("ИндексКартинки"); 
	дзВсеОбъекты.Колонки.Добавить("Подсистемы"); 
	дзВсеОбъекты.Колонки.Добавить("ЕстьДоступ"); 
	дзВсеОбъекты.Колонки.Добавить("ПолноеИмяОбъекта"); 
	ДобавитьВетвьМетаданных("ОбщаяФорма", 6, 7);
	ДобавитьВетвьМетаданных("Интерфейс", 54, 55);
	ДобавитьВетвьМетаданных("Константа", 20, 0);
	ДобавитьВетвьМетаданных("Справочник", 2, 3);
	ДобавитьВетвьМетаданных("Документ", 12, 13);
	ДобавитьВетвьМетаданных("ЖурналДокументов", 15, 15);
	ДобавитьВетвьМетаданных("ПланВидовХарактеристик", 37, 38);
	ДобавитьВетвьМетаданных("ПланСчетов", 39, 40);
	ДобавитьВетвьМетаданных("ПланВидовРасчета", 47, 48);
	//ДобавитьВетвьМетаданных("КритерийОтбора", , ); // Обычно их формы не поддерживают интерактивный выбор параметра. Поэтому открываем их из редактора объекта
	ДобавитьВетвьМетаданных("РегистрСведений", 33, 34);
	ДобавитьВетвьМетаданных("РегистрНакопления", 31, 32);
	ДобавитьВетвьМетаданных("РегистрБухгалтерии", 41, 42);
	ДобавитьВетвьМетаданных("РегистрРасчета", 49, 50);
	ДобавитьВетвьМетаданных("БизнесПроцесс", 43, 44);
	ДобавитьВетвьМетаданных("Задача", 45, 46);
	ДобавитьВетвьМетаданных("ПланОбмена", 51, 52);
	ДобавитьВетвьМетаданных("Перечисление", 9, 10);
	Если ирКэш.ДоступныВнешниеИсточникДанныхЛкс() Тогда 
		Для Каждого МетаВнешнийИсточникДанных Из Метаданные.ВнешниеИсточникиДанных Цикл
			ИмяВетви = МетаВнешнийИсточникДанных.ПолноеИмя();
			ПредставлениеВетви = МетаВнешнийИсточникДанных.Представление();
			ЕстьДоступ = ПравоДоступа("Использование", МетаВнешнийИсточникДанных);
			ДобавитьВетвьМетаданных(ИмяВетви, 64, 65, Истина, ЕстьДоступ, МетаВнешнийИсточникДанных.Таблицы, ПредставлениеВетви);
		КонецЦикла;
	КонецЕсли; 
	ДобавитьВетвьМетаданных("Отчет", 23, 24);
	ДобавитьВетвьМетаданных("Обработка", 18, 19);
	ВыводСтандартныхИнструментов(дзВсеОбъекты);
	ВыводСодержимогоКаталогов(дзВсеОбъекты);
	ВыводСохраненныхВнешнихОбработок(дзВсеОбъекты);
	ВыводСохраненныхНастроекОтчетов(дзВсеОбъекты);
	ИмяОсновногоПредставления = ПолучитьИмяОсновногоПредставления();
	Для каждого стрВетви из дзВсеОбъекты.Строки цикл
		стрВетви.Строки.Сортировать("Вид УБЫВ, " + ИмяОсновногоПредставления, Ложь);
	КонецЦикла;

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

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

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

	Если Ложь
		Или Не ирКэш.ЛиСеансТолстогоКлиентаУПЛкс()
		Или ирКэш.ЛиПортативныйРежимЛкс() И Не ирКэш.ЛиФайловаяБазаЛкс() 
	Тогда
		Возврат;
	КонецЕсли; 
    ПредставлениеКорняКорня = "Стандартные инструменты";
	ВидФормы = "СистемнаяФорма";
	СтрокаКорня = ?(ДеревоОбъектов = Неопределено, Дерево, ДеревоОбъектов).Строки.Найти(ПредставлениеКорняКорня);
	Если СтрокаКорня = Неопределено Тогда
		СтрокаКорня = ?(ДеревоОбъектов = Неопределено, Дерево, ДеревоОбъектов).Строки.Добавить();
		СтрокаКорня.Представление = ПредставлениеКорняКорня;
		СтрокаКорня.Имя = СтрокаКорня.Представление;
		СтрокаКорня.ИндексКартинки = 6;
		СтрокаКорня.ЕстьДоступ = Истина;
	КонецЕсли;
	СтрокиКорня = СтрокаКорня.Строки;
	ТаблицаСтандартныхИнструментов = ирОбщий.ТаблицаЗначенийИзТабличногоДокументаЛкс(ПолучитьМакет("СтандартныеИнструменты"));
	Если ирКэш.НомерВерсииПлатформыЛкс() >= 803020 Тогда
		ТаблицаСтандартныхИнструментов.Найти("StandartServersControl").ИмяФормы = "StandardServersManagement";
		ТаблицаСтандартныхИнструментов.Найти("StandardExtensionsManagement").ИмяФормы = "StandardConfigurationExtensionsManagement";
		ТаблицаСтандартныхИнструментов.Найти("StandardECSRegister").ИмяФормы = "StandardCollaborationSystemManagement";
	КонецЕсли;
	СловаФильтра = Неопределено;
	Для Каждого СтрокаИнструмента Из ТаблицаСтандартныхИнструментов Цикл
		Если ЛиОбъектПроходитФильтры(СтрокаИнструмента.Представление, СтрокаПоиска,,, СловаФильтра) Тогда
			СтрокДерева = СтрокаКорня.Строки.Добавить();
			СтрокДерева.ЕстьДоступ = Истина;
			СтрокДерева.ИндексКартинки = 7;
			СтрокДерева.Имя = СтрокаИнструмента.ИмяФормы;
			СтрокДерева.Представление = СтрокаИнструмента.Представление;
			СтрокДерева.Вид = ВидФормы;
		КонецЕсли;
	КонецЦикла; 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура КоманднаяПанельДереваИнтерфейсаОткрыть(Кнопка)
	
	ОткрытиеФормы();
	
КонецПроцедуры

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

Процедура кнПрятатьНажатие(Элемент)
	Если СостояниеОкна = ВариантСостоянияОкна.Прячущееся Тогда
		_СостояниеОкна = ВариантСостоянияОкна.Прикрепленное
	Иначе
		_СостояниеОкна = ВариантСостоянияОкна.Прячущееся 
	КонецЕсли;
	мНастройкиФормы.Вставить("СостояниеОкна", _СостояниеОкна);
	Переоткрыть();
КонецПроцедуры

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

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

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

Функция ОткрытьРедакторКонстант()
	
	ИмяКонстанты = ТекущийЭлемент.ТекущаяСтрока.Имя;
	Форма = ирКлиент.ПолучитьФормуЛкс("Обработка.ирРедакторКонстант.Форма",,, ИмяКонстанты);
	Форма.НачальноеЗначениеВыбора = ИмяКонстанты;
	Возврат Форма;
	
КонецФункции // ирРедакторКонстант()

Функция ИсследоватьОбъект(Ссылка)
	
	Форма = ирОбщий.ИсследоватьЛкс(Ссылка,,,,,,,, ЭтаФорма);
	Возврат Форма;
	
КонецФункции 

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

Функция ирПолучитьКартинкуЕслиЕсть(ИмяКартинки)
	
	Результат = Новый Картинка;
	Если Лев(ИмяКартинки, 2) = "ир" Тогда
		Результат = ирКэш.КартинкаПоИмениЛкс(ИмяКартинки);
	Иначе
		// Для типовых поиск по метаданным недоступен
		Попытка
			Результат = БиблиотекаКартинок[ИмяКартинки];
		Исключение
		КонецПопытки;
	КонецЕсли;
	Возврат Результат;
	
КонецФункции

Процедура ФильтрПодсистемНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
	
	ирОбщий.ПолеВводаСИсториейВыбора_ОбновитьСписокЛкс(Элемент, ЭтаФорма);

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

Процедура КомандыПанелиИмяСиноним(Кнопка)
	
	ЭтотОбъект.флИмяСиноним = Не Кнопка.Пометка;
	ПрименитьРежимИмяСиноним();
	мВременныйФильтрИмен = "";
	РазвернутыеВетви = СохранитьРазвернутыеВетви();
	ПриИзмененииФильтраИмен();
	ВосстановитьРазвернутыеВетви(РазвернутыеВетви);
	
КонецПроцедуры

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

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

Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) Экспорт
	
	ирКлиент.Форма_ОбработкаОповещенияЛкс(ЭтаФорма, ИмяСобытия, Параметр, Источник); 
	Если ИмяСобытия = "ИзмененБуферОбмена" Тогда
		ОбновитьПредставлениеБуфераОбмена();
	КонецЕсли;

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

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

Процедура ЗаполнитьКоличествоСтрок()
	
	Если ЭлементыФормы.Дерево.Колонки.КоличествоСтрок.Видимость Тогда
		ирКлиент.ЗаполнитьКоличествоСтрокТаблицВДеревеМетаданныхЛкс(Дерево);
	КонецЕсли;

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

// Предопределеный метод
Процедура ПроверкаЗавершенияФоновыхЗаданий() Экспорт 
	
	ирКлиент.ПроверитьЗавершениеФоновыхЗаданийФормыЛкс(ЭтаФорма);
	
КонецПроцедуры

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

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

Процедура КлсКомандаНажатие(Кнопка) Экспорт 
	
	ирКлиент.УниверсальнаяКомандаФормыЛкс(ЭтаФорма, Кнопка);
	
КонецПроцедуры

Процедура ОбработчикОжиданияСПараметрамиЛкс() Экспорт 
	
	ирКлиент.ОбработчикОжиданияСПараметрамиЛкс();

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

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

Процедура ОбновитьПредставлениеБуфераОбмена() 
	
	ЗначениеИзБуфера = ирКлиент.ЗначениеИзБуфераОбменаЛкс();
	ЭтаФорма.БуферОбмена = ирОбщий.РасширенноеПредставлениеЗначенияЛкс(ЗначениеИзБуфера) + " : " + ТипЗнч(ЗначениеИзБуфера);
	ЭлементыФормы.БуферОбмена.Картинка = ирКлиент.КартинкаТипаЛкс(ТипЗнч(ЗначениеИзБуфера));
	
КонецПроцедуры

Процедура ФильтрПодсистемОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	
	Элемент.Значение = ВыбранноеЗначение; // Без этого выбор из списка последних использованных не устанавливал значение
	
КонецПроцедуры

Процедура ВнешнееСобытие(Источник, Событие, Данные) Экспорт
	
	ирКлиент.Форма_ВнешнееСобытиеЛкс(ЭтаФорма, Источник, Событие, Данные);

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

Процедура ТабличноеПолеПриПолученииДанных(Элемент, ОформленияСтрок) Экспорт 
	
	ирКлиент.ТабличноеПолеПриПолученииДанныхЛкс(ЭтаФорма, Элемент, ОформленияСтрок);

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

Процедура КомандыПанелиИсследовательОбъектов(Кнопка)
	
	ирОбщий.ИсследоватьЛкс(ОбъектМДСтрокиСписка(),,,,,, Истина,, ЭтаФорма);
	
КонецПроцедуры

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

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

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

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

Процедура ИзбранноеПриАктивизацииСтроки(Элемент)
	
	Если Элемент.ТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли;
	ирКлиент.ТабличноеПолеПриАктивизацииСтрокиЛкс(ЭтаФорма, Элемент);
	Если мКлючиТекущихСтрок[Элемент.Имя] = Элемент.ТекущаяСтрока.Имя Тогда
		Возврат;
	КонецЕсли; 
	мКлючиТекущихСтрок[Элемент.Имя] = Элемент.ТекущаяСтрока.Имя;
	СгенерироватьКомандыКонтекстногоМеню(Элемент);
	Если Не мЗапретитьИсходящиеОповещения Тогда 
		ОповеститьСвязанныеФормы(Элемент);
	КонецЕсли;
	
КонецПроцедуры

Процедура КонтекстноеМенюОткрыть(Кнопка)
	
	ОткрытиеФормы();
	
КонецПроцедуры

Процедура ПоказатьСвернутьЧастое(Видимость)
	
	ЭлементыФормы.КомандыПанели.Кнопки.ПоказатьЧастое.Пометка = Видимость;
	ирКлиент.ИзменитьСвернутостьЛкс(ЭтаФорма, Видимость, ЭлементыФормы.Частое, ЭлементыФормы.РазделительПоследнееЧастое, ЭтаФорма.Панель, "верх");
	
КонецПроцедуры

Процедура КомандыПанелиПоказатьЧастое(Кнопка)
	
	ПоказатьСвернутьЧастое(Не ЭлементыФормы.КомандыПанели.Кнопки.ПоказатьЧастое.Пометка);
	
КонецПроцедуры

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

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

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

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

Процедура ИспользоватьДинамическийСписокИРНажатие(Кнопка)
	
	ЭтотОбъект.ИспользоватьДинамическийСписокИР = Не ИспользоватьДинамическийСписокИР;
	НастроитьЭлементыФормы();
	
КонецПроцедуры

Процедура НастроитьЭлементыФормы()
	
	ЭлементыФормы.КомандыПанели.Кнопки.ИспользоватьДинамическийСписокИР.Пометка = ИспользоватьДинамическийСписокИР;
	Если мНастройкиФормы.ПоискЧерезРегулярныеВыражения Тогда
		НоваяКартинка = ирКэш.КартинкаПоИмениЛкс("ирВыражениеРегулярное");
	Иначе
		НоваяКартинка = ирКэш.КартинкаПоИмениЛкс("Заменить");
	КонецЕсли;
	ЭлементыФормы.ДеревоСтрокаПоиска.Картинка = НоваяКартинка;

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

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

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

Процедура КомандыПанелиТаблицаТиповМетаданных(Кнопка)
	 ирКлиент.ОткрытьТаблицуЗначенийЛкс(ирКэш.ТипыМетаОбъектов(),, Ложь, "Типы метаданных");
КонецПроцедуры

Процедура КомандыПанелиТаблицаВсехТаблицБД(Кнопка)
	 ирКлиент.ОткрытьТаблицуЗначенийЛкс(ирКэш.ТаблицаВсехТаблицБДЛкс(),, Ложь, "Таблицы БД");
КонецПроцедуры

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

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

Процедура ДеревоСтрокаПоискаОчистка(Элемент, СтандартнаяОбработка)
	
	Если Элемент.Значение = "" Тогда
		ирКлиент.ТабличноеПолеДеревоЗначений_СвернутьВсеСтрокиЛкс(ЭлементыФормы.Дерево);
		СтандартнаяОбработка = Ложь;
	КонецЕсли;
	
КонецПроцедуры

Процедура ФильтроватьИсториюПриИзменении(Элемент)
	
	ЗаполнитьТабличныеПоляСтатистики(Ложь);
	
КонецПроцедуры

Процедура БуферОбменаОткрытие(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	ЗначениеИзБуфера = ирКлиент.ЗначениеИзБуфераОбменаЛкс();
	Если ЗначениеИзБуфера <> Неопределено Тогда
		ирКлиент.ОткрытьЗначениеЛкс(ЗначениеИзБуфера);
	КонецЕсли;
КонецПроцедуры

Процедура БуферОбменаОчистка(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	ирКлиент.БуферОбменаПриложения_УстановитьЗначениеЛкс(Неопределено);
КонецПроцедуры

Процедура ГлавнаяКоманднаяПанельВыгрузитьБД(Кнопка)
	
	ФайлВыгрузки = ирКлиент.ВыбратьФайлЛкс(Ложь, "DT", "Выгрузка базы 1С",,,, "Выберите файл для выгрузки базы");
	Если ФайлВыгрузки = Неопределено Тогда
		Возврат;
	КонецЕсли;     
	Если ирКэш.ЛиФайловаяБазаЛкс() Тогда
		ирОбщий.ВыполнитьКомандуКонфигуратораЛкс("DumpIB """ + ФайлВыгрузки + """", СтрокаСоединенияИнформационнойБазы(),,,,,,,,,,,,,, Истина);
	Иначе
		Команда = "infobase dump """ + ФайлВыгрузки + """";
		ирОбщий.ВыполнитьКомандуАвтоСервераБазыЛкс(Команда,,,, Ложь,,,,, ЭтаФорма);
	КонецЕсли;
КонецПроцедуры

Процедура ДействияФормыВыгрузитьКонфигурациюВФайлы(Кнопка)
	
	КаталогВыгрузки = ирКлиент.ВыбратьКаталогВФормеЛкс(,, "Выгрузка конфигурации в файлы");
	Если КаталогВыгрузки = Неопределено Тогда
		Возврат;
	КонецЕсли;     
	Если ирКэш.ЛиФайловаяБазаЛкс() Тогда
		ирОбщий.ВыполнитьКомандуКонфигуратораЛкс("DumpConfigFiles """ + КаталогВыгрузки + """", СтрокаСоединенияИнформационнойБазы(),,,,,,,,,,,,,, Истина);
	Иначе
		Команда = "infobase config export """ + КаталогВыгрузки + """";
		ирОбщий.ВыполнитьКомандуАвтоСервераБазыЛкс(Команда,,,, Ложь,,,,, ЭтаФорма);
	КонецЕсли;
КонецПроцедуры

Процедура ДействияФормыВыгрузитьКонфигурацию(Кнопка)
	ФайлВыгрузки = ирКлиент.ВыбратьФайлЛкс(Ложь, "CF", "Конфигурация 1С",,,, "Выберите файл для сохранения конфигурации");
	Если ФайлВыгрузки = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	Если ирКэш.ЛиФайловаяБазаЛкс() Тогда
		ирОбщий.ВыполнитьКомандуКонфигуратораЛкс("DumpCfg """ + ФайлВыгрузки + """", СтрокаСоединенияИнформационнойБазы(),,,,,,,,,,,,,, Истина);
	Иначе
		Команда = "infobase config save """ + ФайлВыгрузки + """";
		ирОбщий.ВыполнитьКомандуАвтоСервераБазыЛкс(Команда,,,, Ложь,,,,, ЭтаФорма);
	КонецЕсли;
КонецПроцедуры

Процедура КомандыПанелиМакетыКонфигурации(Кнопка)
	Форма = ирКлиент.ФормаВыбораМакетаКонфигурацииЛкс();
	Форма.Открыть();
КонецПроцедуры

ирКлиент.ИнициироватьФормуЛкс(ЭтаФорма, "Обработка.ирИнтерфейснаяПанель.Форма.Форма");

ПоискЧерезРегулярныеВыражения = Ложь;
ИспользоватьДинамическищйСписокИР = Истина;
ПолнотекстовыйПоискПорогНечеткости = 0;
ПолнотекстовыйПоискРазмерПорции = 0; // Если 0 - то полнотекстовый поиск отключен
МаксЭлементовСтатистики = 500;

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

ВеткаПоследнее = МассивСтатическихВеток.Добавить();
ВеткаПоследнее.Имя = "Последнее";
ВеткаПоследнее.Представление = "Последнее";
ВеткаПоследнее.Использовать = Истина;
ВеткаПоследнее.КоличествоОтображать = 200;
ВеткаПоследнее.СтрокаСортировки = "ПоследнееИспользование УБЫВ";
ВеткаПоследнее.ДопСортировкаОтображения = "";

ВеткаЧастое = МассивСтатическихВеток.Добавить();
ВеткаЧастое.Имя = "Частое";
ВеткаЧастое.Представление = "Частое";
ВеткаЧастое.Использовать = Истина;
ВеткаЧастое.КоличествоОтображать = 50;
ВеткаЧастое.СтрокаСортировки = "КоличествоИспользований УБЫВ, ПоследнееИспользование";
ВеткаЧастое.ДопСортировкаОтображения = "Вид, Имя";

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