Имя: Пароль:
1C
1С v8
1С УПП RLS Склады и подразделения в док. ПеремещениеТоваров. Не работает.
0 golden-pack
 
15.01.14
09:22
1С 8.2 УПП

RLS включен по складам и подразделениям(+ еще по многим другим, но это не имеет отношения к вопросу).

Документ: ПеремещениеТоваров

Пользователь. Роль: Кладовщик (только в роли кладовщик есть права на чтение документа Перемещение товаров). На право чтение есть ограничение (RLS запрос) по организации, подразделению и складу.

Пользователю назначено две группы пользователя: "ГруппаПоПодразделениям" - все склады запрещены и разрешено одно подразделение <ОсновноеПодразделение> и "ГруппаПоСкладам" - все подразделения запрешены и разрешен один склад "ОсновнойСклад".

Далее по логике типовой конфигурации - "Если пользователь входит в несколько групп, то его права на уровне записей объединяются по всем группам. То есть права разных групп суммируются по логическому условию "ИЛИ"."

Есть документ по подразделению - ОсновноеПодразделение и складу - Основной склад. Так вот пользователь не видит этот документ (право чтение) - т.е. не видит не в списке документов, из других источников ссылающихся на этот документ - <Объект не найден ...>.

Относительно проверки - те ли подразделения и склады заданы, тот ли документ смотрите в той ли базе, точно ничего не натупили - ответ - все проверено, также в программе УПП работает 100 активных пользователей с разграниченными права, есть еще КА, БП с большим колчеством пользователей с разграниченными правами - все работает, проблема возникла только в данном конкретном случае.

---------------------

Запрос RLS на право чтение из роли кладовщик для документа "ПеремещениеТоваров":

---------------------
#Если &ИспользоватьОграничениеПоОрганизации ИЛИ &ИспользоватьОграничениеПоПодразделения ИЛИ &ИспользоватьОграничениеПоСклады #Тогда
ТекущаяТаблица
ИЗ
    #ТекущаяТаблица КАК ТекущаяТаблица
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
            СоставГруппы.Ссылка КАК ГруппаПользователей
        ИЗ
            Справочник.ГруппыПользователей.ПользователиГруппы КАК СоставГруппы
        ГДЕ
            СоставГруппы.Пользователь = &ТекущийПользователь) КАК ГруппыПользователей
        ПО (ИСТИНА)
ГДЕ
НЕ ГруппыПользователей.ГруппаПользователей ЕСТЬ NULL
И
    (НЕ 1 В
                (ВЫБРАТЬ ПЕРВЫЕ 1
                    1
                ИЗ
                    РегистрСведений.НазначениеВидовОбъектовДоступа КАК НазначениеВидовОбъектовДоступа
                                        
                    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПравДоступаПользователей КАК НастройкиПравДоступаПользователей
                        ПО
                            ВЫБОР
                                    
                                    #Если &ИспользоватьОграничениеПоОрганизации #Тогда
                                    КОГДА НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Организации)
                                        ТОГДА НастройкиПравДоступаПользователей.ОбъектДоступа = ТекущаяТаблица.Организация
                                    #КонецЕсли
                                    
                                    #Если &ИспользоватьОграничениеПоПодразделения #Тогда
                                    КОГДА НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Подразделения)
                                        ТОГДА НастройкиПравДоступаПользователей.ОбъектДоступа = ТекущаяТаблица.Подразделение
                                    #КонецЕсли
                                    
                                    #Если &ИспользоватьОграничениеПоСклады #Тогда
                                    КОГДА НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Склады)
                                        ТОГДА НастройкиПравДоступаПользователей.ОбъектДоступа В (ТекущаяТаблица.СкладОтправитель, ТекущаяТаблица.СкладПолучатель)
                                    #КонецЕсли
                            
                                КОНЕЦ
                                И НастройкиПравДоступаПользователей.ВидОбъектаДоступа = НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа
                                И НастройкиПравДоступаПользователей.ОбластьДанных = ЗНАЧЕНИЕ(Перечисление.ОбластиДанныхОбъектовДоступа.ПустаяСсылка)
                                                                                                
                                И НастройкиПравДоступаПользователей.Пользователь = ГруппыПользователей.ГруппаПользователей
                ГДЕ                
                     НазначениеВидовОбъектовДоступа.ГруппаПользователей = ГруппыПользователей.ГруппаПользователей
                           И НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа В (
                                                                                  ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.ПустаяСсылка)
                                                                                                                                                                  
                                                                                  #Если &ИспользоватьОграничениеПоОрганизации #Тогда
                                                                                  , ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Организации)
                                                                                  #КонецЕсли
                                                                                  
                                                                                  #Если &ИспользоватьОграничениеПоПодразделения #Тогда
                                                                                  , ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Подразделения)
                                                                                  #КонецЕсли
                                                                                  
                                                                                  #Если &ИспользоватьОграничениеПоСклады #Тогда
                                                                                  , ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Склады)
                                                                                  #КонецЕсли
                                                                                  
                                                                                  )
                
                    И НастройкиПравДоступаПользователей.ОбъектДоступа ЕСТЬ NULL))
