Перем КорневаяСтрока;
Перем БазовоеВыражение Экспорт;
Перем _Значение_ Экспорт;
Перем МаркерСловаЗначения;
Перем СтруктураТипаЗначения;
Перем мСписокПоследнихИспользованныхВыражений;
Перем ИмяТекущегоСвойства Экспорт;
Перем мАвтоКонтекстнаяПомощь;
Перем ИсследуемоеЗначениеЗаменено; // Признак того, что исследуемое значение (ссылка на объект в памяти) было заменено (в результате редактирования в спец. редакторе)
Перем мПлатформа;

Процедура УстановитьИсследуемоеЗначение(пЗначение, пПутьКДанным = Неопределено, пСтруктураТипа = Неопределено) Экспорт 

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

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

Функция ПолучитьПолныйПуть(СтрокаДерева, Знач КромеВерхнего = Ложь)

	Результат = "";
	Если СтрокаДерева = Неопределено Тогда
	ИначеЕсли Истина
		И КромеВерхнего
		И СтрокаДерева.Родитель = Неопределено
	Тогда
	Иначе
		ПолныйПутьКРодителю = ПолучитьПолныйПуть(СтрокаДерева.Родитель, КромеВерхнего);
		Если ПолныйПутьКРодителю <> "" Тогда
			Результат = ПолныйПутьКРодителю;
		КонецЕсли;
		Если СтрокаДерева.ТипСлова <> "Группа" Тогда
			Если Результат <> "" И Лев(СтрокаДерева.Слово, 1) <> "[" Тогда  
				Результат = Результат + ".";
			КонецЕсли; 
			Результат = Результат + СтрокаДерева.Слово; 
			Если СтрокаДерева.ТипСлова = "Метод" Тогда
				Результат = Результат + "()";
			КонецЕсли;
		КонецЕсли; 
	КонецЕсли;
	Возврат Результат;

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

Процедура ЗаполнитьСтрокуСлова(СтрокаДерева)

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

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

Процедура мВычислитьВыражение() 

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

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

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

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

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

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

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

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

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

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

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

Процедура ВыражениеПриИзменении(Элемент)

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

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

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

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

Процедура ОткрытьТекущийЭлемент(ПредпочитатьИсследовательКоллекций = Ложь, СтандартнаяОбработка = Ложь)

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

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

Процедура КоманднаяПанельДереваОткрыть(Кнопка)
	
	ОткрытьТекущийЭлемент();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

Процедура КоманднаяПанельДереваГлобальныйКонтекст(Кнопка)
	
	УстановитьГлобальныйКонтекст();
	
КонецПроцедуры

Процедура КоманднаяПанельДереваАвтоКонтекстнаяПомощь(Кнопка)
	
	мАвтоКонтекстнаяПомощь = Не Кнопка.Пометка;
	Кнопка.Пометка = мАвтоКонтекстнаяПомощь;
	Если мАвтоКонтекстнаяПомощь Тогда
		ДеревоЗначенийПриАктивизацииСтроки();
	КонецЕсли; 
	
КонецПроцедуры

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

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

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

Процедура КоманднаяПанельДереваЗначениеВСтрокуВнутр(Кнопка)

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

Процедура КоманднаяПанельДереваОтображениеXDTO(Кнопка)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ДеревоЗначенийПриИзмененииФлажка(Элемент, Колонка)
	
	ирКлиент.ТабличноеПолеПриИзмененииФлажкаЛкс(ЭтаФорма, Элемент, Колонка);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

Процедура ПриПовторномОткрытии(СтандартнаяОбработка)
	Если Истина
		И ДеревоЗначений.Строки.Количество() > 0
		И _Значение_ = ДеревоЗначений.Строки[0].Значение 
	Тогда
		//
	Иначе
		мВычислитьВыражение();
	КонецЕсли;
КонецПроцедуры

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

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

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

Процедура ВпередНажатие(Элемент)
	
	ирКлиент.СледующееВхождениеСтрокиПоискаВТабличномПолеЛкс(ЭтаФорма, ЭлементыФормы.ДеревоЗначений);
	
КонецПроцедуры

Процедура НазадНажатие(Элемент)
	
	ирКлиент.ПредыдущееВхождениеСтрокиПоискаВТабличномПолеЛкс(ЭтаФорма, ЭлементыФормы.ДеревоЗначений);

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

