Перем ТаблицаПравСтарая;
Перем ПользовательСтарый;
Перем НаборРолейСтарый;
Перем НаборПравСтарый;
Перем ПолеОбъектаСтарый;
Перем ОбъектМетаданныхСтарый;
Перем СтарыйИспользоватьНаборПолей;
Перем СтарыйВычислятьФункциональныеОпции;
Перем СтарыйОтборПоПраву;
Перем СтарыйОтборПоДоступу;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура КнопкаВариантаНастроек(Кнопка)
	
	ЗагрузитьВариант(Кнопка.Имя);
	
КонецПроцедуры

Процедура ЗагрузитьВариант(Знач ИмяВарианта) 
	
	КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.ВариантыНастроек[ИмяВарианта].Настройки);

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

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

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

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

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

Процедура СкомпоноватьРезультатПоГотовымТаблицам()
	
	СкомпоноватьРезультат(ЭлементыФормы.ТабличныйДокумент, ДанныеРасшифровки);
	//ЭлементыФормы.ТабличныйДокумент.ПоказатьУровеньГруппировокСтрок(0);

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

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

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

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

Процедура ДействияФормыИсполняемаяКомпоновка(Кнопка)
	
	РежимОтладки = 2;
	СкомпоноватьРезультатПоГотовымТаблицам();
	
КонецПроцедуры

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

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

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

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

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

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

Процедура ОбъектМетаданныхНачалоВыбора(Элемент, СтандартнаяОбработка)
	ирКлиент.ОбъектМетаданныхНачалоВыбораЛкс(Элемент, ПараметрыВыбораОбъектаМетаданных(), СтандартнаяОбработка);
КонецПроцедуры

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

Функция ПараметрыВыбораОбъектаМетаданных()
	Возврат ирКлиент.ПараметрыВыбораОбъектаМетаданныхЛкс(Истина, Истина, Истина, Истина, Истина,,, Истина,,,, Истина, Истина,,,, Истина,, Истина,, Истина);
КонецФункции

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

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

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

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

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

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

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

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

Процедура ДействияФормыКэшРолей(Кнопка)
	
	ирКлиент.ОткрытьФормуЛкс("Обработка.ирРедакторОграниченияДоступа.Форма.КэшРолей");
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ДействияФормыАнализПравНаБазу(Кнопка)
	
	ФормаОтчета = ирКлиент.ПолучитьФормуЛкс("Отчет.ирАнализПравНаБазу.Форма",,, Пользователь);
	ФормаОтчета.Пользователь = Пользователь;
	ФормаОтчета.НаборРолей = ирОбщий.КопияОбъектаЛкс(НаборРолей);
	ФормаОтчета.Открыть();
	
КонецПроцедуры

Процедура КПНаборПолейРедактироватьСписокСтрок(Кнопка)
	ирКлиент.РедактироватьСписокЗначенийЛкс(НаборПолей);
КонецПроцедуры

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

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

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

Процедура НаборПравНачалоВыбора(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	ФормаВыбора = ПолучитьФорму("ВыборПрав", Элемент);
	ФормаВыбора.ОткрытьМодально();
	
КонецПроцедуры

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

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

ирКлиент.ИнициироватьФормуЛкс(ЭтаФорма, "Отчет.ирАнализПравДоступа.Форма.ФормаОтчета");
ЭтаФорма.Авторасшифровка = Истина;
//ЭтаФорма.ВычислятьФункциональныеОпции = Истина; // Очень долго при большом числе опций
