Файл: Разработка регламента выполнения процесса «Управление документооборотом» (1 Построение бизнес-процессов «как есть»).pdf
Добавлен: 28.06.2023
Просмотров: 359
Скачиваний: 2
СОДЕРЖАНИЕ
1 Построение бизнес-процессов «как есть»
1.1 Описание предметной области. Постановка задачи
1.2 Выбор средства для моделирования бизнес-процессов
1.3 Моделирование бизнес-процессов «как есть»
2 Построение бизнес-процессов «как должно быть»
2.1 Предлагаемые мероприятия по улучшению бизнес-процессов
Иначе
ОбновитьПраваПоПодчиненнымПодразделениям(Подразделение);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// Находит все объекты, которые используют указанный дескриптор
// и обновляет права всех других дескрипторов, которые зависят
// от этих объектов
Процедура ОбновитьПраваЗависимыхДескрипторовДоступа(Дескриптор) Экспорт
УстановитьПривилегированныйРежим(Истина);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДескрипторыДоступаДляОбъектов.Объект
|ИЗ
| РегистрСведений.ДескрипторыДоступаДляОбъектов КАК ДескрипторыДоступаДляОбъектов
|ГДЕ
| ДескрипторыДоступаДляОбъектов.Дескриптор = &Дескриптор";
Запрос.УстановитьПараметр("Дескриптор", Дескриптор.Ссылка);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ОбновитьПраваСвязанныхДескрипторовПоОбъекту(ВыборкаДетальныеЗаписи.Объект);
КонецЦикла;
КонецПроцедуры
// Обновляет все дескрипторы прав доступа, в правах которых встречается
// указанный пользователь
Процедура ОбновитьПраваПоПользователю(Пользователь, Немедленно = Ложь) Экспорт
Если Не Немедленно Тогда
РегистрыСведений.ОчередьОбновленияПравДоступа.Добавить(Пользователь, Дата("00010101000000"));
Иначе
УстановитьПривилегированныйРежим(Истина);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПраваПоДескрипторамДоступа.Дескриптор
|ИЗ
| РегистрСведений.ПраваПоДескрипторамДоступа КАК ПраваПоДескрипторамДоступа
|ГДЕ
| ПраваПоДескрипторамДоступа.Пользователь = &Пользователь";
Запрос.УстановитьПараметр("Пользователь", Пользователь);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Немедленно = Не ДокументооборотПраваДоступаПовтИсп.ОтложенноеОбновлениеПравДоступа();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ОбновитьПраваДоступаПоДескриптору(ВыборкаДетальныеЗаписи.Дескриптор, Немедленно);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
// Восстанавливает все права пользователя, которые у него были до
// пометки на удаление или установки признака "Недействителен"
Процедура ВосстановитьПраваПользователя(Пользователь, Немедленно = Ложь) Экспорт
// По группе доступа
Запрос = Новый Запрос("ВЫБРАТЬ
| ГруппыДоступаПользователи.Ссылка КАК ГруппаДоступа
|ИЗ
| Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
|ГДЕ
| ГруппыДоступаПользователи.Пользователь = &Пользователь");
Запрос.УстановитьПараметр("Пользователь", Пользователь);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ОбновитьПраваЗависящиеОтГруппыДоступа(Выборка.ГруппаДоступа);
КонецЦикла;
// По группе пользователей
Запрос = Новый Запрос("ВЫБРАТЬ
| ГруппыПользователейСостав.Ссылка КАК ГруппаПользователей
|ИЗ
| Справочник.ГруппыПользователей.Состав КАК ГруппыПользователейСостав
|ГДЕ
| ГруппыПользователейСостав.Пользователь = &Пользователь");
Запрос.УстановитьПараметр("Пользователь", Пользователь);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ОбновитьПраваОбъектовЗависящихОтГруппыПользователей(Выборка.ГруппаПользователей);
КонецЦикла;
// По рабочей группе дескриптора
Запрос = Новый Запрос("ВЫБРАТЬ
| ДескрипторыДоступаОбъектовРабочаяГруппа.Ссылка КАК Дескриптор
|ИЗ
| Справочник.ДескрипторыДоступаОбъектов.РабочаяГруппа КАК ДескрипторыДоступаОбъектовРабочаяГруппа
|ГДЕ
| ДескрипторыДоступаОбъектовРабочаяГруппа.Участник = &Пользователь");
Запрос.УстановитьПараметр("Пользователь", Пользователь);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ОбновитьПраваДоступаПоДескриптору(Выборка.Дескриптор, Немедленно);
КонецЦикла;
// По пользователям дескриптора
Запрос = Новый Запрос("ВЫБРАТЬ
| ДескрипторыДоступаОбъектовПользователи.Ссылка КАК Дескриптор
|ИЗ
| Справочник.ДескрипторыДоступаОбъектов.Пользователи КАК ДескрипторыДоступаОбъектовПользователи
|ГДЕ
| ДескрипторыДоступаОбъектовПользователи.Пользователь = &Пользователь");
Запрос.УстановитьПараметр("Пользователь", Пользователь);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ОбновитьПраваДоступаПоДескриптору(Выборка.Дескриптор, Немедленно);
КонецЦикла;
// По роли исполнителя в дескрипторе
Запрос = Новый Запрос("ВЫБРАТЬ
| ДескрипторыДоступаОбъектовПользователи.Ссылка КАК Дескриптор
|ИЗ
| РегистрСведений.ИсполнителиЗадач КАК ИсполнителиЗадач
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ДескрипторыДоступаОбъектов.Пользователи КАК ДескрипторыДоступаОбъектовПользователи
| ПО ИсполнителиЗадач.РольИсполнителя = ДескрипторыДоступаОбъектовПользователи.Пользователь
| И ИсполнителиЗадач.ОсновнойОбъектАдресации = ДескрипторыДоступаОбъектовПользователи.ОсновнойОбъектАдресации
| И ИсполнителиЗадач.ДополнительныйОбъектАдресации = ДескрипторыДоступаОбъектовПользователи.ДополнительныйОбъектАдресации
|ГДЕ
| ИсполнителиЗадач.Исполнитель = &Пользователь
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ДескрипторыДоступаОбъектовРабочаяГруппа.Ссылка
|ИЗ
| РегистрСведений.ИсполнителиЗадач КАК ИсполнителиЗадач
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ДескрипторыДоступаОбъектов.РабочаяГруппа КАК ДескрипторыДоступаОбъектовРабочаяГруппа
| ПО ИсполнителиЗадач.ОсновнойОбъектАдресации = ДескрипторыДоступаОбъектовРабочаяГруппа.ОсновнойОбъектАдресации
| И ИсполнителиЗадач.ДополнительныйОбъектАдресации = ДескрипторыДоступаОбъектовРабочаяГруппа.ДополнительныйОбъектАдресации
|ГДЕ
| ИсполнителиЗадач.Исполнитель = &Пользователь");
Запрос.УстановитьПараметр("Пользователь", Пользователь);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ОбновитьПраваДоступаПоДескриптору(Выборка.Дескриптор, Немедленно);
КонецЦикла;
// Права папок
Запрос = Новый Запрос("ВЫБРАТЬ РАЗЛИЧНЫЕ
| НастройкиПравОбъектов.Объект
|ИЗ
| РегистрСведений.НастройкиПравОбъектов КАК НастройкиПравОбъектов
|ГДЕ
| НастройкиПравОбъектов.Пользователь = &Пользователь");
Запрос.УстановитьПараметр("Пользователь", Пользователь);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ОбновитьПраваПапки(Выборка.Объект);
КонецЦикла;
КонецПроцедуры
// Заполняет ТЧ дескриптора НастройкаПрав по настройкам папки
Процедура ЗаполнитьНастройкиДескриптора(ДескрипторДоступа, Папка) Экспорт
// Собственные права папки
Запрос = Новый Запрос("ВЫБРАТЬ
| НастройкиПравОбъектов.Пользователь КАК Пользователь,
| НастройкиПравОбъектов.Право КАК Право,
| НастройкиПравОбъектов.ПравоЗапрещено КАК ПравоЗапрещено,
| НаследованиеНастроекПравОбъектов.Наследовать
|ИЗ
| РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроекПравОбъектов
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПравОбъектов
| ПО НастройкиПравОбъектов.Объект = НаследованиеНастроекПравОбъектов.Родитель
|ГДЕ
| НаследованиеНастроекПравОбъектов.Объект = &Объект
| И НаследованиеНастроекПравОбъектов.Родитель = &Объект");
Запрос.УстановитьПараметр("Объект", Папка.Ссылка);
Результат = Запрос.Выполнить();
Наследовать = Истина;
Если Не Результат.Пустой() Тогда
ТаблицаПрав = Результат.Выгрузить();
Наследовать = ТаблицаПрав[0].Наследовать;
Если ЗначениеЗаполнено(ТаблицаПрав[0].Право) Тогда
ДескрипторДоступа.НастройкаПрав.Загрузить(ТаблицаПрав);
КонецЕсли;
Иначе
ДескрипторДоступа.НастройкаПрав.Очистить();
КонецЕсли;
// Наследуемые права
Если Наследовать Тогда
Запрос.Текст = "ВЫБРАТЬ
| НастройкиПравОбъектов.Пользователь,
| НастройкиПравОбъектов.Право,
| НастройкиПравОбъектов.ПравоЗапрещено
|ИЗ
| РегистрСведений.НастройкиПравОбъектов КАК НастройкиПравОбъектов
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроекПравОбъектов
| ПО НастройкиПравОбъектов.Объект = НаследованиеНастроекПравОбъектов.Родитель
|ГДЕ
| НаследованиеНастроекПравОбъектов.Объект = &Объект
| И НаследованиеНастроекПравОбъектов.Родитель <> &Объект
| И НастройкиПравОбъектов.НаследованиеРазрешено
|
|УПОРЯДОЧИТЬ ПО
| Пользователь,
| Право";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ЗаполнитьЗначенияСвойств(ДескрипторДоступа.НастройкаПрав.Добавить(), Выборка);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
// Включает регл. задание обработки оперативной очереди
Процедура ВключитьОбработкуОперативнойОчереди() Экспорт
Задание = РегламентныеЗадания.НайтиПредопределенное("ДокументооборотОбновлениеПравДоступаОперативное");
Задание.Использование = Истина;
Задание.Записать();
КонецПроцедуры
// Включает регл. задание обработки долгой очереди
Процедура ВключитьОбработкуДолгойОчереди() Экспорт
Задание = РегламентныеЗадания.НайтиПредопределенное("ДокументооборотОбновлениеПравДоступаДолгое");
Задание.Использование = Истина;
Задание.Записать();
КонецПроцедуры
// Останавливает регл. задание обработки оперативной очереди
// Возвращаемое значение:
// Истина, если регл. задание было активно
// Ложь, если регл. задание уже было отключено
Функция ОтключитьОбработкуОперативнойОчереди(ТолькоФоновоеЗадание = Ложь) Экспорт
// Отключение регл. задания
Задание = РегламентныеЗадания.НайтиПредопределенное("ДокументооборотОбновлениеПравДоступаОперативное");
ЗаданиеАктивно = Задание.Использование;
Если Не ТолькоФоновоеЗадание И ЗаданиеАктивно Тогда
Задание.Использование = Ложь;
Задание.Записать();
КонецЕсли;
// Остановка фонового задания
Попытка
ИДЗадания = Задание.УникальныйИдентификатор;
Свойства = РегламентныеЗаданияСервер.ПолучитьСвойстваПоследнегоФоновогоЗаданияВыполненияРегламентногоЗадания(Задание);
РегламентныеЗаданияСервер.ОтменитьФоновоеЗадание(Свойства.Идентификатор);
Исключение
КонецПопытки;
Возврат ЗаданиеАктивно;
КонецФункции
// Останавливает регл. задание обработки долгой очереди
// Возвращаемое значение:
// Истина, если регл. задание было активно
// Ложь, если регл. задание уже было отключено
Функция ОтключитьОбработкуДолгойОчереди(ТолькоФоновоеЗадание = Ложь) Экспорт
// Отключение регл. задания
Задание = РегламентныеЗадания.НайтиПредопределенное("ДокументооборотОбновлениеПравДоступаДолгое");
ЗаданиеАктивно = Задание.Использование;
Если ЗаданиеАктивно Тогда
Если Не ТолькоФоновоеЗадание Тогда
Задание.Использование = Ложь;
Задание.Записать();
КонецЕсли;
// Остановка фонового задания
Попытка
ИДЗадания = Задание.УникальныйИдентификатор;
Свойства = РегламентныеЗаданияСервер.ПолучитьСвойстваПоследнегоФоновогоЗаданияВыполненияРегламентногоЗадания(Задание);
РегламентныеЗаданияСервер.ОтменитьФоновоеЗадание(Свойства.Идентификатор);
Исключение
КонецПопытки;
КонецЕсли;
Возврат ЗаданиеАктивно;
КонецФункции
// Добавляет к переданной стуктуре прав права, не ограниченные на уровне записей
Процедура РасширитьДоступПравамиБезОграничения(Права, ОбъектДоступа, Пользователь = Неопределено) Экспорт
УстановитьПривилегированныйРежим(Истина);
Если Не ЗначениеЗаполнено(Пользователь) Тогда
Пользователь = ОбщегоНазначения.ТекущийПользователь();
КонецЕсли;
// Проверка прав, не ограниченных на уровне записей
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| МАКСИМУМ(ПраваГруппДоступаНаТаблицы.ЧтениеБезОграничения) КАК Чтение,
| МАКСИМУМ(ПраваГруппДоступаНаТаблицы.ДобавлениеБезОграничения) КАК Добавление,
| МАКСИМУМ(ПраваГруппДоступаНаТаблицы.ИзменениеБезОграничения) КАК Изменение,
| МАКСИМУМ(ПраваГруппДоступаНаТаблицы.УдалениеБезОграничения) КАК Удаление,
| МАКСИМУМ(ПраваГруппДоступаНаТаблицы.ПраваБезОграничения) КАК УправлениеПравами
|ИЗ
| РегистрСведений.ПраваГруппДоступаНаТаблицы КАК ПраваГруппДоступаНаТаблицы
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
| ПО ПраваГруппДоступаНаТаблицы.ГруппаДоступа = ГруппыДоступаПользователи.Ссылка