Заменить права настройках прав объектов. Заменяет права, используемые в настройках прав объектов.
// Заменяет права, используемые в настройках прав объектов.
// После выполнения замены будет выполнено обновление вспомогательных данных
// регистра сведений НастройкиПравОбъектов, поэтому следует вызвать
// процедуру однократно, чтобы не снижать производительность.
//
// Параметры:
// ТаблицаПереименований - ТаблицаЗначений - с колонками:
// * ТипВладельцев - Ссылка - пустая ссылка типа владельца прав из описания типов
// ВладелецНастроекПрав, например пустая ссылка справочника ПапкиФайлов.
// * СтароеИмя - Строка - старое имя права, относящееся к указанному типу владельцев.
// * НовоеИмя - Строка - новое имя права, относящееся к указанному типу владельцев.
// Если указана пустая строка, настройка старого права будет удалена.
// Если старому имени поставлены в соответствие два новых имени,
// тогда одна старая настройка будет размножена в две новых.
//
Процедура ЗаменитьПраваВНастройкахПравОбъектов(ТаблицаПереименований) Экспорт
// АПК: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
///////////////////////////////////////////////////////////////////////////////////////////////////////
ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов (БСП)
ТаблицаЗаменыПравВНастройкахПравОбъектов (БСП)
ВозможныеПраваДляНастройкиПравОбъектов (БСП)
ПравилаРегистрацииОбъекта (БСП)
Канал FastCode 1C в Телеграм! Шаблоны кода, статьи, полезные советы, курсы по 1С (8К участников)