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

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

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

#Область ДляВызоваИзДругихПодсистем

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

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

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

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

// Параметры:
//   КлючВарианта - Строка
//                - Неопределено
//   ИспользуемыеТаблицы - Массив из Строка
//
Процедура ПриОпределенииИспользуемыхТаблиц(КлючВарианта, ИспользуемыеТаблицы) Экспорт
	
	ИспользуемыеТаблицы.Добавить(Метаданные.РегистрыСведений.ПраваРолей.ПолноеИмя());
	ИспользуемыеТаблицы.Добавить(Метаданные.Справочники.ПрофилиГруппДоступа.ПолноеИмя());
	
КонецПроцедуры

// Параметры:
//   ФормаОтчета - ФормаКлиентскогоПриложения
//   ДополнительныеПараметры - Структура:
//     * ТекстПредупреждения - Строка
//     * ИмяПараметраХраненияОтказаОтПредупреждения - Строка
//
Процедура ПередФормированиемОтчета(ФормаОтчета, ДополнительныеПараметры) Экспорт
	
	Вариант = КомпоновщикНастроек.Настройки.ДополнительныеСвойства.КлючПредопределенногоВарианта;
	
	Если Вариант <> "ПраваРолей"
	   И Вариант <> "ПраваРолиИПрофилейНаОбъектыМетаданных" Тогда
		Возврат;
	КонецЕсли;
	
	Значения = ЗначенияВыбранногоПараметра("НеПредупреждатьОБольшомРазмереОтчета", Истина);
	Если ТипЗнч(Значения) = Тип("СписокЗначений")
	   И Значения[0].Значение = Истина Тогда
		Возврат;
	КонецЕсли;
	
	Результат = ПраваРолей(Истина, Вариант = "ПраваРолиИПрофилейНаОбъектыМетаданных", Истина);
	
	КоличествоСтрок   = Результат.Иерархия.Количество();
	КоличествоКолонок = Результат.Роли.Количество();
	
	КоличествоЯчеек = КоличествоСтрок * КоличествоКолонок;
	
	Если КоличествоЯчеек < 1000000 Тогда
		Возврат;
	КонецЕсли;
	
	ГигабайтДо = Окр(КоличествоЯчеек / 1500000 + КоличествоСтрок / 6000, 1) + 0.4;
	
	ДополнительныеПараметры.ИмяПараметраХраненияОтказаОтПредупреждения =
		"НеПредупреждатьОБольшомРазмереОтчета";
	ДополнительныеПараметры.ТекстПредупреждения =
		СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'При текущих отборах отчет может быть очень большим
			           |до %1 строк и %2 столбцов (%3 ячеек).
			           |
			           |Может долго формироваться.
			           |Может не хватить памяти (нужно ~ до %4 Гб).
			           |
			           |Рекомендуется усилить отборы.'"),
			Формат(КоличествоСтрок, ""),
			Формат(КоличествоКолонок, ""),
			Формат(КоличествоЯчеек, ""),
			Формат(ГигабайтДо, "ЧДЦ=1"));
	
КонецПроцедуры

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

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

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

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

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

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

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

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

// Для процедуры ПриКомпоновкеРезультата.
Процедура ЗавершитьВывод(ДокументРезультат, ДанныеРасшифровки, Вариант, ПрофилиВместоРолей, ВысотаШапки)
	
	Картинки = Картинки();
	НетЛинии = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.НетЛинии);
	// АПК:163-выкл - №598.1 Использование допустимо, так как влияет на смысл.
	ТекстЕстьОграничение = НСтр("ru = 'Есть ограничение'");
	// АПК:163-вкл.
	
	Если Вариант = "ПраваРолей"
	 Или Вариант = "ПраваРолиИПрофилейНаОбъектыМетаданных" Тогда
		ПервыйЗаголовокТаблицы = НСтр("ru = 'Вид объектов метаданных'");
		
	ИначеЕсли Вариант = "ПодробныеПраваРолейНаОбъектМетаданных" Тогда
		ПервыйЗаголовокТаблицы = ?(ПрофилиВместоРолей, НСтр("ru = 'Профиль'"), НСтр("ru = 'Роль'"));
	Иначе
		ПервыйЗаголовокТаблицы = НСтр("ru = 'Роль'");
	КонецЕсли;
	
	ВысотаТаблицы = ДокументРезультат.ВысотаТаблицы;
	ШиринаТаблицы = ДокументРезультат.ШиринаТаблицы;
	ТипИдентификаторРасшифровкиКомпоновкиДанных = Тип("ИдентификаторРасшифровкиКомпоновкиДанных");
	НачальноеЗначениеЕстьПравоСОграничением =
		Вариант = "ПодробныеПраваРолейНаОбъектМетаданных";
	ТекстПравоРазрешено = НСтр("ru = '✔'");
	
	Для НомерСтроки = 1 По ВысотаТаблицы Цикл
		ЕстьПравоСОграничением = НачальноеЗначениеЕстьПравоСОграничением;
		Для НомерКолонки = 1 По ШиринаТаблицы Цикл
			Область = ДокументРезультат.Область(НомерСтроки, НомерКолонки);
			
			Расшифровка = Область.Расшифровка;
			Если ТипЗнч(Расшифровка) <> ТипИдентификаторРасшифровкиКомпоновкиДанных Тогда
				Если Область.Текст = "*" Тогда
					Область.Текст = "";
					Область.Примечание.Текст = ТекстЕстьОграничение;
				ИначеЕсли Область.Текст = "+" Тогда
					Область.Текст = ТекстПравоРазрешено;
					Область.Примечание.Текст = ТекстЕстьОграничение;
				ИначеЕсли Область.Текст = "***" Тогда
					Область.Текст = ПервыйЗаголовокТаблицы;
					Если ЗначениеЗаполнено(ВысотаШапки) Тогда
						Если Вариант = "ПраваРолей"
						 Или Вариант = "ПраваРолиИПрофилейНаОбъектыМетаданных" Тогда
							ОбластьНиже = ДокументРезультат.Область(НомерСтроки + 1, НомерКолонки);
							Если ЗначениеЗаполнено(Область.ВысотаСтроки)
							   И ЗначениеЗаполнено(ОбластьНиже.ВысотаСтроки) Тогда
								ТекущаяВысота = Область.ВысотаСтроки + ОбластьНиже.ВысотаСтроки;
								Область.ВысотаСтроки     = ВысотаШапки * (Область.ВысотаСтроки     / ТекущаяВысота);
								ОбластьНиже.ВысотаСтроки = ВысотаШапки * (ОбластьНиже.ВысотаСтроки / ТекущаяВысота);
								Если Область.ВысотаСтроки < 13 Тогда
									Область.ВысотаСтроки = 13;
									ОбластьНиже.ВысотаСтроки = ВысотаШапки - Область.ВысотаСтроки;
								КонецЕсли;
							КонецЕсли;
						Иначе
							Область.ВысотаСтроки = ВысотаШапки;
						КонецЕсли;
					КонецЕсли;
				КонецЕсли;
				Если Не ЕстьПравоСОграничением И НомерКолонки >= 2 Тогда
					Прервать;
				КонецЕсли;
				Продолжить;
			КонецЕсли;
			
			ЗначенияПолей = ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля();
			ПолеЕстьОграничение = ЗначенияПолей.Найти("ЕстьОграничение");
			
			Если ПолеЕстьОграничение <> Неопределено Тогда
				Если ПолеЕстьОграничение.Значение = Истина Тогда
					Область.Примечание.Текст = ТекстЕстьОграничение;
				КонецЕсли;
				Продолжить;
				
			ИначеЕсли ЗначенияПолей.Найти("ИндексКартинки") <> Неопределено Тогда
				Отступ = (ЗначенияПолей.Найти("Уровень").Значение - 1) * 2;
				ОбластьСтроки = ДокументРезультат.Область(НомерСтроки, , НомерСтроки);
				ОбластьСтроки.СоздатьФорматСтрок();
				ОбластьСправа = ДокументРезультат.Область(НомерСтроки, НомерКолонки);
				ОбластьСлева  = ДокументРезультат.Область(НомерСтроки, НомерКолонки - 1);
				ОбластьСправа.ГраницаСлева = НетЛинии;
				ОбластьСлева.ГраницаСправа = НетЛинии;
				ОбластьСправа.ШиринаКолонки = Область.ШиринаКолонки + ОбластьСлева.ШиринаКолонки - Отступ;
				ОбластьСлева.ШиринаКолонки = Отступ;
				ОбластьСправа.Картинка = Картинки.Получить(ЗначенияПолей.Найти("ИндексКартинки").Значение).Картинка;
				Если ЗначенияПолей.Найти("ЕстьПравоСОграничением").Значение = Истина Тогда
					ЕстьПравоСОграничением = Истина;
				КонецЕсли;
			КонецЕсли;
			
			Если Не ЕстьПравоСОграничением И НомерКолонки >= 2 Тогда
				Прервать;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	
КонецПроцедуры

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

// Для процедуры СкрытьЛишниеПоляДанных.
Процедура СкрытьПоляДанныхКромеУказанных(ИмяНабораДанных, ПутиКДанным, ИсходнаяСхема, ТекущаяСхема)
	
	Отчеты.АнализПравДоступа.СкрытьПоляДанныхКромеУказанных(ИмяНабораДанных,
		ПутиКДанным, ИсходнаяСхема, ТекущаяСхема);
	
КонецПроцедуры

// Для процедуры ПослеЗагрузкиНастроекВКомпоновщик.
Процедура НастроитьПараметрУровеньДоступа(Настройки)
	
	Параметр = Новый ПараметрКомпоновкиДанных("УровеньДоступа");
	ДоступныйПараметр = Настройки.ПараметрыДанных.ДоступныеПараметры.НайтиПараметр(Параметр);
	Если ДоступныйПараметр = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Список = Новый СписокЗначений;
	Список.Добавить(01, НСтр("ru = 'Есть право'"));
	Список.Добавить(02, НСтр("ru = 'Использование'"));
	Список.Добавить(03, НСтр("ru = 'Чтение'"));
	Список.Добавить(04, НСтр("ru = 'Изменение'"));
	Список.Добавить(05, НСтр("ru = 'Добавление'"));
	Список.Добавить(06, НСтр("ru = 'Просмотр'"));
	Список.Добавить(07, НСтр("ru = 'Просмотр и Изменение'"));
	Список.Добавить(08, НСтр("ru = 'Просмотр и Добавление'"));
	Список.Добавить(09, НСтр("ru = 'Редактирование'"));
	Список.Добавить(10, НСтр("ru = 'Редактирование и Добавление'"));
	Список.Добавить(11, НСтр("ru = 'Создание'"));
	Список.Добавить(12, НСтр("ru = 'Получение'"));
	Список.Добавить(13, НСтр("ru = 'Установка'"));
	Список.Добавить(14, НСтр("ru = 'Получение и Установка'"));
	Список.Добавить(15, НСтр("ru = 'Внешний источник данных: Использование'"));
	Список.Добавить(16, НСтр("ru = 'Внешний источник данных: Администрирование'"));
	Список.Добавить(17, НСтр("ru = 'Внешний источник данных: Использование и Администрирование'"));
	
	ДоступныйПараметр.ДоступныеЗначения = Список;
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

	Возврат Контекст;
	
КонецФункции

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

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

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

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

// Возвращаемое значение:
//  Соответствие из КлючИЗначение:
//   * Ключ - СправочникСсылка.ИдентификаторыОбъектовМетаданных,
//          - СправочникСсылка.ИдентификаторыОбъектовРасширений
//   * Значение - Массив из СправочникСсылка.ПрофилиГруппДоступа
//
Функция ПрофилиРолей()
	
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	РолиПрофилей.Роль КАК Роль,
	|	РолиПрофилей.Ссылка КАК Профиль
	|ИЗ
	|	Справочник.ПрофилиГруппДоступа.Роли КАК РолиПрофилей
	|ГДЕ
	|	&ОтборПрофилей
	|ИТОГИ ПО
	|	Роль";
	
	ВыбранныеПрофили = ЗначенияВыбранногоПараметра("Профиль");
	Если ВыбранныеПрофили = Неопределено Тогда
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ОтборПрофилей", "ИСТИНА");
	Иначе
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ОтборПрофилей",
			"РолиПрофилей.Ссылка В(&Профили)");
		Запрос.УстановитьПараметр("Профили", ВыбранныеПрофили.ВыгрузитьЗначения());
	КонецЕсли;
	
	Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
	
	ПрофилиРолей = Новый Соответствие;
	Пока Выборка.Следующий() Цикл
		ВыборкаПрофилей = Выборка.Выбрать();
		Профили = Новый Массив;
		ПрофилиРолей.Вставить(Выборка.Роль, Профили);
		Пока ВыборкаПрофилей.Следующий() Цикл
			Профили.Добавить(ВыборкаПрофилей.Профиль);
		КонецЦикла;
	КонецЦикла;
	
	Возврат ПрофилиРолей;
	
КонецФункции

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

// Параметры:
//  Профили - Массив из СправочникСсылка.ПрофилиГруппДоступа
//
// Возвращаемое значение:
//  Массив из СправочникСсылка.ПрофилиГруппДоступа - профили без групп
//
Функция СписокПрофилейБезГрупп(Профили)
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Профили", Профили);
	Запрос.Текст =
	"ВЫБРАТЬ
	|	Профили.Ссылка КАК Профиль
	|ИЗ
	|	Справочник.ПрофилиГруппДоступа КАК Профили
	|ГДЕ
	|	Профили.ЭтоГруппа = ЛОЖЬ
	|	И Профили.Ссылка В(&Профили)
	|
	|УПОРЯДОЧИТЬ ПО
	|	Профили.Наименование";
	
	Профили = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Профиль");
	
	СписокПрофилей = Новый СписокЗначений;
	СписокПрофилей.ЗагрузитьЗначения(Профили);
	
	Возврат СписокПрофилей;
	
КонецФункции


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

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

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

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

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

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

Функция ПраваРолей(Заполнить, ПрофилиВместоРолей, ТолькоИерархия = Ложь)
	
	Иерархия = Новый ТаблицаЗначений;
	Иерархия.Колонки.Добавить("КодРодителя",            ТипСтрока(50));
	Иерархия.Колонки.Добавить("КодЭлемента",            ТипСтрока(50));
	Иерархия.Колонки.Добавить("ИндексКартинки",         ТипЧисло(2));
	Иерархия.Колонки.Добавить("ИмяЭлемента",            ТипСтрока(255));
	Иерархия.Колонки.Добавить("ПредставлениеЭлемента",  ТипСтрока(1000));
	Иерархия.Колонки.Добавить("ЕстьПраваЭлемента",      Новый ОписаниеТипов("Булево"));
	Иерархия.Колонки.Добавить("ЕстьПравоСОграничением", Новый ОписаниеТипов("Булево"));
	Иерархия.Колонки.Добавить("ПолноеИмяОбъекта",       ТипСтрока(430));
	
	Права = Новый ТаблицаЗначений;
	Права.Колонки.Добавить("КодЭлемента",     ТипСтрока(50));
	Права.Колонки.Добавить("КодРоли",         ТипЧисло(4));
	Права.Колонки.Добавить("УровеньДоступа",  ТипЧисло(2));
	Права.Колонки.Добавить("ЕстьОграничение", Новый ОписаниеТипов("Булево"));
	
	ОписаниеРолей = ОписаниеРолей(Заполнить, ПрофилиВместоРолей);
	
	Результат = Новый Структура;
	Результат.Вставить("Иерархия", Иерархия);
	Результат.Вставить("Права",    Права);
	Результат.Вставить("Роли",     ОписаниеРолей);
	
	Если Не Заполнить Тогда
		Возврат Результат;
	КонецЕсли;

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

Функция ТипСтрока(ДлинаСтроки)
	
	Возврат Новый ОписаниеТипов("Строка",,,, Новый КвалификаторыСтроки(ДлинаСтроки))
	
КонецФункции

Функция ТипЧисло(ЧислоРазрядов)
	
	Возврат Новый ОписаниеТипов("Число",,,
		Новый КвалификаторыЧисла(ЧислоРазрядов, 0, ДопустимыйЗнак.Неотрицательный));
	
КонецФункции

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

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

Функция РолиВыбранныхПрофилей()
	
	ВыбранныеПрофили = ЗначенияВыбранногоПараметра("Профиль");
	Если ВыбранныеПрофили = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Профили", ВыбранныеПрофили.ВыгрузитьЗначения());
	Запрос.Текст =
	"ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	РолиПрофилей.Роль КАК Роль
	|ИЗ
	|	Справочник.ПрофилиГруппДоступа.Роли КАК РолиПрофилей
	|ГДЕ
	|	РолиПрофилей.Ссылка В(&Профили)";
	
	Выборка = Запрос.Выполнить().Выбрать();
	
	Роли = Новый Соответствие;
	Пока Выборка.Следующий() Цикл
		Роли.Вставить(Выборка.Роль, Истина);
	КонецЦикла;
	
	Возврат Роли;
	
КонецФункции

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

Функция КоличествоЭлементов(Коллекция)
	
	Если ТипЗнч(Коллекция) = Тип("КоллекцияОбъектовМетаданных")
	 Или ТипЗнч(Коллекция) = Тип("ОписанияСтандартныхРеквизитов") Тогда
		Возврат Коллекция.Количество();
		
	ИначеЕсли ТипЗнч(Коллекция) = Тип("ОписанияСтандартныхТабличныхЧастей") Тогда
		Количество = 0;
		//@skip-check module-unused-local-variable
		Для Каждого ЭлементКоллекции Из Коллекция Цикл
			Количество = Количество + 1;
		КонецЦикла;
		Возврат Количество;
	КонецЕсли;
	
	Возврат 1;
	
КонецФункции

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

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

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

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

