RDT1C/Reports/ирАнализПравДоступа/Ext/ObjectModule.bsl
Администратор 48c2d81a78 .
2021-06-28 00:02:50 +03:00

574 lines
43 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//ирПортативный Перем ирПортативный Экспорт;
//ирПортативный Перем ирОбщий Экспорт;
//ирПортативный Перем ирСервер Экспорт;
//ирПортативный Перем ирКэш Экспорт;
//ирПортативный Перем ирПривилегированный Экспорт;
Перем РежимОтладки Экспорт;
Перем ТаблицаПрав Экспорт;
Перем Роли Экспорт;
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
#Если _ Тогда
СхемаКомпоновки = Новый СхемаКомпоновкиДанных;
КонечнаяНастройка = Новый НастройкиКомпоновкиДанных;
ВнешниеНаборыДанных = Новый Структура;
ДокументРезультат = Новый ТабличныйДокумент;
#КонецЕсли
СтандартнаяОбработка = Ложь;
ПрофилиГруппДоступа = Новый ТаблицаЗначений;
ПрофилиГруппДоступа.Колонки.Добавить("РольИмя", Новый ОписаниеТипов("Строка"));
ПрофилиГруппДоступа.Колонки.Добавить("ПрофильГруппДоступа", Новый ОписаниеТипов("Строка"));
ПрофилиГруппДоступа.Колонки.Добавить("КоличествоРолей", Новый ОписаниеТипов("Число"));
Если ирКэш.НомерВерсииБСПЛкс() >= 200 Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"
|ВЫБРАТЬ
| ПрофилиГруппДоступаРоли.Ссылка КАК ПрофильГруппДоступа,
| Профили.КоличествоРолей КАК КоличествоРолей,
| ПрофилиГруппДоступаРоли.Роль.Имя КАК РольИмя
|ИЗ
| Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли
| ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| ПрофилиГруппДоступа_РолиТ.Ссылка КАК Ссылка,
| КОЛИЧЕСТВО(ПрофилиГруппДоступа_РолиТ.Роль) КАК КоличествоРолей
| ИЗ
| Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступа_РолиТ
|
| СГРУППИРОВАТЬ ПО
| ПрофилиГруппДоступа_РолиТ.Ссылка) КАК Профили
| ПО Профили.Ссылка = ПрофилиГруппДоступаРоли.Ссылка
|";
ПрофилиГруппДоступа = Запрос.Выполнить().Выгрузить();
КонецЕсли;
РолиПользователей = Новый ТаблицаЗначений;
РолиПользователей.Колонки.Добавить("Роль", Новый ОписаниеТипов("Строка"));
РолиПользователей.Колонки.Добавить("Пользователь", Новый ОписаниеТипов("Строка"));
Если ПравоДоступа("Администрирование", Метаданные) Тогда
ДоступныеПользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
Иначе
ДоступныеПользователи = Новый Массив;
ДоступныеПользователи.Добавить(ПользователиИнформационнойБазы.ТекущийПользователь());
КонецЕсли;
Для Каждого ПользовательИБ Из ДоступныеПользователи Цикл
#Если Сервер И Не Сервер Тогда
ПользовательИБ = ПользователиИнформационнойБазы.СоздатьПользователя();
#КонецЕсли
Для Каждого РольЦикл Из ПользовательИБ.Роли Цикл
СтрокаРоли = РолиПользователей.Добавить();
СтрокаРоли.Роль = РольЦикл.Имя;
СтрокаРоли.Пользователь = ПользовательИБ.Имя;
КонецЦикла;
КонецЦикла;
ТаблицаРоли = Новый ТаблицаЗначений;
ТаблицаРоли.Колонки.Добавить("Роль", Новый ОписаниеТипов("Строка"));
ТаблицаРоли.Колонки.Добавить("УстанавливатьПраваДляНовыхОбъектов");
ТаблицаРоли.Колонки.Добавить("НезависимыеПраваПодчиненныхОбъектов");
ТаблицаРоли.Колонки.Добавить("УстанавливатьПраваДляРеквизитовИТабличныхЧастейПоУмолчанию");
Если ИзвлечьСвойстваРолей Тогда
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
Для Каждого МетаРоль Из Роли Цикл
ФайлРоли = Новый Файл("" + мПлатформа.ПапкаКэшаРолей.ПолноеИмя + "\Роль." + МетаРоль.Имя + ".Права.xml");
Если Не ФайлРоли.Существует() Тогда
Сообщить("В кэше ролей не обнаружен файл роли """ + МетаРоль.Имя + """. Для извлечения недоступных в объектной модели свойств этой роли необходимо обновить кэш ролей.");
Продолжить;
КонецЕсли;
СтрокаРоли = ТаблицаРоли.Добавить();
СтрокаРоли.Роль = МетаРоль.Имя;
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ФайлРоли.ПолноеИмя);
ЧтениеXML.Прочитать();
Для Счетчик = 1 По 3 Цикл
ЧтениеXML.Прочитать();
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Если ЧтениеXML.ЛокальноеИмя = "setForNewObjects" Тогда
ЧтениеXML.Прочитать();
СтрокаРоли.УстанавливатьПраваДляНовыхОбъектов = Булево(ЧтениеXML.Значение);
ИначеЕсли ЧтениеXML.ЛокальноеИмя = "setForAttributesByDefault" Тогда
ЧтениеXML.Прочитать();
СтрокаРоли.НезависимыеПраваПодчиненныхОбъектов = Булево(ЧтениеXML.Значение);
ИначеЕсли ЧтениеXML.ЛокальноеИмя = "independentRightsOfChildObjects" Тогда
ЧтениеXML.Прочитать();
СтрокаРоли.УстанавливатьПраваДляРеквизитовИТабличныхЧастейПоУмолчанию = Булево(ЧтениеXML.Значение);
КонецЕсли;
ЧтениеXML.Прочитать();
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЕсли;
Если ВычислятьФункциональныеОпции Тогда
ФункциональныеОпции.Очистить();
Для Каждого ФункциональнаяОпция Из Метаданные.ФункциональныеОпции Цикл
Попытка
ЗначениеОпции = ПолучитьФункциональнуюОпцию(ФункциональнаяОпция.Имя);
Исключение
// Опция с параметрами
Продолжить;
КонецПопытки;
СтрокаТаблицы = ФункциональныеОпции.Добавить();
СтрокаТаблицы.ФункциональнаяОпция = ФункциональнаяОпция.Имя;
СтрокаТаблицы.ФункциональнаяОпцияВключена = ЗначениеОпции;
КонецЦикла;
КонецЕсли;
КонечнаяНастройка = КомпоновщикНастроек.ПолучитьНастройки();
Если ЗначениеЗаполнено(Пользователь) Тогда
ирОбщий.НайтиДобавитьЭлементОтбораКомпоновкиЛкс(КонечнаяНастройка, "Пользователь", Пользователь,,, Ложь);
КонецЕсли;
Если ЗначениеЗаполнено(ОбъектМетаданных) Тогда
ирОбщий.НайтиДобавитьЭлементОтбораКомпоновкиЛкс(КонечнаяНастройка, "ОбъектМетаданных", ОбъектМетаданных,,, Ложь);
КонецЕсли;
Если ЗначениеЗаполнено(Роль) Тогда
ирОбщий.НайтиДобавитьЭлементОтбораКомпоновкиЛкс(КонечнаяНастройка, "Роль", Роль,,, Ложь);
КонецЕсли;
ВнешниеНаборыДанных = Новый Структура;
ВнешниеНаборыДанных.Вставить("ПрофилиГруппДоступа", ПрофилиГруппДоступа);
ВнешниеНаборыДанных.Вставить("РолиПользователей", РолиПользователей);
ВнешниеНаборыДанных.Вставить("Роли", ТаблицаРоли);
ВнешниеНаборыДанных.Вставить("Таблица", ТаблицаПрав);
ВнешниеНаборыДанных.Вставить("ОбъектыМетаданных", ОбъектыМетаданных);
ВнешниеНаборыДанных.Вставить("ТабличныеЧасти", ТабличныеЧасти);
ВнешниеНаборыДанных.Вставить("ПоляМетаданных", ПоляМетаданных);
ВнешниеНаборыДанных.Вставить("ФункциональныеОпции", ФункциональныеОпции);
ВнешниеНаборыДанных.Вставить("ФункциональныеОпцииПолей", ФункциональныеОпцииПолей);
ВнешниеНаборыДанных.Вставить("Права", ДоступныеПрава());
Если РежимОтладки = 2 Тогда
ирОбщий.ОтладитьЛкс(СхемаКомпоновкиДанных, , КонечнаяНастройка, ВнешниеНаборыДанных);
Возврат;
КонецЕсли;
ДокументРезультат.Очистить();
ирОбщий.СкомпоноватьВТабличныйДокументЛкс(СхемаКомпоновкиДанных, КонечнаяНастройка, ДокументРезультат, ВнешниеНаборыДанных, ДанныеРасшифровки);
КонецПроцедуры
Функция ВычислитьПрава(Параметры) Экспорт
ИменаРолей = Параметры.ИменаРолей;
КонечныеНастройки = Параметры.КонечныеНастройки;
ФункциональныеОпцииПолей.Очистить();
ОбъектыМетаданных.Очистить();
ТабличныеЧасти.Очистить();
ПоляМетаданных.Очистить();
Роли = Новый Массив;
Для Каждого ИмяРоли Из ИменаРолей Цикл
Роли.Добавить(Метаданные.Роли[ИмяРоли]);
КонецЦикла;
ТаблицаПрав = Новый ТаблицаЗначений;
ТаблицаПрав.Колонки.Добавить("ОбъектМетаданных", Новый ОписаниеТипов("Строка"));
ТаблицаПрав.Колонки.Добавить("ОбъектМД"); // Удалим перед возвращением результата
ТаблицаПрав.Колонки.Добавить("Поле", Новый ОписаниеТипов("Строка"));
ТаблицаПрав.Колонки.Добавить("ТабличнаяЧасть", Новый ОписаниеТипов("Строка"));
ТаблицаПрав.Колонки.Добавить("Роль", Новый ОписаниеТипов("Строка"));
ТаблицаПрав.Колонки.Добавить("Право", Новый ОписаниеТипов("Строка"));
ТаблицаПрав.Колонки.Добавить("Доступ", Новый ОписаниеТипов("Строка"));
ДоступныеПрава = ДоступныеПрава();
#Если Сервер И Не Сервер Тогда
ДоступныеПрава = Новый ТаблицаЗначений;
КонечныеНастройки = Новый НастройкиКомпоновкиДанных;
#КонецЕсли
ОтборПоДоступу = ирОбщий.НайтиЭлементОтбораЛкс(КонечныеНастройки.Отбор, "Доступ",,,,, Истина);
ДоступныеПрава = ирОбщий.ОтобратьТаблицуЗначенийКомпоновкойЛкс(ДоступныеПрава, КонечныеНастройки,, Истина);
ПраваСсылочные = Новый Структура;
ПраваСсылочные.Вставить("Чтение");
ПраваСсылочные.Вставить("Просмотр");
ПраваСсылочные.Вставить("Добавление");
ПраваСсылочные.Вставить("ИнтерактивноеДобавление");
ПраваСсылочные.Вставить("Изменение");
ПраваСсылочные.Вставить("Редактирование");
ПраваСсылочные.Вставить("Удаление");
ПраваСсылочные.Вставить("ИнтерактивноеУдаление");
ПраваРегистры = Новый Структура;
ПраваРегистры.Вставить("Чтение");
ПраваРегистры.Вставить("Просмотр");
ПраваРегистры.Вставить("Изменение");
ПраваРегистры.Вставить("Редактирование");
ПраваПоследовательность = Новый Структура;
ПраваПоследовательность.Вставить("Чтение");
ПраваПоследовательность.Вставить("Изменение");
ПраваЖурналы = Новый Структура;
ПраваЖурналы.Вставить("Чтение");
ПраваЖурналы.Вставить("Просмотр");
ПраваНехранимые = Новый Структура;
ПраваНехранимые.Вставить("Использование");
ПраваНехранимые.Вставить("Просмотр");
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
ТипыМетаданных = ирКэш.ТипыМетаОбъектов(Истина, Ложь, Ложь);
СтрокаТипаВнешнегоИсточникаДанных = мПлатформа.ПолучитьСтрокуТипаМетаОбъектов("ВнешнийИсточникДанных");
КоллекцияКорневыхТипов = Новый Массив;
Для Каждого СтрокаТипаМетаданных Из ТипыМетаданных Цикл
КоллекцияКорневыхТипов.Добавить(СтрокаТипаМетаданных.Единственное);
КонецЦикла;
Если ирКэш.НомерРежимаСовместимостиЛкс() >= 802013 Тогда
Для Каждого МетаВнешнийИсточникДанных Из Метаданные.ВнешниеИсточникиДанных Цикл
КоллекцияКорневыхТипов.Добавить(МетаВнешнийИсточникДанных.ПолноеИмя());
КонецЦикла;
КонецЕсли;
ИндикаторТиповМетаданных = ирОбщий.ПолучитьИндикаторПроцессаЛкс(КоллекцияКорневыхТипов.Количество(), "Объекты. Типы метаданных");
Для Каждого КорневойТип Из КоллекцияКорневыхТипов Цикл
ирОбщий.ОбработатьИндикаторЛкс(ИндикаторТиповМетаданных);
СтрокаТипаМетаданных = мПлатформа.ПолучитьСтрокуТипаМетаОбъектов(КорневойТип);
Если СтрокаТипаМетаданных = Неопределено Тогда
СтрокаТипаМетаданных = СтрокаТипаВнешнегоИсточникаДанных;
ОбъектМДКорневогоТипа = ирКэш.ОбъектМДПоПолномуИмениЛкс(КорневойТип);
КоллекцияМетаОбъектов = ОбъектМДКорневогоТипа.Таблицы;
ЕстьДоступ = ПравоДоступа("Использование", ОбъектМДКорневогоТипа);
ЛиКорневойТипСсылочный = Истина;
ЛиКорневойТипРегистра = Истина;
ЛиКорневойТипНехранимый = Ложь;
ЛиКорневойТипЖурнала = Ложь;
Иначе
Попытка
КоллекцияМетаОбъектов = Метаданные[СтрокаТипаМетаданных.Множественное];
Исключение
Продолжить;
КонецПопытки;
Если Ложь
Или ирОбщий.ЛиКорневойТипПеречисленияЛкс(КорневойТип)
Или ирОбщий.ЛиКорневойТипВнешнегоИсточникаДанныхЛкс(КорневойТип)
Тогда
Продолжить;
КонецЕсли;
ЛиКорневойТипСсылочный = ирОбщий.ЛиКорневойТипСсылкиЛкс(КорневойТип);
ЛиКорневойТипРегистра = ирОбщий.ЛиКорневойТипРегистраБДЛкс(КорневойТип);
ЛиКорневойТипПоследовательности = ирОбщий.ЛиКорневойТипПоследовательностиЛкс(КорневойТип);
ЛиКорневойТипЖурнала = ирОбщий.ЛиКорневойТипЖурналаДокументовЛкс(КорневойТип);
ЛиКорневойТипНехранимый = Не ЛиКорневойТипСсылочный И Не ЛиКорневойТипРегистра И Не ЛиКорневойТипЖурнала;
Если Истина
И ЛиКорневойТипНехранимый
//И ТипМетаданныхИмяЕдинственное <> "HttpСервис"
//И ТипМетаданныхИмяЕдинственное <> "WebСервис"
И КорневойТип <> "Интерфейс"
И КорневойТип <> "КритерийОтбора"
И КорневойТип <> "Отчет"
И КорневойТип <> "Обработка"
И КорневойТип <> "ОбщаяКоманда"
И КорневойТип <> "ОбщаяФорма"
И КорневойТип <> "ОбщийРеквизит"
И КорневойТип <> "ПараметрСеанса"
И КорневойТип <> "Подсистема"
Тогда
Продолжить;
КонецЕсли;
ЕстьДоступ = Истина;
КонецЕсли;
Если ЗначениеЗаполнено(ПолеОбъекта) Тогда
ИмяПоляТипаМетаданных = ПолеОбъекта;
ИначеЕсли ЛиКорневойТипСсылочный Или ЛиКорневойТипЖурнала Тогда
ИмяПоляТипаМетаданных = "Ссылка";
ИначеЕсли ЛиКорневойТипРегистра Тогда
ИмяПоляТипаМетаданных = "Период";
Иначе
ИмяПоляТипаМетаданных = Неопределено;
КонецЕсли;
ИндикаторОбъектов = ирОбщий.ПолучитьИндикаторПроцессаЛкс(КоллекцияМетаОбъектов.Количество(), СтрокаТипаМетаданных.Множественное);
Для Каждого МетаОбъект Из КоллекцияМетаОбъектов Цикл
#Если Сервер И Не Сервер Тогда
МетаОбъект = Метаданные.Обработки.ирАнализЖурналаРегистрации;
#КонецЕсли
Если СтрокаТипаМетаданных = СтрокаТипаВнешнегоИсточникаДанных Тогда
ЛиКорневойТипСсылочный = ирОбщий.ЛиМетаданныеСсылочногоОбъектаЛкс(МетаОбъект);
ЛиКорневойТипРегистра = Не ЛиКорневойТипСсылочный;
КонецЕсли;
ирОбщий.ОбработатьИндикаторЛкс(ИндикаторОбъектов);
ПолноеИмяОбъектаМД = МетаОбъект.ПолноеИмя();
ТабличныеЧастиЦикл = Новый Массив;
Если Истина
И Не ИспользоватьНаборПолей
И ЗначениеЗаполнено(ОбъектМетаданных)
Тогда
Если ОбъектМетаданных <> ПолноеИмяОбъектаМД Тогда
Продолжить;
КонецЕсли;
Если Не ЗначениеЗаполнено(ПолеОбъекта) Тогда
СтруктураТабличныхЧастей = ирОбщий.ТабличныеЧастиОбъектаЛкс(МетаОбъект);
#Если Сервер И Не Сервер Тогда
СтруктураТабличныхЧастей = Новый Структура;
#КонецЕсли
Для Каждого КлючИЗначение Из СтруктураТабличныхЧастей Цикл
ТабличныеЧастиЦикл.Добавить(КлючИЗначение.Ключ);
КонецЦикла;
КонецЕсли;
ИначеЕсли ИспользоватьНаборПолей Тогда
ТабличныеЧастиЦикл = НаборПолейТаблица.Выгрузить(Новый Структура("ОбъектМДПолноеИмя", ПолноеИмяОбъектаМД)).ВыгрузитьКолонку("ТабличнаяЧасть");
Если ТабличныеЧастиЦикл.Количество() = 0 Тогда
Продолжить;
КонецЕсли;
КонецЕсли;
ТабличныеЧастиЦикл.Добавить("");
СтрокаМД = ОбъектыМетаданных.Добавить();
СтрокаМД.ОбъектМетаданных = ПолноеИмяОбъектаМД;
СтрокаМД.Представление = МетаОбъект.Представление();
СтрокаМД.ТипМетаданных = КорневойТип;
Для Каждого ИмяТЧ Из ТабличныеЧастиЦикл Цикл
ТЧ_МД = МетаОбъект;
ПолноеИмяТЧ_МД = ПолноеИмяОбъектаМД;
Если ЗначениеЗаполнено(ИмяТЧ) Тогда
ПолноеИмяТЧ_МД = ПолноеИмяТЧ_МД + "." + ИмяТЧ;
ТЧ_МД = МетаОбъект.ТабличныеЧасти[ИмяТЧ];
КонецЕсли;
Если ВычислятьФункциональныеОпции Тогда
// Добавим фиктивную строку для проверки функциональных опций на сам объект
СтрокаТаблицы = ТаблицаПрав.Добавить();
СтрокаТаблицы.ОбъектМетаданных = ПолноеИмяОбъектаМД;
СтрокаТаблицы.ОбъектМД = МетаОбъект;
СтрокаТаблицы.ТабличнаяЧасть = ИмяТЧ;
КонецЕсли;
ПоляТаблицыБД = Неопределено;
ПоляТЧ = Новый Массив;
Если ЛиКорневойТипНехранимый Тогда
ПоляТЧ.Добавить("");
ИначеЕсли Истина
И Не ИспользоватьНаборПолей
И ЗначениеЗаполнено(ОбъектМетаданных)
Тогда
ПоляТаблицы = ирКэш.ПоляТаблицыБДЛкс(ПолноеИмяТЧ_МД);
Для Каждого СтрокаПоля Из ПоляТаблицы Цикл
Если Ложь
Или ЗначениеЗаполнено(ПолеОбъекта) И СтрокаПоля.Имя <> ПолеОбъекта
Или СтрокаПоля.ТипЗначения.СодержитТип(Тип("ТаблицаЗначений"))
Или (Истина
И ЗначениеЗаполнено(ИмяТЧ)
И (Ложь
Или СтрокаПоля.Имя = "Ссылка"
Или СтрокаПоля.Имя = "НомерСтроки"))
Тогда
Продолжить;
КонецЕсли;
ПоляТЧ.Добавить(СтрокаПоля.Имя);
КонецЦикла;
ПоляТаблицыБД = ПоляТаблицыБД(ПолноеИмяОбъектаМД, ИмяТЧ);
ИначеЕсли ИспользоватьНаборПолей Тогда
ПоляТЧ = НаборПолейТаблица.Выгрузить(Новый Структура("ОбъектМДПолноеИмя, ТабличнаяЧасть", ПолноеИмяОбъектаМД, ИмяТЧ)).ВыгрузитьКолонку("Поле");
Если ПоляТЧ.Количество() = 0 Тогда
Продолжить;
КонецЕсли;
ПоляТаблицыБД = ПоляТаблицыБД(ПолноеИмяОбъектаМД, ИмяТЧ);
ИначеЕсли Не ЗначениеЗаполнено(ИмяТЧ) Тогда
ПоляТЧ.Добавить(ИмяПоляТипаМетаданных);
КонецЕсли;
//ПоляТЧ.Добавить("");
Если ЗначениеЗаполнено(ИмяТЧ) Тогда
СтрокаМД = ТабличныеЧасти.Добавить();
СтрокаМД.ОбъектМетаданных = ПолноеИмяОбъектаМД;
СтрокаМД.ТабличнаяЧасть = ИмяТЧ;
СтрокаМД.Представление = ТЧ_МД.Представление();
КонецЕсли;
Для Каждого ИмяПоляОбъекта Из ПоляТЧ Цикл
Если ПоляТаблицыБД <> Неопределено И ЗначениеЗаполнено(ИмяПоляОбъекта) Тогда
СтрокаМД = ПоляМетаданных.Добавить();
СтрокаМД.ОбъектМетаданных = ПолноеИмяОбъектаМД;
СтрокаМД.ТабличнаяЧасть = ИмяТЧ;
СтрокаМД.Поле = ИмяПоляОбъекта;
СтрокаМД.Представление = ПоляТаблицыБД.Найти(ИмяПоляОбъекта).Заголовок;
КонецЕсли;
Для Каждого ДоступноеПраво Из ДоступныеПрава Цикл
ПравоДоступа = ДоступноеПраво.Право;
Если Ложь
Или ЛиКорневойТипСсылочный И Не ПраваСсылочные.Свойство(ПравоДоступа)
Или ЛиКорневойТипРегистра И Не ПраваРегистры.Свойство(ПравоДоступа)
Или ЛиКорневойТипЖурнала И Не ПраваЖурналы.Свойство(ПравоДоступа)
Или ЛиКорневойТипПоследовательности И Не ПраваПоследовательность.Свойство(ПравоДоступа)
Или (Истина
И ЛиКорневойТипНехранимый
И Не ПраваНехранимые.Свойство(ПравоДоступа)
И Не (КорневойТип = "ОбщийРеквизит" И ПравоДоступа = "Редактирование")
И Не (КорневойТип = "ОбщаяФорма" И ПравоДоступа = "Использование"))
Тогда
Продолжить;
КонецЕсли;
//ИндикаторРолей = ирОбщий.ПолучитьИндикаторПроцессаЛкс(Метаданные.Роли.Количество(), "Роли");
Для Каждого РольЦикл Из Роли Цикл
Право = ПравоДоступа;
ПрерватьЦикл = Ложь;
ИмяПоляВместеСТЧ = ИмяПоляОбъекта;
Если ЗначениеЗаполнено(ИмяТЧ) Тогда
ИмяПоляВместеСТЧ = ИмяТЧ + "." + ИмяПоляОбъекта;
КонецЕсли;
Если ЛиКорневойТипНехранимый Тогда
ПроверяемыйОбъект = ТЧ_МД;
Если ЗначениеЗаполнено(ИмяПоляОбъекта) Тогда
ПроверяемыйОбъект = ТЧ_МД.Реквизиты[ИмяПоляОбъекта];
КонецЕсли;
Попытка
ПараметрыДоступа = ПравоДоступа(Право, ПроверяемыйОбъект, РольЦикл);
Исключение
Прервать;
КонецПопытки;
Иначе
Попытка
ПараметрыДоступа = ПараметрыДоступа(Право, МетаОбъект, ИмяПоляВместеСТЧ, РольЦикл);
Исключение
Если Ложь
Или ЗначениеЗаполнено(ПолеОбъекта)
Или ЗначениеЗаполнено(ИмяТЧ)
Тогда
ПрерватьЦикл = Истина;
Иначе
ИмяПоляОбъекта = "";
ПараметрыДоступа = ирОбщий.ПараметрыДоступаКОбъектуМДЛкс(Право, МетаОбъект, РольЦикл, ПрерватьЦикл, ИмяПоляОбъекта);
КонецЕсли;
Если ПрерватьЦикл Тогда
Прервать;
КонецЕсли;
КонецПопытки;
КонецЕсли;
Если ТипЗнч(ПараметрыДоступа) = Тип("Булево") Тогда
Если ПараметрыДоступа Тогда
Доступ = "да";
Иначе
Доступ = "нет";
КонецЕсли;
ИначеЕсли ПараметрыДоступа.Доступность Тогда
Если ПараметрыДоступа.ОграничениеУсловием Тогда
Доступ = "да ограничено";
Иначе
Доступ = "да";
КонецЕсли;
Иначе
Доступ = "нет";
КонецЕсли;
Если Истина
И ОтборПоДоступу <> Неопределено
И Не ирОбщий.ЛиЗначениеПроходитЭлементОтбораЛкс(ОтборПоДоступу, Доступ)
Тогда
Продолжить;
КонецЕсли;
СтрокаТаблицы = ТаблицаПрав.Добавить();
СтрокаТаблицы.ОбъектМетаданных = ПолноеИмяОбъектаМД;
СтрокаТаблицы.ОбъектМД = МетаОбъект;
СтрокаТаблицы.ТабличнаяЧасть = ИмяТЧ;
СтрокаТаблицы.Поле = ИмяПоляОбъекта;
//ДочернийОбъектМД = ирОбщий.ДочернийОбъектМДПоИмениЛкс(МетаОбъект, ИмяПоляОбъекта, КорневойТип);
//Если ДочернийОбъектМД <> Неопределено Тогда
// СтрокаТаблицы.ПолеПолноеИмя = ДочернийОбъектМД.ПолноеИмя();
//КонецЕсли;
СтрокаТаблицы.Роль = РольЦикл.Имя;
СтрокаТаблицы.Право = ПравоДоступа;
СтрокаТаблицы.Доступ = Доступ;
КонецЦикла;
КонецЦикла;
//ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
КонецЦикла;
КонецЦикла;
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
Если ВычислятьФункциональныеОпции Тогда
ОпцииОбъектовМД = ирКэш.ФункциональныеОпцииОбъектовМДЛкс();
ДобавленныеОбъектыМД = Новый Соответствие;
ИменаГруппировок = "ОбъектМД, ТабличнаяЧасть, Поле";
ПолныеИменаПолей = ТаблицаПрав.Скопировать(, ИменаГруппировок);
ПолныеИменаПолей.Свернуть(ИменаГруппировок);
Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(ПолныеИменаПолей.Количество(), "Функциональные опции");
Для Каждого СтрокаПоля Из ПолныеИменаПолей Цикл
ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
РодительскийОбъектМД = СтрокаПоля.ОбъектМД;
Если ЗначениеЗаполнено(СтрокаПоля.ТабличнаяЧасть) Тогда
ТЧ_МД = РодительскийОбъектМД.ТабличныеЧасти.Найти(СтрокаПоля.ТабличнаяЧасть);
Если ТЧ_МД <> Неопределено Тогда
РодительскийОбъектМД = ТЧ_МД;
КонецЕсли;
КонецЕсли;
ДочернийОбъектМД = ирОбщий.ДочернийОбъектМДПоИмениЛкс(РодительскийОбъектМД, СтрокаПоля.Поле);
Если ДочернийОбъектМД <> Неопределено Тогда
ОбъектМД = ДочернийОбъектМД;
ПрямоеНазначение = Истина;
Иначе
Если ЗначениеЗаполнено(СтрокаПоля.Поле) Тогда
Продолжить;
КонецЕсли;
ОбъектМД = РодительскийОбъектМД;
ПрямоеНазначение = Ложь;
КонецЕсли;
ПолноеИмяМД = ОбъектМД.ПолноеИмя();
Для Каждого СтрокаОпции Из ОпцииОбъектовМД.НайтиСтроки(Новый Структура("ИмяОбъектаМД", ПолноеИмяМД)) Цикл
СтрокаТаблицы = ФункциональныеОпцииПолей.Добавить();
СтрокаТаблицы.ФункциональнаяОпция = СтрокаОпции.ИмяОпции;
СтрокаТаблицы.ПолеПолноеИмя = ПолноеИмяМД + "." + СтрокаПоля.ТабличнаяЧасть + "." + СтрокаПоля.Поле;
СтрокаТаблицы.ПрямоеНазначение = ПрямоеНазначение = ЗначениеЗаполнено(СтрокаПоля.Поле);
//ДобавленыСтроки = Истина;
КонецЦикла;
//Если Не ДобавленыСтроки Тогда
// // Если объект не входит в функциональные опции
// СтрокаТаблицы = ФункциональныеОпцииПолей.Добавить();
// СтрокаТаблицы.ФункциональнаяОпция = "";
// СтрокаТаблицы.ПолеПолноеИмя = СтрокаПоля.ПолеПолноеИмя;
// СтрокаТаблицы.ПрямоеНазначение = ПрямоеНазначение = ЗначениеЗаполнено(СтрокаПоля.Поле);
//КонецЕсли;
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
КонецЕсли;
ТаблицаПрав.Колонки.Удалить("ОбъектМД");
Результат = Новый Структура;
Результат.Вставить("ТаблицаПрав", ТаблицаПрав);
Результат.Вставить("ОбъектыМетаданных", ОбъектыМетаданных.Выгрузить());
Результат.Вставить("ТабличныеЧасти", ТабличныеЧасти.Выгрузить());
Результат.Вставить("ПоляМетаданных", ПоляМетаданных.Выгрузить());
Результат.Вставить("ФункциональныеОпцииПолей", ФункциональныеОпцииПолей.Выгрузить());
Результат.Вставить("КонечныеНастройки", КонечныеНастройки);
Возврат Результат;
КонецФункции
Функция ПоляТаблицыБД(Знач ПолноеИмяОбъектаМД, Знач ИмяТЧ)
ПолноеИмяТаблицыБД = ПолноеИмяОбъектаМД;
Если ЗначениеЗаполнено(ИмяТЧ) Тогда
ПолноеИмяТаблицыБД = ПолноеИмяТаблицыБД + "." + ИмяТЧ;
КонецЕсли;
ПоляТаблицыБД = ирКэш.ПоляТаблицыБДЛкс(ПолноеИмяТаблицыБД);
Возврат ПоляТаблицыБД;
КонецФункции
Функция ДоступныеПрава(ВВидеТаблицы = Истина) Экспорт
Результат = Новый СписокЗначений;
Результат.Добавить("Чтение", "1.Чтение");
Результат.Добавить("Просмотр", "2.Просмотр");
Результат.Добавить("Добавление", "3.Добавление");
Результат.Добавить("ИнтерактивноеДобавление", "4.Интерактивное Добавление");
Результат.Добавить("Изменение", "5.Изменение");
Результат.Добавить("Редактирование", "6.Интерактивное изменение");
Результат.Добавить("Удаление", "7.Удаление");
Результат.Добавить("ИнтерактивноеУдаление", "8.Интерактивное Удаление");
Результат.Добавить("Использование", "9.Использование");
Если ВВидеТаблицы Тогда
РезультатТаблица = Новый ТаблицаЗначений;
РезультатТаблица.Колонки.Добавить("Право");
РезультатТаблица.Колонки.Добавить("ПравоПредставление");
Для Каждого ЭлементСписка Из Результат Цикл
СтрокаТаблицы = РезультатТаблица.Добавить();
СтрокаТаблицы.Право = ЭлементСписка.Значение;
СтрокаТаблицы.ПравоПредставление = ЭлементСписка.Представление;
КонецЦикла;
Результат = РезультатТаблица;
КонецЕсли;
Возврат Результат;
КонецФункции
//ирПортативный лФайл = Новый Файл(ИспользуемоеИмяФайла);
//ирПортативный ПолноеИмяФайлаБазовогоМодуля = Лев(лФайл.Путь, СтрДлина(лФайл.Путь) - СтрДлина("Модули\")) + "ирПортативный.epf";
//ирПортативный #Если Клиент Тогда
//ирПортативный Контейнер = Новый Структура();
//ирПортативный Оповестить("ирПолучитьБазовуюФорму", Контейнер);
//ирПортативный Если Не Контейнер.Свойство("ирПортативный", ирПортативный) Тогда
//ирПортативный ирПортативный = ВнешниеОбработки.ПолучитьФорму(ПолноеИмяФайлаБазовогоМодуля);
//ирПортативный ирПортативный.Открыть();
//ирПортативный КонецЕсли;
//ирПортативный #Иначе
//ирПортативный ирПортативный = ВнешниеОбработки.Создать(ПолноеИмяФайлаБазовогоМодуля, Ложь); // Это будет второй экземпляр объекта
//ирПортативный #КонецЕсли
//ирПортативный ирОбщий = ирПортативный.ПолучитьОбщийМодульЛкс("ирОбщий");
//ирПортативный ирКэш = ирПортативный.ПолучитьОбщийМодульЛкс("ирКэш");
//ирПортативный ирСервер = ирПортативный.ПолучитьОбщийМодульЛкс("ирСервер");
//ирПортативный ирПривилегированный = ирПортативный.ПолучитьОбщийМодульЛкс("ирПривилегированный");
РежимОтладки = 0;