Имя: Пароль:
1C
1С v8
Ограничение доступа к контрагентам RLS
, ,
0 web_profiler
 
13.05.15
09:24
Не пинайте сильно, в нете инфы полно, но у меня возникают трудности с ролями, помогите.
Суть: создал из полных прав свою роль
создал регистр сведений Доступ к контрагентам (измерение-пользователь, ресурс - группа контрагентов)
Помогите, пожалуйста, составить шаблон ограничений, чтобы мой пользователь видел только свою группу
П.С. Обычное приложение, не пинайте - помогите
1 web_profiler
 
13.05.15
09:29
Хелп!
2 busy1
 
13.05.15
09:32
// ПоЗначениям ( Таблица, Право, Модификатор, В1,П1, В2,Р2, ...,  В(n), П(n)).
// №  параметра:       1,     2,           3,  4, 5,  6, 7, ..., 2+n*2,3+n*2 .
// Читается так: "ограничение доступа по значениям".
// Параметры:
//     Таблица -   Имя текущей таблицы, например "Документ.ПоступлениеТоваровИУслуг".
//     Право     - Одна из строк "Чтение", "Добавление", "Изменение", "Удаление".
//     Модификатор - изменяет шаблон.
//                 1-й модификтор - строка "НеОграничиватьДоступКГруппам" указывает
//                  безусловно выбирать группы иерархического справочника.
//                 Других модификаторов в этой версии шаблона не предусмотрено.
//     В(n)      - Вид доступа (имя предопределённого элемента ПланВидовХарактеристик.ВидыДоступа).
//                 Когда В(n) = "Условие" (или ""), тогда Р(n) содержит строку условия на языке запросов, например
//                  "Т.Автор = &ТекущийПользователь",
//                  "ТипЗначения(Т.Владелец) = Тип(Справочник.Организации)", где Т - псевдоним текущей таблицы.
//                 Если по объекту с таблицей Таблица будет выполняться запись наборов значений доступа,
//                  то условие должно проверять значения только из объекта и/или параметров сеанса, например, &ТекущийПользователь.
//                 Когда В(n) = "ПравоЧтения" ИЛИ "ПравоДобавления" ИЛИ "ПравоИзменения",
//                  выполняется проверка наличия права на таблицу значения Т.Р(n).
//     П(n)      - Поле значения, проверяемого по виду доступа, кроме случая В(n) = "Условие" (или "").
//  Примечение: максимальное количество одновременно проверяемых значений полей можно увеличить, изменив шаблон, но
// необходимо будет указывать все параметры шаблона, т.е. указывать пустые строки, когда количество полей меньше максимального.
//  Шаблон имеет структуру:
//     <Общая часть условий> <Условие по группе параметров 1> И <Условие по группе параметров 2> И ... <Условие по группе параметров(n)>
//  Пример:
//      ПоЗначениям("Документ.ПоступлениеТоваровИУслуг", "Чтение", "",
//      "Организации","Организация",
//      "Поставщики","Контрагент", "","", ...)
3 web_profiler
 
13.05.15
09:33
Пробую так:
Поля: Прочие поля
Ограничение доступа:

Контрагенты ИЗ РегистрСведений.КонтрагентыМенеджера КАК КонтрагентыМенеджера
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
    ПО КонтрагентыМенеджера.ГруппаКонтрагента = Контрагенты.Ссылка
ГДЕ КонтрагентыМенеджера.Менеджер = &ТекущийПользователь
4 busy1
 
13.05.15
09:33
Это справка! Там есть пример. Его можно изучить сделать что то подобное, попробовать, потом отписаться, что не получатся.
5 web_profiler
 
13.05.15
09:34
(2) это и обо всём
6 web_profiler
 
13.05.15
09:35
у меня не тривиальная, на первый взгяд, задачка, справочник список "Контрагенты" - ограничить видимость (доступ) и оставить только нужную группу контрагентов
7 Goggy
 
13.05.15
09:42
(6) Озвуч конфу и версию, может ты велосипед изобретаешь...
8 web_profiler
 
13.05.15
09:45
ут 10.3
9 web_profiler
 
13.05.15
09:47
там есть роль "МенеджерПоПродажам" у него ограничение доступа на уровне записей, но к сожалению при всех настройках видны пустые папки. Мне же необходимо видеть ТОЛЬКО конкретную папку менеджера
10 FIXXXL
 
13.05.15
09:53
(9) у контра есть реквизит ГруппаДоступа, он заполнен?
11 web_profiler
 