Процедура ОчиститьОписаниеПрав(СтрокиДерева)
	
	Для Каждого Строка Из СтрокиДерева Цикл
		Строка.ОписаниеПрав = Неопределено;
		ОчиститьОписаниеПрав(Строка.Строки);
	КонецЦикла;
	
КонецПроцедуры

// Возвращаемое значение:
//  ДеревоЗначений:
//   * Имя                  - Строка
//   * Метаданные           - ОбъектМетаданных
//                          - Неопределено
//   * ОписаниеПрав         - см. ОписаниеПрав
//   * Представление        - Строка
//   * ПредставлениеОбъекта - Строка
//   * ИмяВложений          - Строка
//   * БезГруппы            - Булево
//   * ЕстьИерархия         - Булево
//   * БезРасшифровки       - Булево
//   * ПутьКОбъекту         - Строка
//   * МетаданныеРодителяВложения - ОбъектМетаданных
//                                - Неопределено
//
Функция ДеревоМетаданных(СПолями)
	
	Дерево = Новый ДеревоЗначений;
	Дерево.Колонки.Добавить("Имя",                  ТипСтрока(150));
	Дерево.Колонки.Добавить("Метаданные");
	Дерево.Колонки.Добавить("ОписаниеПрав",         Новый ОписаниеТипов("Структура"));
	Дерево.Колонки.Добавить("Представление",        ТипСтрока(150));
	Дерево.Колонки.Добавить("ПредставлениеОбъекта", ТипСтрока(150));
	Дерево.Колонки.Добавить("ИмяВложений",          ТипСтрока(100));
	Дерево.Колонки.Добавить("БезГруппы",            Новый ОписаниеТипов("Булево"));
	Дерево.Колонки.Добавить("ЕстьИерархия",         Новый ОписаниеТипов("Булево"));
	Дерево.Колонки.Добавить("БезРасшифровки",       Новый ОписаниеТипов("Булево"));
	Дерево.Колонки.Добавить("ПутьКОбъекту",         ТипСтрока(255));
	Дерево.Колонки.Добавить("МетаданныеРодителяВложения"); // Заполняется автоматически.
	
	// Конфигурация
	СтрокаКонфигурация = Дерево.Строки.Добавить();
	СтрокаКонфигурация.Имя                  = "Конфигурация";
	СтрокаКонфигурация.Метаданные           = Метаданные;
	СтрокаКонфигурация.ОписаниеПрав         = ПраваКонфигурации();
	СтрокаКонфигурация.ПутьКОбъекту         = "Конфигурация";
	СтрокаКонфигурация.Представление        = НСтр("ru = 'Конфигурация'");
	СтрокаКонфигурация.ПредставлениеОбъекта = НСтр("ru = 'Конфигурация'");
	
	// Конфигурация.Общие
	СтрокаОбщие = СтрокаКонфигурация.Строки.Добавить();
	СтрокаОбщие.Имя           = "Общие";
	СтрокаОбщие.Представление = НСтр("ru = 'Общие'");
	
	// Конфигурация.Общие.Подсистемы
	СтрокаПодсистемы = СтрокаОбщие.Строки.Добавить();
	СтрокаПодсистемы.Имя                  = "Подсистемы";
	СтрокаПодсистемы.Метаданные           = Метаданные.Подсистемы;
	СтрокаПодсистемы.ОписаниеПрав         = ПравоПросмотр();
	СтрокаПодсистемы.ПутьКОбъекту         = "Подсистема.*";
	СтрокаПодсистемы.Представление        = НСтр("ru = 'Подсистемы'");
	СтрокаПодсистемы.ПредставлениеОбъекта = НСтр("ru = 'Подсистема'");
	
	// Конфигурация.Общие.Подсистемы.Подсистемы.*
	СтрокаВложенныеПодсистемы = СтрокаПодсистемы.Строки.Добавить();
	СтрокаВложенныеПодсистемы.Имя                  = "Подсистемы";
	СтрокаВложенныеПодсистемы.Метаданные           = "Подсистемы";
	СтрокаВложенныеПодсистемы.ПутьКОбъекту         = "Подсистема.*.Подсистема.*";
	СтрокаВложенныеПодсистемы.ОписаниеПрав         = ПравоПросмотр();
	СтрокаВложенныеПодсистемы.Представление        = НСтр("ru = 'Подсистемы'");
	СтрокаВложенныеПодсистемы.ПредставлениеОбъекта = НСтр("ru = 'Подсистема'");
	СтрокаВложенныеПодсистемы.ИмяВложений          = "Подсистемы";
	СтрокаВложенныеПодсистемы.БезГруппы            = Истина;
	СтрокаВложенныеПодсистемы.ЕстьИерархия         = Истина;
	
	// Конфигурация.Общие.ПараметрыСеанса
	СтрокаПараметрыСеанса = СтрокаОбщие.Строки.Добавить();
	СтрокаПараметрыСеанса.Имя                  = "ПараметрыСеанса";
	СтрокаПараметрыСеанса.Метаданные           = Метаданные.ПараметрыСеанса;
	СтрокаПараметрыСеанса.ПутьКОбъекту         = "ПараметрСеанса.*";
	СтрокаПараметрыСеанса.ОписаниеПрав         = ПраваПараметраСеанса();
	СтрокаПараметрыСеанса.Представление        = НСтр("ru = 'Параметры сеанса'");
	СтрокаПараметрыСеанса.ПредставлениеОбъекта = НСтр("ru = 'Параметр сеанса'");
	
	// Конфигурация.Общие.ОбщиеРеквизиты
	СтрокаОбщиеРеквизиты = СтрокаОбщие.Строки.Добавить();
	СтрокаОбщиеРеквизиты.Имя                  = "ОбщиеРеквизиты";
	СтрокаОбщиеРеквизиты.Метаданные           = Метаданные.ОбщиеРеквизиты;
	СтрокаОбщиеРеквизиты.ПутьКОбъекту         = "ОбщийРеквизит.*";
	СтрокаОбщиеРеквизиты.ОписаниеПрав         = ПраваРеквизита();
	СтрокаОбщиеРеквизиты.Представление        = НСтр("ru = 'Общие реквизиты'");
	СтрокаОбщиеРеквизиты.ПредставлениеОбъекта = НСтр("ru = 'Общий реквизит'");
	
	// Конфигурация.Общие.ПланыОбмена
	СтрокаПланыОбмена = СтрокаОбщие.Строки.Добавить();
	СтрокаПланыОбмена.Имя                  = "ПланыОбмена";
	СтрокаПланыОбмена.Метаданные           = Метаданные.ПланыОбмена;
	СтрокаПланыОбмена.ПутьКОбъекту         = "ПланОбмена.*";
	СтрокаПланыОбмена.ОписаниеПрав         = ПраваПланаОбмена();
	СтрокаПланыОбмена.Представление        = НСтр("ru = 'Планы обмена'");
	СтрокаПланыОбмена.ПредставлениеОбъекта = НСтр("ru = 'План обмена'");
	ДобавитьКомандыИПоля(СПолями, СтрокаПланыОбмена);
	
	// Конфигурация.Общие.КритерииОтбора
	СтрокаКритерииОтбора = СтрокаОбщие.Строки.Добавить();
	СтрокаКритерииОтбора.Имя                  = "КритерииОтбора";
	СтрокаКритерииОтбора.Метаданные           = Метаданные.КритерииОтбора;
	СтрокаКритерииОтбора.ПутьКОбъекту         = "КритерийОтбора.*";
	СтрокаКритерииОтбора.ОписаниеПрав         = ПравоПросмотр();
	СтрокаКритерииОтбора.Представление        = НСтр("ru = 'Критерии отбора'");
	СтрокаКритерииОтбора.ПредставлениеОбъекта = НСтр("ru = 'Критерий отбора'");
	ДобавитьКомандыИПоля(Ложь, СтрокаКритерииОтбора);
	
	// Конфигурация.Общие.ОбщиеФормы
	СтрокаОбщиеФормы = СтрокаОбщие.Строки.Добавить();
	СтрокаОбщиеФормы.Имя                  = "ОбщиеФормы";
	СтрокаОбщиеФормы.Метаданные           = Метаданные.ОбщиеФормы;
	СтрокаОбщиеФормы.ПутьКОбъекту         = "ОбщаяФорма.*";
	СтрокаОбщиеФормы.ОписаниеПрав         = ПравоПросмотр();
	СтрокаОбщиеФормы.Представление        = НСтр("ru = 'Общие формы'");
	СтрокаОбщиеФормы.ПредставлениеОбъекта = НСтр("ru = 'Общая форма'");
	
	// Конфигурация.Общие.ОбщиеКоманды
	СтрокаОбщиеКоманды = СтрокаОбщие.Строки.Добавить();
	СтрокаОбщиеКоманды.Имя                  = "ОбщиеКоманды";
	СтрокаОбщиеКоманды.Метаданные           = Метаданные.ОбщиеКоманды;
	СтрокаОбщиеКоманды.ПутьКОбъекту         = "ОбщаяКоманда.*";
	СтрокаОбщиеКоманды.ОписаниеПрав         = ПравоПросмотр();
	СтрокаОбщиеКоманды.Представление        = НСтр("ru = 'Общие команды'");
	СтрокаОбщиеКоманды.ПредставлениеОбъекта = НСтр("ru = 'Общая команда'");
	
	// Конфигурация.Общие.WebСервисы
	СтрокаWebСервисы = СтрокаОбщие.Строки.Добавить();
	СтрокаWebСервисы.Имя                  = "WebСервисы";
	СтрокаWebСервисы.Метаданные           = Метаданные.WebСервисы;
	СтрокаWebСервисы.ПутьКОбъекту         = "WebСервис.*";
	СтрокаWebСервисы.Представление        = НСтр("ru = 'Web-сервисы'");
	СтрокаWebСервисы.ПредставлениеОбъекта = НСтр("ru = 'Web-сервис'");
	
	// Конфигурация.Общие.WebСервисы.Операции
	СтрокаОперации = СтрокаWebСервисы.Строки.Добавить();
	СтрокаОперации.Имя                  = "Операции";
	СтрокаОперации.ИмяВложений          = "Операции";
	СтрокаОперации.ПутьКОбъекту         = "WebСервис.*.Операция.*";
	СтрокаОперации.ОписаниеПрав         = ПравоИспользование();
	СтрокаОперации.БезГруппы            = Истина;
	СтрокаОперации.ПредставлениеОбъекта = НСтр("ru = 'Операция'");
	
	// Конфигурация.Общие.HTTPСервисы
	СтрокаHTTPСервисы = СтрокаОбщие.Строки.Добавить();
	СтрокаHTTPСервисы.Имя                  = "HTTPСервисы";
	СтрокаHTTPСервисы.Метаданные           = Метаданные.HTTPСервисы;
	СтрокаHTTPСервисы.ПутьКОбъекту         = "HTTPСервис.*";
	СтрокаHTTPСервисы.Представление        = НСтр("ru = 'HTTP-сервисы'");
	СтрокаHTTPСервисы.ПредставлениеОбъекта = НСтр("ru = 'HTTP-сервис'");
	
	// Конфигурация.Общие.HTTPСервисы.ШаблоныURL
	СтрокаШаблоныURL = СтрокаHTTPСервисы.Строки.Добавить();
	СтрокаШаблоныURL.Имя                  = "ШаблоныURL";
	СтрокаШаблоныURL.ИмяВложений          = "ШаблоныURL";
	СтрокаШаблоныURL.ПутьКОбъекту         = "HTTPСервис.*.ШаблонURL.*";
	СтрокаШаблоныURL.БезГруппы            = Истина;
	СтрокаШаблоныURL.ПредставлениеОбъекта = НСтр("ru = 'URL-шаблон'");
	
	// Конфигурация.Общие.HTTPСервисы.ШаблоныURL.Методы
	СтрокаМетоды = СтрокаШаблоныURL.Строки.Добавить();
	СтрокаМетоды.Имя                  = "Методы";
	СтрокаМетоды.ИмяВложений          = "Методы";
	СтрокаМетоды.ПутьКОбъекту         = "HTTPСервис.*.ШаблонURL.*.Метод.*";
	СтрокаМетоды.ОписаниеПрав         = ПравоИспользование();
	СтрокаМетоды.БезГруппы            = Истина;
	СтрокаМетоды.ПредставлениеОбъекта = НСтр("ru = 'Метод'");
	
	// Конфигурация.Константы
	СтрокаКонстанты = СтрокаКонфигурация.Строки.Добавить();
	СтрокаКонстанты.Имя                  = "Константы";
	СтрокаКонстанты.Метаданные           = Метаданные.Константы;
	СтрокаКонстанты.ПутьКОбъекту         = "Константа.*";
	СтрокаКонстанты.ОписаниеПрав         = ПраваКонстанты();
	СтрокаКонстанты.Представление        = НСтр("ru = 'Константы'");
	СтрокаКонстанты.ПредставлениеОбъекта = НСтр("ru = 'Константа'");
	
	// Конфигурация.Справочники
	СтрокаСправочники = СтрокаКонфигурация.Строки.Добавить();
	СтрокаСправочники.Имя                  = "Справочники";
	СтрокаСправочники.Метаданные           = Метаданные.Справочники;
	СтрокаСправочники.ПутьКОбъекту         = "Справочник.*";
	СтрокаСправочники.ОписаниеПрав         = ПраваСправочникаИПланов();
	СтрокаСправочники.Представление        = НСтр("ru = 'Справочники'");
	СтрокаСправочники.ПредставлениеОбъекта = НСтр("ru = 'Справочник'");
	ДобавитьКомандыИПоля(СПолями, СтрокаСправочники);
	
	// Конфигурация.Документы (группа)
	СтрокаГруппаДокументы = СтрокаКонфигурация.Строки.Добавить();
	СтрокаГруппаДокументы.Имя           = "Документы";
	СтрокаГруппаДокументы.Представление = НСтр("ru = 'Документы'");
	
	// Конфигурация.Документы.Последовательности
	СтрокаПоследовательности = СтрокаГруппаДокументы.Строки.Добавить();
	СтрокаПоследовательности.Имя                  = "Последовательности";
	СтрокаПоследовательности.Метаданные           = Метаданные.Последовательности;
	СтрокаПоследовательности.ПутьКОбъекту         = "Последовательность.*";
	СтрокаПоследовательности.ОписаниеПрав         = ПраваПоследовательностиИПерерасчета();
	СтрокаПоследовательности.Представление        = НСтр("ru = 'Последовательности'");
	СтрокаПоследовательности.ПредставлениеОбъекта = НСтр("ru = 'Последовательность'");
	
	// Конфигурация.Документы (элементы)
	СтрокаДокументы = СтрокаГруппаДокументы.Строки.Добавить();
	СтрокаДокументы.Имя                  = "Документы";
	СтрокаДокументы.Метаданные           = Метаданные.Документы;
	СтрокаДокументы.ПутьКОбъекту         = "Документ.*";
	СтрокаДокументы.ОписаниеПрав         = ПраваДокумента();
	СтрокаДокументы.БезГруппы            = Истина;
	СтрокаДокументы.ПредставлениеОбъекта = НСтр("ru = 'Документ'");
	ДобавитьКомандыИПоля(СПолями, СтрокаДокументы);
	
	// Конфигурация.ЖурналыДокументов
	СтрокаЖурналыДокументов = СтрокаКонфигурация.Строки.Добавить();
	СтрокаЖурналыДокументов.Имя                  = "ЖурналыДокументов";
	СтрокаЖурналыДокументов.Метаданные           = Метаданные.ЖурналыДокументов;
	СтрокаЖурналыДокументов.ПутьКОбъекту         = "ЖурналДокументов.*";
	СтрокаЖурналыДокументов.ОписаниеПрав         = ПраваЖурналаДокументов();
	СтрокаЖурналыДокументов.Представление        = НСтр("ru = 'Журналы документов'");
	СтрокаЖурналыДокументов.ПредставлениеОбъекта = НСтр("ru = 'Журнал документов'");
	ДобавитьКомандыИПоля(СПолями, СтрокаЖурналыДокументов, "СтандартныеРеквизиты", Истина);
	
	// Конфигурация.Перечисления
	СтрокаПеречисления = СтрокаКонфигурация.Строки.Добавить();
	СтрокаПеречисления.Имя                  = "Перечисления";
	СтрокаПеречисления.Метаданные           = Метаданные.Перечисления;
	СтрокаПеречисления.ПутьКОбъекту         = "Перечисление.*";
	СтрокаПеречисления.Представление        = НСтр("ru = 'Перечисления'");
	СтрокаПеречисления.ПредставлениеОбъекта = НСтр("ru = 'Перечисление'");
	СтрокаПеречисления.БезРасшифровки       = Истина;
	ДобавитьКомандыИПоля(Ложь, СтрокаПеречисления);
	
	// Конфигурация.Отчеты
	СтрокаОтчеты = СтрокаКонфигурация.Строки.Добавить();
	СтрокаОтчеты.Имя                  = "Отчеты";
	СтрокаОтчеты.Метаданные           = Метаданные.Отчеты;
	СтрокаОтчеты.ПутьКОбъекту         = "Отчет.*";
	СтрокаОтчеты.ОписаниеПрав         = ПраваОтчетаОбработкиФункции();
	СтрокаОтчеты.Представление        = НСтр("ru = 'Отчеты'");
	СтрокаОтчеты.ПредставлениеОбъекта = НСтр("ru = 'Отчет'");
	ДобавитьКомандыИПоля(СПолями, СтрокаОтчеты, "Реквизиты, ТабличныеЧасти");
	
	// Конфигурация.Обработки
	СтрокаОбработки = СтрокаКонфигурация.Строки.Добавить();
	СтрокаОбработки.Имя                  = "Обработки";
	СтрокаОбработки.Метаданные           = Метаданные.Обработки;
	СтрокаОбработки.ПутьКОбъекту         = "Обработка.*";
	СтрокаОбработки.ОписаниеПрав         = ПраваОтчетаОбработкиФункции();
	СтрокаОбработки.Представление        = НСтр("ru = 'Обработки'");
	СтрокаОбработки.ПредставлениеОбъекта = НСтр("ru = 'Обработка'");
	ДобавитьКомандыИПоля(СПолями, СтрокаОбработки, "Реквизиты, ТабличныеЧасти");
	
	// Конфигурация.ПланыВидовХарактеристик
	СтрокаПланыВидовХарактеристик = СтрокаКонфигурация.Строки.Добавить();
	СтрокаПланыВидовХарактеристик.Имя                  = "ПланыВидовХарактеристик";
	СтрокаПланыВидовХарактеристик.Метаданные           = Метаданные.ПланыВидовХарактеристик;
	СтрокаПланыВидовХарактеристик.ПутьКОбъекту         = "ПланВидовХарактеристик.*";
	СтрокаПланыВидовХарактеристик.ОписаниеПрав         = ПраваСправочникаИПланов();
	СтрокаПланыВидовХарактеристик.Представление        = НСтр("ru = 'Планы видов характеристик'");
	СтрокаПланыВидовХарактеристик.ПредставлениеОбъекта = НСтр("ru = 'План видов характеристик'");
	ДобавитьКомандыИПоля(СПолями, СтрокаПланыВидовХарактеристик);
	
	// Конфигурация.ПланыСчетов
	СтрокаПланыСчетов = СтрокаКонфигурация.Строки.Добавить();
	СтрокаПланыСчетов.Имя                  = "ПланыСчетов";
	СтрокаПланыСчетов.Метаданные           = Метаданные.ПланыСчетов;
	СтрокаПланыСчетов.ПутьКОбъекту         = "ПланСчетов.*";
	СтрокаПланыСчетов.ОписаниеПрав         = ПраваСправочникаИПланов();
	СтрокаПланыСчетов.Представление        = НСтр("ru = 'Планы счетов'");
	СтрокаПланыСчетов.ПредставлениеОбъекта = НСтр("ru = 'План счетов'");
	ДобавитьКомандыИПоля(СПолями, СтрокаПланыСчетов, "Реквизиты, ПризнакиУчета,
	|ПризнакиУчетаСубконто, ТабличныеЧасти, СтандартныеРеквизиты, СтандартныеТабличныеЧасти");
	
	// Конфигурация.ПланыВидовРасчета
	СтрокаПланыВидовРасчета = СтрокаКонфигурация.Строки.Добавить();
	СтрокаПланыВидовРасчета.Имя                  = "ПланыВидовРасчета";
	СтрокаПланыВидовРасчета.Метаданные           = Метаданные.ПланыВидовРасчета;
	СтрокаПланыВидовРасчета.ПутьКОбъекту         = "ПланВидовРасчета.*";
	СтрокаПланыВидовРасчета.ОписаниеПрав         = ПраваСправочникаИПланов();
	СтрокаПланыВидовРасчета.Представление        = НСтр("ru = 'Планы видов расчета'");
	СтрокаПланыВидовРасчета.ПредставлениеОбъекта = НСтр("ru = 'План видов расчета'");
	ДобавитьКомандыИПоля(СПолями, СтрокаПланыВидовРасчета, "Реквизиты, ТабличныеЧасти,
	|СтандартныеРеквизиты, СтандартныеТабличныеЧасти");
	
	// Конфигурация.РегистрыСведений
	СтрокаРегистрыСведений = СтрокаКонфигурация.Строки.Добавить();
	СтрокаРегистрыСведений.Имя                  = "РегистрыСведений";
	СтрокаРегистрыСведений.Метаданные           = Метаданные.РегистрыСведений;
	СтрокаРегистрыСведений.ПутьКОбъекту         = "РегистрСведений.*";
	СтрокаРегистрыСведений.ОписаниеПрав         = ПраваРегистраСведений();
	СтрокаРегистрыСведений.Представление        = НСтр("ru = 'Регистры сведений'");
	СтрокаРегистрыСведений.ПредставлениеОбъекта = НСтр("ru = 'Регистр сведений'");
	ДобавитьКомандыИПоля(СПолями, СтрокаРегистрыСведений, "Измерения, Ресурсы,
	|Реквизиты, СтандартныеРеквизиты");
	
	// Конфигурация.РегистрыНакопления
	СтрокаРегистрыНакопления = СтрокаКонфигурация.Строки.Добавить();
	СтрокаРегистрыНакопления.Имя                  = "РегистрыНакопления";
	СтрокаРегистрыНакопления.Метаданные           = Метаданные.РегистрыНакопления;
	СтрокаРегистрыНакопления.ПутьКОбъекту         = "РегистрНакопления.*";
	СтрокаРегистрыНакопления.ОписаниеПрав         = ПраваРегистраНакопленияИБухгалтерии();
	СтрокаРегистрыНакопления.Представление        = НСтр("ru = 'Регистры накопления'");
	СтрокаРегистрыНакопления.ПредставлениеОбъекта = НСтр("ru = 'Регистр накопления'");
	ДобавитьКомандыИПоля(СПолями, СтрокаРегистрыНакопления, "Измерения, Ресурсы,
	|Реквизиты, СтандартныеРеквизиты");
	
	// Конфигурация.РегистрыБухгалтерии
	СтрокаРегистрыБухгалтерии = СтрокаКонфигурация.Строки.Добавить();
	СтрокаРегистрыБухгалтерии.Имя                  = "РегистрыБухгалтерии";
	СтрокаРегистрыБухгалтерии.Метаданные           = Метаданные.РегистрыБухгалтерии;
	СтрокаРегистрыБухгалтерии.ПутьКОбъекту         = "РегистрБухгалтерии.*";
	СтрокаРегистрыБухгалтерии.ОписаниеПрав         = ПраваРегистраНакопленияИБухгалтерии();
	СтрокаРегистрыБухгалтерии.Представление        = НСтр("ru = 'Регистры бухгалтерии'");
	СтрокаРегистрыБухгалтерии.ПредставлениеОбъекта = НСтр("ru = 'Регистр бухгалтерии'");
	ДобавитьКомандыИПоля(СПолями, СтрокаРегистрыБухгалтерии, "Измерения, Ресурсы,
	|Реквизиты, СтандартныеРеквизиты");
	
	// Конфигурация.РегистрыРасчета
	СтрокаРегистрыРасчета = СтрокаКонфигурация.Строки.Добавить();
	СтрокаРегистрыРасчета.Имя                  = "РегистрыРасчета";
	СтрокаРегистрыРасчета.Метаданные           = Метаданные.РегистрыРасчета;
	СтрокаРегистрыРасчета.ПутьКОбъекту         = "РегистрРасчета.*";
	СтрокаРегистрыРасчета.ОписаниеПрав         = ПраваРегистраРасчета();
	СтрокаРегистрыРасчета.Представление        = НСтр("ru = 'Регистры расчета'");
	СтрокаРегистрыРасчета.ПредставлениеОбъекта = НСтр("ru = 'Регистр расчета'");
	ДобавитьКомандыИПоля(СПолями, СтрокаРегистрыРасчета, "Измерения, Ресурсы,
	|Реквизиты, СтандартныеРеквизиты, Перерасчеты");
	
	// Конфигурация.БизнесПроцессы
	СтрокаБизнесПроцессы = СтрокаКонфигурация.Строки.Добавить();
	СтрокаБизнесПроцессы.Имя                  = "БизнесПроцессы";
	СтрокаБизнесПроцессы.Метаданные           = Метаданные.БизнесПроцессы;
	СтрокаБизнесПроцессы.ПутьКОбъекту         = "БизнесПроцесс.*";
	СтрокаБизнесПроцессы.ОписаниеПрав         = ПраваБизнесПроцесса();
	СтрокаБизнесПроцессы.Представление        = НСтр("ru = 'Бизнес процессы'");
	СтрокаБизнесПроцессы.ПредставлениеОбъекта = НСтр("ru = 'Бизнес процесс'");
	ДобавитьКомандыИПоля(СПолями, СтрокаБизнесПроцессы);
	
	// Конфигурация.Задачи
	СтрокаЗадачи = СтрокаКонфигурация.Строки.Добавить();
	СтрокаЗадачи.Имя                  = "Задачи";
	СтрокаЗадачи.Метаданные           = Метаданные.Задачи;
	СтрокаЗадачи.ПутьКОбъекту         = "Задача.*";
	СтрокаЗадачи.ОписаниеПрав         = ПраваЗадачи();
	СтрокаЗадачи.Представление        = НСтр("ru = 'Задачи'");
	СтрокаЗадачи.ПредставлениеОбъекта = НСтр("ru = 'Задача'");
	ДобавитьКомандыИПоля(СПолями, СтрокаЗадачи, "РеквизитыАдресации,
	|Реквизиты, ТабличныеЧасти, СтандартныеРеквизиты");
	
	// Конфигурация.ВнешниеИсточникиДанных
	СтрокаВнешниеИсточникиДанных = СтрокаКонфигурация.Строки.Добавить();
	СтрокаВнешниеИсточникиДанных.Имя                  = "ВнешниеИсточникиДанных";
	СтрокаВнешниеИсточникиДанных.Метаданные           = Метаданные.ВнешниеИсточникиДанных;
	СтрокаВнешниеИсточникиДанных.ПутьКОбъекту         = "ВнешнийИсточникДанных.*";
	СтрокаВнешниеИсточникиДанных.ОписаниеПрав         = ПраваВнешнегоИсточникаДанных();
	СтрокаВнешниеИсточникиДанных.Представление        = НСтр("ru = 'Внешние источники данных'");
	СтрокаВнешниеИсточникиДанных.ПредставлениеОбъекта = НСтр("ru = 'Внешний источник данных'");
	
	// Конфигурация.ВнешниеИсточникиДанных.Таблицы
	СтрокаТаблицы = СтрокаВнешниеИсточникиДанных.Строки.Добавить();
	СтрокаТаблицы.Имя                  = "Таблицы";
	СтрокаТаблицы.ИмяВложений          = "Таблицы";
	СтрокаТаблицы.ПутьКОбъекту         = "ВнешнийИсточникДанных.*.Таблица.*";
	СтрокаТаблицы.ОписаниеПрав         = ПраваТаблицыВнешнегоИсточникаДанных();
	СтрокаТаблицы.Представление        = НСтр("ru = 'Таблицы'");
	СтрокаТаблицы.ПредставлениеОбъекта = НСтр("ru = 'Таблица'");
	ДобавитьКомандыИПоля(СПолями, СтрокаТаблицы, "Поля");
	
	// Конфигурация.ВнешниеИсточникиДанных.Кубы
	СтрокаКуба = СтрокаВнешниеИсточникиДанных.Строки.Добавить();
	СтрокаКуба.Имя                  = "Кубы";
	СтрокаКуба.ИмяВложений          = "Кубы";
	СтрокаКуба.ПутьКОбъекту         = "ВнешнийИсточникДанных.*.Куб.*";
	СтрокаКуба.ОписаниеПрав         = ПраваКубаИТаблицыИзмерений();
	СтрокаКуба.Представление        = НСтр("ru = 'Кубы'");
	СтрокаКуба.ПредставлениеОбъекта = НСтр("ru = 'Куб'");
	
	// Конфигурация.ВнешниеИсточникиДанных.Кубы.ТаблицыИзмерений
	СтрокаТаблицыИзмерений = СтрокаКуба.Строки.Добавить();
	СтрокаТаблицыИзмерений.Имя                  = "ТаблицыИзмерений";
	СтрокаТаблицыИзмерений.ИмяВложений          = "ТаблицыИзмерений";
	СтрокаТаблицыИзмерений.ПутьКОбъекту         = "ВнешнийИсточникДанных.*.Куб.*.ТаблицаИзмерения.*";
	СтрокаТаблицыИзмерений.ОписаниеПрав         = ПраваКубаИТаблицыИзмерений();
	СтрокаТаблицыИзмерений.Представление        = НСтр("ru = 'Таблицы измерений'");
	СтрокаТаблицыИзмерений.ПредставлениеОбъекта = НСтр("ru = 'Таблица измерений'");
	ДобавитьКомандыИПоля(СПолями, СтрокаТаблицыИзмерений, "Поля");
	ДобавитьКомандыИПоля(СПолями, СтрокаКуба, "Измерения, Ресурсы", Истина);
	
	// Конфигурация.ВнешниеИсточникиДанных.Функции
	СтрокаФункции = СтрокаВнешниеИсточникиДанных.Строки.Добавить();
	СтрокаФункции.Имя                  = "Функции";
	СтрокаФункции.ИмяВложений          = "Функции";
	СтрокаФункции.ПутьКОбъекту         = "ВнешнийИсточникДанных.*.Функция.*";
	СтрокаФункции.ОписаниеПрав         = ПраваОтчетаОбработкиФункции();
	СтрокаФункции.Представление        = НСтр("ru = 'Функции'");
	СтрокаФункции.ПредставлениеОбъекта = НСтр("ru = 'Функция'");
	
	Возврат Дерево;
	
КонецФункции

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

// Возвращаемое значение:
//  Структура:
//   * СписокПрав - СписокЗначений
//   * УровниДоступа - ТаблицаЗначений:
//      ** Право              - Строка
//      ** ЭтоНаборПрав       - Булево
//      ** Уровень            - Число
//      ** ПравоСОграничением - Строка
//
Функция ОписаниеПрав()
	
	УровниДоступа = Новый ТаблицаЗначений;
	УровниДоступа.Колонки.Добавить("Право",              ТипСтрока(1000));
	УровниДоступа.Колонки.Добавить("ЭтоНаборПрав",       Новый ОписаниеТипов("Булево"));
	УровниДоступа.Колонки.Добавить("Уровень",            ТипЧисло(2));
	УровниДоступа.Колонки.Добавить("ПравоСОграничением", ТипСтрока(1000));
	
	ОписаниеПрав = Новый Структура;
	ОписаниеПрав.Вставить("СписокПрав",    Новый СписокЗначений);
	ОписаниеПрав.Вставить("УровниДоступа", УровниДоступа);
	
	Возврат ОписаниеПрав;
	
КонецФункции

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

Функция ПравоПросмотр()
	
	ОписаниеПрав = ОписаниеПрав();
	СписокПрав = ОписаниеПрав.СписокПрав;
	
	СписокПрав.Добавить("Просмотр",
		НСтр("ru = 'Просмотр'"));
	
	НоваяСтрока = ОписаниеПрав.УровниДоступа.Добавить();
	НоваяСтрока.Право   = "Просмотр";
	НоваяСтрока.Уровень = 6;
	
	Возврат ОписаниеПрав;
	
КонецФункции

Функция ПравоИспользование()
	
	ОписаниеПрав = ОписаниеПрав();
	СписокПрав = ОписаниеПрав.СписокПрав;
	
	СписокПрав.Добавить("Использование",
		НСтр("ru = 'Использование'"));
	
	НоваяСтрока = ОписаниеПрав.УровниДоступа.Добавить();
	НоваяСтрока.Право   = "Использование";
	НоваяСтрока.Уровень = 2;
	
	Возврат ОписаниеПрав;
	
КонецФункции

Функция ПраваПараметраСеанса()
	
	ОписаниеПрав = ОписаниеПрав();
	СписокПрав = ОписаниеПрав.СписокПрав;
	
	// @Access-right-1
	СписокПрав.Добавить("Получение",
		НСтр("ru = 'Получение'"));
	
	// @Access-right-1
	СписокПрав.Добавить("Установка",
		НСтр("ru = 'Установка'"));
	
	НоваяСтрока = ОписаниеПрав.УровниДоступа.Добавить();
	НоваяСтрока.Право   = "Получение" + "," + "Установка"; // @Access-right-1, @Access-right-3
	НоваяСтрока.Уровень = 14;
	НоваяСтрока.ЭтоНаборПрав = Истина;
	
	НоваяСтрока = ОписаниеПрав.УровниДоступа.Добавить();
	НоваяСтрока.Право   = "Установка"; // @Access-right-1
	НоваяСтрока.Уровень = 13;
	
	НоваяСтрока = ОписаниеПрав.УровниДоступа.Добавить();
	НоваяСтрока.Право   = "Получение"; // @Access-right-1
	НоваяСтрока.Уровень = 12;
	
	Возврат ОписаниеПрав;
	
КонецФункции

Функция ПраваРеквизита(БезРедактирования = Ложь)
	
	ОписаниеПрав = ОписаниеПрав();
	СписокПрав = ОписаниеПрав.СписокПрав;
	
	СписокПрав.Добавить("Просмотр",
		НСтр("ru = 'Просмотр'"));
	
	Если Не БезРедактирования Тогда
		СписокПрав.Добавить("Редактирование",
			НСтр("ru = 'Редактирование'"));
		
		НоваяСтрока = ОписаниеПрав.УровниДоступа.Добавить();
		НоваяСтрока.Право   = "Редактирование";
		НоваяСтрока.Уровень = 9;
	КонецЕсли;
	
	НоваяСтрока = ОписаниеПрав.УровниДоступа.Добавить();
	НоваяСтрока.Право   = "Просмотр";
	НоваяСтрока.Уровень = 6;
	
	Возврат ОписаниеПрав;
	
КонецФункции

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

Функция ПраваКонстанты()
	
	ОписаниеПрав = ОписаниеПрав();
	СписокПрав = ОписаниеПрав.СписокПрав;
	
	ДобавитьПраваПрограммнойРаботыСОбъектами(СписокПрав, , Ложь, Ложь);
	ДобавитьПраваИнтерактивнойРаботыСОбъектами(СписокПрав, , Ложь);
	ДобавитьПраваРаботыСИсторией(СписокПрав, Ложь);
	
	ЗаполнитьУровниДоступа(ОписаниеПрав, , Ложь, Ложь);
	
	Возврат ОписаниеПрав;
	
КонецФункции

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

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

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

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

Функция ПраваОтчетаОбработкиФункции()
	
	ОписаниеПрав = ОписаниеПрав();
	СписокПрав = ОписаниеПрав.СписокПрав;
	
	СписокПрав.Добавить("Использование",
		НСтр("ru = 'Использование'"));
	
	СписокПрав.Добавить("Просмотр",
		НСтр("ru = 'Просмотр'"));
	
	НоваяСтрока = ОписаниеПрав.УровниДоступа.Добавить();
	НоваяСтрока.Право   = "Просмотр";
	НоваяСтрока.Уровень = 6;
	
	НоваяСтрока = ОписаниеПрав.УровниДоступа.Добавить();
	НоваяСтрока.Право   = "Использование";
	НоваяСтрока.Уровень = 2;
	
	Возврат ОписаниеПрав;
	
КонецФункции

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

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

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

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

Функция ПраваЗадачи()
	
	ОписаниеПрав = ОписаниеПрав();
	СписокПрав = ОписаниеПрав.СписокПрав;
	
	ДобавитьПраваПрограммнойРаботыСОбъектами(СписокПрав);
	
	// @Access-right-1
	СписокПрав.Добавить("Выполнение",
		НСтр("ru = 'Выполнение'"));
	
	ДобавитьПраваИнтерактивнойРаботыСОбъектами(СписокПрав);
	
	СписокПрав.Добавить("ИнтерактивноеВыполнение",
		НСтр("ru = 'Интерактивный выполнение'"));
	
	СписокПрав.Добавить("ИнтерактивнаяАктивация",
		НСтр("ru = 'Интерактивная активация'"));
	
	СписокПрав.Добавить("ВводПоСтроке",
		НСтр("ru = 'Ввод по строке'"));
	
	ДобавитьПраваРаботыСИсторией(СписокПрав);
	
	ЗаполнитьУровниДоступа(ОписаниеПрав);
	
	Возврат ОписаниеПрав;
	
КонецФункции

Функция ПраваВнешнегоИсточникаДанных()
	
	ОписаниеПрав = ОписаниеПрав();
	СписокПрав = ОписаниеПрав.СписокПрав;
	
	// @Access-right-1
	СписокПрав.Добавить("Использование",
		НСтр("ru = 'Использование'"));
	
	// @Access-right-1
	СписокПрав.Добавить("Администрирование",
		НСтр("ru = 'Администрирование'"));
	
	СписокПрав.Добавить("ИзменениеСтандартнойАутентификации",
		НСтр("ru = 'Изменение стандартной аутентификации текущего пользователя'"));
	
	СписокПрав.Добавить("ИзменениеСтандартнойАутентификацииСеанса",
		НСтр("ru = 'Изменение стандартной аутентификации сеанса'"));
	
	СписокПрав.Добавить("ИзменениеАутентификацииОССеанса",
		НСтр("ru = 'Изменение аутентификации операционной системы сеанса'"));
	
	НоваяСтрока = ОписаниеПрав.УровниДоступа.Добавить();
	НоваяСтрока.Право   = "Использование" + "," + "Администрирование"; // @Access-right-1, @Access-right-3
	НоваяСтрока.Уровень = 17;
	НоваяСтрока.ЭтоНаборПрав = Истина;
	
	НоваяСтрока = ОписаниеПрав.УровниДоступа.Добавить();
	НоваяСтрока.Право   = "Администрирование"; // @Access-right-1
	НоваяСтрока.Уровень = 16;
	
	НоваяСтрока = ОписаниеПрав.УровниДоступа.Добавить();
	НоваяСтрока.Право   = "Использование"; // @Access-right-1
	НоваяСтрока.Уровень = 15;
	
	НоваяСтрока = ОписаниеПрав.УровниДоступа.Добавить();
	НоваяСтрока.Право   = "ИзменениеСтандартнойАутентификации";
	НоваяСтрока.Уровень = 1;
	
	НоваяСтрока = ОписаниеПрав.УровниДоступа.Добавить();
	НоваяСтрока.Право   = "ИзменениеСтандартнойАутентификацииСеанса";
	НоваяСтрока.Уровень = 1;
	
	НоваяСтрока = ОписаниеПрав.УровниДоступа.Добавить();
	НоваяСтрока.Право   = "ИзменениеАутентификацииОССеанса";
	НоваяСтрока.Уровень = 1;
	
	Возврат ОписаниеПрав;
	
КонецФункции

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

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

Процедура ДобавитьПраваПрограммнойРаботыСОбъектами(СписокПрав, БезИзменения = Ложь, Ссылочные = Истина, СОграничением = Истина)
	
	// @Access-right-1
	СписокПрав.Добавить("Чтение",
		НСтр("ru = 'Чтение'"), СОграничением);
	
	Если БезИзменения Тогда
		Возврат;
	КонецЕсли;
	
	// @Access-right-1
	СписокПрав.Добавить("Изменение",
		НСтр("ru = 'Изменение'"), СОграничением);
	
	Если Не Ссылочные Тогда
		Возврат;
	КонецЕсли;
	
	// @Access-right-1
	СписокПрав.Добавить("Добавление",
		НСтр("ru = 'Добавление'"), СОграничением);
	
	// @Access-right-1
	СписокПрав.Добавить("Удаление",
		НСтр("ru = 'Удаление'"), СОграничением);
	
КонецПроцедуры

Процедура ДобавитьПраваИнтерактивнойРаботыСОбъектами(СписокПрав, БезИзменения = Ложь, Ссылочные = Истина, СПометкойУдаления = Истина)
	
	// @Access-right-1
	СписокПрав.Добавить("Просмотр",
		НСтр("ru = 'Просмотр'"));
	
	Если БезИзменения Тогда
		Возврат;
	КонецЕсли;
	
	// @Access-right-1
	СписокПрав.Добавить("Редактирование",
		НСтр("ru = 'Редактирование'"));
	
	Если Не Ссылочные Тогда
		Возврат;
	КонецЕсли;
	
	СписокПрав.Добавить("ИнтерактивноеДобавление",
		НСтр("ru = 'Интерактивное добавление'"));
	
	СписокПрав.Добавить("ИнтерактивноеУдаление",
		НСтр("ru = 'Интерактивное удаление'"));
	
	Если Не СПометкойУдаления Тогда
		Возврат;
	КонецЕсли;
	
	СписокПрав.Добавить("ИнтерактивнаяПометкаУдаления",
		НСтр("ru = 'Интерактивная пометка на удаление'"));
	
	СписокПрав.Добавить("ИнтерактивноеСнятиеПометкиУдаления",
		НСтр("ru = 'Интерактивное снятие пометки удаления'"));
	
	СписокПрав.Добавить("ИнтерактивноеУдалениеПомеченных",
		НСтр("ru = 'Интерактивное удаление помеченных'"));
	
КонецПроцедуры

Процедура ДобавитьПраваРаботыСПредопределеннымиДанными(СписокПрав)
	
	СписокПрав.Добавить("ИнтерактивноеУдалениеПредопределенныхДанных",
		НСтр("ru = 'Интерактивное удаление предопределенных'"));
	
	СписокПрав.Добавить("ИнтерактивнаяПометкаУдаленияПредопределенныхДанных",
		НСтр("ru = 'Интерактивная пометка на удаление предопределенных'"));
	
	СписокПрав.Добавить("ИнтерактивноеСнятиеПометкиУдаленияПредопределенныхДанных",
		НСтр("ru = 'Интерактивное снятие пометки удаления предопределенных'"));
	
	СписокПрав.Добавить("ИнтерактивноеУдалениеПомеченныхПредопределенныхДанных",
		НСтр("ru = 'Интерактивное удаление помеченных предопределенных'"));
	
КонецПроцедуры

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

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

Процедура ЗаполнитьУровниДоступа(ОписаниеПрав, БезИзменения = Ложь, Ссылочный = Истина, СОграничением = Истина)
	
	УровниДоступа = ОписаниеПрав.УровниДоступа;
	
	Если Ссылочный И Не БезИзменения Тогда
		НоваяСтрока = УровниДоступа.Добавить();
		НоваяСтрока.Право   = "ИнтерактивноеДобавление"; // @Access-right-1
		НоваяСтрока.Уровень = 11;
		Если СОграничением Тогда
			НоваяСтрока.ПравоСОграничением = "Добавление"; // @Access-right-1
		КонецЕсли;
		
		НоваяСтрока = УровниДоступа.Добавить();
		НоваяСтрока.Право   = "Редактирование" + "," + "Добавление"; // @Access-right-1, @Access-right-3
		НоваяСтрока.Уровень = 10;
		НоваяСтрока.ЭтоНаборПрав = Истина;
		Если СОграничением Тогда
			НоваяСтрока.ПравоСОграничением = "Добавление"; // @Access-right-1
		КонецЕсли;
	КонецЕсли;
	
	Если Не БезИзменения Тогда
		НоваяСтрока = УровниДоступа.Добавить();
		НоваяСтрока.Право   = "Редактирование"; // @Access-right-1
		НоваяСтрока.Уровень = 9;
		Если СОграничением Тогда
			НоваяСтрока.ПравоСОграничением = "Изменение"; // @Access-right-1
		КонецЕсли;
		
		Если Ссылочный Тогда
			НоваяСтрока = УровниДоступа.Добавить();
			НоваяСтрока.Право   = "Просмотр" + "," + "Добавление"; // @Access-right-1, @Access-right-3
			НоваяСтрока.Уровень = 8;
			НоваяСтрока.ЭтоНаборПрав = Истина;
			Если СОграничением Тогда
				НоваяСтрока.ПравоСОграничением = "Добавление"; // @Access-right-1
			КонецЕсли;
		КонецЕсли;
		
		НоваяСтрока = УровниДоступа.Добавить();
		НоваяСтрока.Право   = "Просмотр" + "," + "Изменение"; // @Access-right-1, @Access-right-3
		НоваяСтрока.Уровень = 7;
		НоваяСтрока.ЭтоНаборПрав = Истина;
		Если СОграничением Тогда
			НоваяСтрока.ПравоСОграничением = "Изменение"; // @Access-right-1
		КонецЕсли;
	КонецЕсли;
	
	НоваяСтрока = УровниДоступа.Добавить();
	НоваяСтрока.Право   = "Просмотр"; // @Access-right-1
	НоваяСтрока.Уровень = 6;
	Если СОграничением Тогда
		НоваяСтрока.ПравоСОграничением = "Чтение"; // @Access-right-1
	КонецЕсли;
	
	Если Ссылочный И Не БезИзменения Тогда
		НоваяСтрока = УровниДоступа.Добавить();
		НоваяСтрока.Право   = "Добавление"; // @Access-right-1
		НоваяСтрока.Уровень = 5;
		Если СОграничением Тогда
			НоваяСтрока.ПравоСОграничением = "Добавление"; // @Access-right-1
		КонецЕсли;
	КонецЕсли;
	
	Если Не БезИзменения Тогда
		НоваяСтрока = УровниДоступа.Добавить();
		НоваяСтрока.Право   = "Изменение"; // @Access-right-1
		НоваяСтрока.Уровень = 4;
		Если СОграничением Тогда
			НоваяСтрока.ПравоСОграничением = "Изменение"; // @Access-right-1
		КонецЕсли;
	КонецЕсли;
	
	НоваяСтрока = УровниДоступа.Добавить();
	НоваяСтрока.Право   = "Чтение"; // @Access-right-1
	НоваяСтрока.Уровень = 3;
	Если СОграничением Тогда
		НоваяСтрока.ПравоСОграничением = "Чтение"; // @Access-right-1
	КонецЕсли;
	
КонецПроцедуры

Функция Картинки()
	
	Картинки = Новый СписокЗначений;
	Картинки.Добавить(""); // Без картинки.
	Картинки.Добавить("Конфигурация",,,              БиблиотекаКартинок.МетаданныеКонфигурация);
	Картинки.Добавить("Общие",,,                     БиблиотекаКартинок.МетаданныеОбщие);
	Картинки.Добавить("Подсистемы",,,                БиблиотекаКартинок.МетаданныеПодсистемы);
	Картинки.Добавить("ПараметрыСеанса",,,           БиблиотекаКартинок.МетаданныеПараметрыСеанса);
	Картинки.Добавить("ОбщиеРеквизиты",,,            БиблиотекаКартинок.МетаданныеОбщиеРеквизиты);
	Картинки.Добавить("ПланыОбмена",,,               БиблиотекаКартинок.МетаданныеПланыОбмена);
	Картинки.Добавить("Реквизиты",,,                 БиблиотекаКартинок.МетаданныеРеквизиты);
	Картинки.Добавить("ТабличныеЧасти",,,            БиблиотекаКартинок.МетаданныеТабличныеЧасти);
	Картинки.Добавить("СтандартныеРеквизиты",,,      БиблиотекаКартинок.МетаданныеСтандартныеРеквизиты);
	Картинки.Добавить("Команды",,,                   БиблиотекаКартинок.МетаданныеКоманды);
	Картинки.Добавить("КритерииОтбора",,,            БиблиотекаКартинок.МетаданныеКритерииОтбора);
	Картинки.Добавить("ОбщиеФормы",,,                БиблиотекаКартинок.МетаданныеОбщиеФормы);
	Картинки.Добавить("ОбщиеКоманды",,,              БиблиотекаКартинок.МетаданныеОбщиеКоманды);
	Картинки.Добавить("WebСервисы",,,                БиблиотекаКартинок.МетаданныеWebСервисы);
	Картинки.Добавить("Операции",,,                  БиблиотекаКартинок.МетаданныеWebСервисыОперации);
	Картинки.Добавить("HTTPСервисы",,,               БиблиотекаКартинок.МетаданныеHTTPСервисы);
	Картинки.Добавить("ШаблоныURL",,,                БиблиотекаКартинок.МетаданныеHTTPСервисыШаблоныURL);
	Картинки.Добавить("Методы",,,                    БиблиотекаКартинок.МетаданныеHTTPСервисыШаблоныURLМетоды);
	Картинки.Добавить("Константы",,,                 БиблиотекаКартинок.МетаданныеКонстанты);
	Картинки.Добавить("Справочники",,,               БиблиотекаКартинок.МетаданныеСправочники);
	Картинки.Добавить("Документы",,,                 БиблиотекаКартинок.МетаданныеДокументы);
	Картинки.Добавить("Последовательности",,,        БиблиотекаКартинок.МетаданныеПоследовательности);
	Картинки.Добавить("ЖурналыДокументов",,,         БиблиотекаКартинок.МетаданныеЖурналыДокументов);
	Картинки.Добавить("Перечисления",,,              БиблиотекаКартинок.МетаданныеПеречисления);
	Картинки.Добавить("Отчеты",,,                    БиблиотекаКартинок.МетаданныеОтчеты);
	Картинки.Добавить("Обработки",,,                 БиблиотекаКартинок.МетаданныеОбработки);
	Картинки.Добавить("ПланыВидовХарактеристик",,,   БиблиотекаКартинок.МетаданныеПланыВидовХарактеристик);
	Картинки.Добавить("ПланыСчетов",,,               БиблиотекаКартинок.МетаданныеПланыСчетов);
	Картинки.Добавить("ПризнакиУчета",,,             БиблиотекаКартинок.МетаданныеПризнакиУчета);
	Картинки.Добавить("ПризнакиУчетаСубконто",,,     БиблиотекаКартинок.МетаданныеПризнакиУчетаСубконто);
	Картинки.Добавить("СтандартныеТабличныеЧасти",,, БиблиотекаКартинок.МетаданныеСтандартныеТабличныеЧасти);
	Картинки.Добавить("ПланыВидовРасчета",,,         БиблиотекаКартинок.МетаданныеПланыВидовРасчета);
	Картинки.Добавить("РегистрыСведений",,,          БиблиотекаКартинок.МетаданныеРегистрыСведений);
	Картинки.Добавить("Измерения",,,                 БиблиотекаКартинок.МетаданныеИзмерения);
	Картинки.Добавить("Ресурсы",,,                   БиблиотекаКартинок.МетаданныеРесурсы);
	Картинки.Добавить("РегистрыНакопления",,,        БиблиотекаКартинок.МетаданныеРегистрыНакопления);
	Картинки.Добавить("РегистрыБухгалтерии",,,       БиблиотекаКартинок.МетаданныеРегистрыБухгалтерии);
	Картинки.Добавить("РегистрыРасчета",,,           БиблиотекаКартинок.МетаданныеРегистрыРасчета);
	Картинки.Добавить("Перерасчеты",,,               БиблиотекаКартинок.МетаданныеПерерасчеты);
	Картинки.Добавить("БизнесПроцессы",,,            БиблиотекаКартинок.МетаданныеБизнесПроцессы);
	Картинки.Добавить("Задачи",,,                    БиблиотекаКартинок.МетаданныеЗадачи);
	Картинки.Добавить("РеквизитыАдресации",,,        БиблиотекаКартинок.МетаданныеРеквизитыАдресации);
	Картинки.Добавить("ВнешниеИсточникиДанных",,,    БиблиотекаКартинок.МетаданныеВнешниеИсточникиДанных);
	Картинки.Добавить("Таблицы",,,                   БиблиотекаКартинок.МетаданныеВнешниеИсточникиТаблицы);
	Картинки.Добавить("Поля",,,                      БиблиотекаКартинок.МетаданныеРеквизиты);
	Картинки.Добавить("Кубы",,,                      БиблиотекаКартинок.МетаданныеВнешниеИсточникиКубы);
	Картинки.Добавить("ТаблицыИзмерений",,,          БиблиотекаКартинок.МетаданныеВнешниеИсточникиТаблицыИзмерений);
	Картинки.Добавить("Функции",,,                   БиблиотекаКартинок.МетаданныеВнешниеИсточникиФункции);
	
	Возврат Картинки;
	
КонецФункции

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

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

#Иначе
ВызватьИсключение НСтр("ru = 'Недопустимый вызов объекта на клиенте.'");
#КонецЕсли