///////////////////////////////////////////////////////////////////////////////
// ПЕРЕМЕННЫЕ МОДУЛЯ

Перем мИмяОбъектаМетаданных Экспорт;
Перем лиДоступ Экспорт;
Перем мПервоначальныйСписокПолей Экспорт;

Перем мКраткоеИмяОбъектаМетаданных;

Перем мИндексыКартинок;


////////////////////////////////////////////////////////////////////////////////
// ЭКСПОРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ

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

////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ УПРАВЛЕНИЯ ВНЕШНИМ ВИДОМ ФОРМЫ

////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ ОБЩЕГО НАЗНАЧЕНИЯ

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

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

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

////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ

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

////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ - ДЕЙСТВИЯ КОМАНДНЫХ ПАНЕЛЕЙ ФОРМЫ

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

Процедура ДеревоПолейПриИзмененииФлажка(Элемент, Колонка)
	
	ТекущаяСтрока = ЭлементыФормы.ДеревоПолей.ТекущаяСтрока;
	ТекущаяСтрока.Метка = ?(ТекущаяСтрока.Метка = 0 ИЛИ ТекущаяСтрока.Метка = 2, 1, 0);
	УстановитьФлажкиПотомков(ТекущаяСтрока);
	УстановитьФлажкиРодителей(ТекущаяСтрока, Истина);
	ИзменитьПодобранныеПоляПоСостояниюСтрокиДерева(ТекущаяСтрока);
	
КонецПроцедуры

Процедура ДеревоПолейПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки) Экспорт
	
	ОформлениеСтроки.Ячейки.Представление.УстановитьФлажок(ДанныеСтроки.Метка);
	
КонецПроцедуры

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

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

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

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

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

КонецПроцедуры
  
                                                           
////////////////////////////////////////////////////////////////////////////////
// ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ
Процедура ТабличноеПолеПриПолученииДанных(Элемент, ОформленияСтрок) Экспорт 
	
	ирКлиент.ТабличноеПолеПриПолученииДанныхЛкс(ЭтаФорма, Элемент, ОформленияСтрок);

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

ирКлиент.ИнициироватьФормуЛкс(ЭтаФорма, "Обработка.ирНастройкаЖурналаРегистрации.Форма.ФормаВыбораПолей");

мИндексыКартинок = Новый Соответствие;

мИндексыКартинок["СтандартныеРеквизиты"] = 5;
мИндексыКартинок["Реквизиты"] = 5;
мИндексыКартинок["ОбщиеРеквизиты"] = 5;
мИндексыКартинок["Графы"] = 7;
мИндексыКартинок["РеквизитыАдресации"] = 5; 
мИндексыКартинок["ТабличныеЧасти"] = 55;
мИндексыКартинок["Измерения"] = 26;
мИндексыКартинок["Ресурсы"] = 28;
ЛиДоступ = Истина;
 