Процедура ДобавитьВДеревоЭлементКоллекции(Знач ЗначениеЭлемента, Знач ПутьКЭлементу, Знач УстановитьТекущуюСтроку = Истина, Знач ИмяТекущегоСвойства = "") Экспорт 
	
	ТекущийУзел = ДеревоЗначений.Строки[0];
	Если Не ирОбщий.СтрНачинаетсяСЛкс(ПутьКЭлементу, ТекущийУзел.Слово) Тогда 
		Возврат;
	КонецЕсли;
	РегВычислитель = ирКэш.ВычислительРегВыраженийЛкс();
	#Если Сервер И Не Сервер Тогда
		РегВычислитель = Обработки.ирОболочкаРегВыражение.Создать();
	#КонецЕсли
	РегВычислитель.Global = Ложь;
	//РегВычислитель.Pattern = "\.|\[(?:\d+|""[\s\S]*"")\]";
	РегВычислитель.Pattern = "\.|\[[\s\S]*?\]";
	Пока Истина Цикл
		ПутьКЭлементу = Сред(ПутьКЭлементу, СтрДлина(ТекущийУзел.Слово) + 1);
		Если Лев(ПутьКЭлементу, 1) = "(" Тогда
			ПутьКЭлементу = Сред(ПутьКЭлементу, Найти(ПутьКЭлементу, ")") + 1);
		КонецЕсли;
		Если Не ЗначениеЗаполнено(ПутьКЭлементу) Тогда
			Прервать;
		КонецЕсли;
		Если Лев(ПутьКЭлементу, 1) = "." Тогда
			ПутьКЭлементу = Сред(ПутьКЭлементу, 2);
		КонецЕсли;
		Вхождение = РегВычислитель.НайтиВхождения(ПутьКЭлементу);
		Если Вхождение.Количество() = 0 Тогда
			Прервать;
		КонецЕсли;
		НовоеСлово = Лев(ПутьКЭлементу, Вхождение[0].FirstIndex);
		Если НовоеСлово = "" Тогда
			НовоеСлово = Вхождение[0].Value;
		КонецЕсли;
		Если Прав(НовоеСлово, 1) = ")" Тогда
			ДочернийУзел = ТекущийУзел.Строки.Найти("<Методы>", "Слово").Строки.Найти(ирОбщий.ПервыйФрагментЛкс(НовоеСлово, "("), "Слово");
		Иначе
			ДочернийУзел = ТекущийУзел.Строки.Найти(НовоеСлово, "Слово");
		КонецЕсли;
		Если ДочернийУзел = Неопределено Тогда
			Прервать;
		КонецЕсли;
		ТекущийУзел = ДочернийУзел;
	КонецЦикла;  
	Если Не ЗначениеЗаполнено(ПутьКЭлементу) Тогда
		НоваяСтрока = ТекущийУзел;
	Иначе
		Если УстановитьТекущуюСтроку Тогда
			ЭлементыФормы.ДеревоЗначений.Развернуть(ТекущийУзел);
		КонецЕсли;
		НоваяСтрока = ТекущийУзел.Строки.Найти(ЗначениеЭлемента, "Значение");
		Если НоваяСтрока = Неопределено Тогда
			НоваяСтрока = ТекущийУзел.Строки.Добавить();
			НоваяСтрока.Слово = ПутьКЭлементу;
			НоваяСтрока.Значение = ЗначениеЭлемента;
			НоваяСтрока.Успех = Истина;
			ЗаполнитьСтрокуСлова(НоваяСтрока);
		КонецЕсли;
	КонецЕсли;
	Если УстановитьТекущуюСтроку Тогда
		ЭлементыФормы.ДеревоЗначений.Развернуть(НоваяСтрока);
		Если ЗначениеЗаполнено(ИмяТекущегоСвойства) Тогда
			СтрокаСвойства = НоваяСтрока.Строки.Найти(ИмяТекущегоСвойства, "Слово");
			Если СтрокаСвойства <> Неопределено Тогда
				НоваяСтрока = СтрокаСвойства;
			КонецЕсли;
			//ЭлементыФормы.ДеревоЗначений.Развернуть(НоваяСтрока);
		КонецЕсли;
		ЭлементыФормы.ДеревоЗначений.ТекущаяСтрока = НоваяСтрока;
		ирКлиент.Форма_АктивироватьОткрытьЛкс(ЭтаФорма);
	КонецЕсли;
	
КонецПроцедуры

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

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

Процедура КоманднаяПанельДереваПриемОбъекта(Кнопка)
	
	УстановитьНовыйПриемОбъекта(Не Кнопка.Пометка);
	
КонецПроцедуры

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

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

Процедура КоманднаяПанельДереваОбучающееВидео(Кнопка)
	
	ЗапуститьПриложение("https://www.youtube.com/watch?v=4vDV-Y9W_ng");
	
КонецПроцедуры

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

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


