Перем ТаблицаПравСтарая;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ирКлиент.ИнициироватьФормуЛкс(ЭтаФорма, "Отчет.ирАнализПравНаБазу.Форма.ФормаОтчета");
ЭтаФорма.Авторасшифровка = Истина;
