gifts2017

Консоль запросов RLS

Опубликовал Rioneri Rioneri (Rioneri) в раздел Программирование - Инструментарий

Поставка включает в себя конфигурацию, внешнюю обработку и файл описания в формате pdf (приведенный ниже).
Консоль можно использовать при анализе текста запроса RLS, который будет выполнен к данным под конкретным пользователем.

 Консоль можно использовать при анализе текста запроса RLS, который будет выполнен к данным под конкретным пользователем.

Например, мы смотрим ограничение доступа «Чтение» для некоторой роли типовой конфигурации 1С:

С 53-мя параметрами вызывается шаблон ограничений, содержащий (в используемой конфигурации) 9037 строк. Очевидно, что понять, какой запрос реально будет выполнен к данным, затруднительно.

Консоль позволяет преобразовать текст ограничения доступа в конкретное условие, которое будет добавлено к запросу при выборке данных из базы.

Порядок преобразования следующий:

  • 1. Замена всех вызовов шаблонов на текст шаблонов. При замене предполагается, что в общем случае вызовов шаблонов из текста ограничения доступа может быть несколько (кто знает, может в следующей БСП нас ждет и такое). Поддерживается ситуация, когда шаблон содержит именованные параметры.
  • 2. Замена вызовов кодовых слов (#ИмяТекущейТаблицы и пр.).
  • 3. Вычисление функций СтрСодержит() в тексте.
  • 4. Вычисление инструкций препроцессора #Если...#КонецЕсли. Здесь, ввиду возможности их многократной вложенности в различных частях условия, получился любопытный код.

Для работы с конфигурацией нужно будет проделать небольшую подготовительную работу.

Выгружаем описание ролей в xml файлы из конфигуратора с помощью опции «Выгрузить конфигурацию в файлы».

Если опции нет в интерфейсе, её можно отобразить с помощью настройки главного окна.

 

Загружаем описание ролей в базу «Консоль запросов RLS»

 

После загрузки открываем форму консоли.

Здесь последовательно указываем поля для получения интересующего нас текста запроса. Нужно указать: конфигурацию, роль, объект метаданных, право и поля ограничений доступа (здесь для права «чтение» возможны варианты). После указания заполняется поле «Ограничение доступа», если для указанных аналитик в конфигурации таковое имеется.

Переходим на закладку «Консоль» и нажимаем «Сформировать». Получаем промежуточный текст запроса для внешней обработки.

Открываем обработку «ФормированиеТекстаЗапросаRLS.epf» в нужной базе под нужным пользователем (это важно, так как в тексте запроса участвуют параметры сеанса и функциональные опции, настроенные для конкретного пользователя).

Скопированный текст вставляем на закладку «Исходный текст», нажимаем «Сформировать» и на закладке «Модифицированный текст» получаем результат.

Примечание.

Консоль сделана на версии 8.3.6.1977. Открыть внешнюю обработку в режиме совместимости 8.3.5 с ходу не получится.

Консоль может использоваться желающими «посмотреть поближе» подсистему ограничений прав доступа, используемую в типовых конфигурациях (текст запроса после обработки более легок в восприятии).


Скачать файлы

Наименование Файл Версия Размер
RLS 22
.zip 730,95Kb
30.12.15
22
.zip 730,95Kb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Сергей Семченков (BigClock) 24.08.15 10:55
Несколько вопросов.
1. Чем отличается от http://infostart.ru/public/264989/
2. Можно ли адаптировать эту консоль для 8.3.5 или даже 8.2?
3. Можно ли адаптировать под выгрузку команды "Выгрузить файлы конфигурации"?
При использовании команды "Выгрузить конфигурацию в файлы" выгружается вся конфигурация,
а при использовании "Выгрузить файлы конфигурации" можно самому выбрать выгружаемые объекты.
2. Rioneri Rioneri (Rioneri) 24.08.15 22:54
(1) BigClock,
1. Судя по описанию, в http://infostart.ru/public/264989/ разбирается текст шаблона с подстановкой параметров, а здесь - текст ограничения доступа, в котором шаблоны могут как присутствовать так и нет (также шаблонов может быть несколько), также здесь представлена конфигурация, а не внешняя обработка (это более удобно в ряде случаев);
2. Адаптировать под предшествующие версии можно, если переопределить СтрНайти();
3. Адаптировать под "Выгрузить файлы конфигурации" можно минимальными усилиями. Со стороны прав доступа выгружаемые конфигуратором файлы схожи.

P.S. Немного посмотрел на http://infostart.ru/public/264989/ оставил пару комментариев
3. Максим Зудин (kasper076) 25.08.15 08:27
1С:Предприятие 8.3 (8.3.6.2076)

Все заполнил согласно инструкции.
Вот что выходит при выборе "Поля ограничения доступа":


Ну и соответственно поле "Ограничение доступа" тоже не заполнено.
Что я делаю не так?
4. Rioneri Rioneri (Rioneri) 25.08.15 21:23
(3) kasper076,
Всё так. Просто из БП 2.0 загрузилось не очень красиво (сам применял для ERP). При выборе из справочника "Поля ограничения доступа" нужно подобрать правильный элемент. Сделать это можно по коду элемента справочника, а код посмотреть с помощью регистра сведений «ограничения доступа».

http://imhocloud.com/image/7XSO

После выбора программа определить текст ограничения доступа, которое соответствует данному отбору.

http://imhocloud.com/image/7XSp
5. Максим Зудин (kasper076) 25.08.15 22:05
(4) Rioneri, спасибо. Направление ясно.
6. Максим Зудин (kasper076) 26.08.15 09:51
Вот вариант обработки для обычных форм версий 8.3.5 и младше. Переопределена функция "СтрНайти()":
Функция СтрНайти(Знач Строка, ПодстрокаПоиска, НаправлениеПоиска = Неопределено, НачальнаяПозиция = 1, НомерВхождения = 1)
	
	Строка			= ВРег(Строка);
	ПодстрокаПоиска	= Врег(ПодстрокаПоиска);
	
	Заглушка = "";
	ДлинаПодстроки	= СтрДлина(ПодстрокаПоиска);
	
	Для Инд = 1 По ДлинаПодстроки Цикл
		Заглушка = Заглушка + " ";
	КонецЦикла;
	
	Для Инд = 1 По НомерВхождения - 1  Цикл
		Позиция = Найти(Строка, ПодстрокаПоиска);
		Строка = Сред(Строка, 1, Позиция - 1) + Заглушка + Сред(Строка, Позиция + ДлинаПодстроки); 
	КонецЦикла;
	
	Возврат Найти(Строка, ПодстрокаПоиска);
	
КонецФункции	
...Показать Скрыть

Испугавшись праведного гнева гуру 1С, переписал с использованием регулярных выражений:
Функция СтрНайти(Знач Строка, ПодстрокаПоиска, НаправлениеПоиска = Неопределено, НачальнаяПозиция = 1, НомерВхождения = 1)
	
	RegExp = Новый COMОбъект("VBScript.RegExp");// создаем объект для работы с регулярными выражениями
	RegExp.MultiLine	= Истина;			// истина — текст многострочный, ложь — одна строка
	RegExp.Global		= Истина;			// истина — поиск по всей строке, ложь — до первого совпадения
	RegExp.IgnoreCase	= Истина;			// истина — игнорировать регистр строки при поиске
	Шаблон				= ПодстрокаПоиска;	//шаблон проверки 
	RegExp.Pattern		= Шаблон;    		// шаблон (регулярное выражение)
	Кол_воВхождений		= RegExp.Execute(Строка);
	Позиция = Кол_воВхождений.Item(НомерВхождения - 1).FirstIndex + 1;	
	
	Возврат Позиция;
	
КонецФункции	
...Показать Скрыть
Прикрепленные файлы:
ФормированиеТекстаЗапросаRLS_8_2.epf
Леонов Александр; hdv; dyuha; Rioneri; +4 Ответить 1
7. Максим *** (premier) 28.08.15 08:08
(6) kasper076, а вот так разве не проще?
Функция СтрНайти(Знач Строка, ПодстрокаПоиска, НаправлениеПоиска = Неопределено)
    Возврат Найти(Строка, ПодстрокаПоиска);
КонецФункции    
...Показать Скрыть


Вот описание возвращаемого значения функции Найти()

Тип: Число.
Позиция первого знака найденной подстроки. Нумерация символов в строке начинается с 1. Если строка не содержит указанной подстроки, то возвращается 0.
8. Allexey (alex_4x) 28.08.15 18:07
Вот это вещь!
Обязательно внимательно ознакомлюсь.
Для толстого клиента 8.2 уже не делаете?
9. Максим Зудин (kasper076) 29.08.15 22:13
(7) premier, проще... Если, конечно, нужно найти первое вхождение. А если, к примеру, 3-е?
10. Максим Зудин (kasper076) 31.08.15 08:35
Адаптировал под 8.3.4 Думаю и на 8.2 будет работать. Добавил отборы в форме "Консоль запросов". Терь если конфигураций несколько, то чуток удобнее заполнять настройки. Постараюсь еще под обычные формы переделать.
P.S. Автору еще раз спасибо. и за проделанную работу, и за знания полученные в процессе изучения этого продукта.
Прикрепленные файлы:
RLS_upd.cf
11. Максим *** (premier) 02.09.15 13:58
(9) kasper076, согласен, если требуется необходимое по счёту вхождение найти.
Тогда следует ещё проверку ввести чтобы Кол_воВхождений.SubMatches.Count не оказалось меньше, чем НомерВхождения, иначе функция в исключение вылетит (если уж, испугавшись праведного гнева гуру 1С, писать :)).
12. Максим *** (premier) 02.09.15 14:41
(9) kasper076, наврал немного: вместо Кол_воВхождений.SubMatches.Count следует использовать Кол_воВхождений.Count
13. Максим Зудин (kasper076) 03.09.15 12:49
(11) premier, вот знал же, что гуру найдут к чему придраться )))) Пасиб. Исправлю обязательно.
14. Андрей Калякин (kalyaka) 30.12.15 11:30
Прошу автора выложить материалы в zip архиве, т.к. файл с расширением .exe не пропускают программы защиты
15. Михаил Р (rygov) 23.03.16 18:43
Видимо в 8.3.7 поменяли структуры выгрузки конфигурации - надо исправить строку:
НачатьПоискФайлов(Новый ОписаниеОповещения("ОбработчикЗагрузкиФайлов", ЭтотОбъект, ПараметрыЗагрузки), Объект.КаталогВыгрузки, "Role.*Rights.xml");

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