#КонецЕсли


----------------------------

Запрос очень бородат - из-за условия НЕ 1 В ().

Для отладки RLS запрос был переписан запрос на это:

---------------------
ВЫБРАТЬ
    ТекущаяТаблица.Ссылка
ИЗ
    Документ.ПеремещениеТоваров КАК ТекущаяТаблица
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
            СоставГруппы.Ссылка КАК ГруппаПользователей
        ИЗ
            Справочник.ГруппыПользователей.ПользователиГруппы КАК СоставГруппы
        ГДЕ
            СоставГруппы.Пользователь = &ТекущийПользователь) КАК ГруппыПользователей
        ПО (ИСТИНА)
ГДЕ
    НЕ ГруппыПользователей.ГруппаПользователей ЕСТЬ NULL
    И ТекущаяТаблица.Ссылка = &ДокПеремещниеТоваров
    И НЕ 1 В
            (ВЫБРАТЬ ПЕРВЫЕ 1
                1
            ИЗ
                РегистрСведений.НазначениеВидовОбъектовДоступа КАК НазначениеВидовОбъектовДоступа ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПравДоступаПользователей КАК НастройкиПравДоступаПользователей
                    ПО
                        ВЫБОР
                                КОГДА НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Подразделения)
                                    ТОГДА НастройкиПравДоступаПользователей.ОбъектДоступа = ТекущаяТаблица.Подразделение
                                КОГДА НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Склады)
                                    ТОГДА НастройкиПравДоступаПользователей.ОбъектДоступа В (ТекущаяТаблица.СкладОтправитель, ТекущаяТаблица.СкладПолучатель)
                            КОНЕЦ
                            И НастройкиПравДоступаПользователей.ВидОбъектаДоступа = НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа
                            И НастройкиПравДоступаПользователей.ОбластьДанных = ЗНАЧЕНИЕ(Перечисление.ОбластиДанныхОбъектовДоступа.ПустаяСсылка)
                            И НастройкиПравДоступаПользователей.Пользователь = ГруппыПользователей.ГруппаПользователей
            ГДЕ
                НазначениеВидовОбъектовДоступа.ГруппаПользователей = ГруппыПользователей.ГруппаПользователей
                И НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа В (ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.ПустаяСсылка), ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Подразделения), ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Склады))
                И НастройкиПравДоступаПользователей.ОбъектДоступа ЕСТЬ NULL )

------------------------

Далее условие, которое "...1 НЕ 1 В( " было переписано на это:

------------------------

