|
Подскажите по RLS | ☑ | ||
---|---|---|---|---|
0
MatrosoV AleXXXand_R
29.11.11
✎
08:30
|
Настроил право на добавление в RLS. Написал вот так:
#Если &ИспользоватьОграничениеПоНоменклатура #Тогда ТекущаяТаблица ИЗ #ТекущаяТаблица КАК ТекущаяТаблица ГДЕ ТекущаяТаблица.Ссылка В ИЕРАРХИИ (ВЫБРАТЬ РАЗЛИЧНЫЕ НастройкиПравДоступаПользователей.ОбъектДоступа КАК ОбъектДоступа ИЗ РегистрСведений.НазначениеВидовОбъектовДоступа КАК НазначениеВидовОбъектовДоступа ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПравДоступаПользователей КАК НастройкиПравДоступаПользователей ПО НастройкиПравДоступаПользователей.ВидОбъектаДоступа = НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа И НастройкиПравДоступаПользователей.ОбластьДанных = ЗНАЧЕНИЕ(Перечисление.ОбластиДанныхОбъектовДоступа.ПустаяСсылка) ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ СоставГруппы.Ссылка КАК ГруппаПользователей ИЗ Справочник.ГруппыПользователей.ПользователиГруппы КАК СоставГруппы ГДЕ СоставГруппы.Пользователь = &ТекущийПользователь ) КАК ГруппыПользователей ПО НастройкиПравДоступаПользователей.Пользователь = ГруппыПользователей.ГруппаПользователей ГДЕ НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Номенклатура)) #КонецЕсли Но ... выдает ошибку Ошибка в ограничении доступа к данным. объект: 'Catalog.Номенклатура(Справочник.Номенклатура)'; право: 'Добавление' {(6, 27)}: Синтаксическая ошибка "ИЕРАРХИИ" ТекущаяТаблица.Ссылка В <<?>>ИЕРАРХИИ Подскажите - RLS, в ИЕРАРХИИ не распознает разве? |
|||
1
vde69
29.11.11
✎
08:34
|
"В ИЕРАРХИИ" не применим к результату запроса
|
|||
2
vde69
29.11.11
✎
08:36
|
(1)+ а вообще в RLS наверно то-же нельзя его юзать, так-же как и итоги.
никогда не пробовал ибо в любом случае это жуткие тормоза |
|||
3
MatrosoV AleXXXand_R
29.11.11
✎
08:38
|
А как лучше сделать? Н
ужно установить ограничение к определенной папке (папкам) в справочнике |
|||
4
SuperMario
29.11.11
✎
08:39
|
(0) Результат запроса должен возвращать или истину или ложь.
|
|||
5
vde69
29.11.11
✎
08:42
|
(3) пошлю я тебя... в типовую глянуть, там есть это. Только там шаблоны RLS по 10 000 строк....
Зато хоть польза будет :) |
|||
6
vde69
29.11.11
✎
08:44
|
почти в тему http://infostart.ru/public/87912/
Альтернативная система RLS Разработана [email protected] (c) при публикации указание авторства обязательно 1с продвигает универсальную систему RLS. На мой взгляд, она имеет ряд недостатков, для устранения которых была разработана данная методика внедрения параллельно действующей системе RLS. Все примеры построены на использовании 1С:Документооборот 8 КОРП, редакция 1.1 (1.1.4.1), для других конфигураций «картинки» могут быть другие. Причины создания альтернативной системы RLS 1. Штатная процедура использует слишком много настроек и сложна в понимании даже для программистов. 2. Отсутствует возможность получить простой список пользователей, имеющий доступ к конкретному объекту. 3. Условия RLS формируются шаблонами невероятных размеров (более 10 000 строк), что делает их, во-первых, практически не редактируемыми и, во-вторых, это явно излишняя нагрузка на сервера. 4. Условия RLS выполняют соединения с регистрами сведений, при этом регистр содержит все записи исключений/разрешений по всем видам RLS. При этом практически возникает ситуация когда требуется выполнить отбор по доступным организациям (из всего 2 в базе), а в регистре содержится 2-3 миллиона записей по контрагентам и файлам 5. Новая система RLS продвигается для управляемых форм, которые базируются на правах, и по сколько штатная система RLS очень громоздкая и медленная то мы имеем очень медленную генерацию форм. Идеология альтернативной системы RSL: 1. Система базируется на фиксированном количестве параметров («аналитике») при этом качественное изменение состава «аналитики» происходит редко (например, аналитика «Организация», их добавляют крайне редко). 2. Для оперативного изменения доступа на часто изменяемые разрезы аналитики в данной системе НЕПОДХОДИТ (например, в организации регистрируют в день 50 новых контрагентов и их раскидывают между менеджерами). В подобном случае следует использовать штатные роли. Предельный размер аналитики (одного справочника аналитики, а не данных) желательно не должен превышать 500 элементов (оптимально до 200 элементов). 3. Система работает параллельно и ее можно совмещать (частично) со штатной системой RLS 4. Система использует штатные механизмы настроек и для пользователей «прозрачна», но при этом имеет ряд простых механизмов облегчающих понимание происходящего. Установка (все изменения в коде обозначении //КБС - доработка системы RLS): 1. Выбираем разрезы аналитики. Я выбрал «Организация», «ГрифДоступа», «Проект», «УровеньДоступа» (последних двух нет в документообороте, я их добавил, подробнее см ниже). 2. При необходимости прописываем аналитики в предопределенные элементы ПВХ «Виды доступа» 3. В каждый объект добавляем реквизиты аналитики 4. Для каждой роли имеющей RLS создаем свою копию (простым перетаскиванием мышки), при этом добавляем суффикс (я добавил _КБС), обязательно сортируем (потом будет проще права копировать). На эту операцию уходит примерно 15 минут. В каждой роли добавляем шаблон «ПоЗначениямКБС» (примерно 30 минут) // ПоЗначениямКБС // ПоЗначениям (Модификатор, РеквизитАдресации, В1,П1, В2,П2, ..., В(n), П(n)). // № параметра: 1, 2, 3, 4, 5, 6, 7, ..., 2+n*2,3+n*2 . // Читается так: "ограничение доступа по значениям". // Параметры: // Модификатор - изменяет шаблон. // 1-й модификтор - строка "НеОграничиватьДоступКГруппам" указывает // безусловно выбирать группы иерархического справочника. // Других модификаторов в этой версии шаблона не предусмотрено. // РеквизитАдресации - имя реквизита для проверки адресации, (сравнивает соответствие с пользователем или группой пользователей) // В(n) - Вид доступа (имя предопределённого элемента ПланВидовХарактеристик.ВидыДоступа). // П(n) - Поле значения, проверяемого по виду доступа. // Примечение: максимальное количество одновременно проверяемых значений полей можно увеличить, изменив шаблон, но // необходимо будет указывать все параметры шаблона, т.е. указывать пустые строки, когда количество полей меньше максимального. // Пример: // ПоЗначениямКБС("", "", // "Организации","Ссылка", // "","", // "","", // "","", // "","") // ТекущаяТаблица ИЗ #ТекущаяТаблица КАК ТекущаяТаблица ГДЕ ((&ОграничиватьДоступПоВиду = "") ИЛИ #Если "#Параметр(1)" = "НеОграничиватьДоступКГруппам" #Тогда ТекущаяТаблица.ЭтоГруппа ИЛИ #КонецЕсли (Истина #Если "#Параметр(2)" <> "" #Тогда И (ТекущаяТаблица.#Параметр(2) В (&МассивДоступаПоАдресации)) #КонецЕсли #Если "#Параметр(3)" <> "" #Тогда И (ТекущаяТаблица.#Параметр(4) В (&МассивДоступаПоВиду#Параметр(3))) #КонецЕсли #Если "#Параметр(5)" <> "" #Тогда И (ТекущаяТаблица.#Параметр(6) В (&МассивДоступаПоВиду#Параметр(5))) #КонецЕсли #Если "#Параметр(7)" <> "" #Тогда И (ТекущаяТаблица.#Параметр(8) В (&МассивДоступаПоВиду#Параметр(7))) #КонецЕсли #Если "#Параметр(9)" <> "" #Тогда И (ТекущаяТаблица.#Параметр(10) В (&МассивДоступаПоВиду#Параметр(9))) #КонецЕсли #Если "#Параметр(11)" <> "" #Тогда И (ТекущаяТаблица.#Параметр(12) В (&МассивДоступаПоВиду#Параметр(11)) #КонецЕсли ) ) 5. Заводим новые параметры сеанса (все параметры имеют тип «ФиксированыйМассив»). Параметр «МассивДоступаПоАдресации» и параметры для каждого имени доступа из ПВХ «Виды доступа», параметры должны начинаться на «МассивДоступаПоВиду» и дальше идет имя параметра ПВХ. Параметры заводятся на ВСЕ имена ПВХ, даже на те которые Вы не планируете использовать. 6. Модуль «Пользователи», изменение одной процедуры Процедура ОпределитьТекущегоПользователя(Знач ИмяПараметра, УстановленныеПараметры) Экспорт УстановитьПривилегированныйРежим(Истина); Если ИмяПараметра <> "ТекущийПользователь" И ИмяПараметра <> "МассивДоступаПоАдресации" // КБС - доработка системы RLS И ИмяПараметра <> "ТекущийВнешнийПользователь" Тогда Возврат; КонецЕсли; ПользовательНеНайден = Ложь; СоздатьПользователя = Ложь; Если ПустаяСтрока(ПользователиИнформационнойБазы.ТекущийПользователь().Имя) Тогда Если ЭтоПолноправныйПользовательИБ() Тогда ПараметрыСеанса.ТекущийВнешнийПользователь = Справочники.ВнешниеПользователи.ПустаяСсылка(); ИмяПользователя = ПолноеИмяНеУказанногоПользователя(); ПолноеИмяПользователя = ПолноеИмяНеУказанногоПользователя(); Запрос = Новый Запрос; Запрос.Текст = " |ВЫБРАТЬ ПЕРВЫЕ 1 | Пользователи.Ссылка КАК Ссылка |ИЗ | Справочник.Пользователи КАК Пользователи |ГДЕ | Пользователи.Наименование = &ПолноеИмяПользователя"; Запрос.Параметры.Вставить("ПолноеИмяПользователя", ПолноеИмяПользователя); Результат = Запрос.Выполнить(); Если Результат.Пустой() Тогда ПользовательНеНайден = Истина; СоздатьПользователя = Истина; ИдентификаторПользователяИБ = ""; Иначе Выборка = Результат.Выбрать(); Выборка.Следующий(); ПараметрыСеанса.ТекущийПользователь = Выборка.Ссылка; КонецЕсли; Иначе ПользовательНеНайден = Истина; КонецЕсли; Иначе ИдентификаторПользователяИБ = ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор; Запрос = Новый Запрос; Запрос.Параметры.Вставить("ИдентификаторПользователяИБ ", ИдентификаторПользователяИБ); Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | Пользователи.Ссылка КАК Ссылка |ИЗ | Справочник.Пользователи КАК Пользователи |ГДЕ | Пользователи.ИдентификаторПользователяИБ = &ИдентификаторПользователяИБ"; РезультатПользователи = Запрос.Выполнить(); Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | ВнешниеПользователи.Ссылка КАК Ссылка |ИЗ | Справочник.ВнешниеПользователи КАК ВнешниеПользователи |ГДЕ | ВнешниеПользователи.ИдентификаторПользователяИБ = &ИдентификаторПользователяИБ"; РезультатВнешниеПользователи = Запрос.Выполнить(); Если НЕ РезультатВнешниеПользователи.Пустой() Тогда Выборка = РезультатВнешниеПользователи.Выбрать(); Выборка.Следующий(); ПараметрыСеанса.ТекущийПользователь = Справочники.Пользователи.ПустаяСсылка(); ПараметрыСеанса.ТекущийВнешнийПользователь = Выборка.Ссылка; Если НЕ ВнешниеПользователи.ИспользоватьВнешнихПользователей() Тогда ТекстСообщенияОбОшибке = НСтр("ru = 'Внешние пользователи отключены!'"); ВызватьИсключение ТекстСообщенияОбОшибке; КонецЕсли; Иначе ПараметрыСеанса.ТекущийВнешнийПользователь = Справочники.ВнешниеПользователи.ПустаяСсылка(); Если РезультатПользователи.Пустой() Тогда Если ЭтоПолноправныйПользовательИБ() Тогда ТекущийПользователь = ПользователиИнформационнойБазы.ТекущийПользователь(); ИмяПользователя = ТекущийПользователь.Имя; ПолноеИмяПользователя = ТекущийПользователь.ПолноеИмя; ИдентификаторПользователяИБ = ТекущийПользователь.УникальныйИдентификатор; ПользовательПоНаименованию = СсылкаПользователяПоПолномуНаименованию(ПолноеИмяПользователя); Если ПользовательПоНаименованию = Неопределено Тогда ПользовательНеНайден = Истина; СоздатьПользователя = Истина; Иначе ПараметрыСеанса.ТекущийПользователь = ПользовательПоНаименованию; КонецЕсли; Иначе ПользовательНеНайден = Истина; КонецЕсли; Иначе Выборка = РезультатПользователи.Выбрать(); Выборка.Следующий(); ПараметрыСеанса.ТекущийПользователь = Выборка.Ссылка; КонецЕсли; КонецЕсли; КонецЕсли; Если СоздатьПользователя Тогда СсылкаНового = Справочники.Пользователи.ПолучитьСсылку(); ПараметрыСеанса.ТекущийПользователь = СсылкаНового; НовыйПользователь = Справочники.Пользователи.СоздатьЭлемент(); НовыйПользователь.ИдентификаторПользователяИБ = ИдентификаторПользователяИБ; НовыйПользователь.Наименование = ПолноеИмяПользователя; НовыйПользователь.УстановитьСсылкуНового(СсылкаНового); Попытка НовыйПользователь.Записать(); Исключение ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Авторизация не выполнена. |Пользователь: %1 не найден в справочнике ""Пользователи"". | |Обратитесь к администратору. |Возникла ошибка при добавлении пользователя в справочник. |%2'"), ИмяПользователя, КраткоеПредставлениеОшибки(ИнформацияОбОшибке()) ); ВызватьИсключение ТекстСообщенияОбОшибке; КонецПопытки; ИначеЕсли ПользовательНеНайден Тогда ВызватьИсключение ТекстСообщенияПользовательНеНайденВСправочнике(ИмяПользователя); КонецЕсли; // ---------------------------------------------------------------------------------------------------------- // КБС - доработка системы RLS Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ | ВложенныйЗапрос.Адресация |ИЗ | (ВЫБРАТЬ | ГруппыПользователейСостав.Пользователь КАК Адресация | ИЗ | Справочник.ГруппыПользователей.Состав КАК ГруппыПользователейСостав | ГДЕ | ВЫБОР | КОГДА &ТекущийВнешнийПользователь = ЗНАЧЕНИЕ(Справочник.ВнешниеПользователи.ПустаяСсылка) | ТОГДА ГруппыПользователейСостав.Пользователь = &ТекущийПользователь | ИНАЧЕ ЛОЖЬ | КОНЕЦ | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ | ВЫБОР | КОГДА &ТекущийВнешнийПользователь = ЗНАЧЕНИЕ(Справочник.ВнешниеПользователи.ПустаяСсылка) | ТОГДА &ТекущийПользователь | ИНАЧЕ &ТекущийВнешнийПользователь | КОНЕЦ | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ | ВЫБОР | КОГДА &ТекущийВнешнийПользователь = ЗНАЧЕНИЕ(Справочник.ВнешниеПользователи.ПустаяСсылка) | ТОГДА &ГрупаВсеПользователи | ИНАЧЕ &ГрупаВсеВнешниеПользователи | КОНЕЦ | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ | ГруппыВнешнихПользователейСостав.ВнешнийПользователь | ИЗ | Справочник.ГруппыВнешнихПользователей.Состав КАК ГруппыВнешнихПользователейСостав | ГДЕ | ВЫБОР | КОГДА &ТекущийВнешнийПользователь = ЗНАЧЕНИЕ(Справочник.ВнешниеПользователи.ПустаяСсылка) | ТОГДА ЛОЖЬ | ИНАЧЕ ГруппыВнешнихПользователейСостав.ВнешнийПользователь = &ТекущийВнешнийПользователь | КОНЕЦ | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ | ВЫБОР | КОГДА &ТекущийВнешнийПользователь = ЗНАЧЕНИЕ(Справочник.ВнешниеПользователи.ПустаяСсылка) | ТОГДА ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) | ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ВнешниеПользователи.ПустаяСсылка) | КОНЕЦ | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ | ВЫБОР | КОГДА &ТекущийВнешнийПользователь = ЗНАЧЕНИЕ(Справочник.ВнешниеПользователи.ПустаяСсылка) | ТОГДА ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.ПустаяСсылка) | ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ГруппыВнешнихПользователей.ПустаяСсылка) | КОНЕЦ) КАК ВложенныйЗапрос | |УПОРЯДОЧИТЬ ПО | ВложенныйЗапрос.Адресация.Наименование"; Запрос.УстановитьПараметр("ТекущийВнешнийПользователь", ПараметрыСеанса.ТекущийВнешнийПользователь); Запрос.УстановитьПараметр("ТекущийПользователь", ПараметрыСеанса.ТекущийПользователь); Запрос.УстановитьПараметр("ГрупаВсеПользователи", Справочники.ГруппыПользователей.ВсеПользователи); Запрос.УстановитьПараметр("ГрупаВсеВнешниеПользователи", Справочники.ГруппыВнешнихПользователей.ВсеВнешниеПользователи); Массив = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Адресация"); ПараметрыСеанса.МассивДоступаПоАдресации = Новый ФиксированныйМассив(Массив); // КБС - доработка системы RLS // ---------------------------------------------------------------------------------------------------------- // // КБС - исправление ошибки в типовой // КБС - по сколько в процедуре инициирутся все три параметра вне зависимости от переданого имени - запишем в массив все 3 варианта // УстановленныеПараметры.Добавить("ТекущийПользователь"); УстановленныеПараметры.Добавить("МассивДоступаПоАдресации"); // КБС - доработка системы RLS УстановленныеПараметры.Добавить("ТекущийВнешнийПользователь"); КонецПроцедуры 7. Модуль «УправлениеДоступом», изменение одной процедуры и добавление одной Процедура УстановитьПараметрыСеансаОграниченияДоступа(ИмяПараметра, УстановленныеПараметры) Экспорт УстановитьПривилегированныйРежим(Истина); Если НЕ ( Лев(ИмяПараметра, СтрДлина("ОграничиватьДоступПоВиду")) = "ОграничиватьДоступПоВиду" ИЛИ Лев(ИмяПараметра, СтрДлина("ВидыДоступа")) = "ВидыДоступа" ИЛИ Лев(ИмяПараметра, СтрДлина("МассивДоступаПоВиду")) = "МассивДоступаПоВиду" // КБС - доработка системы RLS ИЛИ ИмяПараметра = "ДобавлятьРуководителямДоступПодчиненных" ) Тогда Возврат; КонецЕсли; Если НЕ Константы.ОграничиватьДоступНаУровнеЗаписей.Получить() Тогда // Для корректной работы препроцессора в ограничениях доступа, требуется инициализации всех // параметров сеанса, которые могут быть востребованы в работе препроцессора. Если ИмяПараметра = "ВидыДоступаЕдинственныеДляТипаЗначенияДоступа" ИЛИ ИмяПараметра = "ВидыДоступаБезГруппЗначенияДоступа" Тогда ПараметрыСеанса[ИмяПараметра] = Новый ФиксированныйМассив(Новый Массив); // ИначеЕсли ИмяПараметра = "ДобавлятьРуководителямДоступПодчиненных" Тогда ПараметрыСеанса[ИмяПараметра] = Ложь; Иначе ПараметрыСеанса[ИмяПараметра] = ""; КонецЕсли; УстановленныеПараметры.Добавить(ИмяПараметра); Возврат; КонецЕсли; ПараметрыСеанса.ДобавлятьРуководителямДоступПодчиненных = Константы.ДобавлятьРуководителямДоступПодчиненных.Получить(); УстановленныеПараметры.Добавить("ДобавлятьРуководителямДоступПодчиненных"); // Следующие виды доступа не самостоятельные, // поэтому не учитываются при расчете необходимости ограничения в целом. // В стандартных шаблонах проверка по этим видам доступа всегда выполняется, // а в препроцессоре проверка использования не выполнятся. ПараметрыСеанса.ОграничиватьДоступПоВидуУсловие = ""; ПараметрыСеанса.ОграничиватьДоступПоВидуОбъект = ""; УстановленныеПараметры.Добавить("ОграничиватьДоступПоВидуУсловие"); УстановленныеПараметры.Добавить("ОграничиватьДоступПоВидуОбъект"); Запрос = Новый Запрос( "ВЫБРАТЬ РАЗЛИЧНЫЕ | ВидыДоступаПрофилейГруппДоступа.ВидДоступа |ИЗ | Справочник.ПрофилиГруппДоступа.ВидыДоступа КАК ВидыДоступаПрофилейГруппДоступа | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа КАК ГруппыДоступа | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ПользователиИГруппыПользователей | ПО (ПользователиИГруппыПользователей.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка)) | И (ПользователиИГруппыПользователей.ЗначениеДоступа = &ТекущийПользователь) | И (ПользователиИГруппыПользователей.ТолькоВидДоступа = ЛОЖЬ) | И (ПользователиИГруппыПользователей.ГруппаДоступа = ГруппыДоступаПользователи.Пользователь) | ПО ГруппыДоступа.Ссылка = ГруппыДоступаПользователи.Ссылка | И ((НЕ ГруппыДоступа.ПометкаУдаления)) | ПО (ГруппыДоступа.Профиль = ВидыДоступаПрофилейГруппДоступа.Ссылка) | И ((НЕ ВидыДоступаПрофилейГруппДоступа.Ссылка.ПометкаУдаления))"); Запрос.УстановитьПараметр("ТекущийПользователь", ?(ЗначениеЗаполнено(ПараметрыСеанса.ТекущийПользователь), ПараметрыСеанса.ТекущийПользователь, ПараметрыСеанса.ТекущийВнешнийПользователь)); ОграничиваемыеВидыДоступа = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("ВидДоступа"); Запрос = Новый Запрос( "ВЫБРАТЬ | ВидыДоступа.Ссылка КАК ВидДоступа |ИЗ | ПланВидовХарактеристик.ВидыДоступа КАК ВидыДоступа |ГДЕ | ВидыДоступа.Предопределенный"); Выборка = Запрос.Выполнить().Выбрать(); КаждыйВидЕдинственный = Истина; КаждыйВидБезГрупп = Истина; ВидыДоступаБезОграничения = Новый Массив; ВидыДоступаЕдинственныеДляТипаЗначенияДоступа = Новый Массив; ВидыДоступаБезГруппЗначенияДоступа = Новый Массив; ВидыДоступаЧерезПраваПоЗначениямДоступа = Новый Массив; МассивАльтернативныхRLS = Новый Массив; // КБС - доработка системы RLS Пока Выборка.Следующий() Цикл СвойстваВидаДоступа = СвойстваВидаДоступа(Выборка.ВидДоступа); Если СвойстваВидаДоступа.ВидДоступаИспользуетсяВсегда Тогда // Такие виды доступа не самостоятельные, поэтому не учитываются при расчете // необходимости ограничения в целом. // В стандартных шаблонах проверка по этим видам доступа всегда выполняется, // а в препроцессоре проверка использования не выполнятся. ОписаниеВидаДоступа = ""; ИначеЕсли НЕ СвойстваВидаДоступа.ВидДоступаИспользуется Тогда ОписаниеВидаДоступа = ""; ВидыДоступаБезОграничения.Добавить(Выборка.ВидДоступа); ИначеЕсли ОграничиваемыеВидыДоступа.Найти(Выборка.ВидДоступа) = Неопределено Тогда ОписаниеВидаДоступа = ""; ВидыДоступаБезОграничения.Добавить(Выборка.ВидДоступа); ИначеЕсли СвойстваВидаДоступа.ВидДоступаЧерезПраваПоЗначениямДоступа Тогда ОписаниеВидаДоступа = "ЧерезПраваПоЗначениямДоступа"; ВидыДоступаЧерезПраваПоЗначениямДоступа.Добавить(Выборка.ВидДоступа); Иначе Если СвойстваВидаДоступа.ВидДоступаЕдинственныйДляТипаЗначенияДоступа Тогда ОписаниеВидаДоступа = "ЕдинственныйВид, "; ВидыДоступаЕдинственныеДляТипаЗначенияДоступа.Добавить(Выборка.ВидДоступа); Иначе ОписаниеВидаДоступа = "ОдинИзМногихВидов,"; КаждыйВидЕдинственный = Ложь; КонецЕсли; Если СвойстваВидаДоступа.ВидДоступаБезГруппЗначенияДоступа Тогда ОписаниеГрупп = "БезГрупп"; ВидыДоступаБезГруппЗначенияДоступа.Добавить(Выборка.ВидДоступа); Иначе ОписаниеГрупп = ?(СвойстваВидаДоступа.ВидДоступаСОднойГруппойЗначенияДоступа, "ОднаГруппа", "МножествоГрупп"); КаждыйВидБезГрупп = Ложь; КонецЕсли; ОписаниеВидаДоступа = ОписаниеВидаДоступа + ОписаниеГрупп; КонецЕсли; ИмяВидаДоступа = ПланыВидовХарактеристик.ВидыДоступа.ПолучитьИмяПредопределенного(Выборка.ВидДоступа); ПараметрыСеанса["ОграничиватьДоступПоВиду" + ИмяВидаДоступа] = ОписаниеВидаДоступа; УстановленныеПараметры.Добавить("ОграничиватьДоступПоВиду" + ИмяВидаДоступа); ПараметрыСеанса["МассивДоступаПоВиду" + ИмяВидаДоступа] = Новый ФиксированныйМассив(Новый Массив); // КБС - доработка системы RLS Если СвойстваВидаДоступа.АльтернативноеRLS Тогда // КБС - доработка системы RLS МассивАльтернативныхRLS.Добавить(СвойстваВидаДоступа); // КБС - доработка системы RLS КонецЕсли; // КБС - доработка системы RLS УстановленныеПараметры.Добавить("МассивДоступаПоВиду" + ИмяВидаДоступа); // КБС - доработка системы RLS КонецЦикла; ПараметрыСеанса.ВидыДоступаБезОграничения = Новый ФиксированныйМассив(ВидыДоступаБезОграничения); УстановленныеПараметры.Добавить("ВидыДоступаБезОграничения"); ПараметрыСеанса.ВидыДоступаЕдинственныеДляТипаЗначенияДоступа = Новый ФиксированныйМассив(ВидыДоступаЕдинственныеДляТипаЗначенияДоступа); УстановленныеПараметры.Добавить("ВидыДоступаЕдинственныеДляТипаЗначенияДоступа"); ПараметрыСеанса.ВидыДоступаБезГруппЗначенияДоступа = Новый ФиксированныйМассив(ВидыДоступаБезГруппЗначенияДоступа); УстановленныеПараметры.Добавить("ВидыДоступаБезГруппЗначенияДоступа"); ПараметрыСеанса.ВидыДоступаЧерезПраваПоЗначениямДоступа = ?(ВидыДоступаЧерезПраваПоЗначениямДоступа.Количество() = 0, "", Новый ФиксированныйМассив(ВидыДоступаЧерезПраваПоЗначениямДоступа)); УстановленныеПараметры.Добавить("ВидыДоступаЧерезПраваПоЗначениямДоступа"); Если КаждыйВидЕдинственный И КаждыйВидБезГрупп Тогда ПараметрыСеанса.ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп"; ИначеЕсли КаждыйВидЕдинственный Тогда ПараметрыСеанса.ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный"; ИначеЕсли КаждыйВидБезГрупп Тогда ПараметрыСеанса.ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп"; Иначе ПараметрыСеанса.ОграничиватьДоступПоВиду = "Да"; КонецЕсли; УстановленныеПараметры.Добавить("ОграничиватьДоступПоВиду"); // альтернативные RLS должны заполняться после установленых всех других параметров // КБС - доработка системы RLS Для Каждого СвойстваВидаДоступа из МассивАльтернативныхRLS Цикл // КБС - доработка системы RLS ЗаполнитьПараметрАльтернативногоДоступа(СвойстваВидаДоступа); // КБС - доработка системы RLS КонецЦикла; // КБС - доработка системы RLS КонецПроцедуры // УстановитьПараметрыСеансаОграниченияДоступа() //------------------------------------------------------------------------------------------- // КБС - доработка системы RLS // // процедура альтернативного RLS // процедура заполняет параметры сеанса // Процедура ЗаполнитьПараметрАльтернативногоДоступа(СвойстваВидаДоступа) Если (не СвойстваВидаДоступа.АльтернативноеRLS) ИЛИ СвойстваВидаДоступа.ВидДоступаИспользуетсяВсегда Тогда // ВидДоступаИспользуетсяВсегда - не совместим с альтернативной схемой, он используется для прав вне объектов Возврат; КонецЕсли; Если не СвойстваВидаДоступа.ВидДоступаИспользуется Тогда Возврат; КонецЕсли; ИмяВидаДоступа = ПланыВидовХарактеристик.ВидыДоступа.ПолучитьИмяПредопределенного(СвойстваВидаДоступа.ВидДоступа); Массив = Новый Массив; // добавим пустое значение нужного типа, это означает что если у объекта не заполнено значение значит доступ разрешен всем Массив.Добавить(СвойстваВидаДоступа.ВидДоступа.ТипЗначения.ПривестиЗначение(Неопределено)); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ВложенныйЗапрос.Профиль КАК Профиль, | ВложенныйЗапрос.ГруппаДоступа, | ВложенныйЗапрос.ВидДоступа, | ВложенныйЗапрос.ДоступРазрешен КАК ДоступРазрешен, | ВложенныйЗапрос.ПредустановленыйВПрофиле, | ЕСТЬNULL(ВЫБОР | КОГДА ВложенныйЗапрос.ПредустановленыйВПрофиле | ТОГДА ПрофилиГруппДоступаЗначенияДоступа.ЗначениеДоступа | ИНАЧЕ ГруппыДоступаЗначенияДоступа.ЗначениеДоступа | КОНЕЦ, НЕОПРЕДЕЛЕНО) КАК ЗначениеДоступа |ИЗ | (ВЫБРАТЬ | ПрофилиИГруппыДоступа.ГруппаДоступа КАК ГруппаДоступа, | ПрофилиИГруппыДоступа.Профиль КАК Профиль, | ЕСТЬNULL(ВЫБОР | КОГДА ЕСТЬNULL(ПрофилиИГруппыДоступа.ПредустановленныйПрофиль, ЛОЖЬ) | ТОГДА ПрофилиИГруппыДоступа.ВидДоступаПрофиль | ИНАЧЕ ПрофилиИГруппыДоступа.ВидДоступаГруппа | КОНЕЦ, ПрофилиИГруппыДоступа.ВидДоступаПрофиль) КАК ВидДоступа, | ЕСТЬNULL(ВЫБОР | КОГДА ЕСТЬNULL(ПрофилиИГруппыДоступа.ПредустановленныйПрофиль, ЛОЖЬ) | &nb |
|||
7
SuperMario
29.11.11
✎
08:50
|
(3) Сейчас смотрю типовую УПП. Там есть, что тебе нужно.
#Если &ИспользоватьОграничениеПоНоменклатура #Тогда ТекущаяТаблица ИЗ Справочник.Номенклатура КАК ТекущаяТаблица ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ СоставГруппы.Ссылка КАК ГруппаПользователей ИЗ Справочник.ГруппыПользователей.ПользователиГруппы КАК СоставГруппы ГДЕ СоставГруппы.Пользователь = &ТекущийПользователь) КАК ГруппыПользователей ПО (ИСТИНА) ГДЕ (НЕ ГруппыПользователей.ГруппаПользователей ЕСТЬ NULL ) И (НЕ 1 В (ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.НазначениеВидовОбъектовДоступа КАК НазначениеВидовОбъектовДоступа ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПравДоступаПользователей КАК НастройкиПравДоступаПользователей ПО (НастройкиПравДоступаПользователей.ОбъектДоступа = ТекущаяТаблица.Родитель ИЛИ НастройкиПравДоступаПользователей.ОбъектДоступа = ТекущаяТаблица.Ссылка) И НастройкиПравДоступаПользователей.ВидОбъектаДоступа = НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа И НастройкиПравДоступаПользователей.ОбластьДанных = ЗНАЧЕНИЕ(Перечисление.ОбластиДанныхОбъектовДоступа.ПустаяСсылка) И НастройкиПравДоступаПользователей.Пользователь = ГруппыПользователей.ГруппаПользователей ГДЕ НазначениеВидовОбъектовДоступа.ГруппаПользователей = ГруппыПользователей.ГруппаПользователей И НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Номенклатура) И НастройкиПравДоступаПользователей.ОбъектДоступа ЕСТЬ NULL )) #КонецЕсли Обрати внимание на ПО (НастройкиПравДоступаПользователей.ОбъектДоступа = ТекущаяТаблица.Родитель ИЛИ НастройкиПравДоступаПользователей.ОбъектДоступа = ТекущаяТаблица.Ссылка) Регистр НазначениеВидовОбъектовДоступа при RLS на номенклатуру хитро строится. |
|||
8
MatrosoV AleXXXand_R
29.11.11
✎
09:54
|
||||
9
MatrosoV AleXXXand_R
29.11.11
✎
09:55
|
Сделал почти по аналогии как в (7)
#Если &ИспользоватьОграничениеПоНоменклатура #Тогда ТекущаяТаблица ИЗ #ТекущаяТаблица КАК ТекущаяТаблица ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ТекущаяТаблица.Ссылка ИЗ Справочник.Номенклатура КАК ТекущаяТаблица ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ СоставГруппы.Ссылка КАК ГруппаПользователей ИЗ Справочник.ГруппыПользователей.ПользователиГруппы КАК СоставГруппы ГДЕ СоставГруппы.Пользователь = &ТекущийПользователь) КАК ГруппыПользователей ПО (ИСТИНА) ГДЕ (НЕ ГруппыПользователей.ГруппаПользователей ЕСТЬ NULL ) И (НЕ 1 В (ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.НазначениеВидовОбъектовДоступа КАК НазначениеВидовОбъектовДоступа ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПравДоступаПользователей КАК НастройкиПравДоступаПользователей ПО (НастройкиПравДоступаПользователей.ОбъектДоступа = ТекущаяТаблица.Родитель ИЛИ НастройкиПравДоступаПользователей.ОбъектДоступа = ТекущаяТаблица.Ссылка) И НастройкиПравДоступаПользователей.ВидОбъектаДоступа = НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа И НастройкиПравДоступаПользователей.ОбластьДанных = ЗНАЧЕНИЕ(Перечисление.ОбластиДанныхОбъектовДоступа.ПустаяСсылка) И НастройкиПравДоступаПользователей.Пользователь = ГруппыПользователей.ГруппаПользователей ГДЕ НазначениеВидовОбъектовДоступа.ГруппаПользователей = ГруппыПользователей.ГруппаПользователей И НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Номенклатура) И НастройкиПравДоступаПользователей.ОбъектДоступа ЕСТЬ NULL ))) КАК ТаблицаДоступныхГрупп ПО ТекущаяТаблица.Родитель = ТаблицаДоступныхГрупп.Ссылка ИЛИ ТекущаяТаблица.Ссылка = ТаблицаДоступныхГрупп.Ссылка Проверил, работает #КонецЕсли |
|||
10
MatrosoV AleXXXand_R
29.11.11
✎
09:57
|
Может кто подскажет - можно ли через RLS запретить перенос элемента из группы, к которой есть доступ, в группу, к которой доступа нет?
Или это только дорабатывать программно? |
|||
11
Фрэнки
29.11.11
✎
10:03
|
(10) если условие поставлено правильно, то запрет будет
|
|||
12
MatrosoV AleXXXand_R
29.11.11
✎
10:05
|
(11) Условие на что?
Сейчас в неразрешенную папку элемент добавить вручную нельзя, а перенести можно |
|||
13
Фрэнки
29.11.11
✎
10:08
|
(12) но там же несколько пунктов.
зы. а вместо условий с иерархией можно поставить фиксированный массив при начале сеанса - сравнивать на простое вхождение в список. Но в конечном итоге, все это приведет к снижению скорости. |
|||
14
MatrosoV AleXXXand_R
29.11.11
✎
10:10
|
(13) А если другие пользователи добавят подгруппу или элементы в эту группу во время сеанса работы пользователя?
|
|||
15
Фрэнки
29.11.11
✎
10:17
|
(14) логично, что она будет недоступной и потому подобные манипуляции придется совершать в монопольном режиме. тем более, что и обычные манипуляции поверх RLS в типовых рекомендуются в монопольных режимах
|
|||
16
MatrosoV AleXXXand_R
29.11.11
✎
10:57
|
Фрэнки согласен с тобой, у меня в чем-то косяк - элементы можно перенести только из корня разршенной группы, из подгруппы не переносятся
|
|||
17
MatrosoV AleXXXand_R
29.11.11
✎
10:58
|
Подскажите - на какое право смотреть - на Добавление или на Изменение?
|
|||
18
MatrosoV AleXXXand_R
29.11.11
✎
11:08
|
Поправил
|
|||
19
SuperMario
29.11.11
✎
11:11
|
(10) я так понимаю, что если к группе доступ на чтение запрещен, то пользователь просто ее не сможет выбрать. Или все-таки группы просматриваются?
|
|||
20
MatrosoV AleXXXand_R
29.11.11
✎
11:14
|
(19) Сейчас работает все так, как и планировал изначально :)
У пользователя есть права на просмотр и чтение всего справочника, а редактирование и добавление элементов только в определенной группе и его подгруппах, и перенос элементов из этой группы невозможен |
|||
21
SuperMario
29.11.11
✎
11:42
|
(20) Что-то я просмотрел в (0) что ты на добавление делаешь ограничение. Зачем?
На запись нужно. Там не важно для каких элементов - RLS все будет контролить. Ошибка записи сама юзеру вывалит, что он не прав. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |