Файл: Разработка регламента выполнения процесса «Управление документооборотом» (1 Построение бизнес-процессов «как есть»).pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 28.06.2023

Просмотров: 357

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

|ГДЕ

| ПраваГруппДоступаНаТаблицы.Таблица.ЗначениеПустойСсылки = &ПустаяСсылка

| И ГруппыДоступаПользователи.Пользователь = &Пользователь

|

|ИМЕЮЩИЕ

| (МАКСИМУМ(ПраваГруппДоступаНаТаблицы.ЧтениеБезОграничения) = ИСТИНА

| ИЛИ МАКСИМУМ(ПраваГруппДоступаНаТаблицы.ДобавлениеБезОграничения) = ИСТИНА

| ИЛИ МАКСИМУМ(ПраваГруппДоступаНаТаблицы.ИзменениеБезОграничения) = ИСТИНА

| ИЛИ МАКСИМУМ(ПраваГруппДоступаНаТаблицы.УдалениеБезОграничения) = ИСТИНА

| ИЛИ МАКСИМУМ(ПраваГруппДоступаНаТаблицы.ПраваБезОграничения) = ИСТИНА)";

Запрос.УстановитьПараметр("ПустаяСсылка", Новый(ТипЗнч(ОбъектДоступа.Ссылка)));

Запрос.УстановитьПараметр("Пользователь", Пользователь);

Результат = Запрос.Выполнить();

Если Не Результат.Пустой() Тогда

ВыборкаПравБезОграничений = Результат.Выбрать();

ВыборкаПравБезОграничений.Следующий();

Права.Чтение = Права.Чтение или ВыборкаПравБезОграничений.Чтение;

Права.Изменение = Права.Изменение или ВыборкаПравБезОграничений.Изменение;

Права.Удаление = Права.Удаление или ВыборкаПравБезОграничений.Удаление;

Права.УправлениеПравами = Права.УправлениеПравами или ВыборкаПравБезОграничений.УправлениеПравами;

// Добавление без ограничений проверяется вместе с изменением, т.к. тут может

// не быть ограничений РЛС даже если они подразумеваются

Права.Добавление = Права.Добавление или

ВыборкаПравБезОграничений.Добавление и ВыборкаПравБезОграничений.Изменение;

КонецЕсли;

КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////

// Обработчики подписок и регламентных заданий

// Обработчик подписки ДокументооборотПраваДоступаПередЗаписьюОбъектаДоступа

Процедура ДокументооборотПраваДоступаПередЗаписьюОбъектаДоступа(Источник, Отказ) Экспорт

Если Не ДокументооборотПраваДоступаПовтИсп.ВключеноИспользованиеПравДоступа() Тогда

Возврат;

КонецЕсли;

// Сохранение признака ЭтоНовый для использования в обработчике события ПриЗаписи

Источник.ДополнительныеСвойства.Вставить("ЭтоНовый", Источник.ЭтоНовый());

// Сохранение старого дескриптора доступа для обнаружения того, что дескриптор изменен

Если Не Источник.ЭтоНовый() Тогда

СтарыйДескриптор = РегистрыСведений.ДескрипторыДоступаДляОбъектов.НайтиДескрипторДляОбъекта(Источник.Ссылка);

Источник.ДополнительныеСвойства.Вставить("СтарыйДескриптор", СтарыйДескриптор);

КонецЕсли;

КонецПроцедуры

// Обработчик подписки ДокументооборотПраваДоступаПередЗаписьюДокумента


