Слетают права доступа RLS пользователя в РИБ. УНФ 1.6
По непонятной причине в базе РИБ УНФ слетают права пользователя после обмена, при котором приходят изменения конфигурации.
Проявлялось это в том, что пользователь при входе в базу не видел заказов покупателей по своей организации. Был найден способ, чтобы вручную «лечить» эту проблему — включать пользователя в группу полного доступа к заказам покупателей и потом исключать.
Но чинить после каждого обмена было неудобно. Хотя пользователей на филиале было и немного, но это требовало времени.
Разбираться с причинами ошибки тоже не хотелось — можно было бы потратить много времени и не найти причины.
Посмотрел, что добавление или удаление пользователя в группы доступа осуществляется в общей форме ПраваДоступа.
По сути, в ней осуществляется перезапись элементов справочников ГруппыДоступа, в которые добавляются или исключаются пользователи.
На всякий случай создал две процедуры, чтобы проверить, какая из них работает:
Функция ПерезаписатьПраваПользователейБазы() Экспорт //Для проверки в консоли: дор_Сервер.ПерезаписатьПраваПользователейБазы() УстановитьПривилегированныйРежим(Истина); З = Новый Запрос( "ВЫБРАТЬ | Пользователи.Ссылка КАК Ссылка |ИЗ | Справочник.Пользователи КАК Пользователи |ГДЕ | НЕ Пользователи.ПометкаУдаления | И НЕ Пользователи.Недействителен" ); Выборка = З.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл ОО = Выборка.Ссылка.ПолучитьОбъект(); Если ОО = Неопределено Тогда Продолжить; КонецЕсли; ОО.Записать(); КонецЦикла; Возврат истина; КонецФункции Функция ПерезаписатьГруппыДоступаПользователейБазы() Экспорт //Для проверки в консоли: дор_Сервер.ПерезаписатьГруппыДоступаПользователейБазы() УстановитьПривилегированныйРежим(Истина); З = Новый Запрос( "ВЫБРАТЬ | Т.Ссылка КАК Ссылка |ИЗ | Справочник.ГруппыДоступа КАК Т |ГДЕ | НЕ Т.ПометкаУдаления" ); Выборка = З.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл ОО = Выборка.Ссылка.ПолучитьОбъект(); Если ОО = Неопределено Тогда Продолжить; КонецЕсли; ОО.Записать(); КонецЦикла; Возврат истина; КонецФункции
Посмотрел, какая процедура вызывается после обмена и включил туда вызов перезаписи пользователей для подчиненного узла РИБ. Расширяем модуль ОбменДаннымиСервер:
&После("ВыполнитьОбменДаннымиПоСценариюОбменаДанными") Процедура дор_ВыполнитьОбменДаннымиПоСценариюОбменаДанными(Отказ, НастройкаВыполненияОбмена, НомерСтроки) Если НЕ Отказ Тогда //Для РИБ перезаписываем пользователей Если ОбменДаннымиСервер.ЭтоПодчиненныйУзелРИБ() Тогда дор_Сервер.ПерезаписатьПраваПользователейБазы(); КонецЕсли; КонецЕсли; КонецПроцедуры
Также создал команду, чтобы пользователь мог вызвать перезапись сам:
&НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) Если НЕ дор_Сервер.ЭтоПодчиненныйУзелРИБ() Тогда ПоказатьПредупреждение(,"Команда только для подчиненных узлов РИБ!"); Возврат; КонецЕсли; Если дор_Сервер.ПерезаписатьПраваПользователейБазы() Тогда ПоказатьПредупреждение(,"Пользователи перезаписаны, перезайдите под собой!"); Иначе ПоказатьПредупреждение(,"Пользователи не перезаписаны!"); КонецЕсли; КонецПроцедуры
Осталось только проверить на подчиненном узле РИБ, какая из двух команд восстановит RLS права пользователя:
Посмотрел, перезапись пользователей помогает, так что перезапись групп доступа не пробовал.
Среда: 1.6.27.167. Платформа: 8.3.20.1838 Объем: 1.5 час.
Свежие комментарии