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