#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ПрограммныйИнтерфейс
#Область ДляВызоваИзДругихПодсистем
Функция РеквизитыНеРедактируемыеВГрупповойОбработке() Экспорт
НеРедактируемыеРеквизиты = Новый Массив;
НеРедактируемыеРеквизиты.Добавить("ИдентификаторПоставляемыхДанных");
НеРедактируемыеРеквизиты.Добавить("ПоставляемыйПрофильИзменен");
НеРедактируемыеРеквизиты.Добавить("ВидыДоступа.*");
НеРедактируемыеРеквизиты.Добавить("ЗначенияДоступа.*");
Возврат НеРедактируемыеРеквизиты;
КонецФункции
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
Ограничение.Текст =
"ПрисоединитьДополнительныеТаблицы
|ЭтотСписок КАК ПрофилиГруппДоступа
|
|ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа КАК ГруппыДоступа
| ПО ГруппыДоступа.Профиль = ПрофилиГруппДоступа.Ссылка
|;
|РазрешитьЧтениеИзменение
|ГДЕ
| ЭтоГруппа
| ИЛИ Ссылка <> Значение(Справочник.ПрофилиГруппДоступа.Администратор)
| И ЭтоАвторизованныйПользователь(ГруппыДоступа.Ответственный)";
КонецПроцедуры
Процедура ПередВыгрузкойОбъекта(Контейнер, МенеджерВыгрузкиОбъекта, Сериализатор, Объект, Артефакты, Отказ) Экспорт
УправлениеДоступомСлужебный.ПередВыгрузкойОбъекта(Контейнер, МенеджерВыгрузкиОбъекта, Сериализатор, Объект, Артефакты, Отказ);
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
Процедура ОбновитьОписаниеПоставляемыхПрофилей(ЕстьИзменения = Неопределено) Экспорт
УстановитьПривилегированныйРежим(Истина);
СвойстваСеанса = УправлениеДоступомСлужебныйПовтИсп.ОписаниеСвойствВидовДоступаСеанса().СвойстваСеанса;
НовоеЗначение = "";
ПроверенныеПоставляемыеПрофилиСеанса(СвойстваСеанса, НовоеЗначение);
НачатьТранзакцию();
Попытка
ЕстьТекущиеИзменения = Ложь;
СтандартныеПодсистемыСервер.ОбновитьПараметрРаботыПрограммы(
"СтандартныеПодсистемы.УправлениеДоступом.ОписаниеПоставляемыхПрофилей",
НовоеЗначение, ЕстьТекущиеИзменения);
СтандартныеПодсистемыСервер.ДобавитьИзмененияПараметраРаботыПрограммы(
"СтандартныеПодсистемы.УправлениеДоступом.ОписаниеПоставляемыхПрофилей",
?(ЕстьТекущиеИзменения,
Новый ФиксированнаяСтруктура("ЕстьИзменения", Истина),
Новый ФиксированнаяСтруктура()) );
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
Если ЕстьТекущиеИзменения Тогда
ЕстьИзменения = Истина;
КонецЕсли;
КонецПроцедуры
Процедура ОбновитьСоставПредопределенныхПрофилей(ЕстьИзменения = Неопределено) Экспорт
УстановитьПривилегированныйРежим(Истина);
ПредопределенныеПрофили = Метаданные.Справочники.ПрофилиГруппДоступа.ПолучитьИменаПредопределенных();
НачатьТранзакцию();
Попытка
Удаленные = Новый Массив;
ЕстьТекущиеИзменения = Ложь;
СтароеЗначение = Неопределено;
СтандартныеПодсистемыСервер.ОбновитьПараметрРаботыПрограммы(
"СтандартныеПодсистемы.УправлениеДоступом.ПредопределенныеПрофилиГруппДоступа",
ПредопределенныеПрофили, , СтароеЗначение);
Если Не ПредопределенныеПрофилиСовпадают(ПредопределенныеПрофили, СтароеЗначение, Удаленные) Тогда
ЕстьТекущиеИзменения = Истина;
КонецЕсли;
СтандартныеПодсистемыСервер.ДобавитьИзмененияПараметраРаботыПрограммы(
"СтандартныеПодсистемы.УправлениеДоступом.ПредопределенныеПрофилиГруппДоступа",
?(ЗначениеЗаполнено(Удаленные),
Новый ФиксированнаяСтруктура("Удаленные", Новый ФиксированныйМассив(Удаленные)),
Новый ФиксированнаяСтруктура()) );
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
Если ЕстьТекущиеИзменения Тогда
ЕстьИзменения = Истина;
КонецЕсли;
КонецПроцедуры
Процедура ОбновитьПоставляемыеПрофилиПоИзменениямКонфигурации() Экспорт
Кэш = УправлениеДоступомСлужебныйПовтИсп.ОписаниеПоставляемыхПрофилейСеанса();
НовоеЗначение = Кэш.ХешСумма;
УжеИзменен = Ложь;
ИмяПараметра = "СтандартныеПодсистемы.УправлениеДоступом.ОбновленныеПоставляемыеПрофили";
СтароеЗначение = СтандартныеПодсистемыСервер.ПараметрРаботыРасширения(ИмяПараметра, Истина, УжеИзменен);
Если СтароеЗначение = НовоеЗначение Тогда
Возврат;
КонецЕсли;
Удаленные = Новый Массив;
Если ОбновлениеИнформационнойБазы.ВыполняетсяОбновлениеИнформационнойБазы() Тогда
ПоследниеИзменения = СтандартныеПодсистемыСервер.ИзмененияПараметраРаботыПрограммы(
"СтандартныеПодсистемы.УправлениеДоступом.ПредопределенныеПрофилиГруппДоступа");
Если ПоследниеИзменения <> Неопределено Тогда
Для Каждого ЧастьИзменений Из ПоследниеИзменения Цикл
Если ТипЗнч(ЧастьИзменений) <> Тип("ФиксированнаяСтруктура") Тогда
Продолжить;
КонецЕсли;
ТекущаяЧастьИзменений = Новый Структура("Удаленные");
ЗаполнитьЗначенияСвойств(ТекущаяЧастьИзменений, ЧастьИзменений);
Если ТипЗнч(ТекущаяЧастьИзменений.Удаленные) = Тип("ФиксированныйМассив") Тогда
Для Каждого Удаленный Из ТекущаяЧастьИзменений.Удаленные Цикл
Удаленные.Добавить(Удаленный);
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
Если УжеИзменен Тогда
УправлениеДоступомСлужебный.ПроверитьАктуальностьМетаданных();
КонецЕсли;
ОбновитьПоставляемыеПрофили(, Удаленные);
СтандартныеПодсистемыСервер.УстановитьПараметрРаботыРасширения(ИмяПараметра, НовоеЗначение, Истина);
КонецПроцедуры
Процедура ОбновитьНепоставляемыеПрофилиПоИзменениямКонфигурации() Экспорт
Кэш = УправлениеДоступомСлужебныйПовтИсп.ОписаниеСтандартныхРолейРасширенийСеанса();
НовоеЗначение = Кэш.ХешСумма;
УжеИзменен = Ложь;
ИмяПараметра = "СтандартныеПодсистемы.УправлениеДоступом.ОбновленныеНепоставляемыеПрофили";
СтароеЗначение = СтандартныеПодсистемыСервер.ПараметрРаботыРасширения(ИмяПараметра, Истина, УжеИзменен);
Если СтароеЗначение = НовоеЗначение Тогда
Возврат;
КонецЕсли;
Если УжеИзменен Тогда
УправлениеДоступомСлужебный.ПроверитьАктуальностьМетаданных();
КонецЕсли;
ОбновитьНепоставляемыеПрофили();
СтандартныеПодсистемыСервер.УстановитьПараметрРаботыРасширения(ИмяПараметра, НовоеЗначение, Истина);
КонецПроцедуры
Процедура ОбновитьПоставляемыеПрофили(ЕстьИзменения = Неопределено, Удаленные = Неопределено) Экспорт
ВсеРоли = Новый Массив;
Для Каждого Роль Из Метаданные.Роли Цикл
ВсеРоли.Добавить(Роль);
КонецЦикла;
ОбщегоНазначения.ИдентификаторыОбъектовМетаданных(ВсеРоли);
ПоставляемыеПрофили = УправлениеДоступомСлужебный.ПоставляемыеПрофили();
ТекущиеПапкиПрофилей = ТекущиеПапкиПрофилей();
ОбновитьПоставляемыеПапкиПрофилей("", ТекущиеПапкиПрофилей, ПоставляемыеПрофили, Удаленные, ЕстьИзменения);
ПометитьНаУдалениеУстаревшиеПоставляемыеДанные(ТекущиеПапкиПрофилей, ЕстьИзменения);
ТекущиеПрофили = ТекущиеПрофили();
ОбновленныеПрофили = Новый Массив;
ОбновитьПоставляемыеПрофилиБезПапок(ОбновленныеПрофили,
ТекущиеПрофили, ТекущиеПапкиПрофилей, ПоставляемыеПрофили, Удаленные, ЕстьИзменения);
ПометитьНаУдалениеУстаревшиеПоставляемыеДанные(ТекущиеПрофили, ЕстьИзменения, ОбновленныеПрофили);
ОбновитьВспомогательныеДанныеПрофилей(ОбновленныеПрофили, ЕстьИзменения);
КонецПроцедуры
Процедура ОбновитьНепоставляемыеПрофили(ЕстьИзменения = Неопределено) Экспорт
ОсновныеНепоставляемыеПрофили = ОсновныеНепоставляемыеПрофили();
ОбновленныеПрофили = Новый Массив;
Для Каждого ПрофильСсылка Из ОсновныеНепоставляемыеПрофили Цикл
ПрофильОбъект = ПрофильСсылка.ПолучитьОбъект();
ЗаполнитьСтандартныеРолиРасширений(ПрофильОбъект.Роли);
Если Не ПрофильОбъект.Модифицированность() Тогда
Продолжить;
КонецЕсли;
Если Не ОбновлениеИнформационнойБазы.ВыполняетсяОбновлениеИнформационнойБазы()
И Не ОбновлениеИнформационнойБазы.ЭтоВызовИзОбработчикаОбновления() Тогда
ЗаблокироватьДанныеДляРедактирования(ПрофильОбъект.Ссылка, ПрофильОбъект.ВерсияДанных);
КонецЕсли;
ПрофильОбъект.ДополнительныеСвойства.Вставить("НеОбновлятьРолиПользователей");
ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ПрофильОбъект);
ЕстьИзменения = Истина;
ОбновленныеПрофили.Добавить(ПрофильСсылка);
Если Не ОбновлениеИнформационнойБазы.ВыполняетсяОбновлениеИнформационнойБазы()
И Не ОбновлениеИнформационнойБазы.ЭтоВызовИзОбработчикаОбновления() Тогда
РазблокироватьДанныеДляРедактирования(ПрофильОбъект.Ссылка);
КонецЕсли;
КонецЦикла;
ОбновитьВспомогательныеДанныеПрофилей(ОбновленныеПрофили, ЕстьИзменения);
КонецПроцедуры
Процедура ОбновитьВспомогательныеДанныеПрофилей(Профили = Неопределено, ЕстьИзменения = Ложь) Экспорт
Если Профили = Неопределено Тогда
РегистрыСведений.ТаблицыГруппДоступа.ОбновитьДанныеРегистра( , , ЕстьИзменения);
РегистрыСведений.ЗначенияГруппДоступа.ОбновитьДанныеРегистра( , ЕстьИзменения);
УправлениеДоступомСлужебный.ОбновитьРолиПользователей( , , ЕстьИзменения);
ИначеЕсли Профили.Количество() > 0 Тогда
ГруппыДоступаПрофилей = Справочники.ГруппыДоступа.ГруппыДоступаПрофиля(Профили);
РегистрыСведений.ТаблицыГруппДоступа.ОбновитьДанныеРегистра(ГруппыДоступаПрофилей, , ЕстьИзменения);
РегистрыСведений.ЗначенияГруппДоступа.ОбновитьДанныеРегистра(ГруппыДоступаПрофилей, ЕстьИзменения);
ПользователиДляОбновления =
Справочники.ГруппыДоступа.ПользователиДляОбновленияРолейПоПрофилю(Профили);
УправлениеДоступомСлужебный.ОбновитьРолиПользователей(ПользователиДляОбновления, , ЕстьИзменения);
КонецЕсли;
КонецПроцедуры
Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт
МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер");
Если Не Пользователи.ЭтоПолноправныйПользователь()
Или МодульТекущиеДелаСервер.ДелоОтключено("ПрофилиГруппДоступа") Тогда
Возврат;
КонецЕсли;
Разделы = МодульТекущиеДелаСервер.РазделыДляОбъекта(Метаданные.Справочники.ПрофилиГруппДоступа.ПолноеИмя());
КоличествоНесовместимыхПрофилейГруппДоступа = НесовместимыеПрофилиГруппДоступа().Количество();
Для Каждого Раздел Из Разделы Цикл
ИдентификаторПрофиля = "НеСовместимыСТекущейВерсией" + СтрЗаменить(Раздел.ПолноеИмя(), ".", "");
Дело = ТекущиеДела.Добавить();
Дело.Идентификатор = ИдентификаторПрофиля;
Дело.ЕстьДела = КоличествоНесовместимыхПрофилейГруппДоступа > 0;
Дело.Представление = НСтр("ru = 'Не совместимы с текущей версией'");
Дело.Количество = КоличествоНесовместимыхПрофилейГруппДоступа;
Дело.Владелец = Раздел;
Дело = ТекущиеДела.Добавить();
Дело.Идентификатор = "ПрофилиГруппДоступа";
Дело.ЕстьДела = КоличествоНесовместимыхПрофилейГруппДоступа > 0;
Дело.Важное = Истина;
Дело.Представление = НСтр("ru = 'Профили групп доступа'");
Дело.Количество = КоличествоНесовместимыхПрофилейГруппДоступа;
Дело.Форма = "Справочник.ПрофилиГруппДоступа.ФормаСписка";
Дело.ПараметрыФормы= Новый Структура("ПрофилиСРолямиПомеченнымиНаУдаление", Истина);
Дело.Владелец = ИдентификаторПрофиля;
КонецЦикла;
КонецПроцедуры
Процедура ЗаполнитьСтандартныеРолиРасширений(РолиПрофиля, СтандартныеРолиРасширений = Неопределено) Экспорт
Если СтандартныеРолиРасширений = Неопределено Тогда
СтандартныеРолиРасширений = УправлениеДоступомСлужебный.СтандартныеРолиРасширений();
КонецЕсли;
СтандартныеРолиПрофиля = СтандартныеРолиПрофиля(РолиПрофиля);
УстановитьРолиВПрофиле(РолиПрофиля,
СтандартныеРолиРасширений.АдминистраторСистемы,
СтандартныеРолиПрофиля.АдминистраторСистемы);
УстановитьРолиВПрофиле(РолиПрофиля,
СтандартныеРолиРасширений.ПолныеПрава,
СтандартныеРолиПрофиля.ПолныеПрава);
УстановитьРолиВПрофиле(РолиПрофиля,
СтандартныеРолиРасширений.БазовыеПрава,
СтандартныеРолиПрофиля.БазовыеПраваБСП);
УстановитьРолиВПрофиле(РолиПрофиля,
СтандартныеРолиРасширений.БазовыеПраваВнешнихПользователей,
СтандартныеРолиПрофиля.БазовыеПраваВнешнихПользователейБСП);
УстановитьРолиВПрофиле(РолиПрофиля,
СтандартныеРолиРасширений.ОбщиеПрава,
СтандартныеРолиПрофиля.ПолныеПрава
Или СтандартныеРолиПрофиля.БазовыеПраваБСП
Или СтандартныеРолиПрофиля.БазовыеПраваВнешнихПользователейБСП);
ОчиститьУдаленныеСтандартныеРолиРасширений(РолиПрофиля);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ИдентификаторПрофиляАдминистратор() Экспорт
Возврат "6c4b0307-43a4-4141-9c35-3dd7e9586d41";
КонецФункции
Функция ПрофильАдминистратор() Экспорт
УстановитьОтключениеБезопасногоРежима(Истина);
УстановитьПривилегированныйРежим(Истина);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПрофилиГруппДоступа.Ссылка КАК Ссылка
|ИЗ
| Справочник.ПрофилиГруппДоступа КАК ПрофилиГруппДоступа
|ГДЕ
| ПрофилиГруппДоступа.ИдентификаторПоставляемыхДанных = &ИдентификаторПоставляемыхДанных
|
|УПОРЯДОЧИТЬ ПО
| Ссылка
|;
|
|
|ВЫБРАТЬ
| ПрофилиГруппДоступа.Ссылка КАК Ссылка
|ИЗ
| Справочник.ПрофилиГруппДоступа КАК ПрофилиГруппДоступа
|ГДЕ
| ПрофилиГруппДоступа.ИмяПредопределенныхДанных = &ИмяПредопределенныхДанных
|
|УПОРЯДОЧИТЬ ПО
| Ссылка";
Идентификатор = Новый УникальныйИдентификатор(ИдентификаторПрофиляАдминистратор());
Запрос.УстановитьПараметр("ИдентификаторПоставляемыхДанных", Идентификатор);
Запрос.УстановитьПараметр("ИмяПредопределенныхДанных", "Администратор");
РезультатыЗапроса = Запрос.ВыполнитьПакет();
ВыборкаПоИдентификатору = РезультатыЗапроса[0].Выбрать();
ВыборкаПоПредопределенному = РезультатыЗапроса[1].Выбрать();
Если ВыборкаПоИдентификатору.Следующий()
И ВыборкаПоПредопределенному.Следующий()
И ВыборкаПоИдентификатору.Количество() = 1
И ВыборкаПоПредопределенному.Количество() = 1
И ВыборкаПоИдентификатору.Ссылка = ВыборкаПоПредопределенному.Ссылка Тогда
Возврат ВыборкаПоИдентификатору.Ссылка;
КонецЕсли;
Блокировка = Новый БлокировкаДанных;
Блокировка.Добавить("Справочник.ПрофилиГруппДоступа");
Блокировка.Добавить("Справочник.ГруппыДоступа");
ПоставляемыеПрофили = УправлениеДоступомСлужебный.ПоставляемыеПрофили();
СвойстваПрофиляАдминистратор = ПоставляемыеПрофили.ОписанияПрофилей.Получить(
ИдентификаторПрофиляАдминистратор());
НачатьТранзакцию();
Попытка
Блокировка.Заблокировать();
РезультатыЗапроса = Запрос.ВыполнитьПакет();
ВыборкаПоИдентификатору = РезультатыЗапроса[0].Выбрать();
ВыборкаПоПредопределенному = РезультатыЗапроса[1].Выбрать();
Если ВыборкаПоИдентификатору.Следующий() Тогда
ПрофильОбъект = ВыборкаПоИдентификатору.Ссылка.ПолучитьОбъект();
Если ПрофильОбъект.ИмяПредопределенныхДанных <> "Администратор" Тогда
ПрофильОбъект.ИмяПредопределенныхДанных = "Администратор";
КонецЕсли;
ИначеЕсли ВыборкаПоПредопределенному.Следующий() Тогда
ПрофильОбъект = ВыборкаПоПредопределенному.Ссылка.ПолучитьОбъект();
ПрофильОбъект.ИдентификаторПоставляемыхДанных = Идентификатор;
Иначе
ПрофильПоНаименованию = ПрофильПоНаименованию(
НСтр("ru = 'Администратор'", ОбщегоНазначения.КодОсновногоЯзыка()));
Если ЗначениеЗаполнено(ПрофильПоНаименованию) Тогда
ПрофильОбъект = ПрофильПоНаименованию.ПолучитьОбъект();
Иначе
ПрофильОбъект = СоздатьЭлемент();
КонецЕсли;
ПрофильОбъект.ИдентификаторПоставляемыхДанных = Идентификатор;
ПрофильОбъект.ИмяПредопределенныхДанных = "Администратор";
КонецЕсли;
Если ПрофильОбъект.Модифицированность() Тогда
ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ПрофильОбъект, Ложь, Ложь);
КонецЕсли;
ОбъектыДляОтвязки = Новый Соответствие;
Пока ВыборкаПоИдентификатору.Следующий() Цикл
Если ВыборкаПоИдентификатору.Ссылка <> ПрофильОбъект.Ссылка Тогда
ОбъектыДляОтвязки.Вставить(ВыборкаПоИдентификатору.Ссылка);
КонецЕсли;
КонецЦикла;
Пока ВыборкаПоПредопределенному.Следующий() Цикл
Если ВыборкаПоПредопределенному.Ссылка <> ПрофильОбъект.Ссылка Тогда
ОбъектыДляОтвязки.Вставить(ВыборкаПоПредопределенному.Ссылка);
КонецЕсли;
КонецЦикла;
Для Каждого КлючИЗначение Из ОбъектыДляОтвязки Цикл
ТекущийПрофильОбъект = КлючИЗначение.Ключ.ПолучитьОбъект();
ТекущийПрофильОбъект.ИдентификаторПоставляемыхДанных = Неопределено;
ТекущийПрофильОбъект.ИмяПредопределенныхДанных = "";
ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ТекущийПрофильОбъект, Ложь, Ложь);
КонецЦикла;
Для Каждого КлючИЗначение Из ОбъектыДляОтвязки Цикл
ТекущийПрофильОбъект = КлючИЗначение.Ключ.ПолучитьОбъект();
ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ТекущийПрофильОбъект);
КонецЦикла;
ОбновитьПрофильИлиПапкуПрофилей(СвойстваПрофиляАдминистратор);
Справочники.ГруппыДоступа.ГруппаДоступаАдминистраторы(ПрофильОбъект.Ссылка);
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
Возврат ПрофильОбъект.Ссылка;
КонецФункции
Функция ПрофильПоНаименованию(Наименование)
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Наименование", Наименование);
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ПрофилиГруппДоступа.Ссылка КАК Ссылка
|ИЗ
| Справочник.ПрофилиГруппДоступа КАК ПрофилиГруппДоступа
|ГДЕ
| ПрофилиГруппДоступа.Наименование = &Наименование
|
|УПОРЯДОЧИТЬ ПО
| Ссылка";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Ссылка;
КонецЕсли;
Возврат Неопределено;
КонецФункции
Функция ПоставляемыйПрофильПоИдентификатору(Идентификатор, ВызыватьИсключениеЕслиНетВБазеДанных = Ложь, БезПапок = Ложь) Экспорт
УстановитьПривилегированныйРежим(Истина);
ПоставляемыеПрофили = УправлениеДоступомСлужебный.ПоставляемыеПрофили();
СвойстваПрофиля = ПоставляемыеПрофили.ОписанияПрофилей.Получить(Строка(Идентификатор));
Если СвойстваПрофиля = Неопределено Или СвойстваПрофиля.ЭтоГруппа И БезПапок Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Профиль c идентификатором ""%1""
|не поставляется в приложении.'"),
Строка(Идентификатор));
ВызватьИсключение ТекстОшибки;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ИдентификаторПоставляемыхДанных",
Новый УникальныйИдентификатор(СвойстваПрофиля.Идентификатор));
Запрос.Текст =
"ВЫБРАТЬ
| ПрофилиГруппДоступа.Ссылка КАК Ссылка
|ИЗ
| Справочник.ПрофилиГруппДоступа КАК ПрофилиГруппДоступа
|ГДЕ
| ПрофилиГруппДоступа.ИдентификаторПоставляемыхДанных = &ИдентификаторПоставляемыхДанных
|
|УПОРЯДОЧИТЬ ПО
| Ссылка";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Ссылка;
КонецЕсли;
Если ВызыватьИсключениеЕслиНетВБазеДанных Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Поставляемый профиль с идентификатором ""%1""
|не существует в приложении.'"),
Строка(Идентификатор));
ВызватьИсключение ТекстОшибки;
КонецЕсли;
Возврат Неопределено;
КонецФункции
Функция ИдентификаторПоставляемогоПрофиля(Профиль) Экспорт
УстановитьПривилегированныйРежим(Истина);
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Ссылка", Профиль);
Запрос.УстановитьПараметр("ПустойУникальныйИдентификатор",
ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор());
Запрос.Текст =
"ВЫБРАТЬ
| ПрофилиГруппДоступа.ИдентификаторПоставляемыхДанных
|ИЗ
| Справочник.ПрофилиГруппДоступа КАК ПрофилиГруппДоступа
|ГДЕ
| ПрофилиГруппДоступа.Ссылка = &Ссылка
| И ПрофилиГруппДоступа.ИдентификаторПоставляемыхДанных <> &ПустойУникальныйИдентификатор";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Строка(Выборка.ИдентификаторПоставляемыхДанных);
КонецЕсли;
Возврат Неопределено;
КонецФункции
Функция ПоставляемыйПрофильИзменен(Профиль) Экспорт
Если ТипЗнч(Профиль) = Тип("СправочникСсылка.ПрофилиГруппДоступа") Тогда
Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Профиль,
"ПоставляемыйПрофильИзменен") = Истина;
КонецЕсли;
Если Не ЗначениеЗаполнено(Профиль.ИдентификаторПоставляемыхДанных) Тогда
Возврат Ложь;
КонецЕсли;
ОписанияПрофилей = УправлениеДоступомСлужебный.ПоставляемыеПрофили().ОписанияПрофилей;
СвойстваПрофиля = ОписанияПрофилей.Получить(Строка(Профиль.ИдентификаторПоставляемыхДанных));
Если СвойстваПрофиля = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
Если ВРег(Профиль.Наименование) <> ВРег(СвойстваПрофиля.Наименование) Тогда
Возврат Истина;
КонецЕсли;
Если ЗначениеЗаполнено(СвойстваПрофиля.Родитель) Тогда
Родитель = ПоставляемыйПрофильПоИдентификатору(СвойстваПрофиля.Родитель);
Если ЗначениеЗаполнено(Родитель) И Профиль.Родитель <> Родитель Тогда
Возврат Истина;
КонецЕсли;
КонецЕсли;
Если СвойстваПрофиля.ЭтоГруппа Тогда
Возврат Ложь;
КонецЕсли;
ОписаниеРолейПрофиля = ОписаниеРолейПрофиля(СвойстваПрофиля);
Если Профиль.Роли.Количество() <> ОписаниеРолейПрофиля.Количество()
Или Профиль.ВидыДоступа.Количество() <> СвойстваПрофиля.ВидыДоступа.Количество()
Или Профиль.ЗначенияДоступа.Количество() <> СвойстваПрофиля.ЗначенияДоступа.Количество()
Или Профиль.Назначение.Количество() <> СвойстваПрофиля.Назначение.Количество() Тогда
Возврат Истина;
КонецЕсли;
Для Каждого Роль Из ОписаниеРолейПрофиля Цикл
МетаданныеРоли = Метаданные.Роли.Найти(Роль);
Если МетаданныеРоли = Неопределено Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'В поставляемом профиле ""%1""
|указана несуществующая роль ""%2"".'"),
СвойстваПрофиля.Наименование,
Роль);
ВызватьИсключение ТекстОшибки;
КонецЕсли;
ИдентификаторРоли = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(МетаданныеРоли);
Если Профиль.Роли.НайтиСтроки(Новый Структура("Роль", ИдентификаторРоли)).Количество() = 0 Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Для Каждого ОписаниеВидаДоступа Из СвойстваПрофиля.ВидыДоступа Цикл
СвойстваВидаДоступа = УправлениеДоступомСлужебный.СвойстваВидаДоступа(ОписаниеВидаДоступа.Ключ);
Отбор = Новый Структура;
Отбор.Вставить("ВидДоступа", СвойстваВидаДоступа.Ссылка);
Отбор.Вставить("Предустановленный", ОписаниеВидаДоступа.Значение = "Предустановленный");
Отбор.Вставить("ВсеРазрешены", ОписаниеВидаДоступа.Значение = "ВначалеВсеРазрешены");
Если Профиль.ВидыДоступа.НайтиСтроки(Отбор).Количество() = 0 Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Для Каждого ОписаниеЗначенияДоступа Из СвойстваПрофиля.ЗначенияДоступа Цикл
Отбор = Новый Структура;
Отбор.Вставить("ЗначениеДоступа", ПредопределенноеЗначение(ОписаниеЗначенияДоступа.ЗначениеДоступа));
Если Профиль.ЗначенияДоступа.НайтиСтроки(Отбор).Количество() = 0 Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Для Каждого ТипПользователей Из СвойстваПрофиля.Назначение Цикл
Отбор = Новый Структура;
Отбор.Вставить("ТипПользователей", ТипПользователей);
Если Профиль.Назначение.НайтиСтроки(Отбор).Количество() = 0 Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
Функция ПоставляемыеОбластиПрофиляИзменены(НовыйПрофиль, СтарыеЗначения) Экспорт
Если ВРег(НовыйПрофиль.Наименование) <> ВРег(СтарыеЗначения.Наименование) Тогда
Возврат Истина;
КонецЕсли;
Если НовыйПрофиль.Родитель <> СтарыеЗначения.Родитель Тогда
ОписанияПрофилей = УправлениеДоступомСлужебный.ПоставляемыеПрофили().ОписанияПрофилей;
СвойстваПрофиля = ОписанияПрофилей.Получить(Строка(НовыйПрофиль.ИдентификаторПоставляемыхДанных));
Если СвойстваПрофиля <> Неопределено
И ЗначениеЗаполнено(СвойстваПрофиля.Родитель)
И ЗначениеЗаполнено(ПоставляемыйПрофильПоИдентификатору(СвойстваПрофиля.Родитель)) Тогда
Возврат Истина;
КонецЕсли;
КонецЕсли;
Если НовыйПрофиль.ЭтоГруппа Тогда
Возврат Ложь;
КонецЕсли;
СтарыйПрофиль = Новый Структура;
СтарыйПрофиль.Вставить("Роли", СтарыеЗначения.Роли.Выгрузить());
СтарыйПрофиль.Вставить("Назначение", СтарыеЗначения.Назначение.Выгрузить());
СтарыйПрофиль.Вставить("ВидыДоступа", СтарыеЗначения.ВидыДоступа.Выгрузить());
СтарыйПрофиль.Вставить("ЗначенияДоступа", СтарыеЗначения.ЗначенияДоступа.Выгрузить());
Если НовыйПрофиль.Роли.Количество() <> СтарыйПрофиль.Роли.Количество()
Или НовыйПрофиль.ВидыДоступа.Количество() <> СтарыйПрофиль.ВидыДоступа.Количество()
Или НовыйПрофиль.ЗначенияДоступа.Количество() <> СтарыйПрофиль.ЗначенияДоступа.Количество()
Или НовыйПрофиль.Назначение.Количество() <> СтарыйПрофиль.Назначение.Количество() Тогда
Возврат Истина;
КонецЕсли;
Для Каждого Строка Из НовыйПрофиль.Роли Цикл
Если СтарыйПрофиль.Роли.Найти(Строка.Роль, "Роль") = Неопределено Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Для Каждого Строка Из НовыйПрофиль.ВидыДоступа Цикл
Отбор = Новый Структура("ВидДоступа, Предустановленный, ВсеРазрешены",
Строка.ВидДоступа, Строка.Предустановленный, Строка.ВсеРазрешены);
Если СтарыйПрофиль.ВидыДоступа.НайтиСтроки(Отбор).Количество() = 0 Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Для Каждого Строка Из НовыйПрофиль.ВидыДоступа Цикл
Отбор = Новый Структура("ВидДоступа, Предустановленный, ВсеРазрешены",
Строка.ВидДоступа, Строка.Предустановленный, Строка.ВсеРазрешены);
Если СтарыйПрофиль.ВидыДоступа.НайтиСтроки(Отбор).Количество() = 0 Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Для Каждого Строка Из НовыйПрофиль.ЗначенияДоступа Цикл
Отбор = Новый Структура("ВидДоступа, ЗначениеДоступа, ВключаяНижестоящие",
Строка.ВидДоступа, Строка.ЗначениеДоступа, Строка.ВключаяНижестоящие);
Если СтарыйПрофиль.ЗначенияДоступа.НайтиСтроки(Отбор).Количество() = 0 Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Для Каждого Строка Из НовыйПрофиль.Назначение Цикл
Если СтарыйПрофиль.Назначение.Найти(Строка.ТипПользователей, "ТипПользователей") = Неопределено Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
Функция ЕстьНачальноеЗаполнениеПрофиля(Знач Профиль) Экспорт
ИдентификаторПоставляемыхДанных = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(
Профиль, "ИдентификаторПоставляемыхДанных");
Если Не ЗначениеЗаполнено(ИдентификаторПоставляемыхДанных) Тогда
Возврат Ложь;
КонецЕсли;
ПоставляемыеПрофили = УправлениеДоступомСлужебный.ПоставляемыеПрофили();
СвойстваПрофиля = ПоставляемыеПрофили.ОписанияПрофилей.Получить(Строка(ИдентификаторПоставляемыхДанных));
Возврат СвойстваПрофиля <> Неопределено;
КонецФункции
Функция ЗапретИзмененияПрофиля(Знач Профиль, РодительТолькоПросмотр = Ложь) Экспорт
Если Не ЗначениеЗаполнено(Профиль.ИдентификаторПоставляемыхДанных) Тогда
Возврат Ложь;
КонецЕсли;
Если Профиль.ИдентификаторПоставляемыхДанных =
Новый УникальныйИдентификатор(ИдентификаторПрофиляАдминистратор()) Тогда
Возврат Истина;
КонецЕсли;
ПоставляемыеПрофили = УправлениеДоступомСлужебный.ПоставляемыеПрофили();
СвойстваПрофиля = ПоставляемыеПрофили.ОписанияПрофилей.Получить(
Строка(Профиль.ИдентификаторПоставляемыхДанных));
ЗапретИзменения = СвойстваПрофиля <> Неопределено
И (ПоставляемыеПрофили.ПараметрыОбновления.ЗапретитьИзменениеПрофилей
Или СвойстваПрофиля.ЭтоГруппа);
Если ЗапретИзменения И ЗначениеЗаполнено(СвойстваПрофиля.Родитель) Тогда
РодительТолькоПросмотр = Истина;
КонецЕсли;
Возврат ЗапретИзменения;
КонецФункции
Функция ПояснениеПоставляемогоПрофиля(Профиль) Экспорт
ИдентификаторПоставляемыхДанных = Строка(ОбщегоНазначения.ЗначениеРеквизитаОбъекта(
Профиль, "ИдентификаторПоставляемыхДанных"));
ПояснениеПоставляемыхПрофилей = УправлениеДоступомСлужебныйПовтИсп.ПояснениеПоставляемыхПрофилей();
Возврат Строка(ПояснениеПоставляемыхПрофилей.Получить(ИдентификаторПоставляемыхДанных));
КонецФункции
Процедура ЗаполнитьПоставляемыйПрофиль(Знач Профиль, Знач ОбновитьГруппыДоступа) Экспорт
ПользователиСлужебный.ПроверитьБезопасныйРежимОтключен(
"Справочники.ПрофилиГруппДоступа.ЗаполнитьПоставляемыйПрофиль");
ИдентификаторПоставляемыхДанных = Строка(ОбщегоНазначения.ЗначениеРеквизитаОбъекта(
Профиль, "ИдентификаторПоставляемыхДанных"));
ПоставляемыеПрофили = УправлениеДоступомСлужебный.ПоставляемыеПрофили();
СвойстваПрофиля = ПоставляемыеПрофили.ОписанияПрофилей.Получить(ИдентификаторПоставляемыхДанных);
Если СвойстваПрофиля <> Неопределено Тогда
ОбновитьПрофильИлиПапкуПрофилей(СвойстваПрофиля);
Если ОбновитьГруппыДоступа И Не СвойстваПрофиля.ЭтоГруппа Тогда
Справочники.ГруппыДоступа.ОбновитьГруппыДоступаПрофиля(Профиль, Истина);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Функция НесовместимыеПрофилиГруппДоступа() Экспорт
Выгрузка = НазначениеИРолиПрофилейГруппаДоступа();
НесовместимыеПрофили = Новый Массив;
НедоступныеРолиПоНазначению = Новый Соответствие;
Для Каждого ОписаниеПрофиля Из Выгрузка Цикл
НазначениеПрофиля = УправлениеДоступомСлужебныйКлиентСервер.НазначениеПрофиля(ОписаниеПрофиля);
НедоступныеРоли = НедоступныеРолиПоНазначению.Получить(НазначениеПрофиля);
Если НедоступныеРоли = Неопределено Тогда
НедоступныеРоли = ПользователиСлужебныйПовтИсп.НедоступныеРоли(НазначениеПрофиля);
НедоступныеРолиПоНазначению.Вставить(НазначениеПрофиля, НедоступныеРоли);
КонецЕсли;
Если ОписаниеПрофиля.Роли.Найти(Неопределено, "Роль") <> Неопределено Тогда
НесовместимыеПрофили.Добавить(ОписаниеПрофиля.Ссылка);
Продолжить;
КонецЕсли;
ОписаниеРолей = ОбщегоНазначения.ОбъектыМетаданныхПоИдентификаторам(
ОписаниеПрофиля.Роли.ВыгрузитьКолонку("Роль"), Ложь);
Для Каждого ОписаниеРоли Из ОписаниеРолей Цикл
ОбъектМетаданных = ОписаниеРоли.Значение;
Если ОбъектМетаданных = Неопределено Тогда
Продолжить;
КонецЕсли;
Если ОбъектМетаданных = Null
Или НедоступныеРоли.Получить(ОбъектМетаданных.Имя) <> Неопределено
Или ВРег(Лев(ОбъектМетаданных.Имя, СтрДлина("Удалить"))) = ВРег("Удалить") Тогда
НесовместимыеПрофили.Добавить(ОписаниеПрофиля.Ссылка);
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат НесовместимыеПрофили;
КонецФункции
Функция ПоставляемыеПрофили() Экспорт
Кэш = УправлениеДоступомСлужебныйПовтИсп.ОписаниеПоставляемыхПрофилейСеанса();
ТекущаяДатаСеанса = ТекущаяДатаСеанса();
Если Кэш.Проверка.Дата + 3 > ТекущаяДатаСеанса Тогда
Возврат Кэш.ПоставляемыеПрофилиСеанса;
КонецЕсли;
НовоеЗначение = Кэш.ХешСумма;
ИмяПараметра = "СтандартныеПодсистемы.УправлениеДоступом.ОписаниеПоставляемыхПрофилей";
СтароеЗначение = СтандартныеПодсистемыСервер.ПараметрРаботыРасширения(ИмяПараметра, Истина);
Если СтароеЗначение <> НовоеЗначение Тогда
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ПараметрыРаботыВерсийРасширений");
ЭлементБлокировки.УстановитьЗначение("ВерсияРасширений", Справочники.ВерсииРасширений.ПустаяСсылка());
ЭлементБлокировки.УстановитьЗначение("ИмяПараметра", ИмяПараметра);
НачатьТранзакцию();
Попытка
Блокировка.Заблокировать();
УжеИзменен = Ложь;
СтароеЗначение = СтандартныеПодсистемыСервер.ПараметрРаботыРасширения(ИмяПараметра, Истина, УжеИзменен);
Если СтароеЗначение <> НовоеЗначение Тогда
Если УжеИзменен Тогда
УправлениеДоступомСлужебный.ПроверитьАктуальностьМетаданных();
КонецЕсли;
УстановитьОтключениеБезопасногоРежима(Истина);
УстановитьПривилегированныйРежим(Истина);
СтандартныеПодсистемыСервер.УстановитьПараметрРаботыРасширения(ИмяПараметра, НовоеЗначение, Истина);
УстановитьПривилегированныйРежим(Ложь);
УстановитьОтключениеБезопасногоРежима(Ложь);
КонецЕсли;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
КонецЕсли;
Кэш.Проверка.Дата = ТекущаяДатаСеанса;
Возврат Кэш.ПоставляемыеПрофилиСеанса;
КонецФункции
Функция ИзменилисьВидыИлиЗначенияДоступаИлиНазначение(СтарыеЗначения, ТекущийОбъект) Экспорт
Если СтарыеЗначения.Ссылка <> ТекущийОбъект.Ссылка Тогда
Возврат Истина;
КонецЕсли;
ВидыДоступа = СтарыеЗначения.ВидыДоступа.Выгрузить();
ЗначенияДоступа = СтарыеЗначения.ЗначенияДоступа.Выгрузить();
Назначение = СтарыеЗначения.Назначение.Выгрузить();
Если ВидыДоступа.Количество() <> ТекущийОбъект.ВидыДоступа.Количество()
Или ЗначенияДоступа.Количество() <> ТекущийОбъект.ЗначенияДоступа.Количество()
Или Назначение.Количество() <> ТекущийОбъект.Назначение.Количество() Тогда
Возврат Истина;
КонецЕсли;
Отбор = Новый Структура("ВидДоступа, Предустановленный, ВсеРазрешены");
Для Каждого Строка Из ТекущийОбъект.ВидыДоступа Цикл
ЗаполнитьЗначенияСвойств(Отбор, Строка);
Если ВидыДоступа.НайтиСтроки(Отбор).Количество() = 0 Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Отбор = Новый Структура("ВидДоступа, ЗначениеДоступа");
Для Каждого Строка Из ТекущийОбъект.ЗначенияДоступа Цикл
ЗаполнитьЗначенияСвойств(Отбор, Строка);
Если ЗначенияДоступа.НайтиСтроки(Отбор).Количество() = 0 Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Отбор = Новый Структура("ТипПользователей");
Для Каждого Строка Из ТекущийОбъект.Назначение Цикл
ЗаполнитьЗначенияСвойств(Отбор, Строка);
Если Назначение.НайтиСтроки(Отбор).Количество() = 0 Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
Процедура ПриИзмененииЯзыкаИнформационнойБазы(ИзменениеЯзыков) Экспорт
ПользователиСлужебный.ПроверитьБезопасныйРежимОтключен(
"Справочники.ПрофилиГруппДоступа.ПриИзмененииЯзыкаИнформационнойБазы");
УправлениеДоступомСлужебный.ПоставляемыеПрофили();
ОписанияПрофилей = ЗаполненныеПоставляемыеПрофили().ОписанияПрофилей;
НовыеНаименованияПрофилей = Новый ТаблицаЗначений;
НовыеНаименованияПрофилей.Колонки.Добавить("ИдентификаторПоставляемыхДанных",
Новый ОписаниеТипов("УникальныйИдентификатор"));
НовыеНаименованияПрофилей.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка",,,,
Новый КвалификаторыСтроки(Метаданные.Справочники.ПрофилиГруппДоступа.ДлинаНаименования)));
Для Каждого ОписаниеПрофиля Из ОписанияПрофилей Цикл
Наименование = ОписаниеПрофиля.Наименование;
Если Не ЗначениеЗаполнено(Наименование)
Или Не СтроковыеФункцииКлиентСервер.ЭтоУникальныйИдентификатор(ОписаниеПрофиля.Идентификатор) Тогда
Продолжить;
КонецЕсли;
НоваяСтрока = НовыеНаименованияПрофилей.Добавить();
НоваяСтрока.ИдентификаторПоставляемыхДанных =
Новый УникальныйИдентификатор(ОписаниеПрофиля.Идентификатор);
НоваяСтрока.Наименование = Наименование;
КонецЦикла;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("НовыеНаименованияПрофилей", НовыеНаименованияПрофилей);
Запрос.Текст =
"ВЫБРАТЬ
| НовыеНаименованияПрофилей.ИдентификаторПоставляемыхДанных КАК ИдентификаторПоставляемыхДанных,
| НовыеНаименованияПрофилей.Наименование КАК Наименование
|ПОМЕСТИТЬ НовыеНаименованияПрофилей
|ИЗ
| &НовыеНаименованияПрофилей КАК НовыеНаименованияПрофилей
|;
|
|
|ВЫБРАТЬ
| Профили.Ссылка КАК Ссылка,
| НовыеНаименованияПрофилей.Наименование КАК Наименование
|ИЗ
| Справочник.ПрофилиГруппДоступа КАК Профили
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ НовыеНаименованияПрофилей КАК НовыеНаименованияПрофилей
| ПО Профили.ИдентификаторПоставляемыхДанных = НовыеНаименованияПрофилей.ИдентификаторПоставляемыхДанных
| И Профили.Наименование <> НовыеНаименованияПрофилей.Наименование";
Выборка = Запрос.Выполнить().Выбрать();
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("Справочник.ПрофилиГруппДоступа");
Пока Выборка.Следующий() Цикл
ЭлементБлокировки.УстановитьЗначение("Ссылка", Выборка.Ссылка);
НачатьТранзакцию();
Попытка
Блокировка.Заблокировать();
ТекущийОбъект = Выборка.Ссылка.ПолучитьОбъект();
Если ТекущийОбъект.Наименование <> Выборка.Наименование Тогда
ТекущийОбъект.Наименование = Выборка.Наименование;
ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ТекущийОбъект);
КонецЕсли;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Процедура ВосстановитьНесуществующиеВидыИЗначенияДоступа(СтарыеЗначения, НовыеЗначения) Экспорт
Если ТипЗнч(СтарыеЗначения.ВидыДоступа) <> Тип("РезультатЗапроса") Тогда
Возврат;
КонецЕсли;
СвойстваВидовДоступа = УправлениеДоступомСлужебный.СвойстваВидовДоступа();
ПоСсылкам = СвойстваВидовДоступа.ПоСсылкам;
ПоТипамГруппИЗначений = СвойстваВидовДоступа.ПоТипамГруппИЗначений;
СтарыеВидыДоступа = СтарыеЗначения.ВидыДоступа.Выгрузить();
СтарыеЗначенияДоступа = СтарыеЗначения.ЗначенияДоступа.Выгрузить();
ЕстьВосстановленные = Ложь;
Для Каждого Строка Из СтарыеВидыДоступа Цикл
Если Строка.ВидДоступа = Неопределено
Или ПоСсылкам.Получить(Строка.ВидДоступа) <> Неопределено
Или НовыеЗначения.ВидыДоступа.Найти(Строка.ВидДоступа, "ВидДоступа") <> Неопределено Тогда
Продолжить;
КонецЕсли;
НоваяСтрока = НовыеЗначения.ВидыДоступа.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
ЕстьВосстановленные = Истина;
КонецЦикла;
Для Каждого Строка Из СтарыеЗначенияДоступа Цикл
Если Строка.ВидДоступа = Неопределено
Или Строка.ЗначениеДоступа = Неопределено
Или НовыеЗначения.ВидыДоступа.Найти(Строка.ВидДоступа, "ВидДоступа") = Неопределено Тогда
Продолжить;
КонецЕсли;
СвойстваВидаДоступа = ПоТипамГруппИЗначений.Получить(ТипЗнч(Строка.ЗначениеДоступа));
Если СвойстваВидаДоступа <> Неопределено
И СвойстваВидаДоступа.Ссылка = Строка.ВидДоступа Тогда
Продолжить;
КонецЕсли;
Отбор = Новый Структура("ВидДоступа, ЗначениеДоступа",
Строка.ВидДоступа, Строка.ЗначениеДоступа);
Если НовыеЗначения.ЗначенияДоступа.НайтиСтроки(Отбор).Количество() > 0 Тогда
Продолжить;
КонецЕсли;
НоваяСтрока = НовыеЗначения.ЗначенияДоступа.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
ЕстьВосстановленные = Истина;
КонецЦикла;
Если ЕстьВосстановленные Тогда
НовыеЗначения.ВидыДоступа.Добавить();
КонецЕсли;
КонецПроцедуры
Функция СтандартныеРолиПрофиля(РолиПрофиля)
Результат = Новый Структура;
Результат.Вставить("АдминистраторСистемы",
ЕстьРольВПрофиле(РолиПрофиля, Метаданные.Роли.АдминистраторСистемы));
Результат.Вставить("ПолныеПрава",
ЕстьРольВПрофиле(РолиПрофиля, Метаданные.Роли.ПолныеПрава));
Результат.Вставить("БазовыеПраваБСП",
ЕстьРольВПрофиле(РолиПрофиля, Метаданные.Роли.БазовыеПраваБСП));
Результат.Вставить("БазовыеПраваВнешнихПользователейБСП",
ЕстьРольВПрофиле(РолиПрофиля, Метаданные.Роли.БазовыеПраваВнешнихПользователейБСП));
Возврат Результат;
КонецФункции
Функция ЕстьРольВПрофиле(РолиПрофиля, Роль)
Результат = Ложь;
Если ТипЗнч(РолиПрофиля) = Тип("Массив") Тогда
Если РолиПрофиля.Найти(Роль.Имя) <> Неопределено Тогда
Результат = Истина;
КонецЕсли;
ИначеЕсли ТипЗнч(РолиПрофиля) = Тип("ДанныеФормыКоллекция") Тогда
Отбор = Новый Структура("Роль", Роль.Имя);
Если РолиПрофиля.НайтиСтроки(Отбор).Количество() > 0 Тогда
Результат = Истина;
КонецЕсли;
Иначе
ИдентификаторРоли = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Роль.ПолноеИмя());
Если РолиПрофиля.Найти(ИдентификаторРоли, "Роль") <> Неопределено Тогда
Результат = Истина;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
Процедура УстановитьРолиВПрофиле(РолиПрофиля, ИменаРолей, Установить)
Если Не ЗначениеЗаполнено(ИменаРолей) Тогда
Возврат;
КонецЕсли;
Если ТипЗнч(РолиПрофиля) = Тип("Массив") Тогда
Для Каждого ИмяРоли Из ИменаРолей Цикл
ИндексРоли = РолиПрофиля.Найти(ИмяРоли);
Установлена = ИндексРоли <> Неопределено;
Если Установить И Не Установлена Тогда
РолиПрофиля.Добавить(ИмяРоли);
ИначеЕсли Не Установить И Установлена Тогда
РолиПрофиля.Удалить(ИндексРоли);
КонецЕсли;
КонецЦикла;
ИначеЕсли ТипЗнч(РолиПрофиля) = Тип("ДанныеФормыКоллекция") Тогда
Для Каждого ИмяРоли Из ИменаРолей Цикл
Отбор = Новый Структура("Роль", ИмяРоли);
НайденныеСтроки = РолиПрофиля.НайтиСтроки(Отбор);
Установлена = НайденныеСтроки.Количество() > 0;
Если Установить И Не Установлена Тогда
РолиПрофиля.Добавить().Роль = ИмяРоли;
ИначеЕсли Не Установить И Установлена Тогда
НайденнаяСтрока = НайденныеСтроки[0];
РолиПрофиля.Удалить(НайденнаяСтрока);
КонецЕсли;
КонецЦикла;
Иначе
СтрокаПолныхИменРолей = "Роль." + СтрСоединить(ИменаРолей, Символы.ПС + "Роль.");
ПолныеИменаРолей = СтрРазделить(СтрокаПолныхИменРолей, Символы.ПС);
ИдентификаторыРолей = ОбщегоНазначения.ИдентификаторыОбъектовМетаданных(ПолныеИменаРолей);
Для Каждого ПолноеИмяРоли Из ПолныеИменаРолей Цикл
ИдентификаторРоли = ИдентификаторыРолей.Получить(ПолноеИмяРоли);
СтрокаТЧ = РолиПрофиля.Найти(ИдентификаторРоли, "Роль");
Установлена = СтрокаТЧ <> Неопределено;
Если Установить И Не Установлена Тогда
РолиПрофиля.Добавить().Роль = ИдентификаторРоли;
ИначеЕсли Не Установить И Установлена Тогда
РолиПрофиля.Удалить(СтрокаТЧ);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Процедура ОчиститьУдаленныеСтандартныеРолиРасширений(РолиПрофиля)
Если ТипЗнч(РолиПрофиля) = Тип("Массив")
Или ТипЗнч(РолиПрофиля) = Тип("ДанныеФормыКоллекция") Тогда
Возврат;
КонецЕсли;
ИдентификаторыРолей = Новый Массив;
Для Каждого Строка Из РолиПрофиля Цикл
Если ТипЗнч(Строка.Роль) = Тип("СправочникСсылка.ИдентификаторыОбъектовРасширений") Тогда
ИдентификаторыРолей.Добавить(Строка.Роль);
КонецЕсли;
КонецЦикла;
РолиПоИдентификаторам = ОбщегоНазначения.ОбъектыМетаданныхПоИдентификаторам(ИдентификаторыРолей, Ложь);
ИдентификаторыУдаленныхИОтключенныхРолей = Новый Массив;
Для Каждого ОписаниеРоли Из РолиПоИдентификаторам Цикл
Если ТипЗнч(ОписаниеРоли.Значение) = Тип("ОбъектМетаданных") Тогда
Продолжить;
КонецЕсли;
ИдентификаторыУдаленныхИОтключенныхРолей.Добавить(ОписаниеРоли.Ключ);
КонецЦикла;
ПолныеИменаУдаленныхИОтключенныхРолей =
Справочники.ИдентификаторыОбъектовМетаданных.ПолныеИменаОбъектовМетаданныхВключаяУдаленные(
ИдентификаторыУдаленныхИОтключенныхРолей);
Для Каждого ОписаниеРоли Из ПолныеИменаУдаленныхИОтключенныхРолей Цикл
ЧастиИмени = СтрРазделить(ОписаниеРоли.Значение, ".");
Если ЧастиИмени.Количество() <> 2
Или ВРег(ЧастиИмени[0]) <> ВРег("Роль") Тогда
Продолжить;
КонецЕсли;
ИмяРоли = ЧастиИмени[1];
Если Не СтрЗаканчиваетсяНа(ВРег(ИмяРоли), ВРег("ОбщиеПрава"))
И Не СтрЗаканчиваетсяНа(ВРег(ИмяРоли), ВРег("ПолныеПрава"))
И Не СтрЗаканчиваетсяНа(ВРег(ИмяРоли), ВРег("БазовыеПрава"))
И Не СтрЗаканчиваетсяНа(ВРег(ИмяРоли), ВРег("БазовыеПраваВнешнихПользователей"))
И Не СтрЗаканчиваетсяНа(ВРег(ИмяРоли), ВРег("АдминистраторСистемы")) Тогда
Продолжить;
КонецЕсли;
Отбор = Новый Структура("Роль", ОписаниеРоли.Ключ);
Строки = РолиПрофиля.НайтиСтроки(Отбор);
Для Каждого Строка Из Строки Цикл
РолиПрофиля.Удалить(Строка);
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Функция СтандартныеРолиРасширений() Экспорт
Кэш = УправлениеДоступомСлужебныйПовтИсп.ОписаниеСтандартныхРолейРасширенийСеанса();
ТекущаяДатаСеанса = ТекущаяДатаСеанса();
Если Кэш.Проверка.Дата + 3 > ТекущаяДатаСеанса Тогда
Возврат Кэш.РолиСеанса;
КонецЕсли;
НовоеЗначение = Кэш.ХешСумма;
ИмяПараметра = "СтандартныеПодсистемы.УправлениеДоступом.ОписаниеСтандартныхРолейРасширений";
СтароеЗначение = СтандартныеПодсистемыСервер.ПараметрРаботыРасширения(ИмяПараметра, Истина);
Если СтароеЗначение <> НовоеЗначение Тогда
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ПараметрыРаботыВерсийРасширений");
ЭлементБлокировки.УстановитьЗначение("ВерсияРасширений", Справочники.ВерсииРасширений.ПустаяСсылка());
ЭлементБлокировки.УстановитьЗначение("ИмяПараметра", ИмяПараметра);
НачатьТранзакцию();
Попытка
Блокировка.Заблокировать();
УжеИзменен = Ложь;
СтароеЗначение = СтандартныеПодсистемыСервер.ПараметрРаботыРасширения(ИмяПараметра, Истина, УжеИзменен);
Если СтароеЗначение <> НовоеЗначение Тогда
Если УжеИзменен Тогда
УправлениеДоступомСлужебный.ПроверитьАктуальностьМетаданных();
КонецЕсли;
УстановитьОтключениеБезопасногоРежима(Истина);
УстановитьПривилегированныйРежим(Истина);
СтандартныеПодсистемыСервер.УстановитьПараметрРаботыРасширения(ИмяПараметра, НовоеЗначение, Истина);
УстановитьПривилегированныйРежим(Ложь);
УстановитьОтключениеБезопасногоРежима(Ложь);
КонецЕсли;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
КонецЕсли;
Кэш.Проверка.Дата = ТекущаяДатаСеанса;
Возврат Кэш.РолиСеанса;
КонецФункции
Функция ПодготовленныеСтандартныеРолиРасширенийСеанса(ХешСумма) Экспорт
ОбщиеПрава = Новый СписокЗначений;
БазовыеПрава = Новый СписокЗначений;
БазовыеПраваВнешнихПользователей = Новый СписокЗначений;
АдминистраторСистемы = Новый СписокЗначений;
ПолныеПрава = Новый СписокЗначений;
ДополнительныеРолиАдминистратора = Новый СписокЗначений;
ВсеРоли = Новый Соответствие;
РазделениеВключено = ОбщегоНазначения.РазделениеВключено();
Для Каждого Роль Из Метаданные.Роли Цикл
Расширение = Роль.РасширениеКонфигурации();
Если Расширение = Неопределено Тогда
Продолжить;
КонецЕсли;
ИмяРоли = Роль.Имя;
Если СтрЗаканчиваетсяНа(ВРег(ИмяРоли), ВРег("ОбщиеПрава")) Тогда
ОбщиеПрава.Добавить(ИмяРоли);
ДополнительныеРолиАдминистратора.Добавить(ИмяРоли);
ВсеРоли.Вставить(ИмяРоли, "ОбщиеПрава");
ИначеЕсли СтрЗаканчиваетсяНа(ВРег(ИмяРоли), ВРег("ПолныеПрава")) Тогда
ПолныеПрава.Добавить(ИмяРоли);
ДополнительныеРолиАдминистратора.Добавить(ИмяРоли);
ВсеРоли.Вставить(ИмяРоли, "ПолныеПрава");
ИначеЕсли СтрЗаканчиваетсяНа(ВРег(ИмяРоли), ВРег("БазовыеПрава")) Тогда
БазовыеПрава.Добавить(ИмяРоли);
ВсеРоли.Вставить(ИмяРоли, "БазовыеПрава");
ИначеЕсли СтрЗаканчиваетсяНа(ВРег(ИмяРоли), ВРег("БазовыеПраваВнешнихПользователей")) Тогда
БазовыеПраваВнешнихПользователей.Добавить(ИмяРоли);
ВсеРоли.Вставить(ИмяРоли, "БазовыеПраваВнешнихПользователей");
ИначеЕсли СтрЗаканчиваетсяНа(ВРег(ИмяРоли), ВРег("АдминистраторСистемы")) Тогда
АдминистраторСистемы.Добавить(ИмяРоли);
ВсеРоли.Вставить(ИмяРоли, "АдминистраторСистемы");
Если Не РазделениеВключено Тогда
ДополнительныеРолиАдминистратора.Добавить(ИмяРоли);
КонецЕсли;
КонецЕсли;
КонецЦикла;
ОбщиеПрава.СортироватьПоЗначению();
БазовыеПрава.СортироватьПоЗначению();
БазовыеПраваВнешнихПользователей.СортироватьПоЗначению();
АдминистраторСистемы.СортироватьПоЗначению();
ПолныеПрава.СортироватьПоЗначению();
ДополнительныеРолиАдминистратора.СортироватьПоЗначению();
ОбщиеПрава = ОбщиеПрава.ВыгрузитьЗначения();
БазовыеПрава = БазовыеПрава.ВыгрузитьЗначения();
БазовыеПраваВнешнихПользователей = БазовыеПраваВнешнихПользователей.ВыгрузитьЗначения();
АдминистраторСистемы = АдминистраторСистемы.ВыгрузитьЗначения();
ПолныеПрава = ПолныеПрава.ВыгрузитьЗначения();
ДополнительныеРолиАдминистратора = ДополнительныеРолиАдминистратора.ВыгрузитьЗначения();
ДополнительныеРоли = Новый Соответствие;
Для Каждого ИмяРоли Из ДополнительныеРолиАдминистратора Цикл
ДополнительныеРоли.Вставить(ИмяРоли, Истина);
КонецЦикла;
Свойства = Новый Структура;
Свойства.Вставить("ОбщиеПрава",
Новый ФиксированныйМассив(ОбщиеПрава));
Свойства.Вставить("БазовыеПрава",
Новый ФиксированныйМассив(БазовыеПрава));
Свойства.Вставить("БазовыеПраваВнешнихПользователей",
Новый ФиксированныйМассив(БазовыеПраваВнешнихПользователей));
Свойства.Вставить("АдминистраторСистемы",
Новый ФиксированныйМассив(АдминистраторСистемы));
Свойства.Вставить("ПолныеПрава",
Новый ФиксированныйМассив(ПолныеПрава));
Свойства.Вставить("Все",
Новый ФиксированноеСоответствие(ВсеРоли));
Свойства.Вставить("ДополнительныеРолиАдминистратора",
Новый ФиксированноеСоответствие(ДополнительныеРоли));
ОписаниеВерсии = Новый Структура("СвойстваВерсии", Новый Массив);
ДобавитьЭлементВерсии(ОписаниеВерсии, "Версия", "1");
ДобавитьЭлементВерсии(ОписаниеВерсии, "ОбщиеПрава",
РолиСИдентификаторами(ОбщиеПрава));
ДобавитьЭлементВерсии(ОписаниеВерсии, "БазовыеПрава",
РолиСИдентификаторами(БазовыеПрава));
ДобавитьЭлементВерсии(ОписаниеВерсии, "БазовыеПраваВнешнихПользователей",
РолиСИдентификаторами(БазовыеПраваВнешнихПользователей));
ДобавитьЭлементВерсии(ОписаниеВерсии, "АдминистраторСистемы",
РолиСИдентификаторами(АдминистраторСистемы));
ДобавитьЭлементВерсии(ОписаниеВерсии, "ПолныеПрава",
РолиСИдентификаторами(ПолныеПрава));
ДобавитьЭлементВерсии(ОписаниеВерсии, "ДополнительныеРолиАдминистратора",
РолиСИдентификаторами(ДополнительныеРолиАдминистратора));
Результат = Новый ФиксированнаяСтруктура(Свойства);
СтрокаВерсии = СтрСоединить(ОписаниеВерсии.СвойстваВерсии, Символы.ПС);
ХешСумма = УправлениеДоступомСлужебный.ХешСуммаДанных(СтрокаВерсии);
Возврат Результат;
КонецФункции
Процедура ДобавитьЭлементВерсии(Контекст, ИмяПоля, Значение)
УправлениеДоступомСлужебный.ДобавитьЭлементВерсии(Контекст, ИмяПоля, Значение);
КонецПроцедуры
Процедура ДобавитьСвойстваВерсии(Контекст, Структура, ИменаПолей)
УправлениеДоступомСлужебный.ДобавитьСвойстваВерсии(Контекст, Структура, ИменаПолей);
КонецПроцедуры
Процедура ЗарегистрироватьИзменениеРолейПрофилей(Объект, СтарыеЗначения) Экспорт
Данные = Новый Структура;
Данные.Вставить("ВерсияСтруктурыДанных", 1);
Данные.Вставить("ИзменениеРолей", Новый Массив);
Данные.Вставить("ПредставлениеРолей", Новый Массив);
Данные.Вставить("ПредставлениеПрофилей", Новый Массив);
Если ТипЗнч(Объект) = Тип("СправочникОбъект.ПрофилиГруппДоступа") Тогда
АктивностьПрофиляИзменена = Объект.ПометкаУдаления <> СтарыеЗначения.ПометкаУдаления;
ИзменениеРолей = Объект.Роли.Выгрузить();
ИзменениеРолей.Свернуть("Роль");
ИзменениеРолей.Колонки.Добавить("ВидИзменения", Новый ОписаниеТипов("Строка"));
ИзменениеРолей.ЗаполнитьЗначения("Добавлено", "ВидИзменения");
Если ТипЗнч(СтарыеЗначения.Роли) = Тип("РезультатЗапроса")
И Не СтарыеЗначения.Роли.Пустой() Тогда
СтарыеРоли = СтарыеЗначения.Роли.Выгрузить();
СтарыеРоли.Индексы.Добавить("Роль");
Индекс = ИзменениеРолей.Количество();
Пока Индекс > 0 Цикл
Индекс = Индекс - 1;
НоваяРоль = ИзменениеРолей.Получить(Индекс);
СтараяРоль = СтарыеРоли.Найти(НоваяРоль.Роль, "Роль");
Если СтараяРоль = Неопределено Тогда
Продолжить;
КонецЕсли;
Если АктивностьПрофиляИзменена Тогда
НоваяРоль.ВидИзменения = "Изменено";
Иначе
ИзменениеРолей.Удалить(НоваяРоль);
КонецЕсли;
СтарыеРоли.Удалить(СтараяРоль);
КонецЦикла;
Для Каждого СтараяРоль Из СтарыеРоли Цикл
НоваяСтрока = ИзменениеРолей.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтараяРоль);
НоваяСтрока.ВидИзменения = "Удалено";
КонецЦикла;
КонецЕсли;
Если Не АктивностьПрофиляИзменена
И Не ЗначениеЗаполнено(ИзменениеРолей) Тогда
Возврат;
КонецЕсли;
СериализованнаяСсылкаПрофиля = СериализованнаяСсылка(Объект.Ссылка);
ИдентификаторыРолей = ИзменениеРолей.ВыгрузитьКолонку("Роль");
СвойстваРолей = ОбщегоНазначения.ЗначенияРеквизитовОбъектов(ИдентификаторыРолей,
"ПометкаУдаления, Имя, Синоним");
МетаданныеРолей = ОбщегоНазначения.ОбъектыМетаданныхПоИдентификаторам(ИдентификаторыРолей, Ложь);
Для Каждого Строка Из ИзменениеРолей Цикл
Если Не ЗначениеЗаполнено(Строка.Роль) Тогда
Продолжить;
КонецЕсли;
СериализованнаяСсылкаРоли = СериализованнаяСсылка(Строка.Роль);
Свойства = Новый Структура;
Свойства.Вставить("Профиль", СериализованнаяСсылкаПрофиля);
Свойства.Вставить("Роль", СериализованнаяСсылкаРоли);
Свойства.Вставить("ВидИзменения", Строка.ВидИзменения);
Данные.ИзменениеРолей.Добавить(Свойства);
МетаданныеРоли = МетаданныеРолей.Получить(Строка.Роль);
СвойстваРоли = СвойстваРолей.Получить(Строка.Роль);
ИмяРоли = Неопределено;
СинонимРоли = Неопределено;
Если ТипЗнч(МетаданныеРоли) = Тип("ОбъектМетаданных") Тогда
ИмяРоли = МетаданныеРоли.Имя;
СинонимРоли = МетаданныеРоли.Синоним;
ИначеЕсли СвойстваРоли <> Неопределено Тогда
ИмяРоли = СвойстваРоли.Имя;
СинонимРоли = СвойстваРоли.Синоним;
КонецЕсли;
ПометкаУдаленияРоли = ?(СвойстваРоли = Неопределено,
Неопределено, СвойстваРоли.ПометкаУдаления);
Свойства = Новый Структура;
Свойства.Вставить("Роль", СериализованнаяСсылкаРоли);
Свойства.Вставить("ПометкаУдаления", ПометкаУдаленияРоли);
Свойства.Вставить("ЕстьВМетаданных", ТипЗнч(МетаданныеРоли) = Тип("ОбъектМетаданных"));
Свойства.Вставить("Имя", ИмяРоли);
Свойства.Вставить("Синоним", СинонимРоли);
Свойства.Вставить("СтарыеЗначенияСвойств", Новый Структура);
Данные.ПредставлениеРолей.Добавить(Свойства);
КонецЦикла;
Свойства = Новый Структура;
Свойства.Вставить("Профиль", СериализованнаяСсылка(Объект.Ссылка));
Свойства.Вставить("Представление", ПредставлениеСсылки(Объект.Ссылка));
Свойства.Вставить("ПометкаУдаления", Объект.ПометкаУдаления);
Свойства.Вставить("СтарыеЗначенияСвойств", Новый Структура);
Если Объект.ПометкаУдаления <> СтарыеЗначения.ПометкаУдаления Тогда
Свойства.СтарыеЗначенияСвойств.Вставить("ПометкаУдаления", СтарыеЗначения.ПометкаУдаления);
КонецЕсли;
Данные.ПредставлениеПрофилей.Добавить(Свойства);
Иначе
Если Объект.ПометкаУдаления = СтарыеЗначения.ПометкаУдаления Тогда
Возврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Роль", Объект.Ссылка);
Запрос.Текст =
"ВЫБРАТЬ
| ПрофилиГруппДоступа.Ссылка КАК Ссылка,
| ПрофилиГруппДоступа.ПометкаУдаления КАК ПометкаУдаления,
| ПрофилиГруппДоступа.Представление КАК Представление
|ИЗ
| Справочник.ПрофилиГруппДоступа КАК ПрофилиГруппДоступа
|ГДЕ
| ПрофилиГруппДоступа.Ссылка В
| (ВЫБРАТЬ
| РолиПрофилей.Ссылка
| ИЗ
| Справочник.ПрофилиГруппДоступа.Роли КАК РолиПрофилей
| ГДЕ
| РолиПрофилей.Роль = &Роль)";
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат;
КонецЕсли;
СериализованнаяСсылкаРоли = СериализованнаяСсылка(Объект.Ссылка);
МетаданныеРоли = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(Объект.Ссылка, Ложь);
ИмяРоли = ?(ТипЗнч(МетаданныеРоли) = Тип("ОбъектМетаданных"), МетаданныеРоли.Имя, Объект.Имя);
СинонимРоли = ?(ТипЗнч(МетаданныеРоли) = Тип("ОбъектМетаданных"), МетаданныеРоли.Синоним, Объект.Синоним);
Свойства = Новый Структура;
Свойства.Вставить("Роль", СериализованнаяСсылкаРоли);
Свойства.Вставить("ПометкаУдаления", Объект.ПометкаУдаления);
Свойства.Вставить("ЕстьВМетаданных", ТипЗнч(МетаданныеРоли) = Тип("ОбъектМетаданных"));
Свойства.Вставить("Имя", ИмяРоли);
Свойства.Вставить("Синоним", СинонимРоли);
Свойства.Вставить("СтарыеЗначенияСвойств", Новый Структура);
Если Объект.ПометкаУдаления <> СтарыеЗначения.ПометкаУдаления Тогда
Свойства.СтарыеЗначенияСвойств.Вставить("ПометкаУдаления", СтарыеЗначения.ПометкаУдаления);
КонецЕсли;
Если Объект.Имя <> СтарыеЗначения.Имя Тогда
Свойства.СтарыеЗначенияСвойств.Вставить("Имя",
?(ТипЗнч(СтарыеЗначения.Имя) = Тип("Строка"), СтарыеЗначения.Имя, ""));
КонецЕсли;
Если Объект.Синоним <> СтарыеЗначения.Синоним Тогда
Свойства.СтарыеЗначенияСвойств.Вставить("Синоним",
?(ТипЗнч(СтарыеЗначения.Синоним) = Тип("Строка"), СтарыеЗначения.Синоним, ""));
КонецЕсли;
Данные.ПредставлениеРолей.Добавить(Свойства);
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
СериализованнаяСсылкаПрофиля = СериализованнаяСсылка(Выборка.Ссылка);
Свойства = Новый Структура;
Свойства.Вставить("Профиль", СериализованнаяСсылкаПрофиля);
Свойства.Вставить("Роль", СериализованнаяСсылкаРоли);
Свойства.Вставить("ВидИзменения", "Изменено");
Данные.ИзменениеРолей.Добавить(Свойства);
Свойства = Новый Структура;
Свойства.Вставить("Профиль", СериализованнаяСсылкаПрофиля);
Свойства.Вставить("Представление", Выборка.Представление);
Свойства.Вставить("ПометкаУдаления", Выборка.ПометкаУдаления);
Свойства.Вставить("СтарыеЗначенияСвойств", Новый Структура);
Данные.ПредставлениеПрофилей.Добавить(Свойства);
КонецЦикла;
КонецЕсли;
ИмяСобытия = УправлениеДоступомСлужебный.ИмяСобытияИзменениеРолейПрофилейДляЖурналаРегистрации();
ЗаписьЖурналаРегистрации(ИмяСобытия,
УровеньЖурналаРегистрации.Информация,
Объект.Метаданные(),
ОбщегоНазначения.ЗначениеВСтрокуXML(Данные),
,
РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная);
КонецПроцедуры
Функция СериализованнаяСсылка(Ссылка)
Возврат ПользователиСлужебный.СериализованнаяСсылка(Ссылка);
КонецФункции
Функция ПредставлениеСсылки(Ссылка)
Возврат ПользователиСлужебный.ПредставлениеСсылки(Ссылка);
КонецФункции
#Область ПроцедурыИФункцииДляПоддержкиОбменаДаннымиВРИБ
Процедура ВосстановитьСоставРолейРасширений(ЭлементДанных) Экспорт
ПользователиСлужебный.ПроверитьБезопасныйРежимОтключен(
"Справочники.ПрофилиГруппДоступа.ВосстановитьСоставРолейРасширений");
УдалитьРолиРасширений(ЭлементДанных);
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Профиль", ЭлементДанных.Ссылка);
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| РолиПрофилей.Роль КАК Роль
|ИЗ
| Справочник.ПрофилиГруппДоступа.Роли КАК РолиПрофилей
|ГДЕ
| РолиПрофилей.Ссылка = &Профиль
| И ТИПЗНАЧЕНИЯ(РолиПрофилей.Роль) = ТИП(Справочник.ИдентификаторыОбъектовРасширений)";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ЭлементДанных.Роли.Добавить().Роль = Выборка.Роль;
КонецЦикла;
КонецПроцедуры
Процедура УдалитьРолиРасширений(ЭлементДанных) Экспорт
Индекс = ЭлементДанных.Роли.Количество() - 1;
Пока Индекс >= 0 Цикл
Если ТипЗнч(ЭлементДанных.Роли[Индекс].Роль) <> Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда
ЭлементДанных.Роли.Удалить(Индекс);
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикла;
КонецПроцедуры
Процедура УдалитьРолиРасширенийВоВсехПрофиляхГруппДоступа() Экспорт
ПользователиСлужебный.ПроверитьБезопасныйРежимОтключен(
"Справочники.ПрофилиГруппДоступа.УдалитьРолиРасширенийВоВсехПрофиляхГруппДоступа");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| РолиПрофилей.Ссылка КАК Ссылка
|ИЗ
| Справочник.ПрофилиГруппДоступа.Роли КАК РолиПрофилей
|ГДЕ
| ТИПЗНАЧЕНИЯ(РолиПрофилей.Роль) <> ТИП(Справочник.ИдентификаторыОбъектовМетаданных)";
ЕстьИзменения = Ложь;
Выборка = Запрос.Выполнить().Выбрать();
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("Справочник.ПрофилиГруппДоступа");
Пока Выборка.Следующий() Цикл
ЭлементБлокировки.УстановитьЗначение("Ссылка", Выборка.Ссылка);
НачатьТранзакцию();
Попытка
Блокировка.Заблокировать();
ПрофильОбъект = Выборка.Ссылка.ПолучитьОбъект();
Если ПрофильОбъект <> Неопределено Тогда
УдалитьРолиРасширений(ПрофильОбъект);
Если ПрофильОбъект.Модифицированность() Тогда
ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ПрофильОбъект, Ложь);
ЕстьИзменения = Истина;
КонецЕсли;
КонецЕсли;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
КонецЦикла;
Если ЕстьИзменения Тогда
РегистрыСведений.ТаблицыГруппДоступа.ОбновитьДанныеРегистра();
КонецЕсли;
КонецПроцедуры
Процедура ЗарегистрироватьИзменениеПриПолученииДанных(ЭлементДанных) Экспорт
Если ТипЗнч(ЭлементДанных) = Тип("СправочникОбъект.ПрофилиГруппДоступа") Тогда
ЗаполнитьСтандартныеРолиРасширений(ЭлементДанных.Роли);
КонецЕсли;
СтарыеЗначения = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ЭлементДанных.Ссылка,
"Ссылка, ПометкаУдаления, Роли, Назначение, ВидыДоступа, ЗначенияДоступа");
ТребуетсяРегистрация = Ложь;
Профиль = ЭлементДанных.Ссылка;
ИзмененныеРоли = Неопределено;
Если ТипЗнч(ЭлементДанных) = Тип("УдалениеОбъекта") Тогда
Если СтарыеЗначения.Ссылка = Неопределено Тогда
Возврат;
КонецЕсли;
ТребуетсяРегистрация = Истина;
ИзмененныеРоли = ?(СтарыеЗначения.ПометкаУдаления, Новый Массив,
СтарыеЗначения.Роли.Выгрузить().ВыгрузитьКолонку("Роль"));
ИначеЕсли СтарыеЗначения.Ссылка <> ЭлементДанных.Ссылка Тогда
ТребуетсяРегистрация = Истина;
Профиль = ПользователиСлужебный.СсылкаОбъекта(ЭлементДанных);
ИзмененныеРоли = ?(ЭлементДанных.ПометкаУдаления, Новый Массив,
ЭлементДанных.Роли.ВыгрузитьКолонку("Роль"));
ИначеЕсли СтарыеЗначения.ПометкаУдаления <> ЭлементДанных.ПометкаУдаления Тогда
ТребуетсяРегистрация = Истина;
ИзмененныеРоли = ?(ЭлементДанных.ПометкаУдаления,
СтарыеЗначения.Роли.Выгрузить().ВыгрузитьКолонку("Роль"),
ЭлементДанных.Роли.ВыгрузитьКолонку("Роль"));
ИначеЕсли ИзменилисьВидыИлиЗначенияДоступаИлиНазначение(СтарыеЗначения, ЭлементДанных) Тогда
ТребуетсяРегистрация = Истина;
КонецЕсли;
Если ИзмененныеРоли = Неопределено Тогда
СтарыеРоли = СтарыеЗначения.Роли.Выгрузить();
СтарыеРоли.Индексы.Добавить("Роль");
НовыеРоли = ЭлементДанных.Роли.Выгрузить();
НовыеРоли.Индексы.Добавить("Роль");
ИзмененныеРоли = Новый Массив;
Для Каждого Строка Из НовыеРоли Цикл
Если СтарыеРоли.Найти(Строка.Роль, "Роль") = Неопределено Тогда
ИзмененныеРоли.Добавить(Строка.Роль);
КонецЕсли;
КонецЦикла;
Для Каждого Строка Из СтарыеРоли Цикл
Если НовыеРоли.Найти(Строка.Роль, "Роль") = Неопределено Тогда
ИзмененныеРоли.Добавить(Строка.Роль);
КонецЕсли;
КонецЦикла;
Если ИзмененныеРоли.Количество() > 0 Тогда
ТребуетсяРегистрация = Истина;
КонецЕсли;
КонецЕсли;
Если Не ТребуетсяРегистрация Тогда
Возврат;
КонецЕсли;
УстановитьПривилегированныйРежим(Истина);
ПользователиСлужебный.ЗарегистрироватьСсылки("ПрофилиГруппДоступа", Профиль);
Если УправлениеДоступомСлужебный.ОграничиватьДоступНаУровнеЗаписейУниверсально() Тогда
ПользователиСлужебный.ЗарегистрироватьСсылки("ПрофилиГруппДоступаРоли", ИзмененныеРоли);
КонецЕсли;
КонецПроцедуры
Процедура ОбработатьИзменениеЗарегистрированноеПриПолученииДанных() Экспорт
Если ОбщегоНазначения.РазделениеВключено() Тогда
Возврат;
КонецЕсли;
ИзмененныеПрофили = ПользователиСлужебный.ЗарегистрированныеСсылки("ПрофилиГруппДоступа");
Если ИзмененныеПрофили.Количество() = 0 Тогда
Возврат;
КонецЕсли;
Если ИзмененныеПрофили.Количество() = 1
И ИзмененныеПрофили[0] = Неопределено Тогда
ОбновитьВспомогательныеДанныеПрофилей();
Иначе
ОбновитьВспомогательныеДанныеПрофилей(ИзмененныеПрофили);
КонецЕсли;
ПользователиСлужебный.ЗарегистрироватьСсылки("ПрофилиГруппДоступа", Null);
Если Не УправлениеДоступомСлужебный.ОграничиватьДоступНаУровнеЗаписейУниверсально() Тогда
Возврат;
КонецЕсли;
ИзмененныеРоли = ПользователиСлужебный.ЗарегистрированныеСсылки("ПрофилиГруппДоступаРоли");
Если ИзмененныеРоли.Количество() = 0 Тогда
Возврат;
КонецЕсли;
Если ИзмененныеРоли.Количество() = 1
И ИзмененныеРоли[0] = Неопределено Тогда
ИзмененныеРоли = Неопределено;
КонецЕсли;
УправлениеДоступомСлужебный.ЗапланироватьОбновлениеДоступаПриИзмененииРолейПрофиля(
"ОбновитьВспомогательныеДанныеПрофилейИзмененныхПриЗагрузке", ИзмененныеРоли);
ПользователиСлужебный.ЗарегистрироватьСсылки("ПрофилиГруппДоступаРоли", Null);
КонецПроцедуры
#КонецОбласти
#Область НачальноеЗаполнение
Процедура ПриНастройкеНачальногоЗаполненияЭлементов(Настройки) Экспорт
Настройки.ПриНачальномЗаполненииЭлемента = Ложь;
КонецПроцедуры
Процедура ПриНачальномЗаполненииЭлементов(КодыЯзыков, Элементы, ТабличныеЧасти) Экспорт
Элемент = Элементы.Добавить();
Элемент.ИмяПредопределенныхДанных = "Администратор";
Элемент.Наименование = НСтр("ru = 'Администратор'", ОбщегоНазначения.КодОсновногоЯзыка());
Элемент.ИдентификаторПоставляемыхДанных =
Новый УникальныйИдентификатор(ИдентификаторПрофиляАдминистратор());
КонецПроцедуры
#КонецОбласти
#Область ВспомогательныеПроцедурыИФункции
Функция ЗаполненныеПоставляемыеПрофили()
ПараметрыОбновления = Новый Структура;
ПараметрыОбновления.Вставить("ОбновлятьИзмененныеПрофили", Истина);
ПараметрыОбновления.Вставить("ЗапретитьИзменениеПрофилей", Истина);
ПараметрыОбновления.Вставить("ОбновлятьГруппыДоступа", Истина);
ПараметрыОбновления.Вставить("ОбновлятьГруппыДоступаСУстаревшимиНастройками", Ложь);
ОписанияПрофилей = Новый Массив;
ОписаниеПрофиляАдминистратор = УправлениеДоступом.НовоеОписаниеПрофиляГруппДоступа();
ЗаполнитьПрофильАдминистратор(ОписаниеПрофиляАдминистратор);
ОписанияПрофилей.Добавить(ОписаниеПрофиляАдминистратор);
ОписаниеПапкиПрофилей = УправлениеДоступом.НовоеОписаниеПапкиПрофилейГруппДоступа();
ЗаполнитьПапкуПрофилейДополнительныеПрофили(ОписаниеПапкиПрофилей);
ОписанияПрофилей.Добавить(ОписаниеПапкиПрофилей);
ИнтеграцияПодсистемБСП.ПриЗаполненииПоставляемыхПрофилейГруппДоступа(
ОписанияПрофилей, ПараметрыОбновления);
УправлениеДоступомПереопределяемый.ПриЗаполненииПоставляемыхПрофилейГруппДоступа(
ОписанияПрофилей, ПараметрыОбновления);
Если ОписанияПрофилей.Найти(ОписаниеПрофиляАдминистратор) = Неопределено Тогда
ОписанияПрофилей.Добавить(ОписаниеПрофиляАдминистратор);
КонецЕсли;
ЗаполнитьПрофильАдминистратор(ОписаниеПрофиляАдминистратор, Истина);
Если Не ОбщегоНазначения.РазделениеВключено() Тогда
ОписанияПрофилей.Добавить(
УправлениеДоступомСлужебный.ОписаниеПрофиляОткрытиеВнешнихОтчетовИОбработок());
КонецЕсли;
Возврат Новый Структура("ОписанияПрофилей, ПараметрыОбновления", ОписанияПрофилей, ПараметрыОбновления);
КонецФункции
Процедура ЗаполнитьПрофильАдминистратор(ОписаниеПрофиляАдминистратор, КромеОписания = Ложь)
Если КромеОписания Тогда
Описание = ОписаниеПрофиляАдминистратор.Описание;
Иначе
Описание =
НСтр("ru = 'Предназначен для:
|- настройки параметров работы и обслуживания информационной системы,
|- настройки прав доступа других пользователей,
|- удаления помеченных объектов,
|- в редких случаях для внесения изменений в конфигурацию.
|
|Рекомендуется не использовать для обычной работы в информационной системе.'");
КонецЕсли;
ЗаполнитьЗначенияСвойств(ОписаниеПрофиляАдминистратор,
УправлениеДоступом.НовоеОписаниеПрофиляГруппДоступа());
ОписаниеПрофиляАдминистратор.Имя = "Администратор";
ОписаниеПрофиляАдминистратор.Идентификатор = ИдентификаторПрофиляАдминистратор();
ОписаниеПрофиляАдминистратор.Наименование = НСтр("ru = 'Администратор'", ОбщегоНазначения.КодОсновногоЯзыка());
ОписаниеПрофиляАдминистратор.Роли.Добавить("АдминистраторСистемы");
ОписаниеПрофиляАдминистратор.Роли.Добавить("ПолныеПрава");
ОписаниеПрофиляАдминистратор.Описание = Описание;
КонецПроцедуры
Процедура ЗаполнитьПапкуПрофилейДополнительныеПрофили(ОписаниеПапки)
ОписаниеПапки = УправлениеДоступом.НовоеОписаниеПапкиПрофилейГруппДоступа();
ОписаниеПапки.Имя = "ДополнительныеПрофили";
ОписаниеПапки.Идентификатор = "69a066e7-ce81-11eb-881c-b06ebfbf08c7";
ОписаниеПапки.Наименование = НСтр("ru = 'Дополнительные профили'", ОбщегоНазначения.КодОсновногоЯзыка());
КонецПроцедуры
Функция ПроверенныеПоставляемыеПрофилиСеанса(СвойстваВидовДоступа = Неопределено, ХешСумма = "") Экспорт
ЗаполненныеПоставляемыеПрофили = ЗаполненныеПоставляемыеПрофили();
ПараметрыОбновления = ЗаполненныеПоставляемыеПрофили.ПараметрыОбновления;
ОписанияПрофилей = ЗаполненныеПоставляемыеПрофили.ОписанияПрофилей;
ЗаголовокОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Заданы недопустимые значения в процедуре %1
|общего модуля %2.'"),
"ПриЗаполненииПоставляемыхПрофилейГруппДоступа",
"УправлениеДоступомПереопределяемый")
+ Символы.ПС
+ Символы.ПС;
Если ПараметрыОбновления.ЗапретитьИзменениеПрофилей
И НЕ ПараметрыОбновления.ОбновлятьИзмененныеПрофили Тогда
ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Когда в параметре %1 свойство
|%2 установлено Ложь,
|тогда свойство %3 тоже
|должно быть установлено Ложь.'"),
"ПараметрыОбновления",
"ОбновлятьИзмененныеПрофили",
"ЗапретитьИзменениеПрофилей");
ВызватьИсключение ТекстОшибки;
КонецЕсли;
ВсеРоли = ПользователиСлужебный.ВсеРоли().Соответствие;
Если СвойстваВидовДоступа = Неопределено Тогда
СвойстваВидовДоступа = УправлениеДоступомСлужебный.СвойстваВидовДоступа();
КонецЕсли;
ВсеИмена = Новый Соответствие;
ВсеИдентификаторы = Новый Соответствие;
ИменаПапокПрофилей = Новый Соответствие;
СписокПрофилей = Новый СписокЗначений;
Для Каждого ОписаниеПрофиля Из ОписанияПрофилей Цикл
ОписаниеПрофиля.Удалить("Описание");
ЭтоГруппа = ОписаниеПрофиля.ЭтоПапка;
Если Не ЗначениеЗаполнено(ОписаниеПрофиля.Идентификатор) Тогда
ШаблонОшибки = ?(ЭтоГруппа,
НСтр("ru = 'В описании папки профилей ""%1"" не заполнено свойство %2.'"),
НСтр("ru = 'В описании профиля ""%1"" не заполнено свойство %2.'"));
ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОшибки,
?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя), ОписаниеПрофиля.Имя, ОписаниеПрофиля.Наименование),
"Идентификатор");
ВызватьИсключение ТекстОшибки;
ИначеЕсли Не СтроковыеФункцииКлиентСервер.ЭтоУникальныйИдентификатор(ОписаниеПрофиля.Идентификатор) Тогда
ШаблонОшибки = ?(ЭтоГруппа,
НСтр("ru = 'В описании папки профилей ""%1"" указан некорректный идентификатор: ""%2"".'"),
НСтр("ru = 'В описании профиля ""%1"" указан некорректный идентификатор: ""%2"".'"));
ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОшибки,
?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя), ОписаниеПрофиля.Имя, ОписаниеПрофиля.Наименование),
ОписаниеПрофиля.Идентификатор);
ВызватьИсключение ТекстОшибки;
КонецЕсли;
СвойстваПрофиля = Новый Структура;
СвойстваПрофиля.Вставить("Имя", "");
СвойстваПрофиля.Вставить("Родитель", "");
СвойстваПрофиля.Вставить("Идентификатор", "");
СвойстваПрофиля.Вставить("Наименование", "");
ЗаполнитьЗначенияСвойств(СвойстваПрофиля, ОписаниеПрофиля);
СвойстваПрофиля.Вставить("ЭтоГруппа", ЭтоГруппа);
Если ВсеИдентификаторы.Получить(ВРег(СвойстваПрофиля.Идентификатор)) <> Неопределено Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Значение ""%1"" свойства %2 уже используется в описании другого профиля или папки профилей.'"),
СвойстваПрофиля.Идентификатор, "Идентификатор");
ВызватьИсключение ТекстОшибки;
КонецЕсли;
ВсеИдентификаторы.Вставить(ВРег(СвойстваПрофиля.Идентификатор), Истина);
СписокПрофилей.Добавить(СвойстваПрофиля, НРег(СвойстваПрофиля.Идентификатор));
Если ЭтоГруппа И Не ЗначениеЗаполнено(СвойстваПрофиля.Имя) Тогда
ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'В описании папки профилей ""%1"" не заполнено свойство %2.'"),
?(ЗначениеЗаполнено(ОписаниеПрофиля.Наименование), ОписаниеПрофиля.Наименование, ОписаниеПрофиля.Идентификатор),
"Имя");
ВызватьИсключение ТекстОшибки;
ИначеЕсли ЗначениеЗаполнено(СвойстваПрофиля.Имя) Тогда
Если СокрЛП(СвойстваПрофиля.Имя) <> СвойстваПрофиля.Имя Тогда
ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Значение ""%1"" свойства %2 профиля или папки профилей содержит непечатаемые символы.'"),
СвойстваПрофиля.Имя, "Имя");
ВызватьИсключение ТекстОшибки;
КонецЕсли;
Если ВсеИмена.Получить(ВРег(СвойстваПрофиля.Имя)) <> Неопределено Тогда
ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Значение ""%1"" свойства %2 уже используется в описании другого профиля или папки профилей.'"),
СвойстваПрофиля.Имя, "Имя");
ВызватьИсключение ТекстОшибки;
КонецЕсли;
ВсеИмена.Вставить(ВРег(СвойстваПрофиля.Имя), Истина);
КонецЕсли;
Если ЭтоГруппа Тогда
ИменаПапокПрофилей.Вставить(ВРег(СвойстваПрофиля.Имя), СвойстваПрофиля.Родитель);
Продолжить;
КонецЕсли;
ПодготовитьНазначениеПоставляемогоПрофиля(СвойстваПрофиля, ОписаниеПрофиля, ЗаголовокОшибки);
НазначениеПрофиля = УправлениеДоступомСлужебныйКлиентСервер.НазначениеПрофиля(СвойстваПрофиля);
ПодготовитьРолиПоставляемогоПрофиля(СвойстваПрофиля, ОписаниеПрофиля, НазначениеПрофиля, ВсеРоли, ЗаголовокОшибки);
ПодготовитьВидыДоступаПоставляемогоПрофиля(СвойстваПрофиля, ОписаниеПрофиля, НазначениеПрофиля, СвойстваВидовДоступа, ЗаголовокОшибки);
ПодготовитьЗначенияДоступаПоставляемогоПрофиля(СвойстваПрофиля, ОписаниеПрофиля, СвойстваВидовДоступа, ЗаголовокОшибки);
КонецЦикла;
Для Каждого ОписаниеПрофиля Из ОписанияПрофилей Цикл
Если Не ЗначениеЗаполнено(ОписаниеПрофиля.Родитель) Тогда
Продолжить;
КонецЕсли;
Если ИменаПапокПрофилей.Получить(ВРег(ОписаниеПрофиля.Родитель)) <> Неопределено Тогда
Продолжить;
КонецЕсли;
ШаблонОшибки = ?(ОписаниеПрофиля.ЭтоПапка,
НСтр("ru = 'В описании папки профилей ""%1"" в свойстве %2
|указано несуществующее имя папки профилей ""%3"".'"),
НСтр("ru = 'В описании профиля ""%1"" в свойстве %2
|указано несуществующее имя папки профилей ""%3"".'"));
ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОшибки,
?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя), ОписаниеПрофиля.Имя, ОписаниеПрофиля.Наименование),
"Родитель", ОписаниеПрофиля.Родитель);
ВызватьИсключение ТекстОшибки;
КонецЦикла;
ПапкиПоРодителям = Новый Соответствие;
Для Каждого ОписаниеПрофиля Из ОписанияПрофилей Цикл
Если Не ОписаниеПрофиля.ЭтоПапка Тогда
Продолжить;
КонецЕсли;
ПапкиРодителя = ПапкиПоРодителям.Получить(ОписаниеПрофиля.Родитель);
Если ПапкиРодителя = Неопределено Тогда
ПапкиРодителя = Новый Соответствие;
ПапкиПоРодителям.Вставить(ОписаниеПрофиля.Родитель, ПапкиРодителя);
КонецЕсли;
ПапкиРодителя.Вставить(ОписаниеПрофиля.Имя, Истина);
Если Не ЗначениеЗаполнено(ОписаниеПрофиля.Родитель) Тогда
Продолжить;
КонецЕсли;
РодителиПапки = Новый Массив;
Родитель = ОписаниеПрофиля.Родитель;
Пока Истина Цикл
РодителиПапки.Добавить(Родитель);
Родитель = ИменаПапокПрофилей.Получить(ВРег(Родитель));
Если Не ЗначениеЗаполнено(Родитель) Тогда
Прервать;
КонецЕсли;
Если РодителиПапки.Найти(Родитель) = Неопределено Тогда
Продолжить;
КонецЕсли;
ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'В описании папки профилей ""%1"" в свойстве %2
|указано имя папки профилей ""%3"",
|создающее циклическую зависимость: ""%4"".'"),
?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя), ОписаниеПрофиля.Имя, ОписаниеПрофиля.Наименование),
"Родитель",
ОписаниеПрофиля.Родитель,
СтрСоединить(РодителиПапки, " -> "));
ВызватьИсключение ТекстОшибки;
КонецЦикла;
КонецЦикла;
ОписаниеВерсии = Новый Структура("СвойстваВерсии", Новый Массив);
ДобавитьЭлементВерсии(ОписаниеВерсии, "Версия", "1");
ДобавитьЭлементВерсии(ОписаниеВерсии, "ИменаПредопределенных",
Метаданные.Справочники.ПрофилиГруппДоступа.ПолучитьИменаПредопределенных());
ДобавитьСвойстваВерсии(ОписаниеВерсии, ПараметрыОбновления,
"ОбновлятьИзмененныеПрофили,
|ЗапретитьИзменениеПрофилей,
|ОбновлятьГруппыДоступа,
|ОбновлятьГруппыДоступаСУстаревшимиНастройками");
СписокПрофилей.СортироватьПоПредставлению();
СвойстваПрофилей = Новый Соответствие;
ОписанияПрофилейМассив = Новый Массив;
РазделениеВключено = ОбщегоНазначения.РазделениеВключено();
ИдентификаторыВсехРолей = ИдентификаторыВсехРолей();
Для Каждого ОписаниеПрофиля Из СписокПрофилей Цикл
СвойстваПрофиля = Новый ФиксированнаяСтруктура(ОписаниеПрофиля.Значение);
ОписанияПрофилейМассив.Добавить(СвойстваПрофиля);
СвойстваПрофилей.Вставить(СвойстваПрофиля.Идентификатор, СвойстваПрофиля);
Если ЗначениеЗаполнено(СвойстваПрофиля.Имя) Тогда
СвойстваПрофилей.Вставить(СвойстваПрофиля.Имя, СвойстваПрофиля);
КонецЕсли;
ОписаниеВерсии.СвойстваВерсии.Добавить("");
ДобавитьСвойстваВерсии(ОписаниеВерсии, СвойстваПрофиля,
"Имя, Родитель, Идентификатор, Наименование");
Если СвойстваПрофиля.ЭтоГруппа Тогда
Продолжить;
КонецЕсли;
ДобавитьСвойстваВерсии(ОписаниеВерсии, СвойстваПрофиля, "Назначение");
РолиСИдентификаторами = РолиСИдентификаторами(СвойстваПрофиля.Роли, ИдентификаторыВсехРолей);
ДобавитьСвойстваВерсии(ОписаниеВерсии, Новый Структура("Роли", РолиСИдентификаторами) , "Роли");
Если РазделениеВключено Тогда
РолиНедоступныеВСервисе = Новый СписокЗначений;
Для Каждого ОписаниеРоли Из СвойстваПрофиля.РолиНедоступныеВСервисе Цикл
РолиНедоступныеВСервисе.Добавить(ОписаниеРоли.Ключ);
КонецЦикла;
РолиНедоступныеВСервисе.СортироватьПоЗначению();
ДобавитьЭлементВерсии(ОписаниеВерсии,
"РолиНедоступныеВСервисе", РолиНедоступныеВСервисе.ВыгрузитьЗначения());
КонецЕсли;
ВидыДоступа = Новый СписокЗначений;
Для Каждого КлючИЗначение Из СвойстваПрофиля.ВидыДоступа Цикл
ЗначенияДоступа = Новый СписокЗначений;
ВидыДоступа.Добавить(ЗначенияДоступа, КлючИЗначение.Ключ + " (" + КлючИЗначение.Значение + ")");
Для Каждого ОписаниеЗначения Из СвойстваПрофиля.ЗначенияДоступа Цикл
Если ОписаниеЗначения.ВидДоступа = КлючИЗначение.Ключ Тогда
ЗначенияДоступа.Добавить(ОписаниеЗначения.ЗначениеДоступа);
КонецЕсли;
КонецЦикла;
ЗначенияДоступа.СортироватьПоЗначению();
КонецЦикла;
ВидыДоступа.СортироватьПоПредставлению();
Для Каждого ЭлементСписка Из ВидыДоступа Цикл
Если ЗначениеЗаполнено(ЭлементСписка.Значение) Тогда
ДобавитьЭлементВерсии(ОписаниеВерсии,
ЭлементСписка.Представление, ЭлементСписка.Значение.ВыгрузитьЗначения());
Иначе
ОписаниеВерсии.СвойстваВерсии.Добавить(ЭлементСписка.Представление);
КонецЕсли;
КонецЦикла;
КонецЦикла;
СтрокаВерсии = СтрСоединить(ОписаниеВерсии.СвойстваВерсии, Символы.ПС);
ХешСумма = УправлениеДоступомСлужебный.ХешСуммаДанных(СтрокаВерсии);
Результат = Новый Структура;
Результат.Вставить("ПараметрыОбновления",
Новый ФиксированнаяСтруктура(ПараметрыОбновления));
Результат.Вставить("ОписанияПрофилей",
Новый ФиксированноеСоответствие(СвойстваПрофилей));
Результат.Вставить("ОписанияПрофилейМассив",
Новый ФиксированныйМассив(ОписанияПрофилейМассив));
Результат.Вставить("ПапкиПоРодителям",
ОбщегоНазначения.ФиксированныеДанные(ПапкиПоРодителям));
Возврат Новый ФиксированнаяСтруктура(Результат);
КонецФункции
Процедура ПодготовитьНазначениеПоставляемогоПрофиля(СвойстваПрофиля, ОписаниеПрофиля, ЗаголовокОшибки)
Если ОписаниеПрофиля.Назначение.Количество() = 0 Тогда
ОписаниеПрофиля.Назначение.Добавить(Тип("СправочникСсылка.Пользователи"));
КонецЕсли;
СписокНазначений = Новый СписокЗначений;
Для Каждого Тип Из ОписаниеПрофиля.Назначение Цикл
Если ТипЗнч(Тип) = Тип("ОписаниеТипов") Тогда
Типы = Тип.Типы();
Иначе
Типы = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Тип);
КонецЕсли;
Для Каждого Тип Из Типы Цикл
Если ТипЗнч(Тип) <> Тип("Тип")
Или Не ОбщегоНазначения.ЭтоСсылка(Тип)
Или Не Метаданные.ОпределяемыеТипы.Пользователь.Тип.СодержитТип(Тип)
Или Тип <> Тип("СправочникСсылка.Пользователи")
И Не Метаданные.ОпределяемыеТипы.ВнешнийПользователь.Тип.СодержитТип(Тип) Тогда
ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'В описании профиля ""%1""
|указано недопустимое назначение ""%2 (%3)"".
|Ожидается назначение, как значение типа ""%4"" для ссылки,
|указанное в определяемом типе %5 и
|указанное в определяемом типе %6
|(кроме типа %7).'"),
?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя),
ОписаниеПрофиля.Имя, ОписаниеПрофиля.Идентификатор),
Строка(Тип),
Строка(ТипЗнч(Тип)),
"Тип",
"Пользователь",
"ВнешнийПользователь",
"СправочникСсылка.Пользователи");
ВызватьИсключение ТекстОшибки;
КонецЕсли;
ОписаниеТипаСсылки = Новый ОписаниеТипов(ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Тип));
Значение = ОписаниеТипаСсылки.ПривестиЗначение(Неопределено);
СписокНазначений.Добавить(Значение);
КонецЦикла;
КонецЦикла;
СписокНазначений.СортироватьПоЗначению();
СвойстваПрофиля.Вставить("Назначение",
Новый ФиксированныйМассив(СписокНазначений.ВыгрузитьЗначения()));
КонецПроцедуры
Процедура ПодготовитьРолиПоставляемогоПрофиля(СвойстваПрофиля, ОписаниеПрофиля,
НазначениеПрофиля, ВсеРоли, ЗаголовокОшибки)
НедоступныеРоли = ПользователиСлужебныйПовтИсп.НедоступныеРоли(НазначениеПрофиля, Ложь);
ПроверенныеРоли = Новый Соответствие;
ИндексРоли = ОписаниеПрофиля.Роли.Количество();
Пока ИндексРоли > 0 Цикл
ИндексРоли = ИндексРоли - 1;
Роль = ОписаниеПрофиля.Роли[ИндексРоли];
Если ВсеРоли.Получить(Роль) = Неопределено Тогда
ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'В описании профиля ""%1 (%2)""
|указана несуществующая роль ""%3"".'"),
ОписаниеПрофиля.Имя,
ОписаниеПрофиля.Идентификатор,
Роль);
ВызватьИсключение ТекстОшибки;
КонецЕсли;
Если ПроверенныеРоли.Получить(ВРег(Роль)) <> Неопределено Тогда
ОписаниеПрофиля.Роли.Удалить(ИндексРоли);
Продолжить;
КонецЕсли;
ПроверенныеРоли.Вставить(ВРег(Роль), Истина);
Если НедоступныеРоли.Получить(Роль) <> Неопределено Тогда
ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'В описании профиля ""%1 (%2)""
|указана роль ""%3"",
|которая не соответствует назначению профиля:
|""%4"".'"),
ОписаниеПрофиля.Имя,
ОписаниеПрофиля.Идентификатор,
Роль,
ПредставлениеНазначенияПрофиля(НазначениеПрофиля));
ВызватьИсключение ТекстОшибки;
КонецЕсли;
КонецЦикла;
ЗаполнитьСтандартныеРолиРасширений(ОписаниеПрофиля.Роли,
УправлениеДоступомСлужебныйПовтИсп.ОписаниеСтандартныхРолейРасширенийСеанса().РолиСеанса);
СписокРолей = Новый СписокЗначений;
СписокРолей.ЗагрузитьЗначения(ОписаниеПрофиля.Роли);
СписокРолей.СортироватьПоЗначению();
СвойстваПрофиля.Вставить("Роли",
Новый ФиксированныйМассив(СписокРолей.ВыгрузитьЗначения()));
Если ОбщегоНазначения.РазделениеВключено() Тогда
СвойстваПрофиля.Вставить("РолиНедоступныеВСервисе",
РолиПрофиляНедоступныеВСервисе(ОписаниеПрофиля, НазначениеПрофиля));
КонецЕсли;
КонецПроцедуры
Процедура ПодготовитьВидыДоступаПоставляемогоПрофиля(СвойстваПрофиля, ОписаниеПрофиля,
НазначениеПрофиля, СвойстваВидовДоступа, ЗаголовокОшибки)
ВидыДоступа = Новый Соответствие;
Для Каждого ЭлементСписка Из ОписаниеПрофиля.ВидыДоступа Цикл
ИмяВидаДоступа = ЭлементСписка.Значение;
УточнениеВидаДоступа = ЭлементСписка.Представление;
Если СвойстваВидовДоступа.ПоИменам.Получить(ИмяВидаДоступа) = Неопределено Тогда
ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'В описании профиля ""%1""
|указан несуществующий вид доступа ""%2"".'"),
?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя),
ОписаниеПрофиля.Имя,
ОписаниеПрофиля.Идентификатор),
ИмяВидаДоступа);
ВызватьИсключение ТекстОшибки;
КонецЕсли;
ВидДоступаСоответствуетНазначениюПрофиля =
УправлениеДоступомСлужебныйКлиентСервер.ВидДоступаСоответствуетНазначениюПрофиля(
ИмяВидаДоступа, НазначениеПрофиля);
Если Не ВидДоступаСоответствуетНазначениюПрофиля Тогда
ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'В описании профиля ""%1""
|указан вид доступа ""%2""
|который не соответствует назначению профиля:
|""%3"".'"),
?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя),
ОписаниеПрофиля.Имя,
ОписаниеПрофиля.Идентификатор),
ИмяВидаДоступа,
ПредставлениеНазначенияПрофиля(НазначениеПрофиля));
ВызватьИсключение ТекстОшибки;
КонецЕсли;
Если УточнениеВидаДоступа <> ""
И УточнениеВидаДоступа <> "ВначалеВсеЗапрещены"
И УточнениеВидаДоступа <> "Предустановленный"
И УточнениеВидаДоступа <> "ВначалеВсеРазрешены" Тогда
ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'В описании профиля ""%1""
|для вида доступа ""%2"" указано неизвестное уточнение ""%3"".
|
|Допустимы только следующие уточнения:
|- ""%4"" или """",
|- ""%5"",
|- ""%6"".'"),
?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя),
ОписаниеПрофиля.Имя,
ОписаниеПрофиля.Идентификатор),
ИмяВидаДоступа,
УточнениеВидаДоступа,
"ВначалеВсеЗапрещены",
"ВначалеВсеРазрешены",
"Предустановленный");
ВызватьИсключение ТекстОшибки;
КонецЕсли;
ВидыДоступа.Вставить(ИмяВидаДоступа, УточнениеВидаДоступа);
КонецЦикла;
СвойстваПрофиля.Вставить("ВидыДоступа", Новый ФиксированноеСоответствие(ВидыДоступа));
КонецПроцедуры
Процедура ПодготовитьЗначенияДоступаПоставляемогоПрофиля(СвойстваПрофиля, ОписаниеПрофиля, СвойстваВидовДоступа, ЗаголовокОшибки);
ЗначенияДоступа = Новый Массив;
ТаблицаЗначенийДоступа = Новый ТаблицаЗначений;
ТаблицаЗначенийДоступа.Колонки.Добавить("ВидДоступа", Метаданные.ОпределяемыеТипы.ЗначениеДоступа.Тип);
ТаблицаЗначенийДоступа.Колонки.Добавить("ЗначениеДоступа", Метаданные.ОпределяемыеТипы.ЗначениеДоступа.Тип);
Для Каждого ЭлементСписка Из ОписаниеПрофиля.ЗначенияДоступа Цикл
Отбор = Новый Структура;
Отбор.Вставить("ВидДоступа", ЭлементСписка.Значение);
Отбор.Вставить("ЗначениеДоступа", ЭлементСписка.Представление);
ВидДоступа = Отбор.ВидДоступа;
ЗначениеДоступа = Отбор.ЗначениеДоступа;
СвойстваВидаДоступа = СвойстваВидовДоступа.ПоИменам.Получить(ВидДоступа);
Если СвойстваВидаДоступа = Неопределено Тогда
ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'В описании профиля ""%1""
|указан несуществующий вид доступа ""%2""
|для значения доступа
|""%3"".'"),
?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя),
ОписаниеПрофиля.Имя,
ОписаниеПрофиля.Идентификатор),
ВидДоступа,
ЗначениеДоступа);
ВызватьИсключение ТекстОшибки;
КонецЕсли;
ОбъектМетаданных = Неопределено;
ПозицияТочки = СтрНайти(ЗначениеДоступа, ".");
Если ПозицияТочки > 0 Тогда
ВидОбъектаМетаданных = Лев(ЗначениеДоступа, ПозицияТочки - 1);
ОстатокСтроки = Сред(ЗначениеДоступа, ПозицияТочки + 1);
ПозицияТочки = СтрНайти(ОстатокСтроки, ".");
Если ПозицияТочки > 0 Тогда
ИмяОбъектаМетаданных = Лев(ОстатокСтроки, ПозицияТочки - 1);
ПолноеИмяОбъектаМетаданных = ВидОбъектаМетаданных + "." + ИмяОбъектаМетаданных;
ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ПолноеИмяОбъектаМетаданных);
КонецЕсли;
КонецЕсли;
Если ОбъектМетаданных = Неопределено Тогда
ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'В описании профиля ""%1""
|для вида доступа ""%2""
|не существует тип указанного значения доступа
|""%3"".'"),
?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя),
ОписаниеПрофиля.Имя,
ОписаниеПрофиля.Идентификатор),
ВидДоступа,
ЗначениеДоступа);
ВызватьИсключение ТекстОшибки;
КонецЕсли;
Попытка
ПустаяСсылкаЗначенияДоступа = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(
ПолноеИмяОбъектаМетаданных).ПустаяСсылка();
Исключение
ПустаяСсылкаЗначенияДоступа = Неопределено;
КонецПопытки;
Если ПустаяСсылкаЗначенияДоступа = Неопределено Тогда
ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'В описании профиля ""%1""
|для вида доступа ""%2""
|указан не ссылочный тип значения доступа
|""%3"".'"),
?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя),
ОписаниеПрофиля.Имя,
ОписаниеПрофиля.Идентификатор),
ВидДоступа,
ЗначениеДоступа);
ВызватьИсключение ТекстОшибки;
КонецЕсли;
ТипЗначенияДоступа = ТипЗнч(ПустаяСсылкаЗначенияДоступа);
СвойстваВидаДоступаПоТипу = СвойстваВидовДоступа.ПоТипамЗначений.Получить(ТипЗначенияДоступа);
Если СвойстваВидаДоступаПоТипу = Неопределено
ИЛИ СвойстваВидаДоступаПоТипу.Имя <> ВидДоступа Тогда
ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'В описании профиля ""%1""
|указано значение доступа ""%3""
|типа, который не указан в свойствах вида доступа ""%2"".'"),
?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя),
ОписаниеПрофиля.Имя,
ОписаниеПрофиля.Идентификатор),
ВидДоступа,
ЗначениеДоступа);
ВызватьИсключение ТекстОшибки;
КонецЕсли;
Если ТаблицаЗначенийДоступа.НайтиСтроки(Отбор).Количество() > 0 Тогда
ТекстОшибки = ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'В описании профиля ""%1""
|для вида доступа ""%2""
|повторно указано значение доступа
|""%3"".'"),
?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя),
ОписаниеПрофиля.Имя,
ОписаниеПрофиля.Идентификатор),
ВидДоступа,
ЗначениеДоступа);
ВызватьИсключение ТекстОшибки;
КонецЕсли;
ЗначенияДоступа.Добавить(Новый ФиксированнаяСтруктура(Отбор));
КонецЦикла;
СвойстваПрофиля.Вставить("ЗначенияДоступа", Новый ФиксированныйМассив(ЗначенияДоступа));
КонецПроцедуры
Функция ИдентификаторыВсехРолей()
Результат = Новый Соответствие;
Для Каждого Роль Из Метаданные.Роли Цикл
Результат.Вставить(Роль.Имя,
Справочники.ИдентификаторыОбъектовМетаданных.КлючОбъектаМетаданныхРоль(Роль));
КонецЦикла;
Возврат Результат;
КонецФункции
Функция РолиСИдентификаторами(ИменаРолей, ИдентификаторыВсехРолей = Неопределено)
Результат = Новый Массив;
Для Каждого ИмяРоли Из ИменаРолей Цикл
Если ИдентификаторыВсехРолей = Неопределено Тогда
ИдентификаторРоли = Справочники.ИдентификаторыОбъектовМетаданных.КлючОбъектаМетаданныхРоль(
Метаданные.Роли[ИмяРоли]);
Иначе
ИдентификаторРоли = ИдентификаторыВсехРолей.Получить(ИмяРоли);
КонецЕсли;
Результат.Добавить(ИмяРоли + " " + Строка(ИдентификаторРоли));
КонецЦикла;
Возврат Результат;
КонецФункции
Функция СвойстваПоставляемогоПрофиля(Идентификатор) Экспорт
ПоставляемыеПрофили = УправлениеДоступомСлужебный.ПоставляемыеПрофили();
Возврат ПоставляемыеПрофили.ОписанияПрофилей.Получить(Идентификатор);
КонецФункции
Функция ПояснениеПоставляемыхПрофилей() Экспорт
ОписанияПрофилей = ЗаполненныеПоставляемыеПрофили().ОписанияПрофилей;
ПредставлениеВидовДоступа = Новый Соответствие;
Для Каждого ОписаниеПрофиля Из ОписанияПрофилей Цикл
Если ОписаниеПрофиля.ЭтоПапка Тогда
ПредставлениеВидовДоступа.Вставить(ОписаниеПрофиля.Идентификатор, "");
Иначе
ПредставлениеВидовДоступа.Вставить(ОписаниеПрофиля.Идентификатор, ОписаниеПрофиля.Описание);
КонецЕсли;
КонецЦикла;
Возврат Новый ФиксированноеСоответствие(ПредставлениеВидовДоступа);
КонецФункции
Функция ПредставлениеНазначенияПрофиля(НазначениеПрофиля)
Если НазначениеПрофиля = "СовместноДляПользователейИВнешнихПользователей" Тогда
Возврат НСтр("ru = 'Совместно для пользователей и внешних пользователей'");
ИначеЕсли НазначениеПрофиля = "ДляВнешнихПользователей" Тогда
Возврат НСтр("ru = 'Для внешних пользователей'");
КонецЕсли;
Возврат НСтр("ru = 'Для пользователей'");
КонецФункции
Функция ПредопределенныеПрофилиСовпадают(НовыеПрофили, СтарыеПрофили, Удаленные)
Если ТипЗнч(НовыеПрофили) <> ТипЗнч(СтарыеПрофили) Тогда
Возврат Ложь;
КонецЕсли;
ПредопределенныеПрофилиСовпадают =
НовыеПрофили.Количество() = СтарыеПрофили.Количество();
Для Каждого Профиль Из СтарыеПрофили Цикл
Если НовыеПрофили.Найти(Профиль) = Неопределено Тогда
ПредопределенныеПрофилиСовпадают = Ложь;
Удаленные.Добавить(Профиль);
КонецЕсли;
КонецЦикла;
Возврат ПредопределенныеПрофилиСовпадают;
КонецФункции
Процедура ОбновитьПоставляемыеПапкиПрофилей(Родитель, ТекущиеПапкиПрофилей, ПоставляемыеПрофили, Удаленные, ЕстьИзменения)
ПапкиРодителя = ПоставляемыеПрофили.ПапкиПоРодителям.Получить(Родитель);
Если Не ЗначениеЗаполнено(ПапкиРодителя) Тогда
Возврат;
КонецЕсли;
Для Каждого КлючИЗначение Из ПапкиРодителя Цикл
СвойстваПрофиля = ПоставляемыеПрофили.ОписанияПрофилей.Получить(КлючИЗначение.Ключ);
Идентификатор = Новый УникальныйИдентификатор(СвойстваПрофиля.Идентификатор);
СтрокаТекущейПапки = ТекущиеПапкиПрофилей.Найти(Идентификатор, "ИдентификаторПоставляемыхДанных");
Если СтрокаТекущейПапки <> Неопределено Тогда
СтрокаТекущейПапки.Найден = Истина;
КонецЕсли;
Если ОбновитьПрофильИлиПапкуПрофилей(СвойстваПрофиля, Удаленные, Истина) Тогда
ЕстьИзменения = Истина;
КонецЕсли;
ОбновитьПоставляемыеПапкиПрофилей(КлючИЗначение.Ключ,
ТекущиеПапкиПрофилей, ПоставляемыеПрофили, Удаленные, ЕстьИзменения);
КонецЦикла;
КонецПроцедуры
Процедура ПометитьНаУдалениеУстаревшиеПоставляемыеДанные(ПапкиИлиПрофили, ЕстьИзменения, ОбновленныеПрофили = Неопределено)
Если Не Справочники.ВерсииРасширений.ВсеРасширенияПодключены() Тогда
Возврат;
КонецЕсли;
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("Справочник.ПрофилиГруппДоступа");
Для Каждого СтрокаТекущегоПрофиля Из ПапкиИлиПрофили Цикл
Если СтрокаТекущегоПрофиля.Найден Тогда
Продолжить;
КонецЕсли;
Если Не СтрокаТекущегоПрофиля.ЭтоГруппа
И СтрокаТекущегоПрофиля.ПоставляемыйПрофильИзменен Тогда
Продолжить;
КонецЕсли;
ЭлементБлокировки.УстановитьЗначение("Ссылка", СтрокаТекущегоПрофиля.Ссылка);
НачатьТранзакцию();
Попытка
Блокировка.Заблокировать();
ПрофильОбъект = СтрокаТекущегоПрофиля.Ссылка.ПолучитьОбъект();
Если Не ПрофильОбъект.ПометкаУдаления Тогда
ПрофильОбъект.ПометкаУдаления = Истина;
ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ПрофильОбъект);
Если ОбновленныеПрофили <> Неопределено Тогда
ОбновленныеПрофили.Добавить(ПрофильОбъект.Ссылка);
КонецЕсли;
ЕстьИзменения = Истина;
КонецЕсли;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Процедура ОбновитьПоставляемыеПрофилиБезПапок(ОбновленныеПрофили, ТекущиеПрофили,
ТекущиеПапкиПрофилей, ПоставляемыеПрофили, Удаленные, ЕстьИзменения)
ОписанияПрофилей = ПоставляемыеПрофили.ОписанияПрофилейМассив;
ПараметрыОбновления = ПоставляемыеПрофили.ПараметрыОбновления;
Для Каждого СвойстваПрофиля Из ОписанияПрофилей Цикл
СвойстваПрофиля = СвойстваПрофиля;
Если СвойстваПрофиля.ЭтоГруппа Тогда
Продолжить;
КонецЕсли;
Идентификатор = Новый УникальныйИдентификатор(СвойстваПрофиля.Идентификатор);
СтрокаТекущегоПрофиля = ТекущиеПрофили.Найти(Идентификатор, "ИдентификаторПоставляемыхДанных");
ПрофильОбновлен = Ложь;
Если СтрокаТекущегоПрофиля = Неопределено Тогда
Если ОбновитьПрофильИлиПапкуПрофилей(СвойстваПрофиля, Удаленные, Истина) Тогда
ЕстьИзменения = Истина;
КонецЕсли;
Профиль = ПоставляемыйПрофильПоИдентификатору(СвойстваПрофиля.Идентификатор);
Иначе
СтрокаТекущегоПрофиля.Найден = Истина;
Профиль = СтрокаТекущегоПрофиля.Ссылка;
Если Не СтрокаТекущегоПрофиля.ПоставляемыйПрофильИзменен
Или ПараметрыОбновления.ОбновлятьИзмененныеПрофили Тогда
ПрофильОбновлен = ОбновитьПрофильИлиПапкуПрофилей(СвойстваПрофиля, Удаленные, Истина);
КонецЕсли;
КонецЕсли;
Если ПараметрыОбновления.ОбновлятьГруппыДоступа Тогда
ГруппыДоступаПрофиляОбновлены = Справочники.ГруппыДоступа.ОбновитьГруппыДоступаПрофиля(
Профиль, ПараметрыОбновления.ОбновлятьГруппыДоступаСУстаревшимиНастройками);
ПрофильОбновлен = ПрофильОбновлен Или ГруппыДоступаПрофиляОбновлены;
КонецЕсли;
Если ПрофильОбновлен Тогда
ЕстьИзменения = Истина;
ОбновленныеПрофили.Добавить(Профиль);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ОбновитьПрофильИлиПапкуПрофилей(СвойстваПрофиля, Удаленные = Неопределено, НеОбновлятьРолиПользователей = Ложь)
ПрофильИзменен = Ложь;
УдаленПредопределенныйЭлементПапкиИлиПрофиля = ТипЗнч(Удаленные) = Тип("Массив")
И Удаленные.Найти(СвойстваПрофиля.Имя) <> Неопределено;
ПрофильСсылка = ПоставляемыйПрофильПоИдентификатору(СвойстваПрофиля.Идентификатор);
Если ПрофильСсылка = Неопределено Тогда
Если ЗначениеЗаполнено(СвойстваПрофиля.Имя) Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПрофилиГруппДоступа.Ссылка КАК Ссылка,
| ПрофилиГруппДоступа.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
|ИЗ
| Справочник.ПрофилиГруппДоступа КАК ПрофилиГруппДоступа
|ГДЕ
| ПрофилиГруппДоступа.Предопределенный = ИСТИНА
| И ПрофилиГруппДоступа.ЭтоГруппа = &ЭтоГруппа";
Запрос.УстановитьПараметр("ЭтоГруппа", СвойстваПрофиля.ЭтоГруппа);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ИмяПредопределенного = Выборка.ИмяПредопределенныхДанных;
Если ВРег(СвойстваПрофиля.Имя) = ВРег(ИмяПредопределенного) Тогда
ПрофильСсылка = Выборка.Ссылка;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ПрофильСсылка = Неопределено Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПрофилиГруппДоступа.Ссылка КАК Ссылка
|ИЗ
| Справочник.ПрофилиГруппДоступа КАК ПрофилиГруппДоступа
|ГДЕ
| ПрофилиГруппДоступа.Предопределенный = ЛОЖЬ
| И ПрофилиГруппДоступа.ЭтоГруппа = &ЭтоГруппа
| И ПрофилиГруппДоступа.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("ЭтоГруппа", СвойстваПрофиля.ЭтоГруппа);
Запрос.УстановитьПараметр("Ссылка",
ПолучитьСсылку(Новый УникальныйИдентификатор(СвойстваПрофиля.Идентификатор)));
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ПрофильСсылка = Выборка.Ссылка;
КонецЕсли;
КонецЕсли;
Если ПрофильСсылка = Неопределено
И СвойстваПрофиля.ЭтоГруппа
И ЗначениеЗаполнено(СвойстваПрофиля.Наименование) Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПрофилиГруппДоступа.Ссылка КАК Ссылка
|ИЗ
| Справочник.ПрофилиГруппДоступа КАК ПрофилиГруппДоступа
|ГДЕ
| ПрофилиГруппДоступа.Предопределенный = ЛОЖЬ
| И ПрофилиГруппДоступа.ЭтоГруппа
| И ПрофилиГруппДоступа.Наименование = &Наименование";
Запрос.УстановитьПараметр("Наименование", СвойстваПрофиля.Наименование);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ПрофильСсылка = Выборка.Ссылка;
КонецЕсли;
КонецЕсли;
Если ПрофильСсылка = Неопределено Тогда
ПрофильОбъект = ?(СвойстваПрофиля.ЭтоГруппа, СоздатьГруппу(), СоздатьЭлемент());
Иначе
ПрофильОбъект = ПрофильСсылка.ПолучитьОбъект();
КонецЕсли;
ПрофильОбъект.ИдентификаторПоставляемыхДанных =
Новый УникальныйИдентификатор(СвойстваПрофиля.Идентификатор);
ПрофильИзменен = Истина;
Иначе
ПрофильОбъект = ПрофильСсылка.ПолучитьОбъект();
ПрофильИзменен = ПоставляемыйПрофильИзменен(ПрофильОбъект)
Или УдаленПредопределенныйЭлементПапкиИлиПрофиля;
КонецЕсли;
Если ПрофильИзменен Тогда
Если Не ОбновлениеИнформационнойБазы.ВыполняетсяОбновлениеИнформационнойБазы()
И Не ОбновлениеИнформационнойБазы.ЭтоВызовИзОбработчикаОбновления() Тогда
ЗаблокироватьДанныеДляРедактирования(ПрофильОбъект.Ссылка, ПрофильОбъект.ВерсияДанных);
КонецЕсли;
Если УдаленПредопределенныйЭлементПапкиИлиПрофиля Тогда
ПрофильОбъект.ПометкаУдаления = Ложь;
КонецЕсли;
ПрофильОбъект.Наименование = СвойстваПрофиля.Наименование;
Если ЗначениеЗаполнено(СвойстваПрофиля.Родитель) Тогда
Родитель = ПоставляемыйПрофильПоИдентификатору(СвойстваПрофиля.Родитель);
Если ЗначениеЗаполнено(Родитель) Тогда
ПрофильОбъект.Родитель = Родитель;
КонецЕсли;
КонецЕсли;
Если Не СвойстваПрофиля.ЭтоГруппа Тогда
ПрофильОбъект.Роли.Очистить();
Для каждого Роль Из ОписаниеРолейПрофиля(СвойстваПрофиля) Цикл
МетаданныеРоли = Метаданные.Роли.Найти(Роль);
Если МетаданныеРоли = Неопределено Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'При обновлении поставляемого профиля ""%1""
|обнаружена несуществующая роль ""%2"".'"),
СвойстваПрофиля.Наименование,
Роль);
ВызватьИсключение ТекстОшибки;
КонецЕсли;
ПрофильОбъект.Роли.Добавить().Роль =
ОбщегоНазначения.ИдентификаторОбъектаМетаданных(МетаданныеРоли);
КонецЦикла;
ПрофильОбъект.ВидыДоступа.Очистить();
Для каждого ОписаниеВидаДоступа Из СвойстваПрофиля.ВидыДоступа Цикл
СвойстваВидаДоступа = УправлениеДоступомСлужебный.СвойстваВидаДоступа(ОписаниеВидаДоступа.Ключ);
Строка = ПрофильОбъект.ВидыДоступа.Добавить();
Строка.ВидДоступа = СвойстваВидаДоступа.Ссылка;
Строка.Предустановленный = ОписаниеВидаДоступа.Значение = "Предустановленный";
Строка.ВсеРазрешены = ОписаниеВидаДоступа.Значение = "ВначалеВсеРазрешены";
КонецЦикла;
ПрофильОбъект.ЗначенияДоступа.Очистить();
Для каждого ОписаниеЗначенияДоступа Из СвойстваПрофиля.ЗначенияДоступа Цикл
СвойстваВидаДоступа = УправлениеДоступомСлужебный.СвойстваВидаДоступа(ОписаниеЗначенияДоступа.ВидДоступа);
СтрокаЗначения = ПрофильОбъект.ЗначенияДоступа.Добавить();
СтрокаЗначения.ВидДоступа = СвойстваВидаДоступа.Ссылка;
СтрокаЗначения.ЗначениеДоступа = ПредопределенноеЗначение(ОписаниеЗначенияДоступа.ЗначениеДоступа);
КонецЦикла;
ПрофильОбъект.Назначение.Очистить();
Для каждого ТипНазначения Из СвойстваПрофиля.Назначение Цикл
СтрокаНазначения = ПрофильОбъект.Назначение.Добавить();
СтрокаНазначения.ТипПользователей = ТипНазначения;
КонецЦикла;
Если НеОбновлятьРолиПользователей Тогда
ПрофильОбъект.ДополнительныеСвойства.Вставить("НеОбновлятьРолиПользователей");
КонецЕсли;
КонецЕсли;
Если Не Справочники.ВерсииРасширений.ВсеРасширенияПодключены() Тогда
СтарыеЗначения = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ПрофильОбъект.Ссылка, "ВидыДоступа, ЗначенияДоступа");
ВосстановитьНесуществующиеВидыИЗначенияДоступа(СтарыеЗначения, ПрофильОбъект);
КонецЕсли;
ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ПрофильОбъект);
Если Не ОбновлениеИнформационнойБазы.ВыполняетсяОбновлениеИнформационнойБазы()
И Не ОбновлениеИнформационнойБазы.ЭтоВызовИзОбработчикаОбновления() Тогда
РазблокироватьДанныеДляРедактирования(ПрофильОбъект.Ссылка);
КонецЕсли;
КонецЕсли;
Возврат ПрофильИзменен;
КонецФункции
Функция ОписаниеРолейПрофиля(ОписаниеПрофиля)
НазначениеПрофиля = УправлениеДоступомСлужебныйКлиентСервер.НазначениеПрофиля(ОписаниеПрофиля);
НедоступныеРоли = ПользователиСлужебныйПовтИсп.НедоступныеРоли(НазначениеПрофиля);
ОписаниеРолейПрофиля = Новый Массив;
Для Каждого Роль Из ОписаниеПрофиля.Роли Цикл
Если НедоступныеРоли.Получить(Роль) = Неопределено Тогда
ОписаниеРолейПрофиля.Добавить(Роль);
КонецЕсли;
КонецЦикла;
ЗаполнитьСтандартныеРолиРасширений(ОписаниеРолейПрофиля);
Возврат Новый ФиксированныйМассив(ОписаниеРолейПрофиля);
КонецФункции
Функция РолиПрофиляНедоступныеВСервисе(ОписаниеПрофиля, НазначениеПрофиля)
НедоступныеРоли = ПользователиСлужебныйПовтИсп.НедоступныеРоли(НазначениеПрофиля, Истина);
НедоступныеРолиПрофиля = Новый Соответствие;
Для Каждого Роль Из ОписаниеПрофиля.Роли Цикл
Если НедоступныеРоли.Получить(Роль) <> Неопределено Тогда
НедоступныеРолиПрофиля.Вставить(Роль, Истина);
КонецЕсли;
КонецЦикла;
Возврат Новый ФиксированноеСоответствие(НедоступныеРолиПрофиля);
КонецФункции
Функция ТекущиеПапкиПрофилей()
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ПустойУникальныйИдентификатор",
ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор());
Запрос.Текст =
"ВЫБРАТЬ
| ПрофилиГруппДоступа.ИдентификаторПоставляемыхДанных КАК ИдентификаторПоставляемыхДанных,
| ПрофилиГруппДоступа.Ссылка КАК Ссылка,
| ПрофилиГруппДоступа.ЭтоГруппа КАК ЭтоГруппа,
| ЛОЖЬ КАК Найден
|ИЗ
| Справочник.ПрофилиГруппДоступа КАК ПрофилиГруппДоступа
|ГДЕ
| ПрофилиГруппДоступа.ЭтоГруппа
| И ПрофилиГруппДоступа.ИдентификаторПоставляемыхДанных <> &ПустойУникальныйИдентификатор";
ТекущиеПрофили = Запрос.Выполнить().Выгрузить();
Возврат ТекущиеПрофили;
КонецФункции
Функция ТекущиеПрофили()
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ПустойУникальныйИдентификатор",
ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор());
Запрос.Текст =
"ВЫБРАТЬ
| ПрофилиГруппДоступа.ПоставляемыйПрофильИзменен КАК ПоставляемыйПрофильИзменен,
| ПрофилиГруппДоступа.ИдентификаторПоставляемыхДанных КАК ИдентификаторПоставляемыхДанных,
| ПрофилиГруппДоступа.ЭтоГруппа КАК ЭтоГруппа,
| ПрофилиГруппДоступа.Ссылка КАК Ссылка,
| ЛОЖЬ КАК Найден
|ИЗ
| Справочник.ПрофилиГруппДоступа КАК ПрофилиГруппДоступа
|ГДЕ
| НЕ ПрофилиГруппДоступа.ЭтоГруппа
| И ПрофилиГруппДоступа.ИдентификаторПоставляемыхДанных <> &ПустойУникальныйИдентификатор";
ТекущиеПрофили = Запрос.Выполнить().Выгрузить();
Возврат ТекущиеПрофили;
КонецФункции
Функция ОсновныеНепоставляемыеПрофили()
ПоставляемыеПрофили = УправлениеДоступомСлужебный.ПоставляемыеПрофили();
ИдентификаторыПоставляемыхПрофилей = Новый Массив;
Для Каждого ОписаниеПрофиля Из ПоставляемыеПрофили.ОписанияПрофилейМассив Цикл
Если ОписаниеПрофиля.ЭтоГруппа Тогда
Продолжить;
КонецЕсли;
ИдентификаторыПоставляемыхПрофилей.Добавить(
Новый УникальныйИдентификатор(ОписаниеПрофиля.Идентификатор));
КонецЦикла;
РолиОсновныхПрофилей = Новый Массив;
РолиОсновныхПрофилей.Добавить(ОбщегоНазначения.ИдентификаторОбъектаМетаданных(
Метаданные.Роли.ПолныеПрава.ПолноеИмя()));
РолиОсновныхПрофилей.Добавить(ОбщегоНазначения.ИдентификаторОбъектаМетаданных(
Метаданные.Роли.БазовыеПраваБСП.ПолноеИмя()));
РолиОсновныхПрофилей.Добавить(ОбщегоНазначения.ИдентификаторОбъектаМетаданных(
Метаданные.Роли.БазовыеПраваВнешнихПользователейБСП.ПолноеИмя()));
РолиОсновныхПрофилей.Добавить(ОбщегоНазначения.ИдентификаторОбъектаМетаданных(
Метаданные.Роли.АдминистраторСистемы.ПолноеИмя()));
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ИдентификаторыПоставляемыхПрофилей", ИдентификаторыПоставляемыхПрофилей);
Запрос.УстановитьПараметр("РолиОсновныхПрофилей", РолиОсновныхПрофилей);
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПрофилиГруппДоступа.Ссылка КАК Ссылка
|ИЗ
| Справочник.ПрофилиГруппДоступа КАК ПрофилиГруппДоступа
|ГДЕ
| НЕ ПрофилиГруппДоступа.ЭтоГруппа
| И НЕ ПрофилиГруппДоступа.ИдентификаторПоставляемыхДанных В (&ИдентификаторыПоставляемыхПрофилей)
| И ИСТИНА В
| (ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА
| ИЗ
| Справочник.ПрофилиГруппДоступа.Роли КАК РолиПрофилей
| ГДЕ
| РолиПрофилей.Ссылка = ПрофилиГруппДоступа.Ссылка
| И РолиПрофилей.Роль В (&РолиОсновныхПрофилей))";
Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
КонецФункции
Функция НазначениеИРолиПрофилейГруппаДоступа()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Профили.Ссылка КАК Ссылка,
| Профили.Назначение.(
| ТипПользователей КАК ТипПользователей
| ) КАК Назначение,
| Профили.Роли.(
| Роль КАК Роль
| ) КАК Роли
|ИЗ
| Справочник.ПрофилиГруппДоступа КАК Профили";
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
#КонецОбласти
#КонецОбласти
#КонецЕсли