Слетают права доступа RLS пользователя в РИБ. УНФ 1.6

По непонятной причине в базе РИБ УНФ слетают права пользователя после обмена, при котором приходят изменения конфигурации.

Проявлялось это в том, что пользователь при входе в базу не видел заказов покупателей по своей организации. Был найден способ, чтобы вручную «лечить» эту проблему — включать пользователя в группу полного доступа к заказам покупателей и потом исключать.

Но чинить после каждого обмена было неудобно. Хотя пользователей на филиале было и немного, но это требовало времени.

Разбираться с причинами ошибки тоже не хотелось — можно было бы потратить много времени и не найти причины.

Посмотрел, что добавление или удаление пользователя в группы доступа осуществляется в общей форме ПраваДоступа.

По сути, в ней осуществляется перезапись элементов справочников ГруппыДоступа, в которые добавляются или исключаются пользователи.

На всякий случай создал две процедуры, чтобы проверить, какая из них работает:

Функция ПерезаписатьПраваПользователейБазы() Экспорт  
	//Для проверки в консоли: дор_Сервер.ПерезаписатьПраваПользователейБазы()
	
	УстановитьПривилегированныйРежим(Истина);
	З = Новый Запрос(
	"ВЫБРАТЬ
	|	Пользователи.Ссылка КАК Ссылка
	|ИЗ
	|	Справочник.Пользователи КАК Пользователи
	|ГДЕ
	|	НЕ Пользователи.ПометкаУдаления
	|	И НЕ Пользователи.Недействителен"
	);      
	Выборка = З.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		ОО = Выборка.Ссылка.ПолучитьОбъект();
		Если ОО = Неопределено Тогда
			Продолжить;
		КонецЕсли;     
		ОО.Записать();
	КонецЦикла;     
	
	Возврат истина;
КонецФункции   

Функция ПерезаписатьГруппыДоступаПользователейБазы() Экспорт  
	//Для проверки в консоли: дор_Сервер.ПерезаписатьГруппыДоступаПользователейБазы()
	
	УстановитьПривилегированныйРежим(Истина);
	З = Новый Запрос(
	"ВЫБРАТЬ
	|	Т.Ссылка КАК Ссылка
	|ИЗ
	|	Справочник.ГруппыДоступа КАК Т
	|ГДЕ
	|	НЕ Т.ПометкаУдаления"
	);     
	
	Выборка = З.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		ОО = Выборка.Ссылка.ПолучитьОбъект();
		Если ОО = Неопределено Тогда
			Продолжить;
		КонецЕсли;     
		ОО.Записать();
	КонецЦикла;     
	
	Возврат истина;
КонецФункции


Посмотрел, какая процедура вызывается после обмена и включил туда вызов перезаписи пользователей для подчиненного узла РИБ. Расширяем модуль ОбменДаннымиСервер:

&После("ВыполнитьОбменДаннымиПоСценариюОбменаДанными")
Процедура дор_ВыполнитьОбменДаннымиПоСценариюОбменаДанными(Отказ, НастройкаВыполненияОбмена, НомерСтроки)
	Если НЕ Отказ Тогда
		//Для РИБ перезаписываем пользователей
		Если ОбменДаннымиСервер.ЭтоПодчиненныйУзелРИБ() Тогда
			дор_Сервер.ПерезаписатьПраваПользователейБазы();
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

Также создал команду, чтобы пользователь мог вызвать перезапись сам:


&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
	Если НЕ дор_Сервер.ЭтоПодчиненныйУзелРИБ() Тогда
		ПоказатьПредупреждение(,"Команда только для подчиненных узлов РИБ!");
		Возврат;
	КонецЕсли;

	Если дор_Сервер.ПерезаписатьПраваПользователейБазы() Тогда
		ПоказатьПредупреждение(,"Пользователи перезаписаны, перезайдите под собой!");
	Иначе
		ПоказатьПредупреждение(,"Пользователи не перезаписаны!");
	КонецЕсли;
КонецПроцедуры

Осталось только проверить на подчиненном узле РИБ, какая из двух команд восстановит RLS права пользователя:

Посмотрел, перезапись пользователей помогает, так что перезапись групп доступа не пробовал.

Среда: 1.6.27.167. Платформа: 8.3.20.1838 Объем: 1.5 час.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *