Имя: Пароль:
1C
1С v8
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
понял. все хочу курсы почитать по оптимизации.