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