13.05.15
09:54
есть заполнен, но это неудобно - надо заходить в каждого контрагента у устанавливать ему группу доступа
12 web_profiler
 
13.05.15
09:56
я пошел другим путем - создал регистр сведений и у него измерение - пользователь, ресурс - группа контрагентов
Теперь хочу для пользователя ограничить по группе доступ
Контрагенты ИЗ РегистрСведений.КонтрагентыМенеджера КАК КонтрагентыМенеджера
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
    ПО КонтрагентыМенеджера.ГруппаКонтрагента = Контрагенты.Ссылка
ГДЕ КонтрагентыМенеджера.Менеджер = &ТекущийПользователь
13 FIXXXL
 
13.05.15
10:00
(11) сделай один раз обработкой, по Ответственному в документах к примеру

и немного допили момент записи нового контра: если пользователь только в одной группе - пиши ее, если в нескольких - кажи окно выбора групп
14 web_profiler
 
13.05.15
10:01
(13) не подходит, нужен функционал, который я описал
15 hhhh
 
13.05.15
10:13
(14) Расширение табличного поля списка справочника (Catalog list table box extension)
ПросмотрГруппИЭлементов (ViewFoldersAndItems)
Использование:

Чтение и запись.
Описание:

Тип: ИспользованиеГруппИЭлементов.
Управляет просмотром групп и элементов.

Доступность:

Толстый клиент.
Примечание:

Имеет смысл только для справочника с иерархией групп и элементов.
16 web_profiler
 
13.05.15
10:14
(15) в моем случае не подходит. ТОЛЬКО RLS
17 Fregat
 
13.05.15
10:28
В бухгалтерии 2.0 работает нечто подобное. Было реализовано следующим образом:

Создан регистр сведений с измерениями ГруппаКонтрагентов и Пользователь.

В доступной пользователю роле, в правах на чтение добавлено ограничение:

Поля: <Прочие поля>
Ограничение доступа:
Контрагенты ГДЕ (Контрагенты.Родитель В
                (ВЫБРАТЬ
                    ГруппыДоступаКонтрагентов.ГруппаКонтрагентов.Ссылка
                ИЗ
                    РегистрСведений.ГруппыДоступаКонтрагентов КАК ГруппыДоступаКонтрагентов
                ГДЕ
                    ГруппыДоступаКонтрагентов.Пользователь = &ТекущийПользователь)
            ИЛИ Контрагенты.Ссылка В
                (ВЫБРАТЬ
                    ГруппыДоступаКонтрагентов.ГруппаКонтрагентов.Ссылка
                ИЗ
                    РегистрСведений.ГруппыДоступаКонтрагентов КАК ГруппыДоступаКонтрагентов
                ГДЕ
                    ГруппыДоступаКонтрагентов.Пользователь = &ТекущийПользователь))
18 hhhh
 
13.05.15
10:30
(16) ну, делаешь (9) и убираешь папки через (15).
19 web_profiler
 
13.05.15
10:34
(18) а как скрыть пустые папки через "ПросмотрГруппИЭлементов" ?
20 web_profiler
 
13.05.15
10:43
(17) осталось ряд пустых групп в справочнике контрагентов и еще в отчетах выводится "объект не найден"
21 web_profiler
 
13.05.15
10:43
с продажами
22 web_profiler
 
13.05.15
10:44
(18) В базе будут одновременно работать пользователи и для каждого свои группы
23 web_profiler
 
13.05.15
10:44
так что ПросмотрГруппИЭлементов - не варитант
24 Сметанин
 
13.05.15
10:57
Контрагенты ИЗ Справочник.Контрагенты КАК Контрагенты
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ КонтрагентыМенеджера.ГруппаКонтрагента ИЗ
        РегистрСведений.КонтрагентыМенеджера КАК КонтрагентыМенеджера
ГДЕ КонтрагентыМенеджера.Менеджер = &ТекущийПользователь) КАК ВложенныйЗапрос
    ПО (Контрагенты.Ссылка = ВложенныйЗапрос.ГруппаКонтрагента.Родитель
            ИЛИ Контрагенты.Ссылка = ВложенныйЗапрос.ГруппаКонтрагента
            ИЛИ Контрагенты.Родитель = ВложенныйЗапрос.ГруппаКонтрагента
            ИЛИ Контрагенты.Родитель.Родитель = ВложенныйЗапрос.ГруппаКонтрагента
            ИЛИ Контрагенты.Родитель.Родитель.Родитель = ВложенныйЗапрос.ГруппаКонтрагента)
