ЗаменитьПраваВНастройкахПравОбъектов (БСП)

Автор: 1С
ОбщийМодуль.УправлениеДоступом
БСП

Заменить права настройках прав объектов. Заменяет права, используемые в настройках прав объектов.

// Заменяет права, используемые в настройках прав объектов.
// После выполнения замены будет выполнено обновление вспомогательных данных
// регистра сведений НастройкиПравОбъектов, поэтому следует вызвать
// процедуру однократно, чтобы не снижать производительность.
// 
// Параметры:
//  ТаблицаПереименований - ТаблицаЗначений - с колонками:
//    * ТипВладельцев - Ссылка - пустая ссылка типа владельца прав из описания типов
//                      ВладелецНастроекПрав, например пустая ссылка справочника ПапкиФайлов.
//    * СтароеИмя     - Строка - старое имя права, относящееся к указанному типу владельцев.
//    * НовоеИмя      - Строка - новое  имя права, относящееся к указанному типу владельцев.
//                      Если указана пустая строка, настройка старого права будет удалена.
//                      Если старому имени поставлены в соответствие два новых имени,
//                      тогда одна старая настройка будет размножена в две новых.
//  
Процедура ЗаменитьПраваВНастройкахПравОбъектов(ТаблицаПереименований) Экспорт
	
	// АПК:96-выкл: допустимо, так как строки не должны повторятся и это разовая операция в обработчике обновления.
	Запрос = Новый Запрос;
	Запрос.Параметры.Вставить("ТаблицаПереименований", ТаблицаПереименований);
	Запрос.Текст =
	"ВЫБРАТЬ
	|	ТаблицаПереименований.ТипВладельцев,
	|	ТаблицаПереименований.СтароеИмя,
	|	ТаблицаПереименований.НовоеИмя
	|ПОМЕСТИТЬ ТаблицаПереименований
	|ИЗ
	|	&ТаблицаПереименований КАК ТаблицаПереименований
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	НастройкиПрав.Объект,
	|	НастройкиПрав.Пользователь,
	|	НастройкиПрав.Право,
	|	МАКСИМУМ(НастройкиПрав.ПравоЗапрещено) КАК ПравоЗапрещено,
	|	МАКСИМУМ(НастройкиПрав.НаследованиеРазрешено) КАК НаследованиеРазрешено,
	|	МАКСИМУМ(НастройкиПрав.ПорядокНастройки) КАК ПорядокНастройки
	|ПОМЕСТИТЬ СтарыеНастройкиПрав
	|ИЗ
	|	РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
	|
	|СГРУППИРОВАТЬ ПО
	|	НастройкиПрав.Объект,
	|	НастройкиПрав.Пользователь,
	|	НастройкиПрав.Право
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	СтарыеНастройкиПрав.Объект,
	|	СтарыеНастройкиПрав.Пользователь,
	|	ТаблицаПереименований.СтароеИмя,
	|	ТаблицаПереименований.НовоеИмя,
	|	СтарыеНастройкиПрав.ПравоЗапрещено,
	|	СтарыеНастройкиПрав.НаследованиеРазрешено,
	|	СтарыеНастройкиПрав.ПорядокНастройки
	|ПОМЕСТИТЬ НастройкиПрав
	|ИЗ
	|	СтарыеНастройкиПрав КАК СтарыеНастройкиПрав
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаПереименований КАК ТаблицаПереименований
	|		ПО (ТИПЗНАЧЕНИЯ(СтарыеНастройкиПрав.Объект) = ТИПЗНАЧЕНИЯ(ТаблицаПереименований.ТипВладельцев))
	|			И СтарыеНастройкиПрав.Право = ТаблицаПереименований.СтароеИмя
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	НастройкиПрав.НовоеИмя
	|ИЗ
	|	НастройкиПрав КАК НастройкиПрав
	|
	|СГРУППИРОВАТЬ ПО
	|	НастройкиПрав.Объект,
	|	НастройкиПрав.Пользователь,
	|	НастройкиПрав.НовоеИмя
	|
	|ИМЕЮЩИЕ
	|	НастройкиПрав.НовоеИмя <> """" И
	|	КОЛИЧЕСТВО(НастройкиПрав.НовоеИмя) > 1
	|
	|ОБЪЕДИНИТЬ
	|
	|ВЫБРАТЬ
	|	НастройкиПрав.НовоеИмя
	|ИЗ
	|	НастройкиПрав КАК НастройкиПрав
	|		ЛЕВОЕ СОЕДИНЕНИЕ СтарыеНастройкиПрав КАК СтарыеНастройкиПрав
	|		ПО НастройкиПрав.Объект = СтарыеНастройкиПрав.Объект
	|			И НастройкиПрав.Пользователь = СтарыеНастройкиПрав.Пользователь
	|			И НастройкиПрав.НовоеИмя = СтарыеНастройкиПрав.Право
	|ГДЕ
	|	НЕ СтарыеНастройкиПрав.Право ЕСТЬ NULL 
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	НастройкиПрав.Объект,
	|	НастройкиПрав.Пользователь,
	|	НастройкиПрав.СтароеИмя,
	|	НастройкиПрав.НовоеИмя,
	|	НастройкиПрав.ПравоЗапрещено,
	|	НастройкиПрав.НаследованиеРазрешено,
	|	НастройкиПрав.ПорядокНастройки
	|ИЗ
	|	НастройкиПрав КАК НастройкиПрав";
	// АПК:96-вкл: допустимо, так как строки не должны повторятся и это разовая операция в обработчике обновления.
	
	Блокировка = Новый БлокировкаДанных;
	Блокировка.Добавить("РегистрСведений.НастройкиПравОбъектов");
	
	НачатьТранзакцию();
	Попытка
		Блокировка.Заблокировать();
		РезультатыЗапроса = Запрос.ВыполнитьПакет();
		
		ПовторяющиесяНовыеИмена = РезультатыЗапроса[РезультатыЗапроса.Количество()-2].Выгрузить();
		
		Если ПовторяющиесяНовыеИмена.Количество() > 0 Тогда
			ПовторяющиесяНовыеИменаПрав = "";
			Для каждого Строка Из ПовторяющиесяНовыеИмена Цикл
				ПовторяющиесяНовыеИменаПрав = ПовторяющиесяНовыеИменаПрав
					+ ?(ЗначениеЗаполнено(ПовторяющиесяНовыеИменаПрав), "," + Символы.ПС, "")
					+ Строка.НовоеИмя;
			КонецЦикла;
			ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Ошибка в параметрах процедуры ЗаменитьПраваВНастройкахПравОбъектов
				           |общего модуля УправлениеДоступом.
				           |
				           |После обновления будут повторяться настройки следующих новых имен прав:
				           |%1.'"),
				ПовторяющиесяНовыеИменаПрав);
		КонецЕсли;
		
		ТаблицаЗамены = РезультатыЗапроса[РезультатыЗапроса.Количество()-1].Выгрузить();
		
		НаборЗаписей = РегистрыСведений.НастройкиПравОбъектов.СоздатьНаборЗаписей();
		
		ОбновлениеИБ = ОбновлениеИнформационнойБазы.ВыполняетсяОбновлениеИнформационнойБазы()
		           Или ОбновлениеИнформационнойБазы.ЭтоВызовИзОбработчикаОбновления();
		
		Для каждого Строка Из ТаблицаЗамены Цикл
			НаборЗаписей.Отбор.Объект.Установить(Строка.Объект);
			НаборЗаписей.Отбор.Пользователь.Установить(Строка.Пользователь);
			НаборЗаписей.Отбор.Право.Установить(Строка.СтароеИмя);
			НаборЗаписей.Прочитать();
			Если НаборЗаписей.Количество() > 0 Тогда
				НаборЗаписей.Очистить();
				Если ОбновлениеИБ Тогда
					ОбновлениеИнформационнойБазы.ЗаписатьДанные(НаборЗаписей);
				Иначе
					НаборЗаписей.Записать();
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
		
		НоваяЗапись = НаборЗаписей.Добавить();
		Для каждого Строка Из ТаблицаЗамены Цикл
			Если Строка.НовоеИмя = "" Тогда
				Продолжить;
			КонецЕсли;
			НаборЗаписей.Отбор.Объект.Установить(Строка.Объект);
			НаборЗаписей.Отбор.Пользователь.Установить(Строка.Пользователь);
			НаборЗаписей.Отбор.Право.Установить(Строка.НовоеИмя);
			ЗаполнитьЗначенияСвойств(НоваяЗапись, Строка);
			НоваяЗапись.Право = Строка.НовоеИмя;
			Если ОбновлениеИБ Тогда
				ОбновлениеИнформационнойБазы.ЗаписатьДанные(НаборЗаписей);
			Иначе
				НаборЗаписей.Записать();
			КонецЕсли;
		КонецЦикла;
		
		РегистрыСведений.НастройкиПравОбъектов.ОбновитьВспомогательныеДанныеРегистра();
		ЗафиксироватьТранзакцию();
	Исключение
		ОтменитьТранзакцию();
		ВызватьИсключение;
	КонецПопытки;
	
КонецПроцедуры

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

Рекомендации

Похожие публикации

ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов (БСП)

ТаблицаЗаменыПравВНастройкахПравОбъектов (БСП)

ВозможныеПраваДляНастройкиПравОбъектов (БСП)

ПравилаРегистрацииОбъекта (БСП)

ЕстьПравоДоступаКОбъекту (БСП)

ЕстьПраво (БСП)

TurboConf 6 - расширение Конфигуратора 1С