ВЫБРАТЬ
    НазначениеВидовОбъектовДоступа.ГруппаПользователей,
    НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа,
    НастройкиПравДоступаПользователей.ОбъектДоступа,
    НастройкиПравДоступаПользователей.ВидОбъектаДоступа КАК ВидОбъектаДоступа1,
    НастройкиПравДоступаПользователей.ОбластьДанных,
    НастройкиПравДоступаПользователей.Пользователь,
    НастройкиПравДоступаПользователей.ВладелецПравДоступа,
    НастройкиПравДоступаПользователей.НаследованаОтВсеПользователи,
    НастройкиПравДоступаПользователей.Чтение,
    НастройкиПравДоступаПользователей.Запись,
    НастройкиПравДоступаПользователей.ВидНаследованияПравДоступаИерархическихСправочников
ИЗ
    РегистрСведений.НазначениеВидовОбъектовДоступа КАК НазначениеВидовОбъектовДоступа
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПравДоступаПользователей КАК НастройкиПравДоступаПользователей
        ПО (НастройкиПравДоступаПользователей.ВидОбъектаДоступа = НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа)
            И (ВЫБОР
                КОГДА НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Подразделения)
                    ТОГДА НастройкиПравДоступаПользователей.ОбъектДоступа = &Подразделение
                КОГДА НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Склады)
                    ТОГДА НастройкиПравДоступаПользователей.ОбъектДоступа В (&СкладОтправитель, &СкладПолучатель)
            КОНЕЦ)
            И (НастройкиПравДоступаПользователей.ОбластьДанных = ЗНАЧЕНИЕ(Перечисление.ОбластиДанныхОбъектовДоступа.ПустаяСсылка))
            И (НастройкиПравДоступаПользователей.Пользователь = &ГруппаПользователей1
                ИЛИ НастройкиПравДоступаПользователей.Пользователь = &ГруппаПользователей2 ИЛИ НастройкиПравДоступаПользователей.Пользователь = &ГруппаПользователей3)
ГДЕ
    (НазначениеВидовОбъектовДоступа.ГруппаПользователей = &ГруппаПользователей1
            ИЛИ НазначениеВидовОбъектовДоступа.ГруппаПользователей = &ГруппаПользователей2 ИЛИ НазначениеВидовОбъектовДоступа.ГруппаПользователей = &ГруппаПользователей3)
    И НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа В (ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.ПустаяСсылка), ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Подразделения), ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Склады))
    И НастройкиПравДоступаПользователей.ОбъектДоступа ЕСТЬ NULL

------------------------

И вот в этом условие все отрабатывает корректно.

Вся проблема в запросе RLS в условиях "НастройкиПравДоступаПользователей.Пользователь = ГруппыПользователей.ГруппаПользователей" и "НазначениеВидовОбъектовДоступа.ГруппаПользователей = ГруппыПользователей.ГруппаПользователей
"

Здесь по логике настройки прав доступа - должно отрабатывать условие или на все роли текущего пользователя, однако этого не проиcходит.

Сейчас релиз платформы 8.2.19.76 - раньше таких ошибок замечено не было (однако группы пользователей таких способом тоже не рагзграничались), возможно эта версия платформы по другому формирует текст запрос в запрос SQL. Всмотритесь внимательно в условие запроса RLS.


Вопрос - сталкивался ли кто-нибудь с этой проблемой ?
1 Apokalipsec
 
15.01.14
09:34
потому что выбрать ПЕРВЫЕ 1 - одна запись с обрезанным доступом к  подразделению/складу, ага.
2 golden-pack
 
15.01.14
09:43
(1) Нет. Смысл условия сводится к тому - если запрос ничего не возвращает тогда - RLS право чтение разрешается
3 golden-pack
 
15.01.14
09:44
(1) тут вопрос как этот бородатейший запрос в SQL преобразуется.
4 Apokalipsec
 
15.01.14
10:01
(3) Возьми профайлер и посмотри.
(2) черепашка.
AdBlock убивает бесплатный контент. 1Сергей