Файл: Разработка регламента выполнения процесса «Управление документооборотом» (1 Построение бизнес-процессов «как есть»).pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 28.06.2023

Просмотров: 358

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Объект.Удалить();

КонецЦикла;

// Удаление всех прав регистров

Выборка = Справочники.ДескрипторыДоступаРегистров.Выбрать();

Пока Выборка.Следующий() Цикл

Объект = Выборка.ПолучитьОбъект();

Объект.Удалить();

КонецЦикла;

ЗафиксироватьТранзакцию();

КонецПроцедуры

// Обновляет сведения о правах доступа всех данных информационной базы.

Процедура ОбновитьПраваВсехДанных() Экспорт

УстановитьПривилегированныйРежим(Истина);

ВремяНачала = ТекущаяДата();

// Пересчет прав всех объектов

ТипыВладельцев = Метаданные.ПодпискиНаСобытия.ДокументооборотПраваДоступаПриЗаписиОбъектаДоступа.Источник.Типы();

Для Каждого Тип Из ТипыВладельцев Цикл

ИмяСправочника = Метаданные.НайтиПоТипу(Тип).ПолноеИмя();

ОпределитьПраваПоИмениОбъекта(ИмяСправочника);

КонецЦикла;

// Пересчет прав всех файлов

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ РАЗЛИЧНЫЕ

| Файлы.ВладелецФайла

|ИЗ

| Справочник.Файлы КАК Файлы";

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

ОпределитьДескрипторДоступаФайлаПоВладельцу(Выборка.ВладелецФайла);

КонецЦикла;

// Пересчет прав всех регистров

ТипыВладельцев = Метаданные.ПодпискиНаСобытия.ДокументооборотПраваДоступаПередЗаписьюНабораЗаписей.Источник.Типы();

Для Каждого Тип Из ТипыВладельцев Цикл

МетаданныеРегистра = Метаданные.НайтиПоТипу(Тип);

ПолноеИмя = МетаданныеРегистра.ПолноеИмя();

ОпределитьПраваПоИмениРегистра(ПолноеИмя)

КонецЦикла;

КонецПроцедуры

// Определяет права доступа для всех объектов указанной таблицы

// Если права для этого объекта уже определены, то ничего не делает

Процедура ОпределитьПраваПоИмениОбъекта(Таблица) Экспорт

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Данные.Ссылка

|ИЗ

| [Таблица] КАК Данные";

Запрос.Текст = СтрЗаменить(Запрос.Текст, "[Таблица]", Таблица);

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

ДокументооборотПраваДоступа.ОпределитьДескрипторДоступаОбъекта(Выборка.Ссылка);

КонецЦикла;

КонецПроцедуры

// Определяет права доступа для всех записей указанного регистра

// Если права для записей этого регситра уже определены, то ничего не делает

Процедура ОпределитьПраваПоИмениРегистра(ПолноеИмя) Экспорт

МенеджерРегистра = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ПолноеИмя);

МетаданныеРегистра = Метаданные.НайтиПоПолномуИмени(ПолноеИмя);


ПодчиненРегистратору = Ложь;

Если Метаданные.РегистрыНакопления.Содержит(МетаданныеРегистра) Тогда

ПодчиненРегистратору = Истина;

КонецЕсли;

Если Метаданные.РегистрыСведений.Содержит(МетаданныеРегистра) Тогда

Если МетаданныеРегистра.РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.ПодчинениеРегистратору Тогда

ПодчиненРегистратору = Истина;

КонецЕсли;

КонецЕсли;

Если ПодчиненРегистратору Тогда

// Пересчет прав всех записей по уникальным регистраторам

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ Регистр.Регистратор";

Запрос.Текст = Запрос.Текст +

"

|ИЗ

| %1 КАК Регистр";

Запрос.Текст = СтрЗаменить(Запрос.Текст, "%1", ПолноеИмя);

Выборка = Запрос.Выполнить().Выбрать();

// Обход результатов запроса

Пока Выборка.Следующий() Цикл

// Чтение набора записей с отбором по регистратору

НаборЗаписей = МенеджерРегистра.СоздатьНаборЗаписей();

НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор);

НаборЗаписей.Прочитать();

// Определение дескриптора для набора записей

ДокументооборотПраваДоступа.ОпределитьДескрипторДоступаНабораЗаписей(НаборЗаписей);

КонецЦикла;

Иначе

СведенияОПолях = Новый Структура("ОбъектДоступа1, ОбъектДоступа2, ОбъектДоступа3");

МенеджерРегистра.ЗаполнитьСведенияОПоляхДоступа(СведенияОПолях);

// Пересчет прав всех уникальных записей всех регистров

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ ";

