![]() |
|
RLS Нет настройки прав - дай ко всему справочнику доступ | ☑ | ||
---|---|---|---|---|
0
Homer
17.11.15
✎
09:26
|
Чего-то голову сломал как без пакета запросов дать доступ ко всему справочнику если в регистре "Настройки пользователя" нет строки. а если есть, то дать только к этому справочнику.
|
|||
1
vde69
17.11.15
✎
09:29
|
как пакет запросов связан с РЛС ???
в рельсе нельзя использовать пакеты и даже ВТ в пакете запросов невозможно влиять на рельсу... обьясни подробнее чего хотел>? |
|||
2
Homer
17.11.15
✎
09:30
|
на сколько я знаю пакет запросов нельзя использовать в RLS/
|
|||
3
vde69
17.11.15
✎
09:33
|
(2) левое соединение и условие:
где естьNull(регистрнастройки.значение, истина) = истина |
|||
4
DrLekter
17.11.15
✎
09:35
|
Использую такой шаблон:
#Параметр(1) ГДЕ (НЕ "#Параметр(1)" В (&СправочникиСОграниченнымДоступом) ИЛИ "#Параметр(1)" В (&СправочникиСОграниченнымДоступом) И (&ВыбранныеОбъектыРазрешены И #Параметр(1).Ссылка В (&ОбъектыДоступа) ИЛИ НЕ &ВыбранныеОбъектыРазрешены И НЕ #Параметр(1).Ссылка В (&ОбъектыДоступа))) СправочникиСОграниченнымДоступом - Параметр сеанса, который заполняется на старте. Если конкретный справочник туда не входит, условие превращается в Истину. Дальше еще усложнение за счет того, что доступ использую в две стороны - либо запрещение, либо разрешение конкретных объектов. Вам важна только первая часть. |
|||
5
Homer
17.11.15
✎
09:41
|
(2)
Есть Справочник, на нем ограничение. Твой вариант как сюда прикрутить? // уатКолонны ИЗ РегистрСведений.НастройкиПользователей КАК НастройкиПользователей ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.уатКолонны КАК уатКолонны ПО НастройкиПользователей.Значение.Ссылка = уатКолонны.Ссылка ГДЕ НастройкиПользователей.Пользователь = &ТекущийПользователь // (4) Сейчас гляну |
|||
6
vde69
17.11.15
✎
09:41
|
я использую такие шаблоны (автору будет полезно):
// ----------------------------------------------------------- // шаблон к торговым документам // Параметры // 1. Имя реквизита Сделка или для доступа по регистру "документы по сделки" // 2. Имя реквизита Склад1 // 3. Имя реквизита Склад2 // 4. Имя реквизита ЦФО // 5. Зарезервировано // 6. Дополнительное ИЛИ условие (например "ЭтоГруппа") // // все параметры могут быть пустыми ТекущаяТаблица ИЗ #ТекущаяТаблица КАК ТекущаяТаблица #Если ("#Параметр(1)" = "") и &ИспользоватьОграниченияПравДоступаНаУровнеЗаписей #Тогда // основной вид доступа по сделке для документов не имеющих реквизита сделка (реквизит в ТЧ) ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДокументыПоСделке КАК ДокументыПоСделке ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ДоступПоСделкам КАК ДоступПоСделкам ПО (ДоступПоСделкам.Сделка = ДокументыПоСделке.Сделка) ПО (ДокументыПоСделке.Регистратор = ТекущаяТаблица.Ссылка) #ИначеЕсли ("#Параметр(1)" <> "") и &ИспользоватьОграниченияПравДоступаНаУровнеЗаписей #Тогда // основной вид доступа по сделке по реквизиту ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДоступПоСделкам КАК ДоступПоСделкам ПО ТекущаяТаблица.#Параметр(1) = ДоступПоСделкам.Сделка #КонецЕсли ГДЕ (НЕ &ИспользоватьОграниченияПравДоступаНаУровнеЗаписей ИЛИ &ИспользоватьОграниченияПравДоступаНаУровнеЗаписей И ( // основной вид доступа по сделки #Если "#Параметр(1)" <> "" #Тогда (ЕСТЬNULL(ДоступПоСделкам.Пользователь, &ТекущийПользователь) В (&RLS_ДоступныеОтделы)) #Иначе ЛОЖЬ #КонецЕсли // дополнительный вид доступа по складу, перекрывает доступ по сделке #Если "#Параметр(2)" <> "" #Тогда ИЛИ ТекущаяТаблица.#Параметр(2) В (&RLS_ДоступныеСклады) #КонецЕсли #Если "#Параметр(3)" <> "" #Тогда ИЛИ ТекущаяТаблица.#Параметр(3) В (&RLS_ДоступныеСклады) #КонецЕсли // дополнительный вид доступа по документам без доступа по сделкам, но с ЦФО #Если "#Параметр(1)" = "" и "#Параметр(4)" <> "" #Тогда ИЛИ ТекущаяТаблица.#Параметр(4) В (&RLS_ДоступныеЦФО) #КонецЕсли // зарезервированый параметр #Если "#Параметр(5)" <> "" #Тогда #КонецЕсли // текстовое условие #Если "#Параметр(6)" <> "" #Тогда ИЛИ #Параметр(6) #КонецЕсли )) |
|||
7
vde69
17.11.15
✎
09:43
|
(6) звездочка сьелась :) найдите ее :)
|
|||
8
Homer
17.11.15
✎
09:43
|
я вот так придумал. ну как то стремно))
ВЫБРАТЬ уатКолонны.Ссылка ИЗ Справочник.уатКолонны КАК уатКолонны ГДЕ 0 В (ВЫБРАТЬ КОЛИЧЕСТВО(РАЗЛИЧНЫЕ уатКолонны.Ссылка) КАК Ссылка ИЗ Справочник.уатКолонны КАК уатКолонны ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПользователей КАК НастройкиПользователей ПО НастройкиПользователей.Значение.Ссылка = уатКолонны.Ссылка И НастройкиПользователей.Пользователь = &ТекущийПользователь И НастройкиПользователей.Значение ССЫЛКА Справочник.уатКолонны) ОБЪЕДИНИТЬ ВЫБРАТЬ уатКолонны.Ссылка ИЗ Справочник.уатКолонны КАК уатКолонны ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПользователей КАК НастройкиПользователей ПО (НастройкиПользователей.Значение.Ссылка = уатКолонны.Ссылка) И (НастройкиПользователей.Пользователь = &ТекущийПользователь) И (НастройкиПользователей.Значение ССЫЛКА Справочник.уатКолонны) |
|||
9
vde69
17.11.15
✎
09:52
|
что-то типа этого надо:
уатКолонны ИЗ РегистрСведений.НастройкиПользователей КАК НастройкиПользователей левое СОЕДИНЕНИЕ Справочник.уатКолонны КАК уатКолонны ПО НастройкиПользователей.Значение.Ссылка = уатКолонны.Ссылка и НастройкиПользователей.Пользователь = &ТекущийПользователь где выбор когда НастройкиПользователей.Значение есть null тогда истина когда НастройкиПользователей.Значение = уатКолонны.Ссылка тогда истина иначе ложь конец выбора |
|||
10
vde69
17.11.15
✎
09:53
|
(9) точнее так
уатКолонны ИЗ РегистрСведений.НастройкиПользователей КАК НастройкиПользователей левое СОЕДИНЕНИЕ Справочник.уатКолонны КАК уатКолонны ПО НастройкиПользователей.Значение ССЫЛКА Справочник.уатКолонны и НастройкиПользователей.Пользователь = &ТекущийПользователь где выбор когда НастройкиПользователей.Значение есть null тогда истина когда естьnull(НастройкиПользователей.Значение,"") = уатКолонны.Ссылка тогда истина иначе ложь конец выбора |
|||
11
Homer
17.11.15
✎
09:55
|
(10) НЕ работает. я уже все перепробовал ))
|
|||
12
vde69
17.11.15
✎
09:57
|
(11) работает, если напишешь как у меня в (10) подправив синтаксис
|
|||
13
Homer
17.11.15
✎
09:57
|
ВЫБРАТЬ
уатКолонны.Ссылка ИЗ РегистрСведений.НастройкиПользователей КАК НастройкиПользователей ЛЕВОЕ СОЕДИНЕНИЕ Справочник.уатКолонны КАК уатКолонны ПО (НастройкиПользователей.Значение ССЫЛКА Справочник.уатКолонны) И (НастройкиПользователей.Пользователь = &ТекущийПользователь) ГДЕ ВЫБОР КОГДА НастройкиПользователей.Значение ЕСТЬ NULL ТОГДА ИСТИНА КОГДА ЕСТЬNULL(НастройкиПользователей.Значение, "") = уатКолонны.Ссылка ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ |
|||
14
vde69
17.11.15
✎
09:58
|
(12)+
я взял ЛЕВОЕ соединение, и условие по пользователю перенес из "где" в "по" |
|||
15
Homer
17.11.15
✎
09:58
|
так?
|
|||
16
Homer
17.11.15
✎
09:59
|
ВЫБРАТЬ
уатКолонны.Ссылка ИЗ РегистрСведений.НастройкиПользователей КАК НастройкиПользователей ЛЕВОЕ СОЕДИНЕНИЕ Справочник.уатКолонны КАК уатКолонны ПО (НастройкиПользователей.Значение ССЫЛКА Справочник.уатКолонны) И (НастройкиПользователей.Пользователь = &ТекущийПользователь) И (ВЫБОР КОГДА НастройкиПользователей.Значение ЕСТЬ NULL ТОГДА ИСТИНА КОГДА ЕСТЬNULL(НастройкиПользователей.Значение, "") = уатКолонны.Ссылка ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ) |
|||
17
vde69
17.11.15
✎
10:00
|
(15) нет не так, перепутна лево и право, правильно так
ВЫБРАТЬ уатКолонны.Ссылка ИЗ РегистрСведений.НастройкиПользователей КАК НастройкиПользователей правое СОЕДИНЕНИЕ Справочник.уатКолонны КАК уатКолонны ПО (НастройкиПользователей.Значение ССЫЛКА Справочник.уатКолонны) И (НастройкиПользователей.Пользователь = &ТекущийПользователь) ГДЕ ВЫБОР КОГДА НастройкиПользователей.Значение ЕСТЬ NULL ТОГДА ИСТИНА КОГДА ЕСТЬNULL(НастройкиПользователей.Значение, "") = уатКолонны.Ссылка ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ |
|||
18
Homer
17.11.15
✎
10:01
|
(17) не работает))
|
|||
19
Homer
17.11.15
✎
10:02
|
я "час" убил, перепробовав всякие дебильные соединения.
|
|||
20
vde69
17.11.15
✎
10:03
|
должно работать, проверь в консоли
смысл такой выбираем все элементы справочника и проверяем, если есть настройка в регистре - используем ее, если нет - то берем все элементы.... хотя может не работать если в справочнике есть иерархия (любая) |
|||
21
Homer
17.11.15
✎
10:04
|
я смотрю в консоли. не работает!
|
|||
22
Homer
17.11.15
✎
10:05
|
в регистре нет вообще строки если у пользователя нет колонны
|
|||
23
vde69
17.11.15
✎
10:05
|
в консоли выполни только этот кусок
ВЫБРАТЬ уатКолонны.Ссылка ИЗ РегистрСведений.НастройкиПользователей КАК НастройкиПользователей правое СОЕДИНЕНИЕ Справочник.уатКолонны КАК уатКолонны ПО (НастройкиПользователей.Значение ССЫЛКА Справочник.уатКолонны) И (НастройкиПользователей.Пользователь = &ТекущийПользователь) |
|||
24
Homer
17.11.15
✎
10:05
|
(22) ошибка
|
|||
25
Homer
17.11.15
✎
10:06
|
(23) показывает все колонны, даже если у пользователя есть колонна.
не правильно работает |
|||
26
vde69
17.11.15
✎
10:07
|
(25) замечательно... теперь добавь условие
ГДЕ ВЫБОР КОГДА НастройкиПользователей.Значение ЕСТЬ NULL ТОГДА ИСТИНА КОГДА ЕСТЬNULL(НастройкиПользователей.Значение, "") = уатКолонны.Ссылка ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ |
|||
27
Homer
17.11.15
✎
10:08
|
ВЫБРАТЬ
уатКолонны.Ссылка ИЗ РегистрСведений.НастройкиПользователей КАК НастройкиПользователей правое СОЕДИНЕНИЕ Справочник.уатКолонны КАК уатКолонны ПО (НастройкиПользователей.Значение ССЫЛКА Справочник.уатКолонны) И (НастройкиПользователей.Пользователь = &ТекущийПользователь) ГДЕ ВЫБОР КОГДА НастройкиПользователей.Значение ЕСТЬ NULL ТОГДА ИСТИНА КОГДА ЕСТЬNULL(НастройкиПользователей.Значение, "") = уатКолонны.Ссылка ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ Пусто |
|||
28
vde69
17.11.15
✎
10:11
|
выполни и смотри чего лежит в поле "значение" особенно обрати внимание на тип
ВЫБРАТЬ уатКолонны.Ссылка, НастройкиПользователей.Значение, НастройкиПользователей.Пользователь ИЗ РегистрСведений.НастройкиПользователей КАК НастройкиПользователей правое СОЕДИНЕНИЕ Справочник.уатКолонны КАК уатКолонны ПО (НастройкиПользователей.Значение ССЫЛКА Справочник.уатКолонны) И (НастройкиПользователей.Пользователь = &ТекущийПользователь) |
|||
29
vde69
17.11.15
✎
10:14
|
нашел ошибку... счас подумаю
|
|||
30
Homer
17.11.15
✎
10:16
|
ок я минут на 20 офф
|
|||
31
vde69
17.11.15
✎
10:18
|
вот это
НастройкиПользователей.Значение ССЫЛКА Справочник.уатКолонны нужно заменить на что-то типа этого НастройкиПользователей.Настройка = Значение(трататататата) |
|||
32
Homer
17.11.15
✎
10:49
|
(31) Если я уберу данное условие совсем то запрос также пуст!
|
|||
33
vde69
17.11.15
✎
10:58
|
(32) из запроса без условия ГДЕ см(28)
чему равны поля: НастройкиПользователей.Значение НастройкиПользователей.Пользователь НастройкиПользователей.Настройка |
|||
34
Homer
17.11.15
✎
11:15
|
в поле значение составной тип((
|
|||
35
Homer
17.11.15
✎
11:31
|
ВЫБРАТЬ
уатКолонны.Ссылка ИЗ Справочник.уатКолонны КАК уатКолонны ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПользователей КАК НастройкиПользователей ПО (НастройкиПользователей.Настройка = ЗНАЧЕНИЕ(ПланВидовХарактеристик.НастройкиПользователей.Колонна)) И (НастройкиПользователей.Пользователь = &ТекущийПользователь) ГДЕ ВЫБОР КОГДА НастройкиПользователей.Значение ССЫЛКА Справочник.уатКолонны И НастройкиПользователей.Значение = ЗНАЧЕНИЕ(Справочник.уатКолонны.ПустаяСсылка) ТОГДА ИСТИНА ИНАЧЕ НастройкиПользователей.Значение = уатКолонны.Ссылка КОНЕЦ |
|||
36
Homer
17.11.15
✎
11:31
|
(35) так работает
|
|||
37
vde69
17.11.15
✎
11:44
|
(34) вот по этому и не работало :)
(35) у тебя ошибочка есть, подумай, что будет если НастройкиПользователей.Значение будет отсутствовать (равно null), такие ситуации у тебя отбрасываются, а как я понял в таком случае нужно показывать весь справочник... |
|||
38
Homer
17.11.15
✎
11:47
|
(37) проверил все варианты. все гуд.
оставил правда вот такой вариант // ВЫБРАТЬ уатКолонны.Ссылка ИЗ Справочник.уатКолонны КАК уатКолонны ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПользователей КАК НастройкиПользователей ПО (НастройкиПользователей.Настройка = ЗНАЧЕНИЕ(ПланВидовХарактеристик.НастройкиПользователей.Колонна)) И (НастройкиПользователей.Пользователь = &ТекущийПользователь) ГДЕ ВЫБОР КОГДА НастройкиПользователей.Значение = ЗНАЧЕНИЕ(Справочник.уатКолонны.ПустаяСсылка) ТОГДА ИСТИНА ИНАЧЕ НастройкиПользователей.Значение = уатКолонны.Ссылка КОНЕЦ |
|||
39
vde69
17.11.15
✎
11:52
|
(38) если будет тормозить на реальной базе используй конструкции типа:
ИНАЧЕ выразить (НастройкиПользователей.Значение как Справочник.уатКолонны) = уатКолонны.Ссылка зы и про null не забывай, у тебя есть ошибка, если ты ее сейчас не видишь - это не значит, что ее нет.... |
|||
40
Homer
17.11.15
✎
11:54
|
ты хочешь что бы я
НастройкиПользователей.Значение заменил на ЕстьNull(НастройкиПользователей.Значение,"") |
|||
41
vde69
17.11.15
✎
11:56
|
(40) надо делать так
ВЫБРАТЬ уатКолонны.Ссылка ИЗ Справочник.уатКолонны КАК уатКолонны ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПользователей КАК НастройкиПользователей ПО (НастройкиПользователей.Настройка = ЗНАЧЕНИЕ(ПланВидовХарактеристик.НастройкиПользователей.Колонна)) И (НастройкиПользователей.Пользователь = &ТекущийПользователь) ГДЕ ВЫБОР КОГДА НастройкиПользователей.Значение есть null ТОГДА ИСТИНА КОГДА выразить (НастройкиПользователей.Значение как Справочник.уатКолонны) = ЗНАЧЕНИЕ(Справочник.уатКолонны.ПустаяСсылка) ТОГДА ИСТИНА ИНАЧЕ выразить (НастройкиПользователей.Значение как Справочник.уатКолонны) = уатКолонны.Ссылка КОНЕЦ |
|||
42
Homer
17.11.15
✎
12:00
|
а разве "Когда тогда" не дает тормозов?
|
|||
43
Homer
17.11.15
✎
12:01
|
больше условий больше торозов
|
|||
44
vde69
17.11.15
✎
12:09
|
условие накладывается по факту только на уже полученную выборку (на все элементы справочника уатКолонны), но при этом выполняются не обязательно все условия.
короче можешь испытать на скорость в рельсе (именно в рельсе, там нюансы есть в вызовах из динамических списков) все варианты, указанный в (41) должен показать скорость на порядок выше чем в (38) |
|||
45
vde69
17.11.15
✎
12:11
|
(44)+
вариант (38) будет приводить к джойнам с метаданными (большими джойнами, огромными) и в добавок он вообще не отрабатывает ситуации когда у пользователя настройка отсутствует в регистре |
|||
46
Homer
17.11.15
✎
12:32
|
понял. все хочу курсы почитать по оптимизации.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |