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