Процедура ДокументооборотПраваДоступаПередЗаписьюДокумента(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт

Если Не ДокументооборотПраваДоступаПовтИсп.ВключеноИспользованиеПравДоступа() Тогда

Возврат;

КонецЕсли;

// Сохранение признака ЭтоНовый для использования в обработчике события ПриЗаписи

Источник.ДополнительныеСвойства.Вставить("ЭтоНовый", Источник.ЭтоНовый());

КонецПроцедуры

// Обработчик подписки ДокументооборотПраваДоступаПриЗаписиОбъектаДоступа

Процедура ДокументооборотПраваДоступаПриЗаписиОбъектаДоступа(Источник, Отказ) Экспорт

Если Не ДокументооборотПраваДоступаПовтИсп.ВключеноИспользованиеПравДоступа() Тогда

Возврат;

КонецЕсли;

НеобходимаПроверкаПравПоДескриптору = Не ПривилегированныйРежим() И Не РольДоступна("ПолныеПрава");

Дескриптор = ОпределитьДескрипторДоступаОбъекта(

Источник,

НеобходимаПроверкаПравПоДескриптору); // Немедленно

// Проверка права добавления

Если НеобходимаПроверкаПравПоДескриптору Тогда

Права = РегистрыСведений.ПраваПоДескрипторамДоступа.ПолучитьПраваПоДескриптору(Дескриптор);

РасширитьДоступПравамиБезОграничения(Права, Источник.Ссылка);

НетПрав = Ложь;

Если Источник.ДополнительныеСвойства.ЭтоНовый Тогда

// Для новых объектов проверяется право добавления

Если Не Права.Добавление Тогда

НетПрав = Истина;

КонецЕсли;

Иначе

// Для существующих объектов проверяется право изменения

Если Не Права.Изменение Тогда

НетПрав = Истина;

КонецЕсли;

КонецЕсли;

Если НетПрав Тогда

ВызватьИсключение НСтр("ru = 'Недостаточно прав для выполнения операции.

|Обратитесь к администратору.'");

КонецЕсли;

КонецЕсли;

// Проверка на изменение дескриптора

Если Источник.ДополнительныеСвойства.Свойство("СтарыйДескриптор") Тогда

// Если дескприптор поменялся, то обновляются права всех данных,

// которые зависят от этого объекта

Если Источник.ДополнительныеСвойства.СтарыйДескриптор <> Дескриптор Тогда

ОбновитьПраваЗависимыхДанных(Источник.Ссылка);

КонецЕсли;

КонецЕсли;

КонецПроцедуры

// Обработчик подписки ДокументооборотПраваДоступаПередЗаписьюФайла

Процедура ДокументооборотПраваДоступаПередЗаписьюФайла(Источник, Отказ) Экспорт

Если Не ДокументооборотПраваДоступаПовтИсп.ВключеноИспользованиеПравДоступа() Тогда

Возврат;

КонецЕсли;

Дескриптор = ПолучитьДескрипторДоступаФайла(


Источник.ВладелецФайла,

Истина);

// Проверка права добавления

Если Не ПривилегированныйРежим() И Не РольДоступна("ПолныеПрава") Тогда

Если Источник.ЭтоНовый() Тогда

Права = РегистрыСведений.ПраваПоДескрипторамДоступа.ПолучитьПраваПоДескриптору(Дескриптор);

РасширитьДоступПравамиБезОграничения(Права, Источник.Ссылка);

Если Не Права.Добавление Тогда

ВызватьИсключение НСтр("ru = 'Недостаточно прав для выполнения операции.

|Обратитесь к администратору.'");

КонецЕсли;

КонецЕсли;

КонецЕсли;

КонецПроцедуры

// Обработчик подписки ДокументооборотПраваДоступаПередЗаписьюНабораЗаписей

Процедура ДокументооборотПраваДоступаПередЗаписьюНабораЗаписей(Источник, Отказ, Замещение) Экспорт

Если Не ДокументооборотПраваДоступаПовтИсп.ВключеноИспользованиеПравДоступа() Тогда

Возврат;

КонецЕсли;

ОпределитьДескрипторДоступаНабораЗаписей(

Источник,

Истина); // Немедленно

КонецПроцедуры

// Обработчик подписки ДокументооборотПередЗаписьюПравообразующихОбъектов

Процедура ДокументооборотПередЗаписьюПравообразующихОбъектов(Источник, Отказ) Экспорт

УстановитьПривилегированныйРежим(Истина);

Если Не ДокументооборотПраваДоступаПовтИсп.ВключеноИспользованиеПравДоступа() Тогда

Возврат;

КонецЕсли;

Если ДокументооборотПраваДоступаПереопределяемый.ДокументооборотПередЗаписьюПравообразующихОбъектов(Источник, Отказ) Тогда

Возврат;

КонецЕсли;

// Проверка на то, что изменились правообразующие реквизиты

Если ТипЗнч(Источник) = Тип("СправочникОбъект.ГруппыПользователей") Тогда

СтарыйСостав = Источник.Ссылка.Состав;

Если Источник.ЭтоНовый() Тогда

Источник.ДополнительныеСвойства.Вставить("ЗначениеИзменено", Истина);

ИначеЕсли Источник.Родитель <> Источник.Ссылка.Родитель Тогда

Источник.ДополнительныеСвойства.Вставить("ЗначениеИзменено", Истина);

Источник.ДополнительныеСвойства.Вставить("СтарыйРодитель", Источник.Ссылка.Родитель);

ИначеЕсли Источник.Состав.Количество() <> СтарыйСостав.Количество() Тогда

Источник.ДополнительныеСвойства.Вставить("ЗначениеИзменено", Истина);

Иначе

// Поэлементное сравнение

ЗначениеИзменено = Ложь;

Для Сч = 0 По СтарыйСостав.Количество() - 1 Цикл

Если СтарыйСостав[Сч].Пользователь <> Источник.Состав[Сч].Пользователь Тогда

ЗначениеИзменено = Истина;

Прервать;

КонецЕсли;

КонецЦикла;

Если ЗначениеИзменено Тогда


Источник.ДополнительныеСвойства.Вставить("ЗначениеИзменено", Истина);

КонецЕсли;

КонецЕсли;

ИначеЕсли ТипЗнч(Источник) = Тип("СправочникОбъект.ГруппыДоступа") Тогда

Если Не Источник.ЭтоГруппа Тогда

Источник.ДополнительныеСвойства.Вставить("ЗначениеИзменено", Истина);

Если Не Источник.ЭтоНовый() Тогда

ЗначенияДоступа = ПолучитьЗначенияДоступаГруппыДоступа(Источник.Ссылка);

Источник.ДополнительныеСвойства.Вставить("СтарыеЗначенияДоступа", ЗначенияДоступа);

Источник.ДополнительныеСвойства.Вставить("СтарыйПрофиль", Источник.Ссылка.Профиль);

Источник.ДополнительныеСвойства.Вставить("СтарыйСостав", Источник.Ссылка.Пользователи);

КонецЕсли;

КонецЕсли;

ИначеЕсли ТипЗнч(Источник) = Тип("СправочникОбъект.Пользователи") Тогда

Источник.ДополнительныеСвойства.Вставить("ЭтоНовый", Источник.ЭтоНовый());

Источник.ДополнительныеСвойства.Вставить("ЗначениеИзменено", Истина);

Источник.ДополнительныеСвойства.Вставить("ИзмененаПометкаУдаления",

Источник.ПометкаУдаления <> Источник.Ссылка.ПометкаУдаления);

Источник.ДополнительныеСвойства.Вставить("ИзмененПризнакДействительности",

Источник.Недействителен <> Источник.Ссылка.Недействителен);

ИначеЕсли ТипЗнч(Источник) = Тип("СправочникОбъект.ПапкиФайлов")

ИЛИ ТипЗнч(Источник) = Тип("СправочникОбъект.ПапкиВнутреннихДокументов") Тогда

Если Источник.Родитель <> Источник.Ссылка.Родитель Тогда

Источник.ДополнительныеСвойства.Вставить("ЗначениеИзменено", Истина);

КонецЕсли;

ИначеЕсли ТипЗнч(Источник) = Тип("СправочникОбъект.СтруктураАдминистрации") Тогда

Если Источник.Родитель <> Источник.Ссылка.Родитель

ИЛИ Источник.Руководитель <> Источник.Ссылка.Руководитель Тогда

Источник.ДополнительныеСвойства.Вставить("ЗначениеИзменено", Истина);

КонецЕсли;

ИначеЕсли ТипЗнч(Источник) = Тип("СправочникОбъект.ПрофилиГруппДоступа") Тогда

СтарыеРоли = Источник.Ссылка.Роли;

СтарыеВидыДоступа = Источник.Ссылка.ВидыДоступа;

СтарыеЗначенияДоступа = Источник.Ссылка.ЗначенияДоступа;

Если Источник.Роли.Количество() <> СтарыеРоли.Количество()

Или Источник.ВидыДоступа.Количество() <> СтарыеВидыДоступа.Количество()

Или Источник.ЗначенияДоступа.Количество() <> СтарыеЗначенияДоступа.Количество() Тогда

Источник.ДополнительныеСвойства.Вставить("ЗначениеИзменено", Истина);

Иначе

// Поэлементное сравнение

ЗначениеИзменено = Ложь;


Для Сч = 0 По СтарыеРоли.Количество() - 1 Цикл

Если СтарыеРоли[Сч].Роль <> Источник.Роли[Сч].Роль Тогда

ЗначениеИзменено = Истина;

Прервать;

КонецЕсли;

КонецЦикла;

Если ЗначениеИзменено Тогда

Источник.ДополнительныеСвойства.Вставить("ЗначениеИзменено", Истина);

КонецЕсли;

Если Не ЗначениеИзменено Тогда

Для Сч = 0 По СтарыеВидыДоступа.Количество() - 1 Цикл

Если СтарыеВидыДоступа[Сч].ВидДоступа <> Источник.ВидыДоступа[Сч].ВидДоступа

Или СтарыеВидыДоступа[Сч].ДоступРазрешен <> Источник.ВидыДоступа[Сч].ДоступРазрешен Тогда

ЗначениеИзменено = Истина;

Прервать;

КонецЕсли;

КонецЦикла;

Если ЗначениеИзменено Тогда

Источник.ДополнительныеСвойства.Вставить("ЗначениеИзменено", Истина);

КонецЕсли;

КонецЕсли;

Если Не ЗначениеИзменено Тогда

Для Сч = 0 По СтарыеЗначенияДоступа.Количество() - 1 Цикл

Если СтарыеЗначенияДоступа[Сч].ВидДоступа <> Источник.ЗначенияДоступа[Сч].ВидДоступа

Или СтарыеЗначенияДоступа[Сч].ЗначениеДоступа <> Источник.ЗначенияДоступа[Сч].ЗначениеДоступа Тогда

ЗначениеИзменено = Истина;

Прервать;

КонецЕсли;

КонецЦикла;

Если ЗначениеИзменено Тогда

Источник.ДополнительныеСвойства.Вставить("ЗначениеИзменено", Истина);

КонецЕсли;

КонецЕсли;

КонецЕсли;

КонецЕсли;

КонецПроцедуры

// Обработчик подписки ДокументооборотПриЗаписиПравообразующихОбъектов

Процедура ДокументооборотПриЗаписиПравообразующихОбъектов(Источник, Отказ) Экспорт

УстановитьПривилегированныйРежим(Истина);

Если Не ДокументооборотПраваДоступаПовтИсп.ВключеноИспользованиеПравДоступа() Тогда

Возврат;

КонецЕсли;

// Проверка на то, что правообразующие свойства источника были изменены

Если НЕ Источник.ДополнительныеСвойства.Свойство("ЗначениеИзменено")

Или НЕ Источник.ДополнительныеСвойства.ЗначениеИзменено Тогда

Возврат;

КонецЕсли;

// Обработка источников разных типов

Если ДокументооборотПраваДоступаПереопределяемый.ДокументооборотПриЗаписиПравообразующихОбъектов(Источник, Отказ) Тогда

Возврат;

КонецЕсли;

ТипИсточника = ТипЗнч(Источник);

Если ТипИсточника = Тип("СправочникОбъект.ГруппыПользователей") Тогда

// Перезагрузка регл. заданий - для корректной работы функций повторного использования

ОтключитьОбработкуОперативнойОчереди(Истина);

ОтключитьОбработкуДолгойОчереди(Истина);

ТекущийПриоритетОчередиОбновленияПрав = ПараметрыСеанса.ПриоритетОчередиОбновленияПрав;