25 Fregat
 
13.05.15
10:58
(20) В РС необходимо занести только те группы контрагентов, которые должен видеть пользователь. Остальные будут недоступны посредством RLS.

Если элементы недоступны, то что же вы ожидаете увидеть в отчете кроме как <Объект не найден>?
26 Лефмихалыч
 
13.05.15
11:07
(24) внутреннее соединение с ВЫБРАТЬ в RLS не будет работать там, где пользователей больше 10, а контрагентов больше 1000.

1. Добавить параметр сеанса с типом ФиксированныйМассив.
2. При начале работы системы в этот фиксированный массив закладывать либо группы, либо прямо сразу ссылки на основании данных из регистра ДоступККонтрагентам
3. в РЛС фильтровать тупым ГДЕ Ссылка в (&ПараметрСеансаИзП1)
ну, или в иерархии - как там веселей будет кому
27 Лефмихалыч
 
13.05.15
11:08
+(26) можно при начале работы системы запузырить обработчик ожидания раз в 10 минут, чтобы обновлял фиксированный массив. Чтобы, значит, наверняка и железно
28 web_profiler
 
13.05.15
11:13
(26) помогите с кодом, все волосы повыдергивал, глаз дергаться начинает :)
29 web_profiler
 
13.05.15
11:15
Параметр сеанса "ГруппаКонтрагента" создал
30 web_profiler
 
13.05.15
11:16
В модуле сеанса, Процедура "УстановкаПараметровСеанса". Сюда надо загнать мою группу?
31 web_profiler
 
13.05.15
11:24
Процедура УстановкаПараметровСеанса()    

    ПараметрыСеанса.ОбщиеЗначения = Новый ХранилищеЗначения(Новый Структура);
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    КонтрагентыМенеджера.ГруппаКонтрагента
        |ИЗ
        |    РегистрСведений.КонтрагентыМенеджера КАК КонтрагентыМенеджера
        |ГДЕ
        |    КонтрагентыМенеджера.Менеджер = &Менеджер";
    
    Запрос.УстановитьПараметр("Менеджер", ПараметрыСеанса.ТекущийПользователь);
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    Мас = Новый Массив;    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        Мас.Добавить(ВыборкаДетальныеЗаписи.ГруппаКонтрагента);
    КонецЦикла;
    
    ПараметрыСеанса.ГруппаКонтрагента = Новый ФиксированныйМассив(Мас);
    ПолныеПрава.ОпределитьПараметрыСеансаДляОбменаДанными();
    
    ПолныеПрава.УстановитьПараметрыСеанса();
    
КонецПроцедуры // УстановкаПараметровСеанса
32 web_profiler
 
13.05.15
11:25
так чтоли?
33 web_profiler
 
13.05.15
11:26
неа не так, тут еще нет Текущего Пользователя
34 web_profiler
 
13.05.15
11:31
сделал, но эта зараза все равно пустые группы выводит
35 web_profiler
 
13.05.15
11:33
ПараметрыСеанса.ОбщиеЗначения = Новый ХранилищеЗначения(Новый Структура);
    
    ПолныеПрава.ОпределитьПараметрыСеансаДляОбменаДанными();
    
    ПолныеПрава.УстановитьПараметрыСеанса();
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    КонтрагентыМенеджера.ГруппаКонтрагента
        |ИЗ
        |    РегистрСведений.КонтрагентыМенеджера КАК КонтрагентыМенеджера
        |ГДЕ
        |    КонтрагентыМенеджера.Менеджер = &Менеджер";
    
    Запрос.УстановитьПараметр("Менеджер", ПараметрыСеанса.ТекущийПользователь);
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    Мас = Новый Массив;    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        Мас.Добавить(ВыборкаДетальныеЗаписи.ГруппаКонтрагента);
    КонецЦикла;
    
    ПараметрыСеанса.ГруппаКонтрагента = Новый ФиксированныйМассив(Мас);
36 web_profiler
 
13.05.15
11:36
Поля - Прочие поля
Ограничение доступа - ГДЕ Ссылка в (&ГруппаКонтрагента)

А как сделать В Иерархии  -  ругается, если пишу
ГДЕ Ссылка В ИЕРАРХИИ (&ГруппаКонтрагента)
37 web_profiler
 
13.05.15
12:35
Почему же, все-таки, не отрабатывает ГДЕ Ссылка В ИЕРАРХИИ (&ГруппаКонтрагента)?
38 web_profiler
 
13.05.15
18:05
а я сделал, вот так
спасибо, всем, кто помогал