// Добавление к запросу правообразующих полей

Запрос.Текст = Запрос.Текст +

"Регистр." + СведенияОПолях.ОбъектДоступа1;

Если СведенияОПолях.ОбъектДоступа2 <> Неопределено Тогда

Запрос.Текст = Запрос.Текст + ", Регистр." + СведенияОПолях.ОбъектДоступа2;

КонецЕсли;

Если СведенияОПолях.ОбъектДоступа3 <> Неопределено Тогда

Запрос.Текст = Запрос.Текст + ", Регистр." + СведенияОПолях.ОбъектДоступа3;

КонецЕсли;

// Добавление к запросу всех измерений регистра

Для каждого Измерение Из МетаданныеРегистра.Измерения Цикл

Если Измерение.Имя <> СведенияОПолях.ОбъектДоступа1

И Измерение.Имя <> СведенияОПолях.ОбъектДоступа2

И Измерение.Имя <> СведенияОПолях.ОбъектДоступа2 Тогда

Запрос.Текст = Запрос.Текст + ", Регистр." + Измерение.Имя;

КонецЕсли;

КонецЦикла;

Запрос.Текст = Запрос.Текст +

"

|ИЗ

| %1 КАК Регистр";

Запрос.Текст = СтрЗаменить(Запрос.Текст, "%1", ПолноеИмя);

Выборка = Запрос.Выполнить().Выбрать();


// Обход результатов запроса

Пока Выборка.Следующий() Цикл

// Чтение набора записей

НаборЗаписей = МенеджерРегистра.СоздатьНаборЗаписей();

Для каждого Измерение Из МетаданныеРегистра.Измерения Цикл

НаборЗаписей.Отбор[Измерение.Имя].Установить(Выборка[Измерение.Имя]);

КонецЦикла;

НаборЗаписей.Прочитать();

// Определение дескриптора для набора записей

ДокументооборотПраваДоступа.ОпределитьДескрипторДоступаНабораЗаписей(НаборЗаписей);

КонецЦикла;

КонецЕсли;

КонецПроцедуры

// Возвращает Истина если у указанного пользователя есть указанная роль

// Если пользователь не указан, то используется текущий пользователь

Функция ЕстьРоль(Роль, Объект = Неопределено, Пользователь = Неопределено) Экспорт

Если УправлениеДоступом.ЭтоПолноправныйПользователь(Пользователь) Тогда

Возврат Истина;

КонецЕсли;

// Проверка, что роль назначается пользователю через группу доступа по профилю.

УстановитьПривилегированныйРежим(Истина);

Если Пользователь = Неопределено Тогда

Пользователь = ОбщегоНазначения.ТекущийПользователь();

КонецЕсли;

ОбъектМетаданныхРоль = Метаданные.Роли.Найти(Роль);

ИдентификаторРоли = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданныхРоль);

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ДокументооборотПользователиГруппДоступа.ГруппаДоступа

|ИЗ

| РегистрСведений.ДокументооборотПользователиГруппДоступа КАК ДокументооборотПользователиГруппДоступа

| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли

| ПО ДокументооборотПользователиГруппДоступа.ГруппаДоступа.Профиль = ПрофилиГруппДоступаРоли.Ссылка

|ГДЕ

| ДокументооборотПользователиГруппДоступа.Пользователь = &Пользователь

| И ПрофилиГруппДоступаРоли.Роль = &Роль";

Запрос.УстановитьПараметр("Пользователь", Пользователь);

Запрос.УстановитьПараметр("Роль", ИдентификаторРоли);

Результат = Запрос.Выполнить();

ЕстьРоль = Не Результат.Пустой();

// Проверка значений доступа

Если ЕстьРоль И Объект <> Неопределено Тогда

ЕстьРоль = Ложь;

ДескрипторОбъекта = ПолучитьДескрипторДоступа(Объект);

Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл

ЕстьРоль = Справочники.ДескрипторыДоступаОбъектов.ДоступПоЗначениямРазрешен(

ДескрипторОбъекта, Выборка.ГруппаДоступа);

Если ЕстьРоль Тогда

Прервать;

КонецЕсли;


КонецЦикла;

КонецЕсли;

Возврат ЕстьРоль;

КонецФункции

// Вызывается рекурсивно

Процедура ОбновитьПраваОбъектовЗависящихОтГруппыПользователей(ГруппаПользователей, Немедленно = Неопределено) Экспорт

УстановитьПривилегированныйРежим(Истина);

// Рекурсивный вызов обновления для родительской группы пользователей

Если ЗначениеЗаполнено(ГруппаПользователей.Родитель) Тогда

ОбновитьПраваОбъектовЗависящихОтГруппыПользователей(ГруппаПользователей.Родитель, Немедленно);

КонецЕсли;

// Проверка на отложенное обновление прав доступа

Если ДокументооборотПраваДоступаПовтИсп.ОтложенноеОбновлениеПравДоступа()

И Немедленно <> Истина Тогда

// Добавление в очередь

РегистрыСведений.ОчередьОбновленияПравДоступа.Добавить(ГруппаПользователей);

Возврат;

КонецЕсли;

// Группы доступа

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ГруппыДоступаПользователи.Ссылка

|ИЗ

| Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи

|ГДЕ

| ГруппыДоступаПользователи.Пользователь = &Пользователь";

Запрос.УстановитьПараметр("Пользователь", ГруппаПользователей.Ссылка);

Результат = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = Результат.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

ОбновитьПраваЗависящиеОтГруппыДоступа(ВыборкаДетальныеЗаписи.Ссылка);

КонецЦикла;

// РегистрСведений НастройкиПравОбъектов

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| НастройкиПравОбъектов.Объект

|ИЗ

| РегистрСведений.НастройкиПравОбъектов КАК НастройкиПравОбъектов

|ГДЕ

| НастройкиПравОбъектов.Пользователь = &Пользователь";

Запрос.УстановитьПараметр("Пользователь", ГруппаПользователей.Ссылка);

Результат = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = Результат.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

ОбновитьПраваПапки(ВыборкаДетальныеЗаписи.Объект);

КонецЦикла;

// Табличная часть "РабочаяГруппа" у дескриптора доступа объекта

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ДескрипторыДоступаОбъектовРабочаяГруппа.Ссылка

|ИЗ

| Справочник.ДескрипторыДоступаОбъектов.РабочаяГруппа КАК ДескрипторыДоступаОбъектовРабочаяГруппа

|ГДЕ

| ДескрипторыДоступаОбъектовРабочаяГруппа.Участник = &ГруппаПользователей";

Запрос.УстановитьПараметр("ГруппаПользователей", ГруппаПользователей.Ссылка);

Результат = Запрос.Выполнить();


ВыборкаДетальныеЗаписи = Результат.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

Справочники.ДескрипторыДоступаОбъектов.ОбновитьПрава(ВыборкаДетальныеЗаписи.Ссылка);

КонецЦикла;

// Табличная часть "Пользователи" у дескриптора доступа объекта

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ДескрипторыДоступаОбъектовПользователи.Ссылка

|ИЗ

| Справочник.ДескрипторыДоступаОбъектов.Пользователи КАК ДескрипторыДоступаОбъектовПользователи

|ГДЕ

| ДескрипторыДоступаОбъектовПользователи.Пользователь = &ГруппаПользователей";

Запрос.УстановитьПараметр("ГруппаПользователей", ГруппаПользователей.Ссылка);

Результат = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = Результат.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

Справочники.ДескрипторыДоступаОбъектов.ОбновитьПрава(ВыборкаДетальныеЗаписи.Ссылка);

КонецЦикла;

// Если изменена группа ВсеПользователи, то выполняется обновление всех дескрипторов

// для элементов справочников, которые являются группами. Т.к. доступ к группам имеют

// все пользователи без ограничений

Если ГруппаПользователей = Справочники.ГруппыПользователей.ВсеПользователи Тогда

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ДескрипторыДоступаОбъектов.Ссылка

|ИЗ

| Справочник.ДескрипторыДоступаОбъектов КАК ДескрипторыДоступаОбъектов

|ГДЕ

| ДескрипторыДоступаОбъектов.Группа = Истина";

Результат = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = Результат.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

Справочники.ДескрипторыДоступаОбъектов.ОбновитьПрава(ВыборкаДетальныеЗаписи.Ссылка);

КонецЦикла;

КонецЕсли;

КонецПроцедуры

// Обновляет права, зависящие от указанного подразделения

// - для руководителя подразделения

// - для входящих в подразделение пользователей

// - для родительских и подчиненных подразделений

Процедура ОбновитьПраваПоПодразделению(Подразделение, Немедленно = Неопределено) Экспорт

УстановитьПривилегированныйРежим(Истина);

// Если не установлена передача руководителям доступа подчиненных

// то тогда при изменении подразделений обновление прав выполнять

// не требуется

Если Константы.ДобавлятьРуководителямДоступПодчиненных.Получить() Тогда

Если ДокументооборотПраваДоступаПовтИсп.ОтложенноеОбновлениеПравДоступа()

И Немедленно <> Истина Тогда

РегистрыСведений.ОчередьОбновленияПравДоступа.Добавить(Подразделение);