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