|
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) черепашка. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |