Перем мСоответствиеСтруктурТипа;

Функция ОтобранныеСтрокиТаблицы() Экспорт

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

КонецФункции // ПолучитьОтобранныеСтрокиТаблицы()

Функция ПомеченныеСтрокиТаблицы() Экспорт

	Результат = РедактируемыеТипы.Выгрузить(Новый Структура("Пометка", Истина), "Имя");
	Возврат Результат;

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

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

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

Процедура УстановитьПометкуДерева(СтрокиДереваТипов, Признак)

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

КонецПроцедуры // УстановитьСПометкуДерева()

Процедура ЗакрытьССохранением()

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

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

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

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

Процедура КнопкаОКНажатие(Кнопка)
	
	ЗакрытьССохранением();

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

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

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

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

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

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

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

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

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

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

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

// <Описание функции>
//
// Параметры:
//  <Параметр1>  - <Тип.Вид> - <описание параметра>
//                 <продолжение описания параметра>;
//  <Параметр2>  - <Тип.Вид> - <описание параметра>
//                 <продолжение описания параметра>.
//
// Возвращаемое значение:
//               - <Тип.Вид> - <описание значения>
//                 <продолжение описания значения>;
//  <Значение2>  - <Тип.Вид> - <описание значения>
//                 <продолжение описания значения>.
//
Функция ОпределитьТекущуюСтроку()


	
КонецФункции // ОпределитьТекущуюСтроку()

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

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

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

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

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

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

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

Процедура ОбновитьСтроки()
	
	// Антибаг платформы 8.2.15. Непомеченные строки лишались текста в колонке "Представление" при выводе строки
	// http://partners.v8.1c.ru/forum/thread.jsp?id=1016721#1016721
	ЭлементыФормы.РедактируемыеТипы.ОбновитьСтроки();

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

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

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

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

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

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

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

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

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

Процедура СоставДатыПриИзменении(Элемент)
	
	УстановитьПометкуВТекущейСтроке();

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

Процедура УстановитьПометкуВТекущейСтроке(НоваяПометка = Истина)

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

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

Процедура РазрядностьПриИзменении(Элемент)
	
	УстановитьПометкуВТекущейСтроке();
	
КонецПроцедуры

Процедура РазрядностьДробнойЧастиПриИзменении(Элемент)
	
	УстановитьПометкуВТекущейСтроке();

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

Процедура НеотрицательноеПриИзменении(Элемент)
	
	УстановитьПометкуВТекущейСтроке();
	
КонецПроцедуры

Процедура ДлинаСтрокиПриИзменении(Элемент)
	
	УстановитьПометкуВТекущейСтроке();
	
КонецПроцедуры

Процедура ФиксированнаяПриИзменении(Элемент)
	
	УстановитьПометкуВТекущейСтроке();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

Функция ПоследниеВыбранныеНажатие(Кнопка) Экспорт
	
	ирКлиент.ПоследниеВыбранныеНажатиеЛкс(ЭтаФорма, ЭлементыФормы.РедактируемыеТипы, Метаданные().ТабличныеЧасти.РедактируемыеТипы.Реквизиты.Имя.Имя, Кнопка);
	
КонецФункции

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

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

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

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

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

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

Процедура ТаблицаРедактируемыхТиповПриИзмененииФлажка(Элемент, Колонка)
	
	//// https://www.hostedredmine.com/issues/923113 Временно отключаем возможный отбор "Имя в большом списке",
	//// чтобы при обработке изменения флажка он не давал большие задержки 
	//// Опыт использования показал неприятные визуальные эффекты.
	//ЭлементОтбораИмя = ЭлементыФормы.РедактируемыеТипы.ОтборСтрок.Имя;
	//СтароеИспользование = ЭлементОтбораИмя.Использование;
	//ЭлементОтбораИмя.Использование = Ложь;
	
	ирКлиент.ТабличноеПолеПриИзмененииФлажкаЛкс(ЭтаФорма, Элемент, Колонка, ЭлементыФормы.КоманднаяПанельТипов.Кнопки.ТолькоВыбранные);
	//ЭлементОтбораИмя.Использование = СтароеИспользование;
	
КонецПроцедуры

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

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

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

Функция КоллекцииНаборовТипов()
	
	Результат = Новый Массив;
	Если ирКэш.НомерВерсииПлатформыЛкс() > 803001 Тогда
		Результат.Добавить(Метаданные.ОпределяемыеТипы);
	КонецЕсли;
	Результат.Добавить(Метаданные.ПланыВидовХарактеристик);
	Возврат Результат;

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

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

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

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

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

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

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

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

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

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

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

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

СписокВыбора = ЭлементыФормы.СоставДаты.СписокВыбора;
СписокВыбора.Добавить(ЧастиДаты.Время);
СписокВыбора.Добавить(ЧастиДаты.Дата);
СписокВыбора.Добавить(ЧастиДаты.ДатаВремя);
СоставДаты = ЧастиДаты.ДатаВремя;
