Имя: Пароль:
1C
 
Запросы RLS и быстродействие
0 Stim
 
20.11.15
12:17
Сильно ли я нагружу систему при открытии справочника договоры, если напишу запрос РЛС примерно такой:
ГДЕ Контрагент.Партнер.ОсновнойМенеджер.ТекущееПодразделение = &ТекущееПодразделение
Можно это как-то оптимизировать?
1 vde69
 
20.11.15
12:20
будет ппц.....

оптимизировать можно так

ГДЕ ТекущееПодразделение = &ТекущееПодразделение
2 Stim
 
20.11.15
12:22
(1) ппц.. вы так говорите, как будто не видели стандартных рлс-запросов
3 vde69
 
20.11.15
12:23
точнее так

ГДЕ ПодразделениеДляRLS в (&МассивПодразделений)


соответственно нужно добавить и заполнять реквизит ПодразделениеДляRLS

а МассивПодразделений должен быть как минимум из двух элементов, пустого и текущего
4 VikingKosmo
 
20.11.15
12:23
(0) нужно добавить еще выборок через многочисленные точки
5 vde69
 
20.11.15
12:24
(2) видел там жопа, но там такого ужаса как в (0) нет....
6 Гёдза
 
20.11.15
12:26
а сколько всего контрагентов? Если всего пару тыщ, то особой разницы нет
7 Stim
 
20.11.15
12:26
(5) есть еще варианты, тебе в копилку:

ГДЕ Партнер.ОсновнойМенеджер.ТекущееПодразделение В (ВЫБРАТЬ
                ЗначенияГруппДоступа.ЗначениеДоступа
            ИЗ
                РегистрСведений.ЗначенияГруппДоступа КАК ЗначенияГруппДоступа
            ГДЕ
                ЗначенияГруппДоступа.ГруппаДоступа В
                    (ВЫБРАТЬ
                        ГруппыДоступаПользователи.Ссылка
                    ИЗ
                        Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
                    ГДЕ
                        ГруппыДоступаПользователи.Пользователь = &ТекущийПользователь)
                И ЗначенияГруппДоступа.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Подразделения)
                И НЕ ЗначенияГруппДоступа.ТолькоВидДоступа    )
8 vde69
 
20.11.15
14:25
(7) тут нет большой ж... вложеный запрос  имеет статическое условие и будет закеширован (то есть выполнится 1 раз для каждого пакета рельсы, пакеты зависят от выборки, обычно 20-30 элементов на динамическом списке), а для отчета - вообще только 1 раз выполнится...

единственное - отсутствие индекса но для мелкой таблицы это нормально (а вложенный возвращает мелкую таблицу)

конечно можно было джойнить, но там реально можно попасть в фул скан, а тут сделали "понадежнее"

твой вариант на порядок хуже....
9 Stim
 
20.11.15
14:27
(8) предлагаешь добавить реквизит в справочники, его заполнять везде и по нему проверять? Ради одной роли?
10 Гёдза
 
20.11.15
14:29
(9) не проще ли попробовать?
11 vde69
 
20.11.15
14:29
(9) если не хочешь реквизит -

то ради одной роли можно сделать регистр сведений в которой прописать "Объект"+"Пользователь" = "Доступ", так в типовых делают... и в рельсе джойн.. только с типизацией в условии не лоханись, используй "выразить"
12 vde69
 
20.11.15
14:34
вот мой шаблон, сделка - это документ!!! работает хорошо!!!


// -----------------------------------------------------------
// шаблон к торговым документам
// Параметры
//   1. Имя реквизита Сделка или 0 для доступа по регистру "документы по сделки"
//   2. Имя реквизита Склад1
//   3. Имя реквизита Склад2
//   4. Имя реквизита ЦФО
//   5. Зарезервировано
//   6. Дополнительное ИЛИ условие (например "ЭтоГруппа")
//
// все параметры могут быть пустыми


ТекущаяТаблица ИЗ #ТекущаяТаблица КАК ТекущаяТаблица  

    #Если ("#Параметр(1)" = "0") и &ИспользоватьОграниченияПравДоступаНаУровнеЗаписей #Тогда
        // основной вид доступа по сделке для документов не имеющих реквизита сделка (реквизит в ТЧ)

        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДокументыПоСделке КАК ДокументыПоСделке
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ДоступПоСделкам КАК ДоступПоСделкам
            ПО (ДоступПоСделкам.Сделка = ДокументыПоСделке.Сделка)
        ПО (ДокументыПоСделке.Регистратор = ТекущаяТаблица.Ссылка)
            
    #ИначеЕсли ("#Параметр(1)" <> "") и &ИспользоватьОграниченияПравДоступаНаУровнеЗаписей #Тогда
        // основной вид доступа по сделке по реквизиту

        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДоступПоСделкам КАК ДоступПоСделкам
        ПО ТекущаяТаблица.#Параметр(1) = ДоступПоСделкам.Сделка
            
    #КонецЕсли
      
ГДЕ (НЕ &ИспользоватьОграниченияПравДоступаНаУровнеЗаписей
        ИЛИ &ИспользоватьОграниченияПравДоступаНаУровнеЗаписей
            И (
                        
            // основной вид доступа по сделки
            #Если "#Параметр(1)" <> "" #Тогда
                (ЕСТЬNULL(ДоступПоСделкам.Пользователь, &ТекущийПользователь) В (&RLS_ДоступныеОтделы))
            #Иначе
                ЛОЖЬ
            #КонецЕсли
        
            // дополнительный вид доступа по складу, перекрывает доступ по сделке
            #Если "#Параметр(2)" <> "" #Тогда
                ИЛИ ТекущаяТаблица.#Параметр(2) В (&RLS_ДоступныеСклады)
            #КонецЕсли

            #Если "#Параметр(3)" <> "" #Тогда
                ИЛИ ТекущаяТаблица.#Параметр(3) В (&RLS_ДоступныеСклады)
            #КонецЕсли
            
            // дополнительный вид доступа по документам без доступа по сделкам, но с ЦФО
            #Если "#Параметр(1)" = "" и "#Параметр(4)" <> "" #Тогда
                ИЛИ ТекущаяТаблица.#Параметр(4) В (&RLS_ДоступныеЦФО)
            #КонецЕсли

            // зарезервированый параметр
            #Если "#Параметр(5)" <> "" #Тогда
            #КонецЕсли
            
            // текстовое условие
            #Если "#Параметр(6)" <> "" #Тогда
                ИЛИ    #Параметр(6)    
            #КонецЕсли
        ))
13 Stim
 
20.11.15
14:38
(11) офигеть. добавить новый регистр, который заполнять 100500 значениями элементов доступа на каждого пользователя.
14 vde69
 
20.11.15
15:49
(13) есть такое понятие для СУБД как "денормализация", в твоем случае она оправдана...

почитай https://ru.wikipedia.org/wiki/Денормализация
15 Гёдза
 
20.11.15
16:02
кстати так и работает в УПП доступ по контрагентам