Files
SSL/SSL/src/Reports/ПраваРолей/ObjectModule.bsl
T
2026-06-16 23:21:00 +03:00

3310 lines
225 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2025, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ПрограммныйИнтерфейс
#Область ДляВызоваИзДругихПодсистем
// Задать настройки формы отчета.
//
// Параметры:
// Форма - ФормаКлиентскогоПриложения
// - Неопределено
// КлючВарианта - Строка
// - Неопределено
// Настройки - см. ОтчетыКлиентСервер.НастройкиОтчетаПоУмолчанию
//
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
Настройки.ОтключитьСтандартноеКонтекстноеМеню = Истина;
Настройки.РазрешеноИзменятьСтруктуру = Ложь;
Настройки.ФормироватьСразу = Истина;
Настройки.События.ПриСозданииНаСервере = Истина;
Настройки.События.ПриОпределенииИспользуемыхТаблиц = Истина;
Настройки.События.ПередЗагрузкойНастроекВКомпоновщик = Истина;
Настройки.События.ПослеЗагрузкиНастроекВКомпоновщик = Истина;
Настройки.События.ПередФормированиемОтчета = Истина;
Настройки.События.ПриОпределенииПараметровВыбора = Истина;
КонецПроцедуры
// См. ОтчетыПереопределяемый.ПриСозданииНаСервере
Процедура ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт
РеквизитыФормы = Новый Структура("КонтекстВарианта");
ЗаполнитьЗначенияСвойств(РеквизитыФормы, Форма);
Если ЗначениеЗаполнено(РеквизитыФормы.КонтекстВарианта) Тогда
Вариант = Форма.КлючТекущегоВарианта;
ФормаПараметрыОтбор = Форма.ФормаПараметры.Отбор;
Если Вариант = "ПраваРолейИПрофилейНаОбъектМетаданных" Тогда
ФормаПараметрыОтбор.Вставить("ОбъектМетаданных", РеквизитыФормы.КонтекстВарианта);
ИначеЕсли Форма.Параметры.Свойство("ПараметрКоманды") Тогда
ИмяПараметра = "";
Если Вариант = "ПраваРолиИПрофилейНаОбъектыМетаданных" Тогда
ИмяПараметра = "Профиль";
ЗначениеПараметра = СписокПрофилейБезГрупп(Форма.Параметры.ПараметрКоманды);
ИначеЕсли Вариант = "ПраваРолей" Тогда
ИмяПараметра = "Роль";
ЗначениеПараметра = СписокИменРолейПрофилей(Форма.Параметры.ПараметрКоманды);
КонецЕсли;
Если ЗначениеЗаполнено(ИмяПараметра) Тогда
Если ФормаПараметрыОтбор.Свойство("НачальныйОтбор") Тогда
НачальныйОтбор = ФормаПараметрыОтбор.НачальныйОтбор;
Иначе
НачальныйОтбор = Новый Структура;
ФормаПараметрыОтбор.Вставить("НачальныйОтбор", НачальныйОтбор);
КонецЕсли;
НачальныйОтбор.Вставить(ИмяПараметра, ЗначениеПараметра);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// Вызывается перед загрузкой новых настроек. Используется для изменения СКД отчета.
//
// Параметры:
// Контекст - Произвольный
// КлючСхемы - Строка
// КлючВарианта - Строка
// - Неопределено
// НовыеНастройкиКД - НастройкиКомпоновкиДанных
// - Неопределено
// НовыеПользовательскиеНастройкиКД - ПользовательскиеНастройкиКомпоновкиДанных
// - Неопределено
//
Процедура ПередЗагрузкойНастроекВКомпоновщик(Контекст, КлючСхемы, КлючВарианта, НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД) Экспорт
Если ТипЗнч(Контекст) <> Тип("ФормаКлиентскогоПриложения")
Или ТипЗнч(НовыеПользовательскиеНастройкиКД) <> Тип("ПользовательскиеНастройкиКомпоновкиДанных") Тогда
Возврат;
КонецЕсли;
СхемаКомпоновкиДанных.Параметры.Роль.УстановитьДоступныеЗначения(
ПользователиСлужебный.ВсеРоли().Список.Получить());
СхемаКомпоновкиДанных.Параметры.ОбъектМетаданных.УстановитьДоступныеЗначения(
УправлениеДоступомСлужебныйПовтИсп.СписокОбъектовМетаданныхСПравами().Получить());
ДополнительныеСвойства = КомпоновщикНастроек.Настройки.ДополнительныеСвойства;
Вариант = ДополнительныеСвойства.КлючПредопределенногоВарианта;
Форма = Контекст;
ФормаПараметрыОтбор = ДополнительныеСвойства.ФормаПараметрыОтбор;
Если НовыеНастройкиКД <> Неопределено Тогда
СкрытьЛишниеПоляДанных(Вариант, ФормаПараметрыОтбор, НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД);
КонецЕсли;
НедоступныеПараметры = Новый Структура;
Если Вариант = "ПраваРолей"
И Не ФормаПараметрыОтбор.Свойство("НачальныйОтбор") Тогда
Если Не ПараметрИспользуется(НовыеПользовательскиеНастройкиКД, "ОбъектМетаданных")
И Не ПараметрИспользуется(НовыеПользовательскиеНастройкиКД, "Роль") Тогда
Форма.НастройкиОтчета.ФормироватьСразу = Ложь;
КонецЕсли;
НедоступныеПараметры = Новый Структура("Право,Профиль");
Иначе
Если Не ФормаПараметрыОтбор.Свойство("НачальныйОтбор") Тогда
ФормаПараметрыОтбор.Вставить("НачальныйОтбор", Новый Структура);
КонецЕсли;
Если ТипЗнч(ФормаПараметрыОтбор.НачальныйОтбор) <> Тип("Структура") Тогда
ФормаПараметрыОтбор.НачальныйОтбор = Новый Структура;
КонецЕсли;
Если Не ФормаПараметрыОтбор.НачальныйОтбор.Свойство("НачальныйОтборУстановлен") Тогда
ФормаПараметрыОтбор.НачальныйОтбор.Вставить("НачальныйОтборУстановлен",
Не ЗначениеЗаполнено(ФормаПараметрыОтбор.НачальныйОтбор)
И ФормаПараметрыОтбор.Количество() = 1);
КонецЕсли;
Если Вариант = "ПодробныеПраваРолейНаОбъектМетаданных" Тогда
НедоступныеПараметры = Новый Структура("УровеньДоступа,
|ПраваНаРеквизиты, ПоказыватьПраваНеинтерфейсныхПодсистем,
|НеПредупреждатьОБольшомРазмереОтчета");
Если УстановленОтборПоПрофилю(ФормаПараметрыОтбор, КомпоновщикНастроек.Настройки) Тогда
НедоступныеПараметры.Вставить("Роль");
НедоступныеПараметры.Вставить("ПоказыватьОбъектыИРолиБезПрав");
Если ТипЗнч(НовыеНастройкиКД) = Тип("НастройкиКомпоновкиДанных") Тогда
НовыеНастройкиКД.ДополнительныеСвойства.Вставить("УстановленОтборПоПрофилю");
КонецЕсли;
Иначе
НедоступныеПараметры.Вставить("Профиль");
КонецЕсли;
ИначеЕсли Вариант = "ПраваРолейИПрофилейНаОбъектМетаданных" Тогда
НедоступныеПараметры = Новый Структура("ПраваНаРеквизиты,Право,
|НеПредупреждатьОБольшомРазмереОтчета");
ИначеЕсли Вариант = "ПраваРолиИПрофилейНаОбъектыМетаданных" Тогда
Если УстановленОтборПоПрофилю(ФормаПараметрыОтбор, КомпоновщикНастроек.Настройки) Тогда
НедоступныеПараметры.Вставить("Роль");
КонецЕсли;
НедоступныеПараметры.Вставить("Право");
КонецЕсли;
КонецЕсли;
Если ФормаПараметрыОтбор.Свойство("НачальныйОтбор")
И Не ФормаПараметрыОтбор.НачальныйОтбор.НачальныйОтборУстановлен Тогда
ВсеПараметры = Новый Структура("ОбъектМетаданных, Роль, ПраваНаРеквизиты, Профиль,
|УровеньДоступа, Право, ПоказыватьОбъектыИРолиБезПрав, ФорматИмени,
|ПоказыватьПраваНеинтерфейсныхПодсистем, НеПредупреждатьОБольшомРазмереОтчета");
Иначе
ВсеПараметры = НедоступныеПараметры;
КонецЕсли;
Для Каждого ОписаниеПараметра Из ВсеПараметры Цикл
Если Не ФормаПараметрыОтбор.Свойство(ОписаниеПараметра.Ключ) Тогда
ВыключитьПараметр(ОписаниеПараметра.Ключ, НедоступныеПараметры,
НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД);
КонецЕсли;
КонецЦикла;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда
МодульОтчетыСервер = ОбщегоНазначения.ОбщийМодуль("ОтчетыСервер");
МодульОтчетыСервер.ПодключитьСхему(ЭтотОбъект, Контекст, СхемаКомпоновкиДанных, КлючСхемы);
КонецЕсли;
Если Не ФормаПараметрыОтбор.Свойство("НачальныйОтбор")
Или ФормаПараметрыОтбор.НачальныйОтбор.НачальныйОтборУстановлен Тогда
Возврат;
КонецЕсли;
ФормаПараметрыОтбор.НачальныйОтбор.НачальныйОтборУстановлен = Истина;
Если Вариант = "ПраваРолиИПрофилейНаОбъектыМетаданных"
И ФормаПараметрыОтбор.НачальныйОтбор.Свойство("Профиль") Тогда
УстановитьРежимОтображения("Профиль", РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ,
НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД);
УстановитьРежимОтображения("Роль", РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный,
НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД);
КонецЕсли;
Если ТипЗнч(ФормаПараметрыОтбор.НачальныйОтбор) = Тип("Структура") Тогда
Для Каждого КлючИЗначение Из ФормаПараметрыОтбор.НачальныйОтбор Цикл
Если КлючИЗначение.Ключ = "НачальныйОтборУстановлен" Тогда
Продолжить;
КонецЕсли;
ВключитьПараметр(НовыеПользовательскиеНастройкиКД,
КлючИЗначение.Ключ, КлючИЗначение.Значение,
Форма.НастройкиОтчета.ФормироватьСразу);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
// Параметры:
// ДополнительныеПараметры - Структура
//
Процедура ПослеЗагрузкиНастроекВКомпоновщик(ДополнительныеПараметры) Экспорт
ДополнительныеСвойства = КомпоновщикНастроек.Настройки.ДополнительныеСвойства;
Вариант = ДополнительныеСвойства.КлючПредопределенногоВарианта;
ФормаПараметрыОтбор = ДополнительныеСвойства.ФормаПараметрыОтбор;
НастроитьПараметрУровеньДоступа(КомпоновщикНастроек.Настройки);
НастроитьПараметрПраво(Вариант, КомпоновщикНастроек.Настройки);
Если Вариант = "ПраваРолей" Тогда
ВариантНаименование = НСтр("ru = 'Права ролей'");
ИначеЕсли Вариант = "ПраваРолиИПрофилейНаОбъектыМетаданных" Тогда
Если УстановленОтборПоПрофилю(ФормаПараметрыОтбор, КомпоновщикНастроек.Настройки)
Или Не ПараметрИспользуется(КомпоновщикНастроек.ПользовательскиеНастройки, "Роль") Тогда
ВариантНаименование = НСтр("ru = 'Права профилей на объекты метаданных'");
Иначе
ВариантНаименование = НСтр("ru = 'Права роли и профилей на объекты метаданных'");
КонецЕсли;
ИначеЕсли Вариант = "ПраваРолейИПрофилейНаОбъектМетаданных" Тогда
ВариантНаименование = НСтр("ru = 'Права ролей и профилей на объект метаданных'");
ИначеЕсли Вариант = "ПодробныеПраваРолейНаОбъектМетаданных" Тогда
Если УстановленОтборПоПрофилю(ФормаПараметрыОтбор, КомпоновщикНастроек.Настройки) Тогда
ВариантНаименование = НСтр("ru = 'Подробные права профилей на объект метаданных'");
Иначе
ВариантНаименование = НСтр("ru = 'Подробные права ролей на объект метаданных'");
КонецЕсли;
КонецЕсли;
Если ЗначениеЗаполнено(ВариантНаименование) Тогда
ДополнительныеСвойства.Вставить("ВариантНаименование", ВариантНаименование);
КонецЕсли;
КонецПроцедуры
// Параметры:
// КлючВарианта - Строка
// - Неопределено
// ИспользуемыеТаблицы - Массив из Строка
//
Процедура ПриОпределенииИспользуемыхТаблиц(КлючВарианта, ИспользуемыеТаблицы) Экспорт
ИспользуемыеТаблицы.Добавить(Метаданные.РегистрыСведений.ПраваРолей.ПолноеИмя());
ИспользуемыеТаблицы.Добавить(Метаданные.Справочники.ПрофилиГруппДоступа.ПолноеИмя());
КонецПроцедуры
// Параметры:
// ФормаОтчета - ФормаКлиентскогоПриложения
// ДополнительныеПараметры - Структура:
// * ТекстПредупреждения - Строка
// * ИмяПараметраХраненияОтказаОтПредупреждения - Строка
//
Процедура ПередФормированиемОтчета(ФормаОтчета, ДополнительныеПараметры) Экспорт
Вариант = КомпоновщикНастроек.Настройки.ДополнительныеСвойства.КлючПредопределенногоВарианта;
Если Вариант <> "ПраваРолей"
И Вариант <> "ПраваРолиИПрофилейНаОбъектыМетаданных" Тогда
Возврат;
КонецЕсли;
Значения = ЗначенияВыбранногоПараметра("НеПредупреждатьОБольшомРазмереОтчета", Истина);
Если ТипЗнч(Значения) = Тип("СписокЗначений")
И Значения[0].Значение = Истина Тогда
Возврат;
КонецЕсли;
Результат = ПраваРолей(Истина, Вариант = "ПраваРолиИПрофилейНаОбъектыМетаданных", Истина);
КоличествоСтрок = Результат.Иерархия.Количество();
КоличествоКолонок = Результат.Роли.Количество();
КоличествоЯчеек = КоличествоСтрок * КоличествоКолонок;
Если КоличествоЯчеек < 1000000 Тогда
Возврат;
КонецЕсли;
ГигабайтДо = Окр(КоличествоЯчеек / 1500000 + КоличествоСтрок / 6000, 1) + 0.4;
ДополнительныеПараметры.ИмяПараметраХраненияОтказаОтПредупреждения =
"НеПредупреждатьОБольшомРазмереОтчета";
ДополнительныеПараметры.ТекстПредупреждения =
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'При текущих отборах отчет может быть очень большим
|до %1 строк и %2 столбцов (%3 ячеек).
|
|Может долго формироваться.
|Может не хватить памяти (нужно ~ до %4 Гб).
|
|Рекомендуется усилить отборы.'"),
Формат(КоличествоСтрок, ""),
Формат(КоличествоКолонок, ""),
Формат(КоличествоЯчеек, ""),
Формат(ГигабайтДо, "ЧДЦ=1"));
КонецПроцедуры
// См. ОтчетыПереопределяемый.ПриОпределенииПараметровВыбора.
Процедура ПриОпределенииПараметровВыбора(Форма, СвойстваНастройки) Экспорт
Если СвойстваНастройки.ПолеКД = Новый ПолеКомпоновкиДанных("ПараметрыДанных.Роль") Тогда
Если ТипЗнч(СвойстваНастройки.ПользовательскаяНастройкаКД.Значение) = Тип("СписокЗначений") Тогда
Для Каждого Элемент Из СвойстваНастройки.ПользовательскаяНастройкаКД.Значение Цикл
ОбъектМетаданных = Метаданные.Роли.Найти(Элемент.Значение);
Если ОбъектМетаданных = Неопределено Тогда
Продолжить;
КонецЕсли;
Элемент.Представление = ОбъектМетаданных.Представление();
КонецЦикла;
ИначеЕсли ТипЗнч(СвойстваНастройки.ПользовательскаяНастройкаКД.Значение) = Тип("Строка") Тогда
ОбъектМетаданных = Метаданные.Роли.Найти(СвойстваНастройки.ПользовательскаяНастройкаКД.Значение);
Если ОбъектМетаданных = Неопределено Тогда
Возврат;
КонецЕсли;
СписокЗначений = Новый СписокЗначений;
СписокЗначений.Добавить(СвойстваНастройки.ПользовательскаяНастройкаКД.Значение, ОбъектМетаданных.Представление());
СвойстваНастройки.ПользовательскаяНастройкаКД.Значение = СписокЗначений;
КонецЕсли;
КонецЕсли;
Если СвойстваНастройки.ПолеКД = Новый ПолеКомпоновкиДанных("ПараметрыДанных.ОбъектМетаданных") Тогда
Если ТипЗнч(СвойстваНастройки.ПользовательскаяНастройкаКД.Значение) = Тип("СписокЗначений") Тогда
Для Каждого Элемент Из СвойстваНастройки.ПользовательскаяНастройкаКД.Значение Цикл
ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(Элемент.Значение);
Если ОбъектМетаданных = Неопределено Тогда
Продолжить;
КонецЕсли;
Элемент.Представление = ОбъектМетаданных.Представление();
КонецЦикла;
ИначеЕсли ТипЗнч(СвойстваНастройки.ПользовательскаяНастройкаКД.Значение) = Тип("Строка") Тогда
ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(СвойстваНастройки.ПользовательскаяНастройкаКД.Значение);
Если ОбъектМетаданных = Неопределено Тогда
Возврат;
КонецЕсли;
СписокЗначений = Новый СписокЗначений;
СписокЗначений.Добавить(СвойстваНастройки.ПользовательскаяНастройкаКД.Значение, ОбъектМетаданных.Представление());
СвойстваНастройки.ПользовательскаяНастройкаКД.Значение = СписокЗначений;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#Область ОбработчикиСобытий
// Параметры:
// ДокументРезультат - ТабличныйДокумент
// ДанныеРасшифровки - ДанныеРасшифровкиКомпоновкиДанных
// СтандартнаяОбработка - Булево
//
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
НастройкиКомпоновщика = КомпоновщикНастроек.ПолучитьНастройки();
ПараметрФорматИмени = НастройкиКомпоновщика.ПараметрыДанных.Элементы.Найти("ФорматИмени");
ПараметрФорматИмениВыбранный = НастройкиКомпоновщика.ПараметрыДанных.Элементы.Найти("ФорматИмениВыбранный");
Если ПараметрФорматИмени.Использование Тогда
ПараметрФорматИмениВыбранный.Значение = ПараметрФорматИмени.Значение;
Иначе
ПараметрФорматИмениВыбранный.Значение = 0;
КонецЕсли;
ПараметрВысотаШапки = НастройкиКомпоновщика.ПараметрыДанных.Элементы.Найти("ВысотаШапки");
ВысотаШапки = 0;
Если ПараметрВысотаШапки.Использование Тогда
ВысотаШапки = ПараметрВысотаШапки.Значение;
Если ТипЗнч(ВысотаШапки) = Тип("Число") Тогда
Если ВысотаШапки < 30 Тогда
ВысотаШапки = 30;
ИначеЕсли ВысотаШапки > 350 Тогда
ВысотаШапки = 250;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиКомпоновщика, ДанныеРасшифровки);
ВнешниеНаборыДанных = Новый Структура;
Вариант = НастройкиКомпоновщика.ДополнительныеСвойства.КлючПредопределенногоВарианта;
ПраваРолей = ПраваРолей(Вариант = "ПраваРолей" Или Вариант = "ПраваРолиИПрофилейНаОбъектыМетаданных",
Вариант = "ПраваРолиИПрофилейНаОбъектыМетаданных");
ВнешниеНаборыДанных.Вставить("Иерархия", ПраваРолей.Иерархия);
ВнешниеНаборыДанных.Вставить("Права", ПраваРолей.Права);
ВнешниеНаборыДанных.Вставить("Роли", ПраваРолей.Роли);
ПрофилиВместоРолей = НастройкиКомпоновщика.ДополнительныеСвойства.Свойство("УстановленОтборПоПрофилю");
ВнешниеНаборыДанных.Вставить("ПодробныеПраваОбъекта", ПодробныеПраваОбъекта(
Вариант = "ПодробныеПраваРолейНаОбъектМетаданных",
ПрофилиВместоРолей));
ВнешниеНаборыДанных.Вставить("ПраваРолейНаОбъект", ПраваРолейНаОбъект(
Вариант = "ПраваРолейИПрофилейНаОбъектМетаданных"));
ВнешниеНаборыДанных.Вставить("ОтборРоли", ОтборРоли(
Вариант = "ПраваРолиИПрофилейНаОбъектыМетаданных"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных , ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
ЗавершитьВывод(ДокументРезультат, ДанныеРасшифровки, Вариант, ПрофилиВместоРолей, ВысотаШапки);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
// Для процедуры ПриКомпоновкеРезультата.
Процедура ЗавершитьВывод(ДокументРезультат, ДанныеРасшифровки, Вариант, ПрофилиВместоРолей, ВысотаШапки)
Картинки = Картинки();
НетЛинии = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.НетЛинии);
// АПК:163-выкл - №598.1 Использование допустимо, так как влияет на смысл.
ТекстЕстьОграничение = НСтр("ru = 'Есть ограничение'");
// АПК:163-вкл.
Если Вариант = "ПраваРолей"
Или Вариант = "ПраваРолиИПрофилейНаОбъектыМетаданных" Тогда
ПервыйЗаголовокТаблицы = НСтр("ru = 'Вид объектов метаданных'");
ИначеЕсли Вариант = "ПодробныеПраваРолейНаОбъектМетаданных" Тогда
ПервыйЗаголовокТаблицы = ?(ПрофилиВместоРолей, НСтр("ru = 'Профиль'"), НСтр("ru = 'Роль'"));
Иначе
ПервыйЗаголовокТаблицы = НСтр("ru = 'Роль'");
КонецЕсли;
ВысотаТаблицы = ДокументРезультат.ВысотаТаблицы;
ШиринаТаблицы = ДокументРезультат.ШиринаТаблицы;
ТипИдентификаторРасшифровкиКомпоновкиДанных = Тип("ИдентификаторРасшифровкиКомпоновкиДанных");
НачальноеЗначениеЕстьПравоСОграничением =
Вариант = "ПодробныеПраваРолейНаОбъектМетаданных";
ТекстПравоРазрешено = НСтр("ru = '✔'");
Для НомерСтроки = 1 По ВысотаТаблицы Цикл
ЕстьПравоСОграничением = НачальноеЗначениеЕстьПравоСОграничением;
Для НомерКолонки = 1 По ШиринаТаблицы Цикл
Область = ДокументРезультат.Область(НомерСтроки, НомерКолонки);
Расшифровка = Область.Расшифровка;
Если ТипЗнч(Расшифровка) <> ТипИдентификаторРасшифровкиКомпоновкиДанных Тогда
Если Область.Текст = "*" Тогда
Область.Текст = "";
Область.Примечание.Текст = ТекстЕстьОграничение;
ИначеЕсли Область.Текст = "+" Тогда
Область.Текст = ТекстПравоРазрешено;
Область.Примечание.Текст = ТекстЕстьОграничение;
ИначеЕсли Область.Текст = "***" Тогда
Область.Текст = ПервыйЗаголовокТаблицы;
Если ЗначениеЗаполнено(ВысотаШапки) Тогда
Если Вариант = "ПраваРолей"
Или Вариант = "ПраваРолиИПрофилейНаОбъектыМетаданных" Тогда
ОбластьНиже = ДокументРезультат.Область(НомерСтроки + 1, НомерКолонки);
Если ЗначениеЗаполнено(Область.ВысотаСтроки)
И ЗначениеЗаполнено(ОбластьНиже.ВысотаСтроки) Тогда
ТекущаяВысота = Область.ВысотаСтроки + ОбластьНиже.ВысотаСтроки;
Область.ВысотаСтроки = ВысотаШапки * (Область.ВысотаСтроки / ТекущаяВысота);
ОбластьНиже.ВысотаСтроки = ВысотаШапки * (ОбластьНиже.ВысотаСтроки / ТекущаяВысота);
Если Область.ВысотаСтроки < 13 Тогда
Область.ВысотаСтроки = 13;
ОбластьНиже.ВысотаСтроки = ВысотаШапки - Область.ВысотаСтроки;
КонецЕсли;
КонецЕсли;
Иначе
Область.ВысотаСтроки = ВысотаШапки;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если Не ЕстьПравоСОграничением И НомерКолонки >= 2 Тогда
Прервать;
КонецЕсли;
Продолжить;
КонецЕсли;
ЗначенияПолей = ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля();
ПолеЕстьОграничение = ЗначенияПолей.Найти("ЕстьОграничение");
Если ПолеЕстьОграничение <> Неопределено Тогда
Если ПолеЕстьОграничение.Значение = Истина Тогда
Область.Примечание.Текст = ТекстЕстьОграничение;
КонецЕсли;
Продолжить;
ИначеЕсли ЗначенияПолей.Найти("ИндексКартинки") <> Неопределено Тогда
Отступ = (ЗначенияПолей.Найти("Уровень").Значение - 1) * 2;
ОбластьСтроки = ДокументРезультат.Область(НомерСтроки, , НомерСтроки);
ОбластьСтроки.СоздатьФорматСтрок();
ОбластьСправа = ДокументРезультат.Область(НомерСтроки, НомерКолонки);
ОбластьСлева = ДокументРезультат.Область(НомерСтроки, НомерКолонки - 1);
ОбластьСправа.ГраницаСлева = НетЛинии;
ОбластьСлева.ГраницаСправа = НетЛинии;
ОбластьСправа.ШиринаКолонки = Область.ШиринаКолонки + ОбластьСлева.ШиринаКолонки - Отступ;
ОбластьСлева.ШиринаКолонки = Отступ;
ОбластьСправа.Картинка = Картинки.Получить(ЗначенияПолей.Найти("ИндексКартинки").Значение).Картинка;
Если ЗначенияПолей.Найти("ЕстьПравоСОграничением").Значение = Истина Тогда
ЕстьПравоСОграничением = Истина;
КонецЕсли;
КонецЕсли;
Если Не ЕстьПравоСОграничением И НомерКолонки >= 2 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
// Для процедур ПередЗагрузкойНастроекВКомпоновщик.
Процедура СкрытьЛишниеПоляДанных(Вариант, ФормаПараметрыОтбор, НастройкиКД, ПользовательскиеНастройкиКД)
Иерархия = Новый Массив;
Права = Новый Массив;
Роли = Новый Массив;
ОтборРоли = Новый Массив;
ПодробныеПраваОбъекта = Новый Массив;
ПраваРолейНаОбъект = Новый Массив;
Если Вариант = "ПодробныеПраваРолейНаОбъектМетаданных" Тогда
ПодробныеПраваОбъекта = "*";
ПолеИмяРоли = СхемаКомпоновкиДанных.НаборыДанных.ПодробныеПраваОбъекта.Поля.Найти("ИмяРоли2");
ПолеПредставлениеРоли = СхемаКомпоновкиДанных.НаборыДанных.ПодробныеПраваОбъекта.Поля.Найти("ПредставлениеРоли2");
ПолеПрофиль = СхемаКомпоновкиДанных.НаборыДанных.ПодробныеПраваОбъекта.Поля.Найти("Профиль2");
Если УстановленОтборПоПрофилю(ФормаПараметрыОтбор, КомпоновщикНастроек.Настройки) Тогда
ПолеИмяРоли.Заголовок = НСтр("ru = 'Имя профиля'");
ПолеПредставлениеРоли.Заголовок = НСтр("ru = 'Представление профиля'");
ПолеПрофиль.Заголовок = НСтр("ru = 'Профиль'");
Иначе
ПолеИмяРоли.Заголовок = НСтр("ru = 'Имя роли'");
ПолеПредставлениеРоли.Заголовок = НСтр("ru = 'Представление роли'");
ПолеПрофиль.Заголовок = НСтр("ru = 'Профиль (не используется)'");
КонецЕсли;
ИначеЕсли Вариант = "ПраваРолейИПрофилейНаОбъектМетаданных" Тогда
ПраваРолейНаОбъект = "*";
Иначе
Иерархия = "*";
Права = "*";
Роли = Новый Соответствие;
ПолеЕстьПраваРоли = СхемаКомпоновкиДанных.НаборыДанных.Роли.Поля.Найти("ЕстьПраваРоли");
ПолеКодРоли = СхемаКомпоновкиДанных.НаборыДанных.Права.Поля.Найти("КодРоли");
Если Вариант = "ПраваРолиИПрофилейНаОбъектыМетаданных" Тогда
Роли.Вставить("ИмяРоли", Ложь);
Роли.Вставить("ПредставлениеРоли", Ложь);
ПолеКодРоли.Заголовок = НСтр("ru = 'Код профиля'");
ПолеЕстьПраваРоли.Заголовок = НСтр("ru = 'Есть права профиля'");
Если Не УстановленОтборПоПрофилю(ФормаПараметрыОтбор, КомпоновщикНастроек.Настройки) Тогда
ОтборРоли = "*";
КонецЕсли;
Иначе
Роли.Вставить("Профиль4", Ложь);
ПолеКодРоли.Заголовок = НСтр("ru = 'Код роли'");
ПолеЕстьПраваРоли.Заголовок = НСтр("ru = 'Есть права роли'");
КонецЕсли;
КонецЕсли;
ИсходнаяСхема = ПолучитьМакет("Макет");
ТекущаяСхема = СхемаКомпоновкиДанных;
СкрытьПоляДанныхКромеУказанных("Иерархия", Иерархия, ИсходнаяСхема, ТекущаяСхема);
СкрытьПоляДанныхКромеУказанных("Права", Права, ИсходнаяСхема, ТекущаяСхема);
СкрытьПоляДанныхКромеУказанных("Роли", Роли, ИсходнаяСхема, ТекущаяСхема);
СкрытьПоляДанныхКромеУказанных("ОтборРоли", ОтборРоли, ИсходнаяСхема, ТекущаяСхема);
СкрытьПоляДанныхКромеУказанных("ПодробныеПраваОбъекта", ПодробныеПраваОбъекта, ИсходнаяСхема, ТекущаяСхема);
СкрытьПоляДанныхКромеУказанных("ПраваРолейНаОбъект", ПраваРолейНаОбъект, ИсходнаяСхема, ТекущаяСхема);
КонецПроцедуры
// Для процедуры СкрытьЛишниеПоляДанных.
Процедура СкрытьПоляДанныхКромеУказанных(ИмяНабораДанных, ПутиКДанным, ИсходнаяСхема, ТекущаяСхема)
Отчеты.АнализПравДоступа.СкрытьПоляДанныхКромеУказанных(ИмяНабораДанных,
ПутиКДанным, ИсходнаяСхема, ТекущаяСхема);
КонецПроцедуры
// Для процедуры ПослеЗагрузкиНастроекВКомпоновщик.
Процедура НастроитьПараметрУровеньДоступа(Настройки)
Параметр = Новый ПараметрКомпоновкиДанных("УровеньДоступа");
ДоступныйПараметр = Настройки.ПараметрыДанных.ДоступныеПараметры.НайтиПараметр(Параметр);
Если ДоступныйПараметр = Неопределено Тогда
Возврат;
КонецЕсли;
Список = Новый СписокЗначений;
Список.Добавить(01, НСтр("ru = 'Есть право'"));
Список.Добавить(02, НСтр("ru = 'Использование'"));
Список.Добавить(03, НСтр("ru = 'Чтение'"));
Список.Добавить(04, НСтр("ru = 'Изменение'"));
Список.Добавить(05, НСтр("ru = 'Добавление'"));
Список.Добавить(06, НСтр("ru = 'Просмотр'"));
Список.Добавить(07, НСтр("ru = 'Просмотр и Изменение'"));
Список.Добавить(08, НСтр("ru = 'Просмотр и Добавление'"));
Список.Добавить(09, НСтр("ru = 'Редактирование'"));
Список.Добавить(10, НСтр("ru = 'Редактирование и Добавление'"));
Список.Добавить(11, НСтр("ru = 'Создание'"));
Список.Добавить(12, НСтр("ru = 'Получение'"));
Список.Добавить(13, НСтр("ru = 'Установка'"));
Список.Добавить(14, НСтр("ru = 'Получение и Установка'"));
Список.Добавить(15, НСтр("ru = 'Внешний источник данных: Использование'"));
Список.Добавить(16, НСтр("ru = 'Внешний источник данных: Администрирование'"));
Список.Добавить(17, НСтр("ru = 'Внешний источник данных: Использование и Администрирование'"));
ДоступныйПараметр.ДоступныеЗначения = Список;
КонецПроцедуры
// Для процедуры ПослеЗагрузкиНастроекВКомпоновщик.
Процедура НастроитьПараметрПраво(Вариант, Настройки)
Если Вариант <> "ПодробныеПраваРолейНаОбъектМетаданных" Тогда
Возврат;
КонецЕсли;
Параметр = Новый ПараметрКомпоновкиДанных("Право");
ДоступныйПараметр = Настройки.ПараметрыДанных.ДоступныеПараметры.НайтиПараметр(Параметр);
Если ДоступныйПараметр = Неопределено Тогда
Возврат;
КонецЕсли;
Контекст = КонтекстОтчетаПоОбъекту(Истина);
Если Контекст = Неопределено Тогда
Возврат;
КонецЕсли;
ДоступныйПараметр.ДоступныеЗначения = Контекст.ОписаниеПрав.СписокПрав;
КонецПроцедуры
// Для процедуры ПередЗагрузкойНастроекВКомпоновщик.
Процедура ВключитьПараметр(ПользовательскиеНастройки, ИмяПараметра, Значение, ФормироватьСразу)
ЭлементНастройки = НастройкаПараметра(ПользовательскиеНастройки, ИмяПараметра);
Если ЭлементНастройки = Неопределено Тогда
ФормироватьСразу = Ложь;
Иначе
ЭлементНастройки.Значение = Значение;
ЭлементНастройки.Использование = ИмяПараметра <> "Профиль" Или ЗначениеЗаполнено(Значение);
КонецЕсли;
КонецПроцедуры
// Для процедуры ПередЗагрузкойНастроекВКомпоновщик.
Процедура ВыключитьПараметр(ИмяПараметра, НедоступныеПараметры, НастройкиКД, ПользовательскиеНастройкиКД)
Если НастройкиКД = Неопределено Тогда
Возврат;
КонецЕсли;
Если НедоступныеПараметры.Свойство(ИмяПараметра) Тогда
Параметр = СхемаКомпоновкиДанных.Параметры.Найти(ИмяПараметра);
Параметр.ОграничениеИспользования = Истина;
Параметр.ВключатьВДоступныеПоля = Ложь;
КонецЕсли;
ЭлементНастройки = НастройкаПараметра(ПользовательскиеНастройкиКД, ИмяПараметра);
Если ЭлементНастройки = Неопределено Тогда
ЭлементНастройки = НастройкаПараметра(НастройкиКД.ПараметрыДанных, ИмяПараметра);
Если ЭлементНастройки = Неопределено Тогда
Возврат;
КонецЕсли;
КонецЕсли;
Если ЭлементНастройки.Использование Тогда
ЭлементНастройки.Использование = Ложь;
КонецЕсли;
Если ЭлементНастройки.Значение = Истина Тогда
ЭлементНастройки.Значение = Ложь;
КонецЕсли;
КонецПроцедуры
Процедура УстановитьРежимОтображения(ИмяПараметра, Режим, НастройкиКД, ПользовательскиеНастройкиКД)
Если НастройкиКД = Неопределено Тогда
Возврат;
КонецЕсли;
ЭлементНастройки = НастройкаПараметра(НастройкиКД.ПараметрыДанных, ИмяПараметра);
Если ЭлементНастройки <> Неопределено Тогда
ЭлементНастройки.РежимОтображения = Режим;
КонецЕсли;
ЭлементНастройки = НастройкаПараметра(ПользовательскиеНастройкиКД, ИмяПараметра);
Если ЭлементНастройки <> Неопределено Тогда
ЭлементНастройки.РежимОтображения = Режим;
КонецЕсли;
КонецПроцедуры
// Для процедуры ВыключитьПараметр.
Функция НастройкаПараметра(ПользовательскиеНастройкиКД, ИмяПараметра)
Параметр = Новый ПараметрКомпоновкиДанных(ИмяПараметра);
Для Каждого ЭлементНастройки Из ПользовательскиеНастройкиКД.Элементы Цикл
Свойства = Новый Структура("Параметр");
ЗаполнитьЗначенияСвойств(Свойства, ЭлементНастройки);
Если Свойства.Параметр = Параметр Тогда
Возврат ЭлементНастройки;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции
// Для процедуры ПередЗагрузкойНастроекВКомпоновщик.
Функция ПараметрИспользуется(ПользовательскиеНастройки, ИмяПараметра)
ПараметрКомпоновки = Новый ПараметрКомпоновкиДанных(ИмяПараметра);
Для Каждого ЭлементНастройки Из ПользовательскиеНастройки.Элементы Цикл
Свойства = Новый Структура("Параметр");
ЗаполнитьЗначенияСвойств(Свойства, ЭлементНастройки);
Если Свойства.Параметр = ПараметрКомпоновки Тогда
Возврат ЭлементНастройки.Использование
И ЗначениеЗаполнено(ЭлементНастройки.Значение);
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
Функция УстановленОтборПоПрофилю(ФормаПараметрыОтбор, Настройки)
Возврат ФормаПараметрыОтбор.Свойство("НачальныйОтбор")
И ФормаПараметрыОтбор.НачальныйОтбор.Свойство("Профиль")
Или Настройки.ДополнительныеСвойства.Свойство("УстановленОтборПоПрофилю");
КонецФункции
Функция ПодробныеПраваОбъекта(Заполнить, ПрофилиВместоРолей)
Права = Новый ТаблицаЗначений;
Права.Колонки.Добавить("ИмяОбъекта", ТипСтрока(430));
Права.Колонки.Добавить("ПредставлениеОбъекта", ТипСтрока(1000));
Права.Колонки.Добавить("ИмяРоли", ТипСтрока(255));
Права.Колонки.Добавить("ПредставлениеРоли", ТипСтрока(255));
Права.Колонки.Добавить("ИмяПрава", ТипСтрока(255));
Права.Колонки.Добавить("ПредставлениеПрава", ТипСтрока(255));
Права.Колонки.Добавить("ПорядокПрава", ТипЧисло(2));
Права.Колонки.Добавить("ЗначениеПрава", Новый ОписаниеТипов("Булево"));
Права.Колонки.Добавить("ЕстьОграничениеПрава", Новый ОписаниеТипов("Булево"));
Права.Колонки.Добавить("Профиль", Новый ОписаниеТипов("СправочникСсылка.ПрофилиГруппДоступа"));
Если Не Заполнить Тогда
Возврат Права;
КонецЕсли;
Контекст = КонтекстОтчетаПоОбъекту();
Если Контекст = Неопределено Тогда
Возврат Права;
КонецЕсли;
ПолноеИмяОбъекта = Контекст.ПолноеИмяОбъекта;
ПредставлениеОбъекта = Контекст.ПредставлениеОбъекта;
СписокПрав = Контекст.ОписаниеПрав.СписокПрав;
ОбъектМетаданных = Контекст.ОбъектМетаданных;
ИмяСтандартногоРеквизита = Контекст.ИмяСтандартногоРеквизита;
НайденныеПрава = Новый Соответствие;
ВыбранныеПрава = ЗначенияВыбранногоПараметра("Право");
Если ПрофилиВместоРолей Тогда
ПрофилиРолей = ПрофилиРолей();
КонецЕсли;
ОписаниеРолей = ОписаниеРолей(, ПрофилиВместоРолей);
ПоляОбъектов = Новый Соответствие;
Для Каждого ОписаниеПрава Из СписокПрав Цикл
Если ПрофилиВместоРолей Тогда
СтрокиПравПрофилей = Новый Соответствие;
КонецЕсли;
Для Каждого ОписаниеРоли Из ОписаниеРолей Цикл
ЕстьПраво = ПравоДоступа(ОписаниеПрава.Значение, ОбъектМетаданных, ОписаниеРоли.Метаданные, ИмяСтандартногоРеквизита);
Если Не ЕстьПраво Тогда
Продолжить;
КонецЕсли;
Если ВыбранныеПрава <> Неопределено
И ВыбранныеПрава.НайтиПоЗначению(ОписаниеПрава.Значение) = Неопределено Тогда
Продолжить;
КонецЕсли;
НайденныеПрава.Вставить(ОписаниеПрава, Истина);
ОписаниеРоли.ЕстьПраваРоли = Истина;
ЕстьОграничение = Ложь;
Если ОписаниеПрава.Пометка Тогда
ЕстьОграничение = ЕстьОграничение(ОписаниеПрава.Значение,
ОбъектМетаданных, ПоляОбъектов, ОписаниеРоли.Метаданные);
КонецЕсли;
Если ПрофилиВместоРолей Тогда
ПрофилиРоли = ПрофилиРолей.Получить(ОписаниеРоли.Ссылка);
Если Не ЗначениеЗаполнено(ПрофилиРоли) Тогда
Продолжить;
КонецЕсли;
Для Каждого Профиль Из ПрофилиРоли Цикл
СтрокаПрав = СтрокиПравПрофилей.Получить(Профиль);
Если СтрокаПрав = Неопределено Тогда
Отбор = Новый Структура("Профиль", Профиль);
СтрокаПрав = Права.Добавить();
СтрокаПрав.ИмяОбъекта = ПолноеИмяОбъекта;
СтрокаПрав.ПредставлениеОбъекта = ПредставлениеОбъекта;
СтрокаПрав.ИмяРоли = Строка(Профиль);
СтрокаПрав.ПредставлениеРоли = СтрокаПрав.ИмяРоли;
СтрокаПрав.Профиль = Профиль;
СтрокаПрав.ИмяПрава = ОписаниеПрава.Значение;
СтрокаПрав.ПредставлениеПрава = ОписаниеПрава.Представление;
СтрокаПрав.ПорядокПрава = СписокПрав.Индекс(ОписаниеПрава) + 1;
СтрокаПрав.ЗначениеПрава = Истина;
СтрокаПрав.ЕстьОграничениеПрава = ЕстьОграничение;
СтрокиПравПрофилей.Вставить(Профиль, СтрокаПрав);
Иначе
Если Не ЕстьОграничение И СтрокаПрав.ЕстьОграничениеПрава Тогда
СтрокаПрав.ЕстьОграничениеПрава = Ложь;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Иначе
СтрокаПрав = Права.Добавить();
СтрокаПрав.ИмяОбъекта = ПолноеИмяОбъекта;
СтрокаПрав.ПредставлениеОбъекта = ПредставлениеОбъекта;
СтрокаПрав.ИмяРоли = ОписаниеРоли.ИмяРоли;
СтрокаПрав.ПредставлениеРоли = ОписаниеРоли.ПредставлениеРоли;
СтрокаПрав.ИмяПрава = ОписаниеПрава.Значение;
СтрокаПрав.ПредставлениеПрава = ОписаниеПрава.Представление;
СтрокаПрав.ПорядокПрава = СписокПрав.Индекс(ОписаниеПрава) + 1;
СтрокаПрав.ЗначениеПрава = Истина;
СтрокаПрав.ЕстьОграничениеПрава = ЕстьОграничение;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если ПоказыватьОбъектыИРолиБезПрав() И Не ПрофилиВместоРолей Тогда
Отбор = Новый Структура("ЕстьПраваРоли", Ложь);
ОписаниеРолейБезПрав = ОписаниеРолей.НайтиСтроки(Отбор);
Если Права.Количество() = 0 Тогда
ИмяПрава = "";
ПредставлениеПрава = "";
ПорядокПрава = 0;
Если СписокПрав.Количество() > 0 Тогда
ПервоеПраво = Неопределено;
Для Каждого ОписаниеПрава Из СписокПрав Цикл
Если ВыбранныеПрава = Неопределено
Или ВыбранныеПрава.НайтиПоЗначению(ПервоеПраво.Значение) <> Неопределено Тогда
ПервоеПраво = ОписаниеПрава;
Прервать;
КонецЕсли;
КонецЦикла;
Если ПервоеПраво <> Неопределено Тогда
ИмяПрава = ПервоеПраво.Значение;
ПредставлениеПрава = ПервоеПраво.Представление;
НайденныеПрава.Вставить(ПервоеПраво, Истина);
ПорядокПрава = 1;
КонецЕсли;
КонецЕсли;
Иначе
ИмяПрава = Права[0].ИмяПрава;
ПредставлениеПрава = Права[0].ПредставлениеПрава;
ПорядокПрава = Права[0].ПорядокПрава;
КонецЕсли;
Для Каждого ОписаниеРоли Из ОписаниеРолейБезПрав Цикл
НоваяСтрока = Права.Добавить();
НоваяСтрока.ИмяОбъекта = ПолноеИмяОбъекта;
НоваяСтрока.ПредставлениеОбъекта = ПредставлениеОбъекта;
НоваяСтрока.ИмяРоли = ОписаниеРоли.ИмяРоли;
НоваяСтрока.ПредставлениеРоли = ОписаниеРоли.ПредставлениеРоли;
НоваяСтрока.ИмяПрава = ИмяПрава;
НоваяСтрока.ПредставлениеПрава = ПредставлениеПрава;
НоваяСтрока.ПорядокПрава = ПорядокПрава;
КонецЦикла;
КонецЕсли;
Если Права.Количество() = 0 Тогда
ИмяРоли = "";
ПредставлениеРоли = "";
Профиль = Неопределено;
Иначе
ИмяРоли = Права[0].ИмяРоли;
ПредставлениеРоли = Права[0].ПредставлениеРоли;
Профиль = Права[0].Профиль;
КонецЕсли;
Для Каждого ОписаниеПрава Из СписокПрав Цикл
Если НайденныеПрава.Получить(ОписаниеПрава) <> Неопределено
Или ВыбранныеПрава <> Неопределено
И ВыбранныеПрава.НайтиПоЗначению(ОписаниеПрава.Значение) = Неопределено Тогда
Продолжить;
КонецЕсли;
НоваяСтрока = Права.Добавить();
НоваяСтрока.ИмяОбъекта = ПолноеИмяОбъекта;
НоваяСтрока.ПредставлениеОбъекта = ПредставлениеОбъекта;
НоваяСтрока.ИмяРоли = ИмяРоли;
НоваяСтрока.ПредставлениеРоли = ПредставлениеРоли;
НоваяСтрока.Профиль = Профиль;
НоваяСтрока.ИмяПрава = ОписаниеПрава.Значение;
НоваяСтрока.ПредставлениеПрава = ОписаниеПрава.Представление;
НоваяСтрока.ПорядокПрава = СписокПрав.Индекс(ОписаниеПрава) + 1;
КонецЦикла;
Возврат Права;
КонецФункции
// Параметры:
// ЗаполнитьТолькоОписаниеПрав - Булево
//
// Возвращаемое значение:
// Структура:
// * ПолноеИмяОбъекта - Строка
// * ОписаниеПрав - см. ОписаниеПрав
// * ОбъектМетаданных - ОбъектМетаданных
// * ИмяСтандартногоРеквизита - Строка
// * ПредставлениеОбъекта - Строка
// Неопределено
//
Функция КонтекстОтчетаПоОбъекту(ЗаполнитьТолькоОписаниеПрав = Ложь)
ВыбранныеОбъекты = ЗначенияВыбранногоПараметра("ОбъектМетаданных");
Если Не ЗначениеЗаполнено(ВыбранныеОбъекты)
Или ВыбранныеОбъекты.Количество() <> 1 Тогда
Возврат Неопределено;
КонецЕсли;
ПолноеИмяОбъекта = ВыбранныеОбъекты[0].Значение;
Контекст = Новый Структура;
Контекст.Вставить("ПолноеИмяОбъекта", ПолноеИмяОбъекта);
Если ПолноеИмяОбъекта = "Конфигурация" Тогда
ОбъектМетаданных = Метаданные;
ПутьКОбъекту = "Конфигурация";
Иначе
ЧастиПутиКОбъекту = СтрРазделить(ПолноеИмяОбъекта, ".");
Если ЧастиПутиКОбъекту[0] = "Подсистема" Тогда
ПутьКОбъекту = "Подсистема.*";
Иначе
ЭтоЧастьПути = Истина;
Для Индекс = 0 По ЧастиПутиКОбъекту.ВГраница() Цикл
Если Не ЭтоЧастьПути Тогда
ЧастиПутиКОбъекту[Индекс] = "*";
КонецЕсли;
ЭтоЧастьПути = Не ЭтоЧастьПути;
КонецЦикла;
ПутьКОбъекту = СтрСоединить(ЧастиПутиКОбъекту, ".");
КонецЕсли;
КонецЕсли;
Дерево = ДеревоМетаданных(Истина);
СтрокаДерева = Дерево.Строки.Найти(ПутьКОбъекту, "ПутьКОбъекту", Истина);
Если СтрокаДерева = Неопределено
Или СтрокаДерева.ОписаниеПрав = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
Контекст.Вставить("ОписаниеПрав", СтрокаДерева.ОписаниеПрав);
Если ЗаполнитьТолькоОписаниеПрав Тогда
Возврат Контекст;
КонецЕсли;
Если ПолноеИмяОбъекта = "Конфигурация" Тогда
ПредставлениеОбъекта = СтрокаДерева.ПредставлениеОбъекта;
Иначе
ИмяСтандартногоРеквизита = Неопределено;
ПредставлениеОбъекта = "";
ПредставлениеВидаОбъектов = "";
ЧастиИмени = СтрРазделить(ПолноеИмяОбъекта, ".");
КоличествоИмен = Цел(ЧастиИмени.Количество() / 2);
Если ЧастиИмени.Количество() <> КоличествоИмен * 2 Тогда
Возврат Неопределено;
КонецЕсли;
ТекущееПолноеИмя = "";
ТекущийПутьКОбъекту = "";
СтандартнаяТабличнаяЧасть = Неопределено;
Для НомерИмени = 1 По КоличествоИмен Цикл
Индекс = (НомерИмени - 1) * 2;
Если ЧастиИмени[Индекс] = "СтандартнаяТабличнаяЧасть" Тогда
ИмяСтандартногоРеквизита = ЧастиИмени[Индекс + 1];
СтандартнаяТабличнаяЧасть = СтандартнаяТабличнаяЧасть(ОбъектМетаданных, ЧастиИмени[Индекс + 1]);
Если СтандартнаяТабличнаяЧасть = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
ТекущееПредставлениеОбъекта = СтандартнаяТабличнаяЧасть.Представление();
ИначеЕсли ЧастиИмени[Индекс] = "СтандартныйРеквизит" Тогда
ИмяСтандартногоРеквизита = ?(ЗначениеЗаполнено(ИмяСтандартногоРеквизита),
ИмяСтандартногоРеквизита + ".", "") + ЧастиИмени[Индекс + 1];
СтандартныйРеквизит = СтандартныйРеквизит(?(СтандартнаяТабличнаяЧасть = Неопределено,
ОбъектМетаданных, СтандартнаяТабличнаяЧасть), ЧастиИмени[Индекс + 1]);
Если СтандартныйРеквизит = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
ТекущееПредставлениеОбъекта = СтандартныйРеквизит.Представление();
Иначе
ТекущееПолноеИмя = ?(ЗначениеЗаполнено(ТекущееПолноеИмя), ТекущееПолноеИмя + ".", "")
+ ЧастиИмени[Индекс] + "." + ЧастиИмени[Индекс + 1];
ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоПолномуИмени(ТекущееПолноеИмя);
Если ОбъектМетаданных = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
ТекущееПредставлениеОбъекта = ОбъектМетаданных.Представление();
КонецЕсли;
ПредставлениеОбъекта = ?(ЗначениеЗаполнено(ПредставлениеОбъекта),
ПредставлениеОбъекта + ".", "") + ТекущееПредставлениеОбъекта;
Если ЧастиПутиКОбъекту[0] = "Подсистема" Тогда
ТекущаяСтрокаДерева = СтрокаДерева;
Иначе
ТекущийПутьКОбъекту = ?(ЗначениеЗаполнено(ТекущийПутьКОбъекту), ТекущийПутьКОбъекту + ".", "")
+ ЧастиПутиКОбъекту[Индекс] + "." + ЧастиПутиКОбъекту[Индекс + 1];
ТекущаяСтрокаДерева = Дерево.Строки.Найти(ТекущийПутьКОбъекту, "ПутьКОбъекту", Истина);
Если ТекущаяСтрокаДерева = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
КонецЕсли;
ПредставлениеВидаОбъектов = ?(ЗначениеЗаполнено(ПредставлениеВидаОбъектов),
ПредставлениеВидаОбъектов + ".", "") + ТекущаяСтрокаДерева.ПредставлениеОбъекта;
КонецЦикла;
ПредставлениеОбъекта = ПредставлениеОбъекта + " (" + ПредставлениеВидаОбъектов + ")";
КонецЕсли;
Контекст.Вставить("ОбъектМетаданных", ОбъектМетаданных);
Контекст.Вставить("ИмяСтандартногоРеквизита", ИмяСтандартногоРеквизита);
Контекст.Вставить("ПредставлениеОбъекта", ПредставлениеОбъекта);
Возврат Контекст;
КонецФункции
Функция СтандартнаяТабличнаяЧасть(ОбъектМетаданных, ИмяСтандартнойТабличнойЧасти)
СвойстваОбъекта = Новый Структура("СтандартныеТабличныеЧасти");
ЗаполнитьЗначенияСвойств(СвойстваОбъекта, ОбъектМетаданных);
Если ТипЗнч(СвойстваОбъекта.СтандартныеТабличныеЧасти) <> Тип("ОписанияСтандартныхТабличныхЧастей") Тогда
Возврат Неопределено;
КонецЕсли;
СтандартныеТабличныеЧасти = СвойстваОбъекта.СтандартныеТабличныеЧасти; // ОписанияСтандартныхТабличныхЧастей
Для Каждого СтандартнаяТабличнаяЧасть Из СтандартныеТабличныеЧасти Цикл
Если СтандартнаяТабличнаяЧасть.Имя = ИмяСтандартнойТабличнойЧасти Тогда
Возврат СтандартнаяТабличнаяЧасть;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции
Функция СтандартныйРеквизит(ОбъектМетаданных, ИмяСтандартногоРеквизита)
СвойстваОбъекта = Новый Структура("СтандартныеРеквизиты");
ЗаполнитьЗначенияСвойств(СвойстваОбъекта, ОбъектМетаданных);
Если ТипЗнч(СвойстваОбъекта.СтандартныеРеквизиты) <> Тип("ОписанияСтандартныхРеквизитов") Тогда
Возврат Неопределено;
КонецЕсли;
СтандартныеТабличныеЧасти = СвойстваОбъекта.СтандартныеТабличныеЧасти; // ОписанияСтандартныхТабличныхЧастей
Для Каждого СтандартныйРеквизит Из СвойстваОбъекта.СтандартныеРеквизиты Цикл
Если СтандартныйРеквизит.Имя = ИмяСтандартногоРеквизита Тогда
Возврат СтандартныйРеквизит;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции
Функция ОтборРоли(Заполнить)
ОтборРоли = Новый ТаблицаЗначений;
ОтборРоли.Колонки.Добавить("ИмяРоли", ТипСтрока(255));
ОтборРоли.Колонки.Добавить("ПредставлениеРоли", ТипСтрока(255));
Если Не Заполнить Тогда
Возврат ОтборРоли;
КонецЕсли;
ВыбранныеРоли = ЗначенияВыбранногоПараметра("Роль");
Если Не ЗначениеЗаполнено(ВыбранныеРоли)
Или ВыбранныеРоли.Количество() <> 1 Тогда
Возврат ОтборРоли;
КонецЕсли;
ИмяРоли = ВыбранныеРоли[0].Значение;
МетаданныеРоли = Метаданные.Роли.Найти(ИмяРоли);
Если МетаданныеРоли = Неопределено Тогда
Возврат ОтборРоли;
КонецЕсли;
НоваяСтрока = ОтборРоли.Добавить();
НоваяСтрока.ИмяРоли = МетаданныеРоли.Имя;
НоваяСтрока.ПредставлениеРоли = МетаданныеРоли.Представление();
Возврат ОтборРоли;
КонецФункции
Функция ПраваРолейНаОбъект(Заполнить)
Права = Новый ТаблицаЗначений;
Права.Колонки.Добавить("ИмяОбъекта", ТипСтрока(430));
Права.Колонки.Добавить("ПредставлениеОбъекта", ТипСтрока(1000));
Права.Колонки.Добавить("ИмяРоли", ТипСтрока(255));
Права.Колонки.Добавить("ПредставлениеРоли", ТипСтрока(255));
Права.Колонки.Добавить("БезПрофиля", Новый ОписаниеТипов("Булево"));
Права.Колонки.Добавить("Профиль", Новый ОписаниеТипов("СправочникСсылка.ПрофилиГруппДоступа"));
Права.Колонки.Добавить("УровеньДоступа", ТипЧисло(2));
Права.Колонки.Добавить("ЕстьОграничение", Новый ОписаниеТипов("Булево"));
Если Не Заполнить Тогда
Возврат Права;
КонецЕсли;
ПоказыватьОбъектыИРолиБезПрав = ПоказыватьОбъектыИРолиБезПрав();
Контекст = КонтекстОтчетаПоОбъекту();
Если Контекст = Неопределено Тогда
Возврат Права;
КонецЕсли;
УровниДоступа = Контекст.ОписаниеПрав.УровниДоступа;
ОбъектМетаданных = Контекст.ОбъектМетаданных;
ИмяСтандартногоРеквизита = Контекст.ИмяСтандартногоРеквизита;
Контекст.Вставить("Права", Права);
Контекст.Вставить("ПрофилиРолей", ПрофилиРолей());
ВыбранныеУровни = ЗначенияВыбранногоПараметра("УровеньДоступа");
ОписаниеРолей = ОписаниеРолей(, Истина);
ПоляОбъектов = Новый Соответствие;
Для Каждого ОписаниеРоли Из ОписаниеРолей Цикл
Для Каждого ОписаниеУровня Из УровниДоступа Цикл
Если ОписаниеУровня.ЭтоНаборПрав Тогда
ЕстьПраво = ЗначениеЗаполнено(ОписаниеУровня.Право);
НаборПрав = СтрРазделить(ОписаниеУровня.Право, ",", Ложь);
Для Каждого Право Из НаборПрав Цикл
Если Не ПравоДоступа(Право, ОбъектМетаданных, ОписаниеРоли.Метаданные) Тогда
ЕстьПраво = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Иначе
ЕстьПраво = ПравоДоступа(ОписаниеУровня.Право, ОбъектМетаданных, ОписаниеРоли.Метаданные, ИмяСтандартногоРеквизита);
КонецЕсли;
Если Не ЕстьПраво Тогда
Продолжить;
КонецЕсли;
Если ВыбранныеУровни <> Неопределено
И ВыбранныеУровни.НайтиПоЗначению(ОписаниеУровня.Уровень) = Неопределено Тогда
Прервать;
КонецЕсли;
ОписаниеРоли.ЕстьПраваРоли = Истина;
ЕстьОграничение = Ложь;
Если ЗначениеЗаполнено(ОписаниеУровня.ПравоСОграничением) Тогда
ЕстьОграничение = ЕстьОграничение(ОписаниеУровня.ПравоСОграничением,
ОбъектМетаданных, ПоляОбъектов, ОписаниеРоли.Метаданные);
КонецЕсли;
ДобавитьПраваРолиПрофилей(Контекст, ОписаниеРоли, ОписаниеУровня.Уровень, ЕстьОграничение);
Прервать;
КонецЦикла;
Если Не ОписаниеРоли.ЕстьПраваРоли И ПоказыватьОбъектыИРолиБезПрав Тогда
ДобавитьПраваРолиПрофилей(Контекст, ОписаниеРоли, 0, Ложь);
КонецЕсли;
КонецЦикла;
Возврат Права;
КонецФункции
// Возвращаемое значение:
// Соответствие из КлючИЗначение:
// * Ключ - СправочникСсылка.ИдентификаторыОбъектовМетаданных,
// - СправочникСсылка.ИдентификаторыОбъектовРасширений
// * Значение - Массив из СправочникСсылка.ПрофилиГруппДоступа
//
Функция ПрофилиРолей()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| РолиПрофилей.Роль КАК Роль,
| РолиПрофилей.Ссылка КАК Профиль
|ИЗ
| Справочник.ПрофилиГруппДоступа.Роли КАК РолиПрофилей
|ГДЕ
| &ОтборПрофилей
|ИТОГИ ПО
| Роль";
ВыбранныеПрофили = ЗначенияВыбранногоПараметра("Профиль");
Если ВыбранныеПрофили = Неопределено Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ОтборПрофилей", "ИСТИНА");
Иначе
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ОтборПрофилей",
"РолиПрофилей.Ссылка В(&Профили)");
Запрос.УстановитьПараметр("Профили", ВыбранныеПрофили.ВыгрузитьЗначения());
КонецЕсли;
Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
ПрофилиРолей = Новый Соответствие;
Пока Выборка.Следующий() Цикл
ВыборкаПрофилей = Выборка.Выбрать();
Профили = Новый Массив;
ПрофилиРолей.Вставить(Выборка.Роль, Профили);
Пока ВыборкаПрофилей.Следующий() Цикл
Профили.Добавить(ВыборкаПрофилей.Профиль);
КонецЦикла;
КонецЦикла;
Возврат ПрофилиРолей;
КонецФункции
// Параметры:
// Профили - Массив из СправочникСсылка.ПрофилиГруппДоступа
//
// Возвращаемое значение:
// Массив из Строка - имена ролей
//
Функция СписокИменРолейПрофилей(Профили)
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Профили", Профили);
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| РолиПрофилей.Роль КАК Роль
|ИЗ
| Справочник.ПрофилиГруппДоступа.Роли КАК РолиПрофилей
|ГДЕ
| РолиПрофилей.Ссылка.ЭтоГруппа = ЛОЖЬ
| И РолиПрофилей.Ссылка В(&Профили)";
ИдентификаторыРолей = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Роль");
ОбъектыМетаданныхРолей = ОбщегоНазначения.ОбъектыМетаданныхПоИдентификаторам(
ИдентификаторыРолей, Ложь);
СписокРолей = Новый СписокЗначений;
Для Каждого КлючИЗначение Из ОбъектыМетаданныхРолей Цикл
ОбъектМетаданныхРоль = КлючИЗначение.Значение;
Если ТипЗнч(ОбъектМетаданныхРоль) <> Тип("ОбъектМетаданных") Тогда
Продолжить;
КонецЕсли;
СписокРолей.Добавить(ОбъектМетаданныхРоль.Имя, ОбъектМетаданныхРоль.Синоним);
КонецЦикла;
СписокРолей.СортироватьПоПредставлению();
Возврат СписокРолей;
КонецФункции
// Параметры:
// Профили - Массив из СправочникСсылка.ПрофилиГруппДоступа
//
// Возвращаемое значение:
// Массив из СправочникСсылка.ПрофилиГруппДоступа - профили без групп
//
Функция СписокПрофилейБезГрупп(Профили)
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Профили", Профили);
Запрос.Текст =
"ВЫБРАТЬ
| Профили.Ссылка КАК Профиль
|ИЗ
| Справочник.ПрофилиГруппДоступа КАК Профили
|ГДЕ
| Профили.ЭтоГруппа = ЛОЖЬ
| И Профили.Ссылка В(&Профили)
|
|УПОРЯДОЧИТЬ ПО
| Профили.Наименование";
Профили = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Профиль");
СписокПрофилей = Новый СписокЗначений;
СписокПрофилей.ЗагрузитьЗначения(Профили);
Возврат СписокПрофилей;
КонецФункции
Функция ОписаниеПрофилей()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Профили.Ссылка КАК Ссылка,
| Профили.Наименование КАК Наименование
|ИЗ
| Справочник.ПрофилиГруппДоступа КАК Профили
|
|УПОРЯДОЧИТЬ ПО
| Наименование";
ОписаниеПрофилей = ОписаниеРолей(Ложь).Скопировать(Новый Массив,
"КодРоли, ИмяРоли, ПредставлениеРоли, ЕстьПраваРоли");
ОписаниеПрофилей.Колонки.Добавить("Профиль",
Новый ОписаниеТипов("СправочникСсылка.ПрофилиГруппДоступа"));
ТекущийНомер = 1;
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НоваяСтрока = ОписаниеПрофилей.Добавить();
НоваяСтрока.КодРоли = ТекущийНомер;
НоваяСтрока.ИмяРоли = Выборка.Наименование;
НоваяСтрока.ПредставлениеРоли = НоваяСтрока.ИмяРоли;
НоваяСтрока.Профиль = Выборка.Ссылка;
ТекущийНомер = ТекущийНомер + 1;
КонецЦикла;
НоваяСтрока = ОписаниеПрофилей.Добавить();
НоваяСтрока.КодРоли = ТекущийНомер;
НоваяСтрока.ИмяРоли = НСтр("ru = '<Без профиля>'");
НоваяСтрока.ПредставлениеРоли = НоваяСтрока.ИмяРоли;
НоваяСтрока.Профиль = Справочники.ПрофилиГруппДоступа.ПустаяСсылка();
ОписаниеПрофилей.Индексы.Добавить("Профиль");
Возврат ОписаниеПрофилей;
КонецФункции
Процедура ДобавитьПраваРолиПрофилей(Контекст, ОписаниеРоли, УровеньДоступа, ЕстьОграничение)
ПрофилиРоли = Контекст.ПрофилиРолей.Получить(ОписаниеРоли.Ссылка);
ПустойПрофиль = Справочники.ПрофилиГруппДоступа.ПустаяСсылка();
Если Не ЗначениеЗаполнено(ПрофилиРоли) Тогда
ПрофилиРоли = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ПустойПрофиль);
КонецЕсли;
Для Каждого Профиль Из ПрофилиРоли Цикл
НоваяСтрока = Контекст.Права.Добавить();
НоваяСтрока.ИмяОбъекта = Контекст.ПолноеИмяОбъекта;
НоваяСтрока.ПредставлениеОбъекта = Контекст.ПредставлениеОбъекта;
НоваяСтрока.ИмяРоли = ОписаниеРоли.ИмяРоли;
НоваяСтрока.ПредставлениеРоли = ОписаниеРоли.ПредставлениеРоли;
НоваяСтрока.БезПрофиля = Профиль = ПустойПрофиль;
НоваяСтрока.Профиль = Профиль;
НоваяСтрока.УровеньДоступа = УровеньДоступа;
НоваяСтрока.ЕстьОграничение = ЕстьОграничение;
КонецЦикла;
КонецПроцедуры
Функция ПоказыватьПраваНаРеквизиты()
ПолеОтбора = КомпоновщикНастроек.ПолучитьНастройки().ПараметрыДанных.Элементы.Найти("ПраваНаРеквизиты");
Возврат ПолеОтбора.Значение = Истина;
КонецФункции
Функция ПоказыватьОбъектыИРолиБезПрав()
ПолеОтбора = КомпоновщикНастроек.ПолучитьНастройки().ПараметрыДанных.Элементы.Найти("ПоказыватьОбъектыИРолиБезПрав");
Возврат ПолеОтбора.Значение = Истина;
КонецФункции
Функция ПоказыватьПраваНеинтерфейсныхПодсистем()
ПолеОтбора = КомпоновщикНастроек.ПолучитьНастройки().ПараметрыДанных.Элементы.Найти("ПоказыватьПраваНеинтерфейсныхПодсистем");
Возврат ПолеОтбора.Значение = Истина;
КонецФункции
Функция ЗначенияВыбранногоПараметра(ИмяПараметра, ИспользуетсяВсегда = Ложь)
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
ПолеОтбора = Настройки.ПараметрыДанных.Элементы.Найти(ИмяПараметра);
Если Не ПолеОтбора.Использование И Не ИспользуетсяВсегда Тогда
Возврат Неопределено;
КонецЕсли;
Если ТипЗнч(ПолеОтбора.Значение) = Тип("СписокЗначений") Тогда
Возврат ПолеОтбора.Значение;
КонецЕсли;
Список = Новый СписокЗначений;
Список.Добавить(ПолеОтбора.Значение);
Возврат Список;
КонецФункции
Функция ПраваРолей(Заполнить, ПрофилиВместоРолей, ТолькоИерархия = Ложь)
Иерархия = Новый ТаблицаЗначений;
Иерархия.Колонки.Добавить("КодРодителя", ТипСтрока(50));
Иерархия.Колонки.Добавить("КодЭлемента", ТипСтрока(50));
Иерархия.Колонки.Добавить("ИндексКартинки", ТипЧисло(2));
Иерархия.Колонки.Добавить("ИмяЭлемента", ТипСтрока(255));
Иерархия.Колонки.Добавить("ПредставлениеЭлемента", ТипСтрока(1000));
Иерархия.Колонки.Добавить("ЕстьПраваЭлемента", Новый ОписаниеТипов("Булево"));
Иерархия.Колонки.Добавить("ЕстьПравоСОграничением", Новый ОписаниеТипов("Булево"));
Иерархия.Колонки.Добавить("ПолноеИмяОбъекта", ТипСтрока(430));
Права = Новый ТаблицаЗначений;
Права.Колонки.Добавить("КодЭлемента", ТипСтрока(50));
Права.Колонки.Добавить("КодРоли", ТипЧисло(4));
Права.Колонки.Добавить("УровеньДоступа", ТипЧисло(2));
Права.Колонки.Добавить("ЕстьОграничение", Новый ОписаниеТипов("Булево"));
ОписаниеРолей = ОписаниеРолей(Заполнить, ПрофилиВместоРолей);
Результат = Новый Структура;
Результат.Вставить("Иерархия", Иерархия);
Результат.Вставить("Права", Права);
Результат.Вставить("Роли", ОписаниеРолей);
Если Не Заполнить Тогда
Возврат Результат;
КонецЕсли;
Контекст = Новый Структура;
Контекст.Вставить("ПрофилиВместоРолей", ПрофилиВместоРолей);
Контекст.Вставить("ОписаниеРолей", ОписаниеРолей);
Контекст.Вставить("МетаданныеРолей", ОписаниеРолей.ВыгрузитьКолонку("Метаданные"));
Контекст.Вставить("Иерархия", Иерархия);
Контекст.Вставить("Права", Права);
Контекст.Вставить("Картинки", Картинки());
Контекст.Вставить("ПоляОбъектов", Новый Соответствие);
Контекст.Вставить("ОбъектыБезПрав", ПоказыватьОбъектыИРолиБезПрав() Или ТолькоИерархия);
Контекст.Вставить("ВыбранныеОМД", ЗначенияВыбранногоПараметра("ОбъектМетаданных"));
Контекст.Вставить("ВыбранныеУровни", ЗначенияВыбранногоПараметра("УровеньДоступа"));
Контекст.Вставить("ВсеПодсистемы", ПоказыватьПраваНеинтерфейсныхПодсистем());
Если ПрофилиВместоРолей Тогда
Контекст.Вставить("ОписаниеПрофилей", ОписаниеПрофилей());
Контекст.Вставить("ПрофилиРолей", ПрофилиРолей());
Результат.Роли = Контекст.ОписаниеПрофилей;
КонецЕсли;
Дерево = ДеревоМетаданных(ПоказыватьПраваНаРеквизиты());
Если ТолькоИерархия Тогда
ОчиститьОписаниеПрав(Дерево.Строки);
КонецЕсли;
ОбработатьСтрокиДерева(Контекст, Дерево.Строки, "", Ложь);
Если ТолькоИерархия Тогда
Возврат Результат;
КонецЕсли;
Если Контекст.ОбъектыБезПрав Тогда
Отбор = Новый Структура("ЕстьПраваРоли", Ложь);
Строки = Результат.Роли.НайтиСтроки(Отбор);
КодЭлементаКонфигурация = Иерархия[0].КодЭлемента;
Для Каждого ОписаниеРоли Из Строки Цикл
СтрокаПрав = Права.Добавить();
СтрокаПрав.КодЭлемента = КодЭлементаКонфигурация;
СтрокаПрав.КодРоли = ОписаниеРоли.КодРоли;
КонецЦикла;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ТипСтрока(ДлинаСтроки)
Возврат Новый ОписаниеТипов("Строка",,,, Новый КвалификаторыСтроки(ДлинаСтроки))
КонецФункции
Функция ТипЧисло(ЧислоРазрядов)
Возврат Новый ОписаниеТипов("Число",,,
Новый КвалификаторыЧисла(ЧислоРазрядов, 0, ДопустимыйЗнак.Неотрицательный));
КонецФункции
Функция ТипИдентификаторОбъектаМетаданных()
Возврат Новый ОписаниеТипов("СправочникСсылка.ИдентификаторыОбъектовМетаданных,
|СправочникСсылка.ИдентификаторыОбъектовРасширений");
КонецФункции
Функция ОписаниеРолей(Заполнить = Истина, СИдентификаторами = Ложь)
ОписаниеРолей = Новый ТаблицаЗначений;
ОписаниеРолей.Колонки.Добавить("Метаданные", Новый ОписаниеТипов("ОбъектМетаданных"));
ОписаниеРолей.Колонки.Добавить("КодРоли", ТипЧисло(4));
ОписаниеРолей.Колонки.Добавить("ИмяРоли", ТипСтрока(255));
ОписаниеРолей.Колонки.Добавить("ПредставлениеРоли", ТипСтрока(255));
ОписаниеРолей.Колонки.Добавить("ЕстьПраваРоли", Новый ОписаниеТипов("Булево"));
ОписаниеРолей.Колонки.Добавить("Ссылка", ТипИдентификаторОбъектаМетаданных());
Если Не Заполнить Тогда
Возврат ОписаниеРолей;
КонецЕсли;
ВыбранныеРоли = ЗначенияВыбранногоПараметра("Роль");
ТекущийНомер = 1;
Для Каждого Роль Из Метаданные.Роли Цикл
Если ВыбранныеРоли <> Неопределено
И ВыбранныеРоли.НайтиПоЗначению(Роль.Имя) = Неопределено Тогда
Продолжить;
КонецЕсли;
НоваяСтрока = ОписаниеРолей.Добавить();
НоваяСтрока.КодРоли = ТекущийНомер;
НоваяСтрока.Метаданные = Роль;
НоваяСтрока.ИмяРоли = Роль.Имя;
НоваяСтрока.ПредставлениеРоли = Роль.Представление();
ТекущийНомер = ТекущийНомер + 1;
КонецЦикла;
Если СИдентификаторами Тогда
РолиВыбранныхПрофилей = РолиВыбранныхПрофилей();
Идентификаторы = ОбщегоНазначения.ИдентификаторыОбъектовМетаданных(
ОписаниеРолей.ВыгрузитьКолонку("Метаданные"));
Индекс = ОписаниеРолей.Количество() - 1;
Пока Индекс >= 0 Цикл
ОписаниеРоли = ОписаниеРолей[Индекс];
РольСсылка = Идентификаторы.Получить(ОписаниеРоли.Метаданные.ПолноеИмя());
Если РолиВыбранныхПрофилей <> Неопределено
И РолиВыбранныхПрофилей.Получить(РольСсылка) = Неопределено Тогда
ОписаниеРолей.Удалить(ОписаниеРоли);
Иначе
ОписаниеРоли.Ссылка = РольСсылка;
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикла;
КонецЕсли;
ОписаниеРолей.Индексы.Добавить("Метаданные");
Возврат ОписаниеРолей;
КонецФункции
Функция РолиВыбранныхПрофилей()
ВыбранныеПрофили = ЗначенияВыбранногоПараметра("Профиль");
Если ВыбранныеПрофили = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Профили", ВыбранныеПрофили.ВыгрузитьЗначения());
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| РолиПрофилей.Роль КАК Роль
|ИЗ
| Справочник.ПрофилиГруппДоступа.Роли КАК РолиПрофилей
|ГДЕ
| РолиПрофилей.Ссылка В(&Профили)";
Выборка = Запрос.Выполнить().Выбрать();
Роли = Новый Соответствие;
Пока Выборка.Следующий() Цикл
Роли.Вставить(Выборка.Роль, Истина);
КонецЦикла;
Возврат Роли;
КонецФункции
Процедура ОбработатьСтрокиДерева(Контекст, СтрокиДерева, КодРодителя, СтрокиЕстьПрава)
Счетчик = 0;
СвойствоВключатьВКомандныйИнтерфейс = Новый Структура("ВключатьВКомандныйИнтерфейс", Истина);
Количество = СтрокиДерева.Количество();
Для Каждого СтрокаДерева Из СтрокиДерева Цикл
Если СтрокаДерева.БезГруппы Тогда
Количество = Количество - 1 + КоличествоЭлементов(СтрокаДерева.Метаданные);
КонецЕсли;
КонецЦикла;
ЧислоЦифр = СтрДлина(Количество);
Для Каждого СтрокаДерева Из СтрокиДерева Цикл
Счетчик = Счетчик + 1;
ИндексКартинки = ИндексКартинки(Контекст, СтрокаДерева.Имя);
СтрокаИерархииЕстьПрава = Ложь;
Если СтрокаДерева.БезГруппы Тогда
КодСтроки = КодРодителя;
Иначе
КодСтроки = КодРодителя + Прав("00000000" + Формат(Счетчик, "ЧГ="), ЧислоЦифр);
СтрокаИерархии = Контекст.Иерархия.Добавить();
СтрокаИерархии.КодРодителя = КодРодителя;
СтрокаИерархии.КодЭлемента = КодСтроки;
СтрокаИерархии.ИндексКартинки = ИндексКартинки;
СтрокаИерархии.ИмяЭлемента = СтрокаДерева.Представление;
СтрокаИерархии.ПредставлениеЭлемента = СтрокаДерева.Представление;
КонецЕсли;
СтрокиВложения = Неопределено;
Если ТипЗнч(СтрокаДерева.Метаданные) = Тип("КоллекцияОбъектовМетаданных")
Или ТипЗнч(СтрокаДерева.Метаданные) = Тип("ОписанияСтандартныхРеквизитов")
Или ТипЗнч(СтрокаДерева.Метаданные) = Тип("ОписанияСтандартныхТабличныхЧастей") Тогда
НомерОбъекта = ?(СтрокаДерева.БезГруппы, Счетчик, 0);
Если СтрокаДерева.Строки.Количество() > 0 Тогда
СтрокиВложения = СтрокаДерева.Строки;
КонецЕсли;
Если ТипЗнч(СтрокаДерева.Метаданные) = Тип("КоллекцияОбъектовМетаданных") Тогда
ВыбранныеОбъектыМетаданных = Контекст.ВыбранныеОМД;
Если ВыбранныеОбъектыМетаданных <> Неопределено
И ВыбранныеОбъектыМетаданных.НайтиПоЗначению(СтрокаДерева.Имя) <> Неопределено Тогда
ВыбранныеОбъектыМетаданных = Неопределено;
КонецЕсли;
Иначе
ВыбранныеОбъектыМетаданных = Неопределено;
КонецЕсли;
ЧислоЦифрДляОбъектов = ?(СтрокаДерева.БезГруппы, ЧислоЦифр,
СтрДлина(КоличествоЭлементов(СтрокаДерева.Метаданные)));
Для Каждого ОбъектМетаданных Из СтрокаДерева.Метаданные Цикл
ТолькоИерархия = Ложь;
Если ВыбранныеОбъектыМетаданных <> Неопределено Тогда
ПолноеИмя = ОбъектМетаданных.ПолноеИмя();
Если ВыбранныеОбъектыМетаданных.НайтиПоЗначению(ПолноеИмя) = Неопределено
И (СтрокаДерева.Имя <> "Подсистемы"
И СтрРазделить(ПолноеИмя, ".", Ложь).Количество() < 3
Или СтрокаДерева.Имя = "Подсистемы"
И Не ЭтоРодительскаяПодсистема(ВыбранныеОбъектыМетаданных, ПолноеИмя, ТолькоИерархия)) Тогда
Продолжить;
КонецЕсли;
КонецЕсли;
Если Не Контекст.ВсеПодсистемы Тогда
СвойствоВключатьВКомандныйИнтерфейс.ВключатьВКомандныйИнтерфейс = Истина;
ЗаполнитьЗначенияСвойств(СвойствоВключатьВКомандныйИнтерфейс, ОбъектМетаданных);
Если Не СвойствоВключатьВКомандныйИнтерфейс.ВключатьВКомандныйИнтерфейс Тогда
ТолькоИерархия = Истина;
КонецЕсли;
КонецЕсли;
НомерОбъекта = НомерОбъекта + 1;
КодЭлемента = КодСтроки + Прав("00000000" + Формат(НомерОбъекта, "ЧГ="), ЧислоЦифрДляОбъектов);
ДополнительнаяСтрокаИерархии = Контекст.Иерархия.Добавить();
ДополнительнаяСтрокаИерархии.КодРодителя = КодСтроки;
ДополнительнаяСтрокаИерархии.КодЭлемента = КодЭлемента;
ДополнительнаяСтрокаИерархии.ИндексКартинки = ИндексКартинки;
ДополнительнаяСтрокаИерархии.ИмяЭлемента = ОбъектМетаданных.Имя;
ДополнительнаяСтрокаИерархии.ПредставлениеЭлемента = ОбъектМетаданных.Представление();
ЕстьПрава = Ложь;
Если Не ТолькоИерархия Тогда
Если Не СтрокаДерева.БезРасшифровки Тогда
Если ТипЗнч(ОбъектМетаданных) = Тип("ОписаниеСтандартнойТабличнойЧасти") Тогда
ДополнительнаяСтрокаИерархии.ПолноеИмяОбъекта = СтрокаДерева.МетаданныеРодителяВложения.ПолноеИмя()
+ ".СтандартнаяТабличнаяЧасть." + ОбъектМетаданных.Имя;
ИначеЕсли ТипЗнч(ОбъектМетаданных) = Тип("ОписаниеСтандартногоРеквизита") Тогда
Если ТипЗнч(СтрокаДерева.МетаданныеРодителяВложения) = Тип("ОписаниеСтандартнойТабличнойЧасти") Тогда
ДополнительнаяСтрокаИерархии.ПолноеИмяОбъекта = СтрокаДерева.Родитель.МетаданныеРодителяВложения.ПолноеИмя()
+ ".СтандартнаяТабличнаяЧасть." + СтрокаДерева.МетаданныеРодителяВложения.Имя
+ ".СтандартныйРеквизит." + ОбъектМетаданных.Имя;
Иначе
ДополнительнаяСтрокаИерархии.ПолноеИмяОбъекта = СтрокаДерева.МетаданныеРодителяВложения.ПолноеИмя()
+ ".СтандартныйРеквизит." + ОбъектМетаданных.Имя;
КонецЕсли;
Иначе
ДополнительнаяСтрокаИерархии.ПолноеИмяОбъекта = ОбъектМетаданных.ПолноеИмя();
КонецЕсли;
КонецЕсли;
СОграничением = Ложь;
Если ТипЗнч(СтрокаДерева.Метаданные) = Тип("КоллекцияОбъектовМетаданных") Тогда
ДобавитьПрава(Контекст, ОбъектМетаданных, СтрокаДерева, КодЭлемента, ЕстьПрава, СОграничением);
ИначеЕсли ТипЗнч(СтрокаДерева.МетаданныеРодителяВложения) = Тип("ОписаниеСтандартнойТабличнойЧасти") Тогда
ДобавитьПрава(Контекст, СтрокаДерева.Родитель.МетаданныеРодителяВложения, СтрокаДерева, КодЭлемента,
ЕстьПрава, СОграничением, СтрокаДерева.МетаданныеРодителяВложения.Имя + "." + ОбъектМетаданных.Имя);
Иначе
ДобавитьПрава(Контекст, СтрокаДерева.МетаданныеРодителяВложения, СтрокаДерева, КодЭлемента,
ЕстьПрава, СОграничением, ОбъектМетаданных.Имя);
КонецЕсли;
ДополнительнаяСтрокаИерархии.ЕстьПравоСОграничением = СОграничением;
КонецЕсли;
Если СтрокиВложения <> Неопределено Тогда
Для Каждого СтрокаВложения Из СтрокиВложения Цикл
СтрокаВложения.МетаданныеРодителяВложения = ОбъектМетаданных;
СтрокаВложения.Метаданные = ОбъектМетаданных[СтрокаВложения.ИмяВложений];
КонецЦикла;
ОбработатьСтрокиДерева(Контекст, СтрокаДерева.Строки, КодЭлемента, ЕстьПрава);
ИначеЕсли СтрокаДерева.ЕстьИерархия Тогда
ОписаниеСтроки = Новый Структура("Строки, Имя,Метаданные,ОписаниеПрав,Представление,
|ИмяВложений,БезГруппы,БезРасшифровки,ЕстьИерархия");
ЗаполнитьЗначенияСвойств(ОписаниеСтроки, СтрокаДерева);
ОписаниеСтроки.Метаданные = ОбъектМетаданных[СтрокаДерева.ИмяВложений];
ОписаниеСтрок = Новый Массив;
ОписаниеСтрок.Добавить(ОписаниеСтроки);
ОбработатьСтрокиДерева(Контекст, ОписаниеСтрок, КодЭлемента, ЕстьПрава);
КонецЕсли;
Если ЕстьПрава Тогда
СтрокаИерархииЕстьПрава = Истина;
ДополнительнаяСтрокаИерархии.ЕстьПраваЭлемента = Истина;
ИначеЕсли Не Контекст.ОбъектыБезПрав Тогда
НомерОбъекта = НомерОбъекта - 1;
Контекст.Иерархия.Удалить(ДополнительнаяСтрокаИерархии);
КонецЕсли;
КонецЦикла;
Если СтрокаДерева.БезГруппы Тогда
Счетчик = НомерОбъекта;
КонецЕсли;
ИначеЕсли ТипЗнч(СтрокаДерева.Метаданные) = Тип("ОбъектМетаданныхКонфигурация") Тогда
Если Контекст.ВыбранныеОМД = Неопределено
Или Контекст.ВыбранныеОМД.НайтиПоЗначению("Конфигурация") <> Неопределено Тогда
ДобавитьПрава(Контекст, СтрокаДерева.Метаданные, СтрокаДерева, КодСтроки, СтрокаИерархииЕстьПрава);
КонецЕсли;
СтрокаИерархии.ПолноеИмяОбъекта = "Конфигурация";
КонецЕсли;
Если СтрокиВложения = Неопределено Тогда
ОбработатьСтрокиДерева(Контекст, СтрокаДерева.Строки, КодСтроки, СтрокаИерархииЕстьПрава);
КонецЕсли;
Если СтрокаИерархииЕстьПрава Тогда
СтрокиЕстьПрава = Истина;
Если Не СтрокаДерева.БезГруппы Тогда
СтрокаИерархии.ЕстьПраваЭлемента = Истина;
КонецЕсли;
ИначеЕсли Не Контекст.ОбъектыБезПрав И Не СтрокаДерева.БезГруппы Тогда
Счетчик = Счетчик - 1;
Контекст.Иерархия.Удалить(СтрокаИерархии);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция КоличествоЭлементов(Коллекция)
Если ТипЗнч(Коллекция) = Тип("КоллекцияОбъектовМетаданных")
Или ТипЗнч(Коллекция) = Тип("ОписанияСтандартныхРеквизитов") Тогда
Возврат Коллекция.Количество();
ИначеЕсли ТипЗнч(Коллекция) = Тип("ОписанияСтандартныхТабличныхЧастей") Тогда
Количество = 0;
//@skip-check module-unused-local-variable
Для Каждого ЭлементКоллекции Из Коллекция Цикл
Количество = Количество + 1;
КонецЦикла;
Возврат Количество;
КонецЕсли;
Возврат 1;
КонецФункции
Функция ЭтоРодительскаяПодсистема(ВыбранныеОбъектыМетаданных, ПолноеИмяПодсистемы, ДобавитьВИерархию)
Для Каждого ЭлементСписка Из ВыбранныеОбъектыМетаданных Цикл
Если СтрНачинаетсяС(ЭлементСписка.Значение, ПолноеИмяПодсистемы) Тогда
ДобавитьВИерархию = Истина;
Возврат Истина;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
Процедура ДобавитьПрава(Контекст, ОбъектМетаданных, СтрокаДерева, КодЭлемента, ЕстьПрава,
СОграничением = Ложь, ИмяСтандартногоРеквизита = Неопределено)
Если Не ЗначениеЗаполнено(СтрокаДерева.ОписаниеПрав) Тогда
Возврат;
КонецЕсли;
ВыбранныеУровни = Контекст.ВыбранныеУровни;
Если ВыбранныеУровни <> Неопределено Тогда
ЕстьУровеньДоступа = Ложь;
Для Каждого ОписаниеУровня Из СтрокаДерева.ОписаниеПрав.УровниДоступа Цикл
Если ВыбранныеУровни.НайтиПоЗначению(ОписаниеУровня.Уровень) <> Неопределено Тогда
ЕстьУровеньДоступа = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если Не ЕстьУровеньДоступа Тогда
Возврат;
КонецЕсли;
КонецЕсли;
ЕстьНаборПрав = Ложь;
ПраваУровней = Новый Массив;
Для Каждого ОписаниеУровня Из СтрокаДерева.ОписаниеПрав.УровниДоступа Цикл
ПраваУровней.Добавить(ОписаниеУровня.Право);
Если ОписаниеУровня.ЭтоНаборПрав Тогда
ЕстьНаборПрав = Истина;
КонецЕсли;
КонецЦикла;
Если Контекст.ПрофилиВместоРолей Тогда
Контекст.Вставить("ПустойПрофиль", Справочники.ПрофилиГруппДоступа.ПустаяСсылка());
Контекст.Вставить("СтрокиПравПрофилей", Новый Соответствие);
КонецЕсли;
Контекст.Вставить("КодЭлемента", КодЭлемента);
МетаданныеРолей = Контекст.МетаданныеРолей;
УровниДоступа = СтрокаДерева.ОписаниеПрав.УровниДоступа;
Если ЕстьНаборПрав Тогда
Для Каждого Роль Из МетаданныеРолей Цикл
Для Каждого ОписаниеУровня Из УровниДоступа Цикл
Если ОписаниеУровня.ЭтоНаборПрав Тогда
ЕстьПраво = ЗначениеЗаполнено(ОписаниеУровня.Право);
НаборПрав = СтрРазделить(ОписаниеУровня.Право, ",", Ложь);
Для Каждого Право Из НаборПрав Цикл
Если Не ПравоДоступа(Право, ОбъектМетаданных, Роль) Тогда
ЕстьПраво = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Иначе
ЕстьПраво = ПравоДоступа(ОписаниеУровня.Право, ОбъектМетаданных, Роль, ИмяСтандартногоРеквизита);
КонецЕсли;
Если Не ЕстьПраво Тогда
Продолжить;
КонецЕсли;
ЕстьПрава = Истина;
Если ЗначениеЗаполнено(ОписаниеУровня.ПравоСОграничением) Тогда
СОграничением = Истина;
КонецЕсли;
ДобавитьПраво(Контекст, ОписаниеУровня, ОбъектМетаданных, Роль);
КонецЦикла;
КонецЦикла;
Иначе
Для Каждого Роль Из МетаданныеРолей Цикл
Для Каждого Право Из ПраваУровней Цикл
Если ПравоДоступа(Право, ОбъектМетаданных, Роль, ИмяСтандартногоРеквизита) Тогда
ОписаниеУровня = УровниДоступа[ПраваУровней.Найти(Право)];
ЕстьПрава = Истина;
Если ЗначениеЗаполнено(ОписаниеУровня.ПравоСОграничением) Тогда
СОграничением = Истина;
КонецЕсли;
ДобавитьПраво(Контекст, ОписаниеУровня, ОбъектМетаданных, Роль);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Процедура ДобавитьПраво(Контекст, ОписаниеУровня, ОбъектМетаданных, Роль)
Если Контекст.ВыбранныеУровни <> Неопределено
И Контекст.ВыбранныеУровни.НайтиПоЗначению(ОписаниеУровня.Уровень) = Неопределено Тогда
Возврат;
КонецЕсли;
ОписаниеРоли = Контекст.ОписаниеРолей.Найти(Роль, "Метаданные");
ОписаниеРоли.ЕстьПраваРоли = Истина;
ЕстьОграничение = Ложь;
Если ЗначениеЗаполнено(ОписаниеУровня.ПравоСОграничением) Тогда
ЕстьОграничение = ЕстьОграничение(ОписаниеУровня.ПравоСОграничением,
ОбъектМетаданных, Контекст.ПоляОбъектов, ОписаниеРоли.Метаданные);
КонецЕсли;
Если Контекст.ПрофилиВместоРолей Тогда
ОписаниеПрофилей = Контекст.ОписаниеПрофилей;
СтрокиПравПрофилей = Контекст.СтрокиПравПрофилей;
ПрофилиРоли = Контекст.ПрофилиРолей.Получить(ОписаниеРоли.Ссылка);
Если Не ЗначениеЗаполнено(ПрофилиРоли) Тогда
ПрофилиРоли = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Контекст.ПустойПрофиль);
КонецЕсли;
Для Каждого Профиль Из ПрофилиРоли Цикл
СтрокаПрав = СтрокиПравПрофилей.Получить(Профиль);
Если СтрокаПрав = Неопределено Тогда
Отбор = Новый Структура("Профиль", Профиль);
НайденныеСтроки = ОписаниеПрофилей.НайтиСтроки(Отбор);
Если НайденныеСтроки.Количество() <> 1 Тогда
Продолжить;
КонецЕсли;
ОписаниеПрофиля = НайденныеСтроки[0];
ОписаниеПрофиля.ЕстьПраваРоли = Истина;
СтрокаПрав = Контекст.Права.Добавить();
СтрокаПрав.КодЭлемента = Контекст.КодЭлемента;
СтрокаПрав.КодРоли = ОписаниеПрофиля.КодРоли;
СтрокаПрав.УровеньДоступа = ОписаниеУровня.Уровень;
СтрокаПрав.ЕстьОграничение = ЕстьОграничение;
СтрокиПравПрофилей.Вставить(Профиль, СтрокаПрав);
Иначе
Если СтрокаПрав.УровеньДоступа < ОписаниеУровня.Уровень Тогда
СтрокаПрав.УровеньДоступа = ОписаниеУровня.Уровень;
КонецЕсли;
Если Не ЕстьОграничение И СтрокаПрав.ЕстьОграничение Тогда
СтрокаПрав.ЕстьОграничение = Ложь;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Иначе
СтрокаПрав = Контекст.Права.Добавить();
СтрокаПрав.КодЭлемента = Контекст.КодЭлемента;
СтрокаПрав.КодРоли = ОписаниеРоли.КодРоли;
СтрокаПрав.УровеньДоступа = ОписаниеУровня.Уровень;
СтрокаПрав.ЕстьОграничение = ЕстьОграничение;
КонецЕсли;
КонецПроцедуры
Функция ЕстьОграничение(ИмяПрава, ОбъектМетаданных, ПоляОбъектов, Роль);
Поля = ПоляОбъектов.Получить(ОбъектМетаданных);
Если Поля = Неопределено Тогда
Поля = РегистрыСведений.ПраваРолей.ВсеПоляОграниченияДоступаОбъектаМетаданных(
ОбъектМетаданных, ОбъектМетаданных.ПолноеИмя());
ПоляОбъектов.Вставить(ОбъектМетаданных, Поля);
КонецЕсли;
Возврат ПараметрыДоступа(ИмяПрава, ОбъектМетаданных, Поля, Роль).ОграничениеУсловием;
КонецФункции
Процедура ОчиститьОписаниеПрав(СтрокиДерева)
Для Каждого Строка Из СтрокиДерева Цикл
Строка.ОписаниеПрав = Неопределено;
ОчиститьОписаниеПрав(Строка.Строки);
КонецЦикла;
КонецПроцедуры
// Возвращаемое значение:
// ДеревоЗначений:
// * Имя - Строка
// * Метаданные - ОбъектМетаданных
// - Неопределено
// * ОписаниеПрав - см. ОписаниеПрав
// * Представление - Строка
// * ПредставлениеОбъекта - Строка
// * ИмяВложений - Строка
// * БезГруппы - Булево
// * ЕстьИерархия - Булево
// * БезРасшифровки - Булево
// * ПутьКОбъекту - Строка
// * МетаданныеРодителяВложения - ОбъектМетаданных
// - Неопределено
//
Функция ДеревоМетаданных(СПолями)
Дерево = Новый ДеревоЗначений;
Дерево.Колонки.Добавить("Имя", ТипСтрока(150));
Дерево.Колонки.Добавить("Метаданные");
Дерево.Колонки.Добавить("ОписаниеПрав", Новый ОписаниеТипов("Структура"));
Дерево.Колонки.Добавить("Представление", ТипСтрока(150));
Дерево.Колонки.Добавить("ПредставлениеОбъекта", ТипСтрока(150));
Дерево.Колонки.Добавить("ИмяВложений", ТипСтрока(100));
Дерево.Колонки.Добавить("БезГруппы", Новый ОписаниеТипов("Булево"));
Дерево.Колонки.Добавить("ЕстьИерархия", Новый ОписаниеТипов("Булево"));
Дерево.Колонки.Добавить("БезРасшифровки", Новый ОписаниеТипов("Булево"));
Дерево.Колонки.Добавить("ПутьКОбъекту", ТипСтрока(255));
Дерево.Колонки.Добавить("МетаданныеРодителяВложения"); // Заполняется автоматически.
// Конфигурация
СтрокаКонфигурация = Дерево.Строки.Добавить();
СтрокаКонфигурация.Имя = "Конфигурация";
СтрокаКонфигурация.Метаданные = Метаданные;
СтрокаКонфигурация.ОписаниеПрав = ПраваКонфигурации();
СтрокаКонфигурация.ПутьКОбъекту = "Конфигурация";
СтрокаКонфигурация.Представление = НСтр("ru = 'Конфигурация'");
СтрокаКонфигурация.ПредставлениеОбъекта = НСтр("ru = 'Конфигурация'");
// Конфигурация.Общие
СтрокаОбщие = СтрокаКонфигурация.Строки.Добавить();
СтрокаОбщие.Имя = "Общие";
СтрокаОбщие.Представление = НСтр("ru = 'Общие'");
// Конфигурация.Общие.Подсистемы
СтрокаПодсистемы = СтрокаОбщие.Строки.Добавить();
СтрокаПодсистемы.Имя = "Подсистемы";
СтрокаПодсистемы.Метаданные = Метаданные.Подсистемы;
СтрокаПодсистемы.ОписаниеПрав = ПравоПросмотр();
СтрокаПодсистемы.ПутьКОбъекту = "Подсистема.*";
СтрокаПодсистемы.Представление = НСтр("ru = 'Подсистемы'");
СтрокаПодсистемы.ПредставлениеОбъекта = НСтр("ru = 'Подсистема'");
// Конфигурация.Общие.Подсистемы.Подсистемы.*
СтрокаВложенныеПодсистемы = СтрокаПодсистемы.Строки.Добавить();
СтрокаВложенныеПодсистемы.Имя = "Подсистемы";
СтрокаВложенныеПодсистемы.Метаданные = "Подсистемы";
СтрокаВложенныеПодсистемы.ПутьКОбъекту = "Подсистема.*.Подсистема.*";
СтрокаВложенныеПодсистемы.ОписаниеПрав = ПравоПросмотр();
СтрокаВложенныеПодсистемы.Представление = НСтр("ru = 'Подсистемы'");
СтрокаВложенныеПодсистемы.ПредставлениеОбъекта = НСтр("ru = 'Подсистема'");
СтрокаВложенныеПодсистемы.ИмяВложений = "Подсистемы";
СтрокаВложенныеПодсистемы.БезГруппы = Истина;
СтрокаВложенныеПодсистемы.ЕстьИерархия = Истина;
// Конфигурация.Общие.ПараметрыСеанса
СтрокаПараметрыСеанса = СтрокаОбщие.Строки.Добавить();
СтрокаПараметрыСеанса.Имя = "ПараметрыСеанса";
СтрокаПараметрыСеанса.Метаданные = Метаданные.ПараметрыСеанса;
СтрокаПараметрыСеанса.ПутьКОбъекту = "ПараметрСеанса.*";
СтрокаПараметрыСеанса.ОписаниеПрав = ПраваПараметраСеанса();
СтрокаПараметрыСеанса.Представление = НСтр("ru = 'Параметры сеанса'");
СтрокаПараметрыСеанса.ПредставлениеОбъекта = НСтр("ru = 'Параметр сеанса'");
// Конфигурация.Общие.ОбщиеРеквизиты
СтрокаОбщиеРеквизиты = СтрокаОбщие.Строки.Добавить();
СтрокаОбщиеРеквизиты.Имя = "ОбщиеРеквизиты";
СтрокаОбщиеРеквизиты.Метаданные = Метаданные.ОбщиеРеквизиты;
СтрокаОбщиеРеквизиты.ПутьКОбъекту = "ОбщийРеквизит.*";
СтрокаОбщиеРеквизиты.ОписаниеПрав = ПраваРеквизита();
СтрокаОбщиеРеквизиты.Представление = НСтр("ru = 'Общие реквизиты'");
СтрокаОбщиеРеквизиты.ПредставлениеОбъекта = НСтр("ru = 'Общий реквизит'");
// Конфигурация.Общие.ПланыОбмена
СтрокаПланыОбмена = СтрокаОбщие.Строки.Добавить();
СтрокаПланыОбмена.Имя = "ПланыОбмена";
СтрокаПланыОбмена.Метаданные = Метаданные.ПланыОбмена;
СтрокаПланыОбмена.ПутьКОбъекту = "ПланОбмена.*";
СтрокаПланыОбмена.ОписаниеПрав = ПраваПланаОбмена();
СтрокаПланыОбмена.Представление = НСтр("ru = 'Планы обмена'");
СтрокаПланыОбмена.ПредставлениеОбъекта = НСтр("ru = 'План обмена'");
ДобавитьКомандыИПоля(СПолями, СтрокаПланыОбмена);
// Конфигурация.Общие.КритерииОтбора
СтрокаКритерииОтбора = СтрокаОбщие.Строки.Добавить();
СтрокаКритерииОтбора.Имя = "КритерииОтбора";
СтрокаКритерииОтбора.Метаданные = Метаданные.КритерииОтбора;
СтрокаКритерииОтбора.ПутьКОбъекту = "КритерийОтбора.*";
СтрокаКритерииОтбора.ОписаниеПрав = ПравоПросмотр();
СтрокаКритерииОтбора.Представление = НСтр("ru = 'Критерии отбора'");
СтрокаКритерииОтбора.ПредставлениеОбъекта = НСтр("ru = 'Критерий отбора'");
ДобавитьКомандыИПоля(Ложь, СтрокаКритерииОтбора);
// Конфигурация.Общие.ОбщиеФормы
СтрокаОбщиеФормы = СтрокаОбщие.Строки.Добавить();
СтрокаОбщиеФормы.Имя = "ОбщиеФормы";
СтрокаОбщиеФормы.Метаданные = Метаданные.ОбщиеФормы;
СтрокаОбщиеФормы.ПутьКОбъекту = "ОбщаяФорма.*";
СтрокаОбщиеФормы.ОписаниеПрав = ПравоПросмотр();
СтрокаОбщиеФормы.Представление = НСтр("ru = 'Общие формы'");
СтрокаОбщиеФормы.ПредставлениеОбъекта = НСтр("ru = 'Общая форма'");
// Конфигурация.Общие.ОбщиеКоманды
СтрокаОбщиеКоманды = СтрокаОбщие.Строки.Добавить();
СтрокаОбщиеКоманды.Имя = "ОбщиеКоманды";
СтрокаОбщиеКоманды.Метаданные = Метаданные.ОбщиеКоманды;
СтрокаОбщиеКоманды.ПутьКОбъекту = "ОбщаяКоманда.*";
СтрокаОбщиеКоманды.ОписаниеПрав = ПравоПросмотр();
СтрокаОбщиеКоманды.Представление = НСтр("ru = 'Общие команды'");
СтрокаОбщиеКоманды.ПредставлениеОбъекта = НСтр("ru = 'Общая команда'");
// Конфигурация.Общие.WebСервисы
СтрокаWebСервисы = СтрокаОбщие.Строки.Добавить();
СтрокаWebСервисы.Имя = "WebСервисы";
СтрокаWebСервисы.Метаданные = Метаданные.WebСервисы;
СтрокаWebСервисы.ПутьКОбъекту = "WebСервис.*";
СтрокаWebСервисы.Представление = НСтр("ru = 'Web-сервисы'");
СтрокаWebСервисы.ПредставлениеОбъекта = НСтр("ru = 'Web-сервис'");
// Конфигурация.Общие.WebСервисы.Операции
СтрокаОперации = СтрокаWebСервисы.Строки.Добавить();
СтрокаОперации.Имя = "Операции";
СтрокаОперации.ИмяВложений = "Операции";
СтрокаОперации.ПутьКОбъекту = "WebСервис.*.Операция.*";
СтрокаОперации.ОписаниеПрав = ПравоИспользование();
СтрокаОперации.БезГруппы = Истина;
СтрокаОперации.ПредставлениеОбъекта = НСтр("ru = 'Операция'");
// Конфигурация.Общие.HTTPСервисы
СтрокаHTTPСервисы = СтрокаОбщие.Строки.Добавить();
СтрокаHTTPСервисы.Имя = "HTTPСервисы";
СтрокаHTTPСервисы.Метаданные = Метаданные.HTTPСервисы;
СтрокаHTTPСервисы.ПутьКОбъекту = "HTTPСервис.*";
СтрокаHTTPСервисы.Представление = НСтр("ru = 'HTTP-сервисы'");
СтрокаHTTPСервисы.ПредставлениеОбъекта = НСтр("ru = 'HTTP-сервис'");
// Конфигурация.Общие.HTTPСервисы.ШаблоныURL
СтрокаШаблоныURL = СтрокаHTTPСервисы.Строки.Добавить();
СтрокаШаблоныURL.Имя = "ШаблоныURL";
СтрокаШаблоныURL.ИмяВложений = "ШаблоныURL";
СтрокаШаблоныURL.ПутьКОбъекту = "HTTPСервис.*.ШаблонURL.*";
СтрокаШаблоныURL.БезГруппы = Истина;
СтрокаШаблоныURL.ПредставлениеОбъекта = НСтр("ru = 'URL-шаблон'");
// Конфигурация.Общие.HTTPСервисы.ШаблоныURL.Методы
СтрокаМетоды = СтрокаШаблоныURL.Строки.Добавить();
СтрокаМетоды.Имя = "Методы";
СтрокаМетоды.ИмяВложений = "Методы";
СтрокаМетоды.ПутьКОбъекту = "HTTPСервис.*.ШаблонURL.*.Метод.*";
СтрокаМетоды.ОписаниеПрав = ПравоИспользование();
СтрокаМетоды.БезГруппы = Истина;
СтрокаМетоды.ПредставлениеОбъекта = НСтр("ru = 'Метод'");
// Конфигурация.Константы
СтрокаКонстанты = СтрокаКонфигурация.Строки.Добавить();
СтрокаКонстанты.Имя = "Константы";
СтрокаКонстанты.Метаданные = Метаданные.Константы;
СтрокаКонстанты.ПутьКОбъекту = "Константа.*";
СтрокаКонстанты.ОписаниеПрав = ПраваКонстанты();
СтрокаКонстанты.Представление = НСтр("ru = 'Константы'");
СтрокаКонстанты.ПредставлениеОбъекта = НСтр("ru = 'Константа'");
// Конфигурация.Справочники
СтрокаСправочники = СтрокаКонфигурация.Строки.Добавить();
СтрокаСправочники.Имя = "Справочники";
СтрокаСправочники.Метаданные = Метаданные.Справочники;
СтрокаСправочники.ПутьКОбъекту = "Справочник.*";
СтрокаСправочники.ОписаниеПрав = ПраваСправочникаИПланов();
СтрокаСправочники.Представление = НСтр("ru = 'Справочники'");
СтрокаСправочники.ПредставлениеОбъекта = НСтр("ru = 'Справочник'");
ДобавитьКомандыИПоля(СПолями, СтрокаСправочники);
// Конфигурация.Документы (группа)
СтрокаГруппаДокументы = СтрокаКонфигурация.Строки.Добавить();
СтрокаГруппаДокументы.Имя = "Документы";
СтрокаГруппаДокументы.Представление = НСтр("ru = 'Документы'");
// Конфигурация.Документы.Последовательности
СтрокаПоследовательности = СтрокаГруппаДокументы.Строки.Добавить();
СтрокаПоследовательности.Имя = "Последовательности";
СтрокаПоследовательности.Метаданные = Метаданные.Последовательности;
СтрокаПоследовательности.ПутьКОбъекту = "Последовательность.*";
СтрокаПоследовательности.ОписаниеПрав = ПраваПоследовательностиИПерерасчета();
СтрокаПоследовательности.Представление = НСтр("ru = 'Последовательности'");
СтрокаПоследовательности.ПредставлениеОбъекта = НСтр("ru = 'Последовательность'");
// Конфигурация.Документы (элементы)
СтрокаДокументы = СтрокаГруппаДокументы.Строки.Добавить();
СтрокаДокументы.Имя = "Документы";
СтрокаДокументы.Метаданные = Метаданные.Документы;
СтрокаДокументы.ПутьКОбъекту = "Документ.*";
СтрокаДокументы.ОписаниеПрав = ПраваДокумента();
СтрокаДокументы.БезГруппы = Истина;
СтрокаДокументы.ПредставлениеОбъекта = НСтр("ru = 'Документ'");
ДобавитьКомандыИПоля(СПолями, СтрокаДокументы);
// Конфигурация.ЖурналыДокументов
СтрокаЖурналыДокументов = СтрокаКонфигурация.Строки.Добавить();
СтрокаЖурналыДокументов.Имя = "ЖурналыДокументов";
СтрокаЖурналыДокументов.Метаданные = Метаданные.ЖурналыДокументов;
СтрокаЖурналыДокументов.ПутьКОбъекту = "ЖурналДокументов.*";
СтрокаЖурналыДокументов.ОписаниеПрав = ПраваЖурналаДокументов();
СтрокаЖурналыДокументов.Представление = НСтр("ru = 'Журналы документов'");
СтрокаЖурналыДокументов.ПредставлениеОбъекта = НСтр("ru = 'Журнал документов'");
ДобавитьКомандыИПоля(СПолями, СтрокаЖурналыДокументов, "СтандартныеРеквизиты", Истина);
// Конфигурация.Перечисления
СтрокаПеречисления = СтрокаКонфигурация.Строки.Добавить();
СтрокаПеречисления.Имя = "Перечисления";
СтрокаПеречисления.Метаданные = Метаданные.Перечисления;
СтрокаПеречисления.ПутьКОбъекту = "Перечисление.*";
СтрокаПеречисления.Представление = НСтр("ru = 'Перечисления'");
СтрокаПеречисления.ПредставлениеОбъекта = НСтр("ru = 'Перечисление'");
СтрокаПеречисления.БезРасшифровки = Истина;
ДобавитьКомандыИПоля(Ложь, СтрокаПеречисления);
// Конфигурация.Отчеты
СтрокаОтчеты = СтрокаКонфигурация.Строки.Добавить();
СтрокаОтчеты.Имя = "Отчеты";
СтрокаОтчеты.Метаданные = Метаданные.Отчеты;
СтрокаОтчеты.ПутьКОбъекту = "Отчет.*";
СтрокаОтчеты.ОписаниеПрав = ПраваОтчетаОбработкиФункции();
СтрокаОтчеты.Представление = НСтр("ru = 'Отчеты'");
СтрокаОтчеты.ПредставлениеОбъекта = НСтр("ru = 'Отчет'");
ДобавитьКомандыИПоля(СПолями, СтрокаОтчеты, "Реквизиты, ТабличныеЧасти");
// Конфигурация.Обработки
СтрокаОбработки = СтрокаКонфигурация.Строки.Добавить();
СтрокаОбработки.Имя = "Обработки";
СтрокаОбработки.Метаданные = Метаданные.Обработки;
СтрокаОбработки.ПутьКОбъекту = "Обработка.*";
СтрокаОбработки.ОписаниеПрав = ПраваОтчетаОбработкиФункции();
СтрокаОбработки.Представление = НСтр("ru = 'Обработки'");
СтрокаОбработки.ПредставлениеОбъекта = НСтр("ru = 'Обработка'");
ДобавитьКомандыИПоля(СПолями, СтрокаОбработки, "Реквизиты, ТабличныеЧасти");
// Конфигурация.ПланыВидовХарактеристик
СтрокаПланыВидовХарактеристик = СтрокаКонфигурация.Строки.Добавить();
СтрокаПланыВидовХарактеристик.Имя = "ПланыВидовХарактеристик";
СтрокаПланыВидовХарактеристик.Метаданные = Метаданные.ПланыВидовХарактеристик;
СтрокаПланыВидовХарактеристик.ПутьКОбъекту = "ПланВидовХарактеристик.*";
СтрокаПланыВидовХарактеристик.ОписаниеПрав = ПраваСправочникаИПланов();
СтрокаПланыВидовХарактеристик.Представление = НСтр("ru = 'Планы видов характеристик'");
СтрокаПланыВидовХарактеристик.ПредставлениеОбъекта = НСтр("ru = 'План видов характеристик'");
ДобавитьКомандыИПоля(СПолями, СтрокаПланыВидовХарактеристик);
// Конфигурация.ПланыСчетов
СтрокаПланыСчетов = СтрокаКонфигурация.Строки.Добавить();
СтрокаПланыСчетов.Имя = "ПланыСчетов";
СтрокаПланыСчетов.Метаданные = Метаданные.ПланыСчетов;
СтрокаПланыСчетов.ПутьКОбъекту = "ПланСчетов.*";
СтрокаПланыСчетов.ОписаниеПрав = ПраваСправочникаИПланов();
СтрокаПланыСчетов.Представление = НСтр("ru = 'Планы счетов'");
СтрокаПланыСчетов.ПредставлениеОбъекта = НСтр("ru = 'План счетов'");
ДобавитьКомандыИПоля(СПолями, СтрокаПланыСчетов, "Реквизиты, ПризнакиУчета,
|ПризнакиУчетаСубконто, ТабличныеЧасти, СтандартныеРеквизиты, СтандартныеТабличныеЧасти");
// Конфигурация.ПланыВидовРасчета
СтрокаПланыВидовРасчета = СтрокаКонфигурация.Строки.Добавить();
СтрокаПланыВидовРасчета.Имя = "ПланыВидовРасчета";
СтрокаПланыВидовРасчета.Метаданные = Метаданные.ПланыВидовРасчета;
СтрокаПланыВидовРасчета.ПутьКОбъекту = "ПланВидовРасчета.*";
СтрокаПланыВидовРасчета.ОписаниеПрав = ПраваСправочникаИПланов();
СтрокаПланыВидовРасчета.Представление = НСтр("ru = 'Планы видов расчета'");
СтрокаПланыВидовРасчета.ПредставлениеОбъекта = НСтр("ru = 'План видов расчета'");
ДобавитьКомандыИПоля(СПолями, СтрокаПланыВидовРасчета, "Реквизиты, ТабличныеЧасти,
|СтандартныеРеквизиты, СтандартныеТабличныеЧасти");
// Конфигурация.РегистрыСведений
СтрокаРегистрыСведений = СтрокаКонфигурация.Строки.Добавить();
СтрокаРегистрыСведений.Имя = "РегистрыСведений";
СтрокаРегистрыСведений.Метаданные = Метаданные.РегистрыСведений;
СтрокаРегистрыСведений.ПутьКОбъекту = "РегистрСведений.*";
СтрокаРегистрыСведений.ОписаниеПрав = ПраваРегистраСведений();
СтрокаРегистрыСведений.Представление = НСтр("ru = 'Регистры сведений'");
СтрокаРегистрыСведений.ПредставлениеОбъекта = НСтр("ru = 'Регистр сведений'");
ДобавитьКомандыИПоля(СПолями, СтрокаРегистрыСведений, "Измерения, Ресурсы,
|Реквизиты, СтандартныеРеквизиты");
// Конфигурация.РегистрыНакопления
СтрокаРегистрыНакопления = СтрокаКонфигурация.Строки.Добавить();
СтрокаРегистрыНакопления.Имя = "РегистрыНакопления";
СтрокаРегистрыНакопления.Метаданные = Метаданные.РегистрыНакопления;
СтрокаРегистрыНакопления.ПутьКОбъекту = "РегистрНакопления.*";
СтрокаРегистрыНакопления.ОписаниеПрав = ПраваРегистраНакопленияИБухгалтерии();
СтрокаРегистрыНакопления.Представление = НСтр("ru = 'Регистры накопления'");
СтрокаРегистрыНакопления.ПредставлениеОбъекта = НСтр("ru = 'Регистр накопления'");
ДобавитьКомандыИПоля(СПолями, СтрокаРегистрыНакопления, "Измерения, Ресурсы,
|Реквизиты, СтандартныеРеквизиты");
// Конфигурация.РегистрыБухгалтерии
СтрокаРегистрыБухгалтерии = СтрокаКонфигурация.Строки.Добавить();
СтрокаРегистрыБухгалтерии.Имя = "РегистрыБухгалтерии";
СтрокаРегистрыБухгалтерии.Метаданные = Метаданные.РегистрыБухгалтерии;
СтрокаРегистрыБухгалтерии.ПутьКОбъекту = "РегистрБухгалтерии.*";
СтрокаРегистрыБухгалтерии.ОписаниеПрав = ПраваРегистраНакопленияИБухгалтерии();
СтрокаРегистрыБухгалтерии.Представление = НСтр("ru = 'Регистры бухгалтерии'");
СтрокаРегистрыБухгалтерии.ПредставлениеОбъекта = НСтр("ru = 'Регистр бухгалтерии'");
ДобавитьКомандыИПоля(СПолями, СтрокаРегистрыБухгалтерии, "Измерения, Ресурсы,
|Реквизиты, СтандартныеРеквизиты");
// Конфигурация.РегистрыРасчета
СтрокаРегистрыРасчета = СтрокаКонфигурация.Строки.Добавить();
СтрокаРегистрыРасчета.Имя = "РегистрыРасчета";
СтрокаРегистрыРасчета.Метаданные = Метаданные.РегистрыРасчета;
СтрокаРегистрыРасчета.ПутьКОбъекту = "РегистрРасчета.*";
СтрокаРегистрыРасчета.ОписаниеПрав = ПраваРегистраРасчета();
СтрокаРегистрыРасчета.Представление = НСтр("ru = 'Регистры расчета'");
СтрокаРегистрыРасчета.ПредставлениеОбъекта = НСтр("ru = 'Регистр расчета'");
ДобавитьКомандыИПоля(СПолями, СтрокаРегистрыРасчета, "Измерения, Ресурсы,
|Реквизиты, СтандартныеРеквизиты, Перерасчеты");
// Конфигурация.БизнесПроцессы
СтрокаБизнесПроцессы = СтрокаКонфигурация.Строки.Добавить();
СтрокаБизнесПроцессы.Имя = "БизнесПроцессы";
СтрокаБизнесПроцессы.Метаданные = Метаданные.БизнесПроцессы;
СтрокаБизнесПроцессы.ПутьКОбъекту = "БизнесПроцесс.*";
СтрокаБизнесПроцессы.ОписаниеПрав = ПраваБизнесПроцесса();
СтрокаБизнесПроцессы.Представление = НСтр("ru = 'Бизнес процессы'");
СтрокаБизнесПроцессы.ПредставлениеОбъекта = НСтр("ru = 'Бизнес процесс'");
ДобавитьКомандыИПоля(СПолями, СтрокаБизнесПроцессы);
// Конфигурация.Задачи
СтрокаЗадачи = СтрокаКонфигурация.Строки.Добавить();
СтрокаЗадачи.Имя = "Задачи";
СтрокаЗадачи.Метаданные = Метаданные.Задачи;
СтрокаЗадачи.ПутьКОбъекту = "Задача.*";
СтрокаЗадачи.ОписаниеПрав = ПраваЗадачи();
СтрокаЗадачи.Представление = НСтр("ru = 'Задачи'");
СтрокаЗадачи.ПредставлениеОбъекта = НСтр("ru = 'Задача'");
ДобавитьКомандыИПоля(СПолями, СтрокаЗадачи, "РеквизитыАдресации,
|Реквизиты, ТабличныеЧасти, СтандартныеРеквизиты");
// Конфигурация.ВнешниеИсточникиДанных
СтрокаВнешниеИсточникиДанных = СтрокаКонфигурация.Строки.Добавить();
СтрокаВнешниеИсточникиДанных.Имя = "ВнешниеИсточникиДанных";
СтрокаВнешниеИсточникиДанных.Метаданные = Метаданные.ВнешниеИсточникиДанных;
СтрокаВнешниеИсточникиДанных.ПутьКОбъекту = "ВнешнийИсточникДанных.*";
СтрокаВнешниеИсточникиДанных.ОписаниеПрав = ПраваВнешнегоИсточникаДанных();
СтрокаВнешниеИсточникиДанных.Представление = НСтр("ru = 'Внешние источники данных'");
СтрокаВнешниеИсточникиДанных.ПредставлениеОбъекта = НСтр("ru = 'Внешний источник данных'");
// Конфигурация.ВнешниеИсточникиДанных.Таблицы
СтрокаТаблицы = СтрокаВнешниеИсточникиДанных.Строки.Добавить();
СтрокаТаблицы.Имя = "Таблицы";
СтрокаТаблицы.ИмяВложений = "Таблицы";
СтрокаТаблицы.ПутьКОбъекту = "ВнешнийИсточникДанных.*.Таблица.*";
СтрокаТаблицы.ОписаниеПрав = ПраваТаблицыВнешнегоИсточникаДанных();
СтрокаТаблицы.Представление = НСтр("ru = 'Таблицы'");
СтрокаТаблицы.ПредставлениеОбъекта = НСтр("ru = 'Таблица'");
ДобавитьКомандыИПоля(СПолями, СтрокаТаблицы, "Поля");
// Конфигурация.ВнешниеИсточникиДанных.Кубы
СтрокаКуба = СтрокаВнешниеИсточникиДанных.Строки.Добавить();
СтрокаКуба.Имя = "Кубы";
СтрокаКуба.ИмяВложений = "Кубы";
СтрокаКуба.ПутьКОбъекту = "ВнешнийИсточникДанных.*.Куб.*";
СтрокаКуба.ОписаниеПрав = ПраваКубаИТаблицыИзмерений();
СтрокаКуба.Представление = НСтр("ru = 'Кубы'");
СтрокаКуба.ПредставлениеОбъекта = НСтр("ru = 'Куб'");
// Конфигурация.ВнешниеИсточникиДанных.Кубы.ТаблицыИзмерений
СтрокаТаблицыИзмерений = СтрокаКуба.Строки.Добавить();
СтрокаТаблицыИзмерений.Имя = "ТаблицыИзмерений";
СтрокаТаблицыИзмерений.ИмяВложений = "ТаблицыИзмерений";
СтрокаТаблицыИзмерений.ПутьКОбъекту = "ВнешнийИсточникДанных.*.Куб.*.ТаблицаИзмерения.*";
СтрокаТаблицыИзмерений.ОписаниеПрав = ПраваКубаИТаблицыИзмерений();
СтрокаТаблицыИзмерений.Представление = НСтр("ru = 'Таблицы измерений'");
СтрокаТаблицыИзмерений.ПредставлениеОбъекта = НСтр("ru = 'Таблица измерений'");
ДобавитьКомандыИПоля(СПолями, СтрокаТаблицыИзмерений, "Поля");
ДобавитьКомандыИПоля(СПолями, СтрокаКуба, "Измерения, Ресурсы", Истина);
// Конфигурация.ВнешниеИсточникиДанных.Функции
СтрокаФункции = СтрокаВнешниеИсточникиДанных.Строки.Добавить();
СтрокаФункции.Имя = "Функции";
СтрокаФункции.ИмяВложений = "Функции";
СтрокаФункции.ПутьКОбъекту = "ВнешнийИсточникДанных.*.Функция.*";
СтрокаФункции.ОписаниеПрав = ПраваОтчетаОбработкиФункции();
СтрокаФункции.Представление = НСтр("ru = 'Функции'");
СтрокаФункции.ПредставлениеОбъекта = НСтр("ru = 'Функция'");
Возврат Дерево;
КонецФункции
Процедура ДобавитьКомандыИПоля(СПолями, СтрокаДерева, Поля = "Реквизиты, ТабличныеЧасти, СтандартныеРеквизиты", БезРедактирования = Ложь)
СтруктураПолей = Новый Структура(Поля);
Если СПолями И СтруктураПолей.Свойство("Измерения") Тогда
// Измерения
СтрокаИзмерения = СтрокаДерева.Строки.Добавить();
СтрокаИзмерения.Имя = "Измерения";
СтрокаИзмерения.ИмяВложений = "Измерения";
СтрокаИзмерения.ПутьКОбъекту = СтрокаДерева.ПутьКОбъекту + ".Измерение.*";
СтрокаИзмерения.ОписаниеПрав = ПраваРеквизита(БезРедактирования);
СтрокаИзмерения.Представление = НСтр("ru = 'Измерения'");
СтрокаИзмерения.ПредставлениеОбъекта = НСтр("ru = 'Измерение'");
КонецЕсли;
Если СПолями И СтруктураПолей.Свойство("Ресурсы") Тогда
// Ресурсы
СтрокаРесурсы = СтрокаДерева.Строки.Добавить();
СтрокаРесурсы.Имя = "Ресурсы";
СтрокаРесурсы.ИмяВложений = "Ресурсы";
СтрокаРесурсы.ПутьКОбъекту = СтрокаДерева.ПутьКОбъекту + ".Ресурс.*";
СтрокаРесурсы.ОписаниеПрав = ПраваРеквизита(БезРедактирования);
СтрокаРесурсы.Представление = НСтр("ru = 'Ресурсы'");
СтрокаРесурсы.ПредставлениеОбъекта = НСтр("ru = 'Ресурс'");
КонецЕсли;
Если СПолями И СтруктураПолей.Свойство("РеквизитыАдресации") Тогда
// РеквизитыАдресации
СтрокаРеквизитыАдресации = СтрокаДерева.Строки.Добавить();
СтрокаРеквизитыАдресации.Имя = "РеквизитыАдресации";
СтрокаРеквизитыАдресации.ИмяВложений = "РеквизитыАдресации";
СтрокаРеквизитыАдресации.ПутьКОбъекту = СтрокаДерева.ПутьКОбъекту + ".РеквизитАдресации.*";
СтрокаРеквизитыАдресации.ОписаниеПрав = ПраваРеквизита(БезРедактирования);
СтрокаРеквизитыАдресации.Представление = НСтр("ru = 'Реквизиты адресации'");
СтрокаРеквизитыАдресации.ПредставлениеОбъекта = НСтр("ru = 'Реквизит адресации'");
КонецЕсли;
Если СПолями И СтруктураПолей.Свойство("Реквизиты") Тогда
// Реквизиты
СтрокаРеквизиты = СтрокаДерева.Строки.Добавить();
СтрокаРеквизиты.Имя = "Реквизиты";
СтрокаРеквизиты.ИмяВложений = "Реквизиты";
СтрокаРеквизиты.ПутьКОбъекту = СтрокаДерева.ПутьКОбъекту + ".Реквизит.*";
СтрокаРеквизиты.ОписаниеПрав = ПраваРеквизита(БезРедактирования);
СтрокаРеквизиты.Представление = НСтр("ru = 'Реквизиты'");
СтрокаРеквизиты.ПредставлениеОбъекта = НСтр("ru = 'Реквизит'");
КонецЕсли;
Если СПолями И СтруктураПолей.Свойство("Поля") Тогда
// Поля
СтрокаПоля = СтрокаДерева.Строки.Добавить();
СтрокаПоля.Имя = "Поля";
СтрокаПоля.ИмяВложений = "Поля";
СтрокаПоля.ПутьКОбъекту = СтрокаДерева.ПутьКОбъекту + ".Поле.*";
СтрокаПоля.ОписаниеПрав = ПраваРеквизита(БезРедактирования);
СтрокаПоля.Представление = НСтр("ru = 'Поля'");
СтрокаПоля.ПредставлениеОбъекта = НСтр("ru = 'Поле'");
КонецЕсли;
Если СПолями И СтруктураПолей.Свойство("ПризнакиУчета") Тогда
// ПризнакиУчета
СтрокаПризнакиУчета = СтрокаДерева.Строки.Добавить();
СтрокаПризнакиУчета.Имя = "ПризнакиУчета";
СтрокаПризнакиУчета.ИмяВложений = "ПризнакиУчета";
СтрокаПризнакиУчета.ПутьКОбъекту = СтрокаДерева.ПутьКОбъекту + ".ПризнакУчета.*";
СтрокаПризнакиУчета.ОписаниеПрав = ПраваРеквизита(БезРедактирования);
СтрокаПризнакиУчета.Представление = НСтр("ru = 'Признаки учета'");
СтрокаПризнакиУчета.ПредставлениеОбъекта = НСтр("ru = 'Признак учета'");
КонецЕсли;
Если СПолями И СтруктураПолей.Свойство("ПризнакиУчетаСубконто") Тогда
// ПризнакиУчетаСубконто
СтрокаПризнакиУчетаСубконто = СтрокаДерева.Строки.Добавить();
СтрокаПризнакиУчетаСубконто.Имя = "ПризнакиУчетаСубконто";
СтрокаПризнакиУчетаСубконто.ИмяВложений = "ПризнакиУчетаСубконто";
СтрокаПризнакиУчетаСубконто.ПутьКОбъекту = СтрокаДерева.ПутьКОбъекту + ".ПризнакУчетаСубконто.*";
СтрокаПризнакиУчетаСубконто.ОписаниеПрав = ПраваРеквизита(БезРедактирования);
СтрокаПризнакиУчетаСубконто.Представление = НСтр("ru = 'Признаки учета субконто'");
СтрокаПризнакиУчетаСубконто.ПредставлениеОбъекта = НСтр("ru = 'Признак учета субконто'");
КонецЕсли;
Если СПолями И СтруктураПолей.Свойство("ТабличныеЧасти") Тогда
// ТабличныеЧасти
СтрокаТабличныеЧасти = СтрокаДерева.Строки.Добавить();
СтрокаТабличныеЧасти.Имя = "ТабличныеЧасти";
СтрокаТабличныеЧасти.ИмяВложений = "ТабличныеЧасти";
СтрокаТабличныеЧасти.ПутьКОбъекту = СтрокаДерева.ПутьКОбъекту + ".ТабличнаяЧасть.*";
СтрокаТабличныеЧасти.ОписаниеПрав = ПраваРеквизита(БезРедактирования);
СтрокаТабличныеЧасти.Представление = НСтр("ru = 'Табличные части'");
СтрокаТабличныеЧасти.ПредставлениеОбъекта = НСтр("ru = 'Табличная часть'");
// ТабличныеЧасти.Реквизиты
СтрокаТабличныеЧастиРеквизиты = СтрокаТабличныеЧасти.Строки.Добавить();
СтрокаТабличныеЧастиРеквизиты.Имя = "Реквизиты";
СтрокаТабличныеЧастиРеквизиты.ИмяВложений = "Реквизиты";
СтрокаТабличныеЧастиРеквизиты.ПутьКОбъекту = СтрокаТабличныеЧасти.ПутьКОбъекту + ".Реквизит.*";
СтрокаТабличныеЧастиРеквизиты.ОписаниеПрав = ПраваРеквизита(БезРедактирования);
СтрокаТабличныеЧастиРеквизиты.Представление = НСтр("ru = 'Реквизиты'");
СтрокаТабличныеЧастиРеквизиты.ПредставлениеОбъекта = НСтр("ru = 'Реквизит'");
СтрокаТабличныеЧастиРеквизиты.БезГруппы = Истина;
КонецЕсли;
Если СПолями И СтруктураПолей.Свойство("СтандартныеРеквизиты") Тогда
// СтандартныеРеквизиты
СтрокаСтандартныеРеквизиты = СтрокаДерева.Строки.Добавить();
СтрокаСтандартныеРеквизиты.Имя = "СтандартныеРеквизиты";
СтрокаСтандартныеРеквизиты.ИмяВложений = "СтандартныеРеквизиты";
СтрокаСтандартныеРеквизиты.ПутьКОбъекту = СтрокаДерева.ПутьКОбъекту + ".СтандартныйРеквизит.*";
СтрокаСтандартныеРеквизиты.ОписаниеПрав = ПраваРеквизита(БезРедактирования);
СтрокаСтандартныеРеквизиты.Представление = НСтр("ru = 'Стандартные реквизиты'");
СтрокаСтандартныеРеквизиты.ПредставлениеОбъекта = НСтр("ru = 'Стандартный реквизит'");
КонецЕсли;
Если СПолями И СтруктураПолей.Свойство("СтандартныеТабличныеЧасти") Тогда
// СтандартныеТабличныеЧасти
СтрокаСтандартныеТабличныеЧасти = СтрокаДерева.Строки.Добавить();
СтрокаСтандартныеТабличныеЧасти.Имя = "СтандартныеТабличныеЧасти";
СтрокаСтандартныеТабличныеЧасти.ИмяВложений = "СтандартныеТабличныеЧасти";
СтрокаСтандартныеТабличныеЧасти.ПутьКОбъекту = СтрокаДерева.ПутьКОбъекту + ".СтандартнаяТабличнаяЧасть.*";
СтрокаСтандартныеТабличныеЧасти.ОписаниеПрав = ПраваРеквизита(БезРедактирования);
СтрокаСтандартныеТабличныеЧасти.Представление = НСтр("ru = 'Стандартные табличные части'");
СтрокаСтандартныеТабличныеЧасти.ПредставлениеОбъекта = НСтр("ru = 'Стандартная табличная часть'");
// СтандартныеТабличныеЧасти.СтандартныеРеквизиты
СтрокаСтандартныеТабличныеЧастиСтандартныеРеквизиты = СтрокаСтандартныеТабличныеЧасти.Строки.Добавить();
СтрокаСтандартныеТабличныеЧастиСтандартныеРеквизиты.Имя = "СтандартныеРеквизиты";
СтрокаСтандартныеТабличныеЧастиСтандартныеРеквизиты.ИмяВложений = "СтандартныеРеквизиты";
СтрокаСтандартныеТабличныеЧастиСтандартныеРеквизиты.ПутьКОбъекту = СтрокаСтандартныеТабличныеЧасти.ПутьКОбъекту + ".СтандартныйРеквизит.*";
СтрокаСтандартныеТабличныеЧастиСтандартныеРеквизиты.ОписаниеПрав = ПраваРеквизита(БезРедактирования);
СтрокаСтандартныеТабличныеЧастиСтандартныеРеквизиты.Представление = НСтр("ru = 'Стандартные реквизиты'");
СтрокаСтандартныеТабличныеЧастиСтандартныеРеквизиты.ПредставлениеОбъекта = НСтр("ru = 'Стандартный реквизит'");
СтрокаСтандартныеТабличныеЧастиСтандартныеРеквизиты.БезГруппы = Истина;
КонецЕсли;
Если СтруктураПолей.Свойство("Перерасчеты") Тогда
// Перерасчеты
СтрокаПерерасчеты = СтрокаДерева.Строки.Добавить();
СтрокаПерерасчеты.Имя = "Перерасчеты";
СтрокаПерерасчеты.ИмяВложений = "Перерасчеты";
СтрокаПерерасчеты.ПутьКОбъекту = СтрокаДерева.ПутьКОбъекту + ".Перерасчет.*";
СтрокаПерерасчеты.ОписаниеПрав = ПраваПоследовательностиИПерерасчета();
СтрокаПерерасчеты.Представление = НСтр("ru = 'Перерасчеты'");
СтрокаПерерасчеты.ПредставлениеОбъекта = НСтр("ru = 'Перерасчет'");
КонецЕсли;
// Команды
СтрокаКоманды = СтрокаДерева.Строки.Добавить();
СтрокаКоманды.Имя = "Команды";
СтрокаКоманды.ИмяВложений = "Команды";
СтрокаКоманды.ПутьКОбъекту = СтрокаДерева.ПутьКОбъекту + ".Команда.*";
СтрокаКоманды.ОписаниеПрав = ПравоПросмотр();
СтрокаКоманды.Представление = НСтр("ru = 'Команды'");
СтрокаКоманды.ПредставлениеОбъекта = НСтр("ru = 'Команда'");
КонецПроцедуры
// Возвращаемое значение:
// Структура:
// * СписокПрав - СписокЗначений
// * УровниДоступа - ТаблицаЗначений:
// ** Право - Строка
// ** ЭтоНаборПрав - Булево
// ** Уровень - Число
// ** ПравоСОграничением - Строка
//
Функция ОписаниеПрав()
УровниДоступа = Новый ТаблицаЗначений;
УровниДоступа.Колонки.Добавить("Право", ТипСтрока(1000));
УровниДоступа.Колонки.Добавить("ЭтоНаборПрав", Новый ОписаниеТипов("Булево"));
УровниДоступа.Колонки.Добавить("Уровень", ТипЧисло(2));
УровниДоступа.Колонки.Добавить("ПравоСОграничением", ТипСтрока(1000));
ОписаниеПрав = Новый Структура;
ОписаниеПрав.Вставить("СписокПрав", Новый СписокЗначений);
ОписаниеПрав.Вставить("УровниДоступа", УровниДоступа);
Возврат ОписаниеПрав;
КонецФункции
Функция ПраваКонфигурации()
ОписаниеПрав = ОписаниеПрав();
СписокПрав = ОписаниеПрав.СписокПрав;
СписокПрав.Добавить("Администрирование",
НСтр("ru = 'Администрирование'"));
СписокПрав.Добавить("АдминистрированиеДанных",
НСтр("ru = 'Администрирование данных'"));
СписокПрав.Добавить("ОбновлениеКонфигурацииБазыДанных",
НСтр("ru = 'Обновление конфигурации базы данных'"));
СписокПрав.Добавить("МонопольныйРежим",
НСтр("ru = 'Монопольный режим'"));
СписокПрав.Добавить("АктивныеПользователи",
НСтр("ru = 'Активные пользователи'"));
СписокПрав.Добавить("ЖурналРегистрации",
НСтр("ru = 'Журнал регистрации'"));
СписокПрав.Добавить("ТонкийКлиент",
НСтр("ru = 'Тонкий клиент'"));
СписокПрав.Добавить("ВебКлиент",
НСтр("ru = 'Веб-клиент'"));
СписокПрав.Добавить("МобильныйКлиент",
НСтр("ru = 'Мобильный клиент'"));
СписокПрав.Добавить("ТолстыйКлиент",
НСтр("ru = 'Толстый клиент'"));
СписокПрав.Добавить("ВнешнееСоединение",
НСтр("ru = 'Внешнее соединение'"));
СписокПрав.Добавить("Automation",
НСтр("ru = 'Automation'"));
СписокПрав.Добавить("РежимВсеФункции",
НСтр("ru = 'Режим ""Все функции""'"));
СписокПрав.Добавить("РегистрацияИнформационнойБазыСистемыВзаимодействия",
НСтр("ru = 'Регистрация системы взаимодействия'"));
СписокПрав.Добавить("РежимОсновногоОкнаОбычный",
НСтр("ru = 'Режим основного окна ""Обычный""'"));
СписокПрав.Добавить("РежимОсновногоОкнаРабочееМесто",
НСтр("ru = 'Режим основного окна ""Рабочее место""'"));
СписокПрав.Добавить("РежимОсновногоОкнаВстроенноеРабочееМесто",
НСтр("ru = 'Режим основного окна ""Встроенное рабочее место""'"));
СписокПрав.Добавить("РежимОсновногоОкнаПолноэкранноеРабочееМесто",
НСтр("ru = 'Режим основного окна ""Полноэкранное рабочее место""'"));
СписокПрав.Добавить("РежимОсновногоОкнаКиоск",
НСтр("ru = 'Режим основного окна ""Киоск""'"));
СписокПрав.Добавить("СохранениеДанныхПользователя",
НСтр("ru = 'Сохранение данных пользователя'"));
СписокПрав.Добавить("АдминистрированиеРасширенийКонфигурации",
НСтр("ru = 'Администрирование расширений конфигурации'"));
СписокПрав.Добавить("ИнтерактивноеОткрытиеВнешнихОбработок",
НСтр("ru = 'Интерактивное открытие внешних обработок'"));
СписокПрав.Добавить("ИнтерактивноеОткрытиеВнешнихОтчетов",
НСтр("ru = 'Интерактивное открытие внешних отчетов'"));
СписокПрав.Добавить("Вывод",
НСтр("ru = 'Вывод'"));
УровниДоступа = ОписаниеПрав.УровниДоступа;
Для Каждого ЭлементСписка Из СписокПрав Цикл
НоваяСтрока = УровниДоступа.Добавить();
НоваяСтрока.Право = ЭлементСписка.Значение;
НоваяСтрока.Уровень = 1;
КонецЦикла;
Возврат ОписаниеПрав;
КонецФункции
Функция ПравоПросмотр()
ОписаниеПрав = ОписаниеПрав();
СписокПрав = ОписаниеПрав.СписокПрав;
СписокПрав.Добавить("Просмотр",
НСтр("ru = 'Просмотр'"));
НоваяСтрока = ОписаниеПрав.УровниДоступа.Добавить();
НоваяСтрока.Право = "Просмотр";
НоваяСтрока.Уровень = 6;
Возврат ОписаниеПрав;
КонецФункции
Функция ПравоИспользование()
ОписаниеПрав = ОписаниеПрав();
СписокПрав = ОписаниеПрав.СписокПрав;
СписокПрав.Добавить("Использование",
НСтр("ru = 'Использование'"));
НоваяСтрока = ОписаниеПрав.УровниДоступа.Добавить();
НоваяСтрока.Право = "Использование";
НоваяСтрока.Уровень = 2;
Возврат ОписаниеПрав;
КонецФункции
Функция ПраваПараметраСеанса()
ОписаниеПрав = ОписаниеПрав();
СписокПрав = ОписаниеПрав.СписокПрав;
// @Access-right-1
СписокПрав.Добавить("Получение",
НСтр("ru = 'Получение'"));
// @Access-right-1
СписокПрав.Добавить("Установка",
НСтр("ru = 'Установка'"));
НоваяСтрока = ОписаниеПрав.УровниДоступа.Добавить();
НоваяСтрока.Право = "Получение" + "," + "Установка"; // @Access-right-1, @Access-right-3
НоваяСтрока.Уровень = 14;
НоваяСтрока.ЭтоНаборПрав = Истина;
НоваяСтрока = ОписаниеПрав.УровниДоступа.Добавить();
НоваяСтрока.Право = "Установка"; // @Access-right-1
НоваяСтрока.Уровень = 13;
НоваяСтрока = ОписаниеПрав.УровниДоступа.Добавить();
НоваяСтрока.Право = "Получение"; // @Access-right-1
НоваяСтрока.Уровень = 12;
Возврат ОписаниеПрав;
КонецФункции
Функция ПраваРеквизита(БезРедактирования = Ложь)
ОписаниеПрав = ОписаниеПрав();
СписокПрав = ОписаниеПрав.СписокПрав;
СписокПрав.Добавить("Просмотр",
НСтр("ru = 'Просмотр'"));
Если Не БезРедактирования Тогда
СписокПрав.Добавить("Редактирование",
НСтр("ru = 'Редактирование'"));
НоваяСтрока = ОписаниеПрав.УровниДоступа.Добавить();
НоваяСтрока.Право = "Редактирование";
НоваяСтрока.Уровень = 9;
КонецЕсли;
НоваяСтрока = ОписаниеПрав.УровниДоступа.Добавить();
НоваяСтрока.Право = "Просмотр";
НоваяСтрока.Уровень = 6;
Возврат ОписаниеПрав;
КонецФункции
Функция ПраваПланаОбмена()
ОписаниеПрав = ОписаниеПрав();
СписокПрав = ОписаниеПрав.СписокПрав;
ДобавитьПраваПрограммнойРаботыСОбъектами(СписокПрав);
ДобавитьПраваИнтерактивнойРаботыСОбъектами(СписокПрав);
СписокПрав.Добавить("ВводПоСтроке",
НСтр("ru = 'Ввод по строке'"));
ДобавитьПраваРаботыСИсторией(СписокПрав);
ЗаполнитьУровниДоступа(ОписаниеПрав);
Возврат ОписаниеПрав;
КонецФункции
Функция ПраваКонстанты()
ОписаниеПрав = ОписаниеПрав();
СписокПрав = ОписаниеПрав.СписокПрав;
ДобавитьПраваПрограммнойРаботыСОбъектами(СписокПрав, , Ложь, Ложь);
ДобавитьПраваИнтерактивнойРаботыСОбъектами(СписокПрав, , Ложь);
ДобавитьПраваРаботыСИсторией(СписокПрав, Ложь);
ЗаполнитьУровниДоступа(ОписаниеПрав, , Ложь, Ложь);
Возврат ОписаниеПрав;
КонецФункции
Функция ПраваСправочникаИПланов()
ОписаниеПрав = ОписаниеПрав();
СписокПрав = ОписаниеПрав.СписокПрав;
ДобавитьПраваПрограммнойРаботыСОбъектами(СписокПрав);
ДобавитьПраваИнтерактивнойРаботыСОбъектами(СписокПрав);
ДобавитьПраваРаботыСПредопределеннымиДанными(СписокПрав);
СписокПрав.Добавить("ВводПоСтроке",
НСтр("ru = 'Ввод по строке'"));
ДобавитьПраваРаботыСИсторией(СписокПрав);
ЗаполнитьУровниДоступа(ОписаниеПрав);
Возврат ОписаниеПрав;
КонецФункции
Функция ПраваПоследовательностиИПерерасчета()
ОписаниеПрав = ОписаниеПрав();
СписокПрав = ОписаниеПрав.СписокПрав;
ДобавитьПраваПрограммнойРаботыСОбъектами(СписокПрав,, Ложь);
НоваяСтрока = ОписаниеПрав.УровниДоступа.Добавить();
НоваяСтрока.Право = "Изменение";
НоваяСтрока.Уровень = 4;
НоваяСтрока.ПравоСОграничением = "Изменение";
НоваяСтрока = ОписаниеПрав.УровниДоступа.Добавить();
НоваяСтрока.Право = "Чтение";
НоваяСтрока.Уровень = 3;
НоваяСтрока.ПравоСОграничением = "Чтение";
Возврат ОписаниеПрав;
КонецФункции
Функция ПраваДокумента()
ОписаниеПрав = ОписаниеПрав();
СписокПрав = ОписаниеПрав.СписокПрав;
ДобавитьПраваПрограммнойРаботыСОбъектами(СписокПрав);
СписокПрав.Добавить("Проведение",
НСтр("ru = 'Проведение'"));
СписокПрав.Добавить("ОтменаПроведения",
НСтр("ru = 'Отмена проведения'"));
ДобавитьПраваИнтерактивнойРаботыСОбъектами(СписокПрав);
СписокПрав.Добавить("ИнтерактивноеПроведение",
НСтр("ru = 'Интерактивное проведение'"));
СписокПрав.Добавить("ИнтерактивноеПроведениеНеоперативное",
НСтр("ru = 'Интерактивное проведение неоперативное'"));
СписокПрав.Добавить("ИнтерактивнаяОтменаПроведения",
НСтр("ru = 'Интерактивная отмена проведения'"));
СписокПрав.Добавить("ИнтерактивноеИзменениеПроведенных",
НСтр("ru = 'Интерактивное изменение проведенных'"));
СписокПрав.Добавить("ВводПоСтроке",
НСтр("ru = 'Ввод по строке'"));
ДобавитьПраваРаботыСИсторией(СписокПрав);
ЗаполнитьУровниДоступа(ОписаниеПрав);
Возврат ОписаниеПрав;
КонецФункции
Функция ПраваЖурналаДокументов()
ОписаниеПрав = ОписаниеПрав();
СписокПрав = ОписаниеПрав.СписокПрав;
ДобавитьПраваПрограммнойРаботыСОбъектами(СписокПрав, Истина);
ДобавитьПраваИнтерактивнойРаботыСОбъектами(СписокПрав, Истина);
ЗаполнитьУровниДоступа(ОписаниеПрав, Истина);
Возврат ОписаниеПрав;
КонецФункции
Функция ПраваОтчетаОбработкиФункции()
ОписаниеПрав = ОписаниеПрав();
СписокПрав = ОписаниеПрав.СписокПрав;
СписокПрав.Добавить("Использование",
НСтр("ru = 'Использование'"));
СписокПрав.Добавить("Просмотр",
НСтр("ru = 'Просмотр'"));
НоваяСтрока = ОписаниеПрав.УровниДоступа.Добавить();
НоваяСтрока.Право = "Просмотр";
НоваяСтрока.Уровень = 6;
НоваяСтрока = ОписаниеПрав.УровниДоступа.Добавить();
НоваяСтрока.Право = "Использование";
НоваяСтрока.Уровень = 2;
Возврат ОписаниеПрав;
КонецФункции
Функция ПраваРегистраСведений()
ОписаниеПрав = ОписаниеПрав();
СписокПрав = ОписаниеПрав.СписокПрав;
ДобавитьПраваПрограммнойРаботыСОбъектами(СписокПрав,, Ложь);
ДобавитьПраваИнтерактивнойРаботыСОбъектами(СписокПрав,, Ложь);
СписокПрав.Добавить("УправлениеИтогами",
НСтр("ru = 'Управление итогами'"));
ДобавитьПраваРаботыСИсторией(СписокПрав);
ЗаполнитьУровниДоступа(ОписаниеПрав,, Ложь);
Возврат ОписаниеПрав;
КонецФункции
Функция ПраваРегистраНакопленияИБухгалтерии()
ОписаниеПрав = ОписаниеПрав();
СписокПрав = ОписаниеПрав.СписокПрав;
ДобавитьПраваПрограммнойРаботыСОбъектами(СписокПрав,, Ложь);
ДобавитьПраваИнтерактивнойРаботыСОбъектами(СписокПрав,, Ложь);
СписокПрав.Добавить("УправлениеИтогами",
НСтр("ru = 'Управление итогами'"));
ЗаполнитьУровниДоступа(ОписаниеПрав,, Ложь);
Возврат ОписаниеПрав;
КонецФункции
Функция ПраваРегистраРасчета()
ОписаниеПрав = ОписаниеПрав();
СписокПрав = ОписаниеПрав.СписокПрав;
ДобавитьПраваПрограммнойРаботыСОбъектами(СписокПрав,, Ложь);
ДобавитьПраваИнтерактивнойРаботыСОбъектами(СписокПрав,, Ложь);
ЗаполнитьУровниДоступа(ОписаниеПрав,, Ложь);
Возврат ОписаниеПрав;
КонецФункции
Функция ПраваБизнесПроцесса()
ОписаниеПрав = ОписаниеПрав();
СписокПрав = ОписаниеПрав.СписокПрав;
ДобавитьПраваПрограммнойРаботыСОбъектами(СписокПрав);
СписокПрав.Добавить("Старт",
НСтр("ru = 'Старт'"));
ДобавитьПраваИнтерактивнойРаботыСОбъектами(СписокПрав);
СписокПрав.Добавить("ИнтерактивныйСтарт",
НСтр("ru = 'Интерактивный старт'"));
СписокПрав.Добавить("ИнтерактивнаяАктивация",
НСтр("ru = 'Интерактивная активация'"));
СписокПрав.Добавить("ВводПоСтроке",
НСтр("ru = 'Ввод по строке'"));
ДобавитьПраваРаботыСИсторией(СписокПрав);
ЗаполнитьУровниДоступа(ОписаниеПрав);
Возврат ОписаниеПрав;
КонецФункции
Функция ПраваЗадачи()
ОписаниеПрав = ОписаниеПрав();
СписокПрав = ОписаниеПрав.СписокПрав;
ДобавитьПраваПрограммнойРаботыСОбъектами(СписокПрав);
// @Access-right-1
СписокПрав.Добавить("Выполнение",
НСтр("ru = 'Выполнение'"));
ДобавитьПраваИнтерактивнойРаботыСОбъектами(СписокПрав);
СписокПрав.Добавить("ИнтерактивноеВыполнение",
НСтр("ru = 'Интерактивный выполнение'"));
СписокПрав.Добавить("ИнтерактивнаяАктивация",
НСтр("ru = 'Интерактивная активация'"));
СписокПрав.Добавить("ВводПоСтроке",
НСтр("ru = 'Ввод по строке'"));
ДобавитьПраваРаботыСИсторией(СписокПрав);
ЗаполнитьУровниДоступа(ОписаниеПрав);
Возврат ОписаниеПрав;
КонецФункции
Функция ПраваВнешнегоИсточникаДанных()
ОписаниеПрав = ОписаниеПрав();
СписокПрав = ОписаниеПрав.СписокПрав;
// @Access-right-1
СписокПрав.Добавить("Использование",
НСтр("ru = 'Использование'"));
// @Access-right-1
СписокПрав.Добавить("Администрирование",
НСтр("ru = 'Администрирование'"));
СписокПрав.Добавить("ИзменениеСтандартнойАутентификации",
НСтр("ru = 'Изменение стандартной аутентификации текущего пользователя'"));
СписокПрав.Добавить("ИзменениеСтандартнойАутентификацииСеанса",
НСтр("ru = 'Изменение стандартной аутентификации сеанса'"));
СписокПрав.Добавить("ИзменениеАутентификацииОССеанса",
НСтр("ru = 'Изменение аутентификации операционной системы сеанса'"));
НоваяСтрока = ОписаниеПрав.УровниДоступа.Добавить();
НоваяСтрока.Право = "Использование" + "," + "Администрирование"; // @Access-right-1, @Access-right-3
НоваяСтрока.Уровень = 17;
НоваяСтрока.ЭтоНаборПрав = Истина;
НоваяСтрока = ОписаниеПрав.УровниДоступа.Добавить();
НоваяСтрока.Право = "Администрирование"; // @Access-right-1
НоваяСтрока.Уровень = 16;
НоваяСтрока = ОписаниеПрав.УровниДоступа.Добавить();
НоваяСтрока.Право = "Использование"; // @Access-right-1
НоваяСтрока.Уровень = 15;
НоваяСтрока = ОписаниеПрав.УровниДоступа.Добавить();
НоваяСтрока.Право = "ИзменениеСтандартнойАутентификации";
НоваяСтрока.Уровень = 1;
НоваяСтрока = ОписаниеПрав.УровниДоступа.Добавить();
НоваяСтрока.Право = "ИзменениеСтандартнойАутентификацииСеанса";
НоваяСтрока.Уровень = 1;
НоваяСтрока = ОписаниеПрав.УровниДоступа.Добавить();
НоваяСтрока.Право = "ИзменениеАутентификацииОССеанса";
НоваяСтрока.Уровень = 1;
Возврат ОписаниеПрав;
КонецФункции
Функция ПраваТаблицыВнешнегоИсточникаДанных()
ОписаниеПрав = ОписаниеПрав();
СписокПрав = ОписаниеПрав.СписокПрав;
ДобавитьПраваПрограммнойРаботыСОбъектами(СписокПрав);
ДобавитьПраваИнтерактивнойРаботыСОбъектами(СписокПрав,,, Ложь);
СписокПрав.Добавить("ВводПоСтроке",
НСтр("ru = 'Ввод по строке'"));
ЗаполнитьУровниДоступа(ОписаниеПрав);
Возврат ОписаниеПрав;
КонецФункции
Функция ПраваКубаИТаблицыИзмерений()
ОписаниеПрав = ОписаниеПрав();
СписокПрав = ОписаниеПрав.СписокПрав;
ДобавитьПраваПрограммнойРаботыСОбъектами(СписокПрав, Истина,, Ложь);
ДобавитьПраваИнтерактивнойРаботыСОбъектами(СписокПрав, Истина);
ЗаполнитьУровниДоступа(ОписаниеПрав, Истина,, Ложь);
Возврат ОписаниеПрав;
КонецФункции
Процедура ДобавитьПраваПрограммнойРаботыСОбъектами(СписокПрав, БезИзменения = Ложь, Ссылочные = Истина, СОграничением = Истина)
// @Access-right-1
СписокПрав.Добавить("Чтение",
НСтр("ru = 'Чтение'"), СОграничением);
Если БезИзменения Тогда
Возврат;
КонецЕсли;
// @Access-right-1
СписокПрав.Добавить("Изменение",
НСтр("ru = 'Изменение'"), СОграничением);
Если Не Ссылочные Тогда
Возврат;
КонецЕсли;
// @Access-right-1
СписокПрав.Добавить("Добавление",
НСтр("ru = 'Добавление'"), СОграничением);
// @Access-right-1
СписокПрав.Добавить("Удаление",
НСтр("ru = 'Удаление'"), СОграничением);
КонецПроцедуры
Процедура ДобавитьПраваИнтерактивнойРаботыСОбъектами(СписокПрав, БезИзменения = Ложь, Ссылочные = Истина, СПометкойУдаления = Истина)
// @Access-right-1
СписокПрав.Добавить("Просмотр",
НСтр("ru = 'Просмотр'"));
Если БезИзменения Тогда
Возврат;
КонецЕсли;
// @Access-right-1
СписокПрав.Добавить("Редактирование",
НСтр("ru = 'Редактирование'"));
Если Не Ссылочные Тогда
Возврат;
КонецЕсли;
СписокПрав.Добавить("ИнтерактивноеДобавление",
НСтр("ru = 'Интерактивное добавление'"));
СписокПрав.Добавить("ИнтерактивноеУдаление",
НСтр("ru = 'Интерактивное удаление'"));
Если Не СПометкойУдаления Тогда
Возврат;
КонецЕсли;
СписокПрав.Добавить("ИнтерактивнаяПометкаУдаления",
НСтр("ru = 'Интерактивная пометка на удаление'"));
СписокПрав.Добавить("ИнтерактивноеСнятиеПометкиУдаления",
НСтр("ru = 'Интерактивное снятие пометки удаления'"));
СписокПрав.Добавить("ИнтерактивноеУдалениеПомеченных",
НСтр("ru = 'Интерактивное удаление помеченных'"));
КонецПроцедуры
Процедура ДобавитьПраваРаботыСПредопределеннымиДанными(СписокПрав)
СписокПрав.Добавить("ИнтерактивноеУдалениеПредопределенныхДанных",
НСтр("ru = 'Интерактивное удаление предопределенных'"));
СписокПрав.Добавить("ИнтерактивнаяПометкаУдаленияПредопределенныхДанных",
НСтр("ru = 'Интерактивная пометка на удаление предопределенных'"));
СписокПрав.Добавить("ИнтерактивноеСнятиеПометкиУдаленияПредопределенныхДанных",
НСтр("ru = 'Интерактивное снятие пометки удаления предопределенных'"));
СписокПрав.Добавить("ИнтерактивноеУдалениеПомеченныхПредопределенныхДанных",
НСтр("ru = 'Интерактивное удаление помеченных предопределенных'"));
КонецПроцедуры
Процедура ДобавитьПраваРаботыСИсторией(СписокПрав, ПраваНаОтсутствующиеДанные = Истина)
СписокПрав.Добавить("ЧтениеИсторииДанных",
НСтр("ru = 'Чтение истории данных'"));
Если ПраваНаОтсутствующиеДанные Тогда
СписокПрав.Добавить("ЧтениеИсторииДанныхОтсутствующихДанных",
НСтр("ru = 'Чтение истории данных отсутствующих данных'"));
КонецЕсли;
СписокПрав.Добавить("ИзменениеИсторииДанных",
НСтр("ru = 'Изменение истории данных'"));
Если ПраваНаОтсутствующиеДанные Тогда
СписокПрав.Добавить("ИзменениеИсторииДанныхОтсутствующихДанных",
НСтр("ru = 'Изменение истории данных отсутствующих данных'"));
КонецЕсли;
СписокПрав.Добавить("ИзменениеНастроекИсторииДанных",
НСтр("ru = 'Изменение настроек истории данных'"));
СписокПрав.Добавить("ИзменениеКомментарияВерсииИсторииДанных",
НСтр("ru = 'Изменение комментария версии истории данных'"));
СписокПрав.Добавить("ПросмотрИсторииДанных",
НСтр("ru = 'Просмотр истории данных'"));
СписокПрав.Добавить("РедактированиеКомментарияВерсииИсторииДанных",
НСтр("ru = 'Редактирование комментария версии истории данных'"));
СписокПрав.Добавить("ПереходНаВерсиюИсторииДанных",
НСтр("ru = 'Переход на версию истории данных'"));
КонецПроцедуры
Процедура ЗаполнитьУровниДоступа(ОписаниеПрав, БезИзменения = Ложь, Ссылочный = Истина, СОграничением = Истина)
УровниДоступа = ОписаниеПрав.УровниДоступа;
Если Ссылочный И Не БезИзменения Тогда
НоваяСтрока = УровниДоступа.Добавить();
НоваяСтрока.Право = "ИнтерактивноеДобавление"; // @Access-right-1
НоваяСтрока.Уровень = 11;
Если СОграничением Тогда
НоваяСтрока.ПравоСОграничением = "Добавление"; // @Access-right-1
КонецЕсли;
НоваяСтрока = УровниДоступа.Добавить();
НоваяСтрока.Право = "Редактирование" + "," + "Добавление"; // @Access-right-1, @Access-right-3
НоваяСтрока.Уровень = 10;
НоваяСтрока.ЭтоНаборПрав = Истина;
Если СОграничением Тогда
НоваяСтрока.ПравоСОграничением = "Добавление"; // @Access-right-1
КонецЕсли;
КонецЕсли;
Если Не БезИзменения Тогда
НоваяСтрока = УровниДоступа.Добавить();
НоваяСтрока.Право = "Редактирование"; // @Access-right-1
НоваяСтрока.Уровень = 9;
Если СОграничением Тогда
НоваяСтрока.ПравоСОграничением = "Изменение"; // @Access-right-1
КонецЕсли;
Если Ссылочный Тогда
НоваяСтрока = УровниДоступа.Добавить();
НоваяСтрока.Право = "Просмотр" + "," + "Добавление"; // @Access-right-1, @Access-right-3
НоваяСтрока.Уровень = 8;
НоваяСтрока.ЭтоНаборПрав = Истина;
Если СОграничением Тогда
НоваяСтрока.ПравоСОграничением = "Добавление"; // @Access-right-1
КонецЕсли;
КонецЕсли;
НоваяСтрока = УровниДоступа.Добавить();
НоваяСтрока.Право = "Просмотр" + "," + "Изменение"; // @Access-right-1, @Access-right-3
НоваяСтрока.Уровень = 7;
НоваяСтрока.ЭтоНаборПрав = Истина;
Если СОграничением Тогда
НоваяСтрока.ПравоСОграничением = "Изменение"; // @Access-right-1
КонецЕсли;
КонецЕсли;
НоваяСтрока = УровниДоступа.Добавить();
НоваяСтрока.Право = "Просмотр"; // @Access-right-1
НоваяСтрока.Уровень = 6;
Если СОграничением Тогда
НоваяСтрока.ПравоСОграничением = "Чтение"; // @Access-right-1
КонецЕсли;
Если Ссылочный И Не БезИзменения Тогда
НоваяСтрока = УровниДоступа.Добавить();
НоваяСтрока.Право = "Добавление"; // @Access-right-1
НоваяСтрока.Уровень = 5;
Если СОграничением Тогда
НоваяСтрока.ПравоСОграничением = "Добавление"; // @Access-right-1
КонецЕсли;
КонецЕсли;
Если Не БезИзменения Тогда
НоваяСтрока = УровниДоступа.Добавить();
НоваяСтрока.Право = "Изменение"; // @Access-right-1
НоваяСтрока.Уровень = 4;
Если СОграничением Тогда
НоваяСтрока.ПравоСОграничением = "Изменение"; // @Access-right-1
КонецЕсли;
КонецЕсли;
НоваяСтрока = УровниДоступа.Добавить();
НоваяСтрока.Право = "Чтение"; // @Access-right-1
НоваяСтрока.Уровень = 3;
Если СОграничением Тогда
НоваяСтрока.ПравоСОграничением = "Чтение"; // @Access-right-1
КонецЕсли;
КонецПроцедуры
Функция Картинки()
Картинки = Новый СписокЗначений;
Картинки.Добавить(""); // Без картинки.
Картинки.Добавить("Конфигурация",,, БиблиотекаКартинок.МетаданныеКонфигурация);
Картинки.Добавить("Общие",,, БиблиотекаКартинок.МетаданныеОбщие);
Картинки.Добавить("Подсистемы",,, БиблиотекаКартинок.МетаданныеПодсистемы);
Картинки.Добавить("ПараметрыСеанса",,, БиблиотекаКартинок.МетаданныеПараметрыСеанса);
Картинки.Добавить("ОбщиеРеквизиты",,, БиблиотекаКартинок.МетаданныеОбщиеРеквизиты);
Картинки.Добавить("ПланыОбмена",,, БиблиотекаКартинок.МетаданныеПланыОбмена);
Картинки.Добавить("Реквизиты",,, БиблиотекаКартинок.МетаданныеРеквизиты);
Картинки.Добавить("ТабличныеЧасти",,, БиблиотекаКартинок.МетаданныеТабличныеЧасти);
Картинки.Добавить("СтандартныеРеквизиты",,, БиблиотекаКартинок.МетаданныеСтандартныеРеквизиты);
Картинки.Добавить("Команды",,, БиблиотекаКартинок.МетаданныеКоманды);
Картинки.Добавить("КритерииОтбора",,, БиблиотекаКартинок.МетаданныеКритерииОтбора);
Картинки.Добавить("ОбщиеФормы",,, БиблиотекаКартинок.МетаданныеОбщиеФормы);
Картинки.Добавить("ОбщиеКоманды",,, БиблиотекаКартинок.МетаданныеОбщиеКоманды);
Картинки.Добавить("WebСервисы",,, БиблиотекаКартинок.МетаданныеWebСервисы);
Картинки.Добавить("Операции",,, БиблиотекаКартинок.МетаданныеWebСервисыОперации);
Картинки.Добавить("HTTPСервисы",,, БиблиотекаКартинок.МетаданныеHTTPСервисы);
Картинки.Добавить("ШаблоныURL",,, БиблиотекаКартинок.МетаданныеHTTPСервисыШаблоныURL);
Картинки.Добавить("Методы",,, БиблиотекаКартинок.МетаданныеHTTPСервисыШаблоныURLМетоды);
Картинки.Добавить("Константы",,, БиблиотекаКартинок.МетаданныеКонстанты);
Картинки.Добавить("Справочники",,, БиблиотекаКартинок.МетаданныеСправочники);
Картинки.Добавить("Документы",,, БиблиотекаКартинок.МетаданныеДокументы);
Картинки.Добавить("Последовательности",,, БиблиотекаКартинок.МетаданныеПоследовательности);
Картинки.Добавить("ЖурналыДокументов",,, БиблиотекаКартинок.МетаданныеЖурналыДокументов);
Картинки.Добавить("Перечисления",,, БиблиотекаКартинок.МетаданныеПеречисления);
Картинки.Добавить("Отчеты",,, БиблиотекаКартинок.МетаданныеОтчеты);
Картинки.Добавить("Обработки",,, БиблиотекаКартинок.МетаданныеОбработки);
Картинки.Добавить("ПланыВидовХарактеристик",,, БиблиотекаКартинок.МетаданныеПланыВидовХарактеристик);
Картинки.Добавить("ПланыСчетов",,, БиблиотекаКартинок.МетаданныеПланыСчетов);
Картинки.Добавить("ПризнакиУчета",,, БиблиотекаКартинок.МетаданныеПризнакиУчета);
Картинки.Добавить("ПризнакиУчетаСубконто",,, БиблиотекаКартинок.МетаданныеПризнакиУчетаСубконто);
Картинки.Добавить("СтандартныеТабличныеЧасти",,, БиблиотекаКартинок.МетаданныеСтандартныеТабличныеЧасти);
Картинки.Добавить("ПланыВидовРасчета",,, БиблиотекаКартинок.МетаданныеПланыВидовРасчета);
Картинки.Добавить("РегистрыСведений",,, БиблиотекаКартинок.МетаданныеРегистрыСведений);
Картинки.Добавить("Измерения",,, БиблиотекаКартинок.МетаданныеИзмерения);
Картинки.Добавить("Ресурсы",,, БиблиотекаКартинок.МетаданныеРесурсы);
Картинки.Добавить("РегистрыНакопления",,, БиблиотекаКартинок.МетаданныеРегистрыНакопления);
Картинки.Добавить("РегистрыБухгалтерии",,, БиблиотекаКартинок.МетаданныеРегистрыБухгалтерии);
Картинки.Добавить("РегистрыРасчета",,, БиблиотекаКартинок.МетаданныеРегистрыРасчета);
Картинки.Добавить("Перерасчеты",,, БиблиотекаКартинок.МетаданныеПерерасчеты);
Картинки.Добавить("БизнесПроцессы",,, БиблиотекаКартинок.МетаданныеБизнесПроцессы);
Картинки.Добавить("Задачи",,, БиблиотекаКартинок.МетаданныеЗадачи);
Картинки.Добавить("РеквизитыАдресации",,, БиблиотекаКартинок.МетаданныеРеквизитыАдресации);
Картинки.Добавить("ВнешниеИсточникиДанных",,, БиблиотекаКартинок.МетаданныеВнешниеИсточникиДанных);
Картинки.Добавить("Таблицы",,, БиблиотекаКартинок.МетаданныеВнешниеИсточникиТаблицы);
Картинки.Добавить("Поля",,, БиблиотекаКартинок.МетаданныеРеквизиты);
Картинки.Добавить("Кубы",,, БиблиотекаКартинок.МетаданныеВнешниеИсточникиКубы);
Картинки.Добавить("ТаблицыИзмерений",,, БиблиотекаКартинок.МетаданныеВнешниеИсточникиТаблицыИзмерений);
Картинки.Добавить("Функции",,, БиблиотекаКартинок.МетаданныеВнешниеИсточникиФункции);
Возврат Картинки;
КонецФункции
Функция ИндексКартинки(Контекст, Имя)
ЭлементСписка = Контекст.Картинки.НайтиПоЗначению(Имя);
Если ЭлементСписка = Неопределено Тогда
Возврат 0;
КонецЕсли;
Возврат Контекст.Картинки.Индекс(ЭлементСписка);
КонецФункции
#КонецОбласти
#Иначе
ВызватьИсключение НСтр("ru = 'Недопустимый вызов объекта на клиенте.'");
#КонецЕсли