///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2024, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область СлужебныйПрограммныйИнтерфейс

////////////////////////////////////////////////////////////////////////////////
// Обслуживание таблиц ВидыДоступа и ЗначенияДоступа в формах редактирования.

#Область ОбработчикиСобытийЭлементовТаблицыФормыЗначенияДоступа

// Только для внутреннего использования.
// 
// Параметры:
//  Форма - см. УправлениеДоступомСлужебныйКлиентСервер.ПараметрыФормыРедактированияРазрешенныхЗначений
//
Процедура ЗначенияДоступаПодобрать(Форма) Экспорт
	
	ЗначениеДоступаНачалоВыбора(Форма, Неопределено, Неопределено, Null);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыВидыДоступа

// Только для внутреннего использования.
Процедура ВидыДоступаПриАктивизацииСтроки(Форма, Элемент) Экспорт
	
	УправлениеДоступомСлужебныйКлиентСервер.ПриИзмененииТекущегоВидаДоступа(Форма);
	
КонецПроцедуры

// Только для внутреннего использования.
// 
// Параметры:
//  Форма - см. УправлениеДоступомСлужебныйКлиентСервер.ПараметрыФормыРедактированияРазрешенныхЗначений
//  Элемент - ТаблицаФормы
//
Процедура ВидыДоступаПриАктивизацииЯчейки(Форма, Элемент) Экспорт
	
	Если Форма.ЭтоПрофильГруппДоступа Тогда
		Возврат;
	КонецЕсли;
	
	Элементы = Форма.Элементы;
	
	Если Элементы.ВидыДоступа.ТекущийЭлемент <> Элементы.ВидыДоступаВсеРазрешеныПредставление Тогда
		Элементы.ВидыДоступа.ТекущийЭлемент = Элементы.ВидыДоступаВсеРазрешеныПредставление;
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

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

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

#Область ОбработчикиСобытийОбщейФормыФормаОтчета

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

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

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

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

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

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

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

#КонецОбласти

#КонецОбласти

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

// Продолжение обработчика события ЗначениеДоступаНачалоВыбора.
Процедура ЗначениеДоступаНачалоВыбораПродолжение(ВыбранныйЭлемент, Контекст) Экспорт
	
	Если ВыбранныйЭлемент <> Неопределено Тогда
		Контекст.Форма.ТекущийТипВыбираемыхЗначений = ВыбранныйЭлемент.Значение;
		ЗначениеДоступаНачалоВыбораЗавершение(Контекст);
	КонецЕсли;
	
КонецПроцедуры

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

// Обслуживание таблиц ВидыДоступа и ЗначенияДоступа в формах редактирования.

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

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

// Обработка расшифровки отчета.

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

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

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

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

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

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

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

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

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

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

// Для процедур ПриОбработкеРасшифровкиОтчетаАнализПравДоступа и
// ПриОбработкеРасшифровкиОтчетаПраваРолей.
//
Процедура СократитьКлючНазначенияИспользования(КлючНазначенияИспользования)
	
	Если СтрДлина(КлючНазначенияИспользования) <= 128 Тогда
		Возврат;
	КонецЕсли;
	
	КлючНазначенияИспользования =
		УправлениеДоступомСлужебныйВызовСервера.СокращенныйКлючНазначенияИспользования(
			КлючНазначенияИспользования);
	
КонецПроцедуры

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

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

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

Функция ПредставлениеВариантаОтчетаАнализПравДоступа(КлючВарианта)
	
	Если КлючВарианта = "АнализПравДоступа" Тогда
		Возврат НСтр("ru = 'Анализ прав доступа'");
		
	ИначеЕсли КлючВарианта = "ПраваПользователейНаТаблицы" Тогда
		Возврат НСтр("ru = 'Права пользователей на таблицы'");
		
	ИначеЕсли КлючВарианта = "ПраваПользователяНаТаблицы" Тогда
		Возврат НСтр("ru = 'Права пользователя на таблицы'");
		
	ИначеЕсли КлючВарианта = "ПраваПользователейНаТаблицу" Тогда
		Возврат НСтр("ru = 'Права пользователей на таблицу'");
		
	ИначеЕсли КлючВарианта = "ПраваПользователяНаТаблицу" Тогда
		Возврат НСтр("ru = 'Права пользователя на таблицу'");
		
	ИначеЕсли КлючВарианта = "ПраваПользователейНаТаблицыОтчета" Тогда
		Возврат НСтр("ru = 'Права пользователей на таблицы отчета'");
		
	ИначеЕсли КлючВарианта = "ПраваПользователяНаТаблицыОтчета" Тогда
		Возврат НСтр("ru = 'Права пользователя на таблицы отчета'");
		
	ИначеЕсли КлючВарианта = "ПраваПользователяНаТаблицыОтчетов" Тогда
		Возврат НСтр("ru = 'Права пользователя на таблицы отчетов'");
		
	ИначеЕсли КлючВарианта = "ПраваПользователейНаОбъект" Тогда
		Возврат НСтр("ru = 'Права пользователей на объект'");
		
	ИначеЕсли КлючВарианта = "ПраваПользователейВРазрезеРазрешенногоЗначения" Тогда
		Возврат НСтр("ru = 'Права пользователей в разрезе разрешенного значения'");
	КонецЕсли;
	
	ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Неизвестное имя варианта отчета ""%1"".'"), КлючВарианта);
	
	ВызватьИсключение(ТекстОшибки, КатегорияОшибки.ОшибкаКонфигурации);
	
КонецФункции

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


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

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


// Для процедуры ПриНачалеВыбораЗначенийОтчетаАнализПравДоступа.
Процедура ПриНачалеВыбораЭлементаДанныхОтчетаАнализПравДоступа(ФормаОтчета,
			УсловияВыбора, ОповещениеОЗакрытии, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	Контекст = Новый Структура;
	Контекст.Вставить("ОповещениеОЗакрытии", ОповещениеОЗакрытии);
	Контекст.Вставить("НачальноеЗначение", ?(ЗначениеЗаполнено(УсловияВыбора.Отмеченные),
		УсловияВыбора.Отмеченные[0].Значение, Неопределено));
	
	Список = УправлениеДоступомСлужебныйВызовСервера.СписокТиповДляВыбора(
		УсловияВыбора.ДоступныеТипы);
	
	Оповещение = Новый ОписаниеОповещения(
		"ПриНачалеВыбораЭлементаДанныхОтчетаАнализПравДоступаПослеВыбораТипа", ЭтотОбъект, Контекст);
	
	НачальныйЭлемент = ?(ЗначениеЗаполнено(Контекст.НачальноеЗначение),
		Список.НайтиПоЗначению(ТипЗнч(Контекст.НачальноеЗначение)), Неопределено);
	
	Заголовок = НСтр("ru = 'Выбор типа данных'");
	
	Список.ПоказатьВыборЭлемента(Оповещение, Заголовок, НачальныйЭлемент);
	
КонецПроцедуры

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

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


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

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

// Для процедуры ПриНачалеВыбораЗначений.
Процедура УдалитьОтключенныеЗначения(ОтмеченныеЗначения)
	
	Индекс = ОтмеченныеЗначения.Количество() - 1;
	
	Пока Индекс >= 0 Цикл 
		Элемент = ОтмеченныеЗначения[Индекс];
		Индекс = Индекс - 1;
		
		Если Не ЗначениеЗаполнено(Элемент.Значение) Тогда 
			ОтмеченныеЗначения.Удалить(Элемент);
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

#КонецОбласти