Анализ прав доступа / Модуль объекта

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

Процедура УстановитьИспользованиеГруппировок(Группировки, НастройкиКД, ПользовательскиеНастройкиКД)
	
	Для Каждого Группировка Из Группировки Цикл
		Отчеты.АнализПравДоступа.УстановитьИспользованиеГруппировки(
			Группировка.Ключ, Группировка.Значение, НастройкиКД, ПользовательскиеНастройкиКД);
	КонецЦикла;
	
КонецПроцедуры

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

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

Связанные материалы