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

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

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

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

Добавлен: 28.06.2023

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

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

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

Иначе

ОбновитьПраваПоПодчиненнымПодразделениям(Подразделение);

КонецЕсли;

КонецЕсли;

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

// Находит все объекты, которые используют указанный дескриптор

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

// от этих объектов

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

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

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

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

"ВЫБРАТЬ

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

|ИЗ

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

|ГДЕ

| ДескрипторыДоступаДляОбъектов.Дескриптор = &Дескриптор";

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

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

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

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

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

КонецЦикла;

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

// Обновляет все дескрипторы прав доступа, в правах которых встречается

// указанный пользователь

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

Если Не Немедленно Тогда

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

Иначе

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

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

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

"ВЫБРАТЬ

| ПраваПоДескрипторамДоступа.Дескриптор

|ИЗ

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

|ГДЕ

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

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

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

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

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

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

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

КонецЦикла;

КонецЕсли;

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

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

// пометки на удаление или установки признака "Недействителен"

Процедура ВосстановитьПраваПользователя(Пользователь, Немедленно = Ложь) Экспорт

// По группе доступа

Запрос = Новый Запрос("ВЫБРАТЬ

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

|ИЗ

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


|ГДЕ

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

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

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

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

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

КонецЦикла;

// По группе пользователей

Запрос = Новый Запрос("ВЫБРАТЬ

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

|ИЗ

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

|ГДЕ

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

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

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

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

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

КонецЦикла;

// По рабочей группе дескриптора

Запрос = Новый Запрос("ВЫБРАТЬ

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

|ИЗ

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

|ГДЕ

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

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

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

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

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

КонецЦикла;

// По пользователям дескриптора

Запрос = Новый Запрос("ВЫБРАТЬ

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

|ИЗ

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

|ГДЕ

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

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

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

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

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

КонецЦикла;

// По роли исполнителя в дескрипторе

Запрос = Новый Запрос("ВЫБРАТЬ

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

|ИЗ

| РегистрСведений.ИсполнителиЗадач КАК ИсполнителиЗадач

| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ДескрипторыДоступаОбъектов.Пользователи КАК ДескрипторыДоступаОбъектовПользователи

| ПО ИсполнителиЗадач.РольИсполнителя = ДескрипторыДоступаОбъектовПользователи.Пользователь

| И ИсполнителиЗадач.ОсновнойОбъектАдресации = ДескрипторыДоступаОбъектовПользователи.ОсновнойОбъектАдресации


| И ИсполнителиЗадач.ДополнительныйОбъектАдресации = ДескрипторыДоступаОбъектовПользователи.ДополнительныйОбъектАдресации

|ГДЕ

| ИсполнителиЗадач.Исполнитель = &Пользователь

|

|ОБЪЕДИНИТЬ ВСЕ

|

|ВЫБРАТЬ

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

|ИЗ

| РегистрСведений.ИсполнителиЗадач КАК ИсполнителиЗадач

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

| ПО ИсполнителиЗадач.ОсновнойОбъектАдресации = ДескрипторыДоступаОбъектовРабочаяГруппа.ОсновнойОбъектАдресации

| И ИсполнителиЗадач.ДополнительныйОбъектАдресации = ДескрипторыДоступаОбъектовРабочаяГруппа.ДополнительныйОбъектАдресации

|ГДЕ

| ИсполнителиЗадач.Исполнитель = &Пользователь");

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

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

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

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

КонецЦикла;

// Права папок

Запрос = Новый Запрос("ВЫБРАТЬ РАЗЛИЧНЫЕ

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

|ИЗ

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

|ГДЕ

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

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

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

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

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

КонецЦикла;

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

// Заполняет ТЧ дескриптора НастройкаПрав по настройкам папки

Процедура ЗаполнитьНастройкиДескриптора(ДескрипторДоступа, Папка) Экспорт

// Собственные права папки

Запрос = Новый Запрос("ВЫБРАТЬ

| НастройкиПравОбъектов.Пользователь КАК Пользователь,

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

| НастройкиПравОбъектов.ПравоЗапрещено КАК ПравоЗапрещено,

| НаследованиеНастроекПравОбъектов.Наследовать

|ИЗ

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

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

| ПО НастройкиПравОбъектов.Объект = НаследованиеНастроекПравОбъектов.Родитель

|ГДЕ

| НаследованиеНастроекПравОбъектов.Объект = &Объект

| И НаследованиеНастроекПравОбъектов.Родитель = &Объект");

Запрос.УстановитьПараметр("Объект", Папка.Ссылка);

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

Наследовать = Истина;

Если Не Результат.Пустой() Тогда


ТаблицаПрав = Результат.Выгрузить();

Наследовать = ТаблицаПрав[0].Наследовать;

Если ЗначениеЗаполнено(ТаблицаПрав[0].Право) Тогда

ДескрипторДоступа.НастройкаПрав.Загрузить(ТаблицаПрав);

КонецЕсли;

Иначе

ДескрипторДоступа.НастройкаПрав.Очистить();

КонецЕсли;

// Наследуемые права

Если Наследовать Тогда

Запрос.Текст = "ВЫБРАТЬ

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

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

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

|ИЗ

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

| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроекПравОбъектов

| ПО НастройкиПравОбъектов.Объект = НаследованиеНастроекПравОбъектов.Родитель

|ГДЕ

| НаследованиеНастроекПравОбъектов.Объект = &Объект

| И НаследованиеНастроекПравОбъектов.Родитель <> &Объект

| И НастройкиПравОбъектов.НаследованиеРазрешено

|

|УПОРЯДОЧИТЬ ПО

| Пользователь,

| Право";

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

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

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

КонецЦикла;

КонецЕсли;

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

// Включает регл. задание обработки оперативной очереди

Процедура ВключитьОбработкуОперативнойОчереди() Экспорт

Задание = РегламентныеЗадания.НайтиПредопределенное("ДокументооборотОбновлениеПравДоступаОперативное");

Задание.Использование = Истина;

Задание.Записать();

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

// Включает регл. задание обработки долгой очереди

Процедура ВключитьОбработкуДолгойОчереди() Экспорт

Задание = РегламентныеЗадания.НайтиПредопределенное("ДокументооборотОбновлениеПравДоступаДолгое");

Задание.Использование = Истина;

Задание.Записать();

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

// Останавливает регл. задание обработки оперативной очереди

// Возвращаемое значение:

// Истина, если регл. задание было активно

// Ложь, если регл. задание уже было отключено

Функция ОтключитьОбработкуОперативнойОчереди(ТолькоФоновоеЗадание = Ложь) Экспорт

// Отключение регл. задания

Задание = РегламентныеЗадания.НайтиПредопределенное("ДокументооборотОбновлениеПравДоступаОперативное");

ЗаданиеАктивно = Задание.Использование;

Если Не ТолькоФоновоеЗадание И ЗаданиеАктивно Тогда

Задание.Использование = Ложь;

Задание.Записать();

КонецЕсли;

// Остановка фонового задания

Попытка


ИДЗадания = Задание.УникальныйИдентификатор;

Свойства = РегламентныеЗаданияСервер.ПолучитьСвойстваПоследнегоФоновогоЗаданияВыполненияРегламентногоЗадания(Задание);

РегламентныеЗаданияСервер.ОтменитьФоновоеЗадание(Свойства.Идентификатор);

Исключение

КонецПопытки;

Возврат ЗаданиеАктивно;

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

// Останавливает регл. задание обработки долгой очереди

// Возвращаемое значение:

// Истина, если регл. задание было активно

// Ложь, если регл. задание уже было отключено

Функция ОтключитьОбработкуДолгойОчереди(ТолькоФоновоеЗадание = Ложь) Экспорт

// Отключение регл. задания

Задание = РегламентныеЗадания.НайтиПредопределенное("ДокументооборотОбновлениеПравДоступаДолгое");

ЗаданиеАктивно = Задание.Использование;

Если ЗаданиеАктивно Тогда

Если Не ТолькоФоновоеЗадание Тогда

Задание.Использование = Ложь;

Задание.Записать();

КонецЕсли;

// Остановка фонового задания

Попытка

ИДЗадания = Задание.УникальныйИдентификатор;

Свойства = РегламентныеЗаданияСервер.ПолучитьСвойстваПоследнегоФоновогоЗаданияВыполненияРегламентногоЗадания(Задание);

РегламентныеЗаданияСервер.ОтменитьФоновоеЗадание(Свойства.Идентификатор);

Исключение

КонецПопытки;

КонецЕсли;

Возврат ЗаданиеАктивно;

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

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

Процедура РасширитьДоступПравамиБезОграничения(Права, ОбъектДоступа, Пользователь = Неопределено) Экспорт

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

Если Не ЗначениеЗаполнено(Пользователь) Тогда

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

КонецЕсли;

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

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

Запрос.Текст = "ВЫБРАТЬ

| МАКСИМУМ(ПраваГруппДоступаНаТаблицы.ЧтениеБезОграничения) КАК Чтение,

| МАКСИМУМ(ПраваГруппДоступаНаТаблицы.ДобавлениеБезОграничения) КАК Добавление,

| МАКСИМУМ(ПраваГруппДоступаНаТаблицы.ИзменениеБезОграничения) КАК Изменение,

| МАКСИМУМ(ПраваГруппДоступаНаТаблицы.УдалениеБезОграничения) КАК Удаление,

| МАКСИМУМ(ПраваГруппДоступаНаТаблицы.ПраваБезОграничения) КАК УправлениеПравами

|ИЗ

| РегистрСведений.ПраваГруппДоступаНаТаблицы КАК ПраваГруппДоступаНаТаблицы

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

| ПО ПраваГруппДоступаНаТаблицы.ГруппаДоступа = ГруппыДоступаПользователи.Ссылка