RDT1C/Reports/ирАнализПравДоступа/Ext/ObjectModule.bsl
Администратор 4f4e825ed0 Консоль компоновки
*Исправлены в снова сломавшиеся привязки
    Консоль запросов
        *Улучшен вывод сообщений об ошибках из-за некорректно заданных выборок итогов
        *Исправлено использование выборок итогов без флажков "Стандартная" и "Автовыборки"
        +Команда "Перейти к определению (F12)"  в поле текста запроса в режиме дерева запроса для выражения обращения к полю временной таблицы теперь переходит к его определению в запросе создания временной таблицы
        +В режиме дерева запроса добавлена команда "Вернуться из перехода (CTRL+F12)" для возвращения к строке дерева, из которой был совершен переход
        +В таблице "Временные таблицы" теперь всегда показывается актуальное количество строк для каждой временной таблицы
        *Исправлена некорректная внутренняя грубая разбивка текста пакетного запроса на запросы при наличии символа "$"
    Общее
        *Исправлена проблема отображения кнопки инструмента "История данных" на платформах ниже 8.3.11
    Форма таблицы значений
        +Добавлен флажок "Только просмотр" для возможности открытия ссылок двойным щелчком
    Поиск дублей и замена ссылок
        *Исправлено использование общих параметров записи в режиме "Выполнять на севере" в непортативных вариантах
    Динамический список
        *Исправлена ошибка перезаполнения командной панели в режиме выбора
        +Реализована работа списка последних выбранных элементов
    Адаптация расширения
        *Исправлена ошибка выполнения адаптации при наличии ссылочных типов в расширениях конфигурации
    Конструктор запроса
        +В контекстном меню дерева доступных полей для полей временных таблиц добавлена команда "Перейти к определению поля (F12)"
        +Командам "Найти в списке доступных..." назначено сочетание клавиш F12
        *Исправлены редкие ошибки
        +Реализована работа команд перехода к определению/выбранной таблице/полю из большинства полей выражений
        +Реализована работа команды перехода к определению таблицы/поля для вложенных запросов
    Анализ прав доступа
        +Добавлена страница описания инструмента
        +Добавлена поддержка всех корневых типов метаданных
        *Устранены неправильные комбинации прав и типов метаданных
    История данных
        *Исправлен переход по некорректному адресу кнопкой ИТС
2019-07-28 23:04:04 +03:00

260 lines
20 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.

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