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

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

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

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

Добавлен: 28.06.2023

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

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

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

КонецЦикла;

// Поиск и обновление дексрипторов по группам доступа физических лиц

ГруппыДоступаФизЛиц = Новый Массив();

Для каждого Эл Из ЗначенияДоступа Цикл

Если ТипЗнч(Эл) = Тип("СправочникСсылка.ГруппыДоступаФизическихЛиц") Тогда

ГруппыДоступаФизЛиц.Добавить(Эл);

КонецЕсли;

КонецЦикла;

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ РАЗЛИЧНЫЕ

| ДескрипторыДоступаОбъектовФизическиеЛица.Ссылка

|ИЗ

| Справочник.ДескрипторыДоступаОбъектов.ФизическиеЛица КАК ДескрипторыДоступаОбъектовФизическиеЛица

|ГДЕ

| ДескрипторыДоступаОбъектовФизическиеЛица.ГруппаДоступа В(&ГруппыДоступаФизЛиц)";

Запрос.УстановитьПараметр("ГруппыДоступаФизЛиц", ГруппыДоступаФизЛиц);

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

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

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

Справочники.ДескрипторыДоступаОбъектов.ОбновитьПрава(ВыборкаДетальныеЗаписи.Ссылка);

КонецЦикла;

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

Процедура ОбновитьПраваПоПодчиненнымПодразделениям(Подразделение)

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

// Выбор всех подразделений от указанного (включительно)

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| СтруктураАдминистрации.Ссылка

|ИЗ

| Справочник.СтруктураАдминистрации КАК СтруктураАдминистрации

|ГДЕ

| СтруктураАдминистрации.Ссылка В ИЕРАРХИИ(&Родитель)";

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

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

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

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

ОбновитьПраваСотрудниковПодразделения(ВыборкаДетальныеЗаписи.Ссылка);

КонецЦикла;

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

Процедура ОбновитьПраваСотрудниковПодразделения(Подразделение)

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

// Выбор всех дескрипторов, в правах которых встречаются сотрудники

// указанного подразделения

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ПраваПоДескрипторамДоступа.Дескриптор

|ИЗ

| РегистрСведений.ПраваПоДескрипторамДоступа КАК ПраваПоДескрипторамДоступа

| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОПользователях КАК СведенияОПользователях

| ПО ПраваПоДескрипторамДоступа.Пользователь = СведенияОПользователях.Пользователь

|ГДЕ

| СведенияОПользователях.Подразделение = &Подразделение";

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


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

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

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

ОбновитьПраваДоступаПоДескриптору(ВыборкаДетальныеЗаписи.Дескриптор);

КонецЦикла;

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

// Находит дексриптор указанного объекта доступа и немедленно обновляет права

// найденного дескриптора. Если дескриптор не найден, то создает его.

Процедура ОбновитьПраваДоступаДляОбъекта(ОбъектДоступа)

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ДескрипторыДоступаДляОбъектов.Дескриптор

|ИЗ

| РегистрСведений.ДескрипторыДоступаДляОбъектов КАК ДескрипторыДоступаДляОбъектов

|ГДЕ

| ДескрипторыДоступаДляОбъектов.Объект = &ОбъектДоступа";

Запрос.УстановитьПараметр("ОбъектДоступа", ОбъектДоступа);

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

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

Если ВыборкаДетальныеЗаписи.Следующий() Тогда

Немедленно = Не ДокументооборотПраваДоступаПовтИсп.ОтложенноеОбновлениеПравДоступа();

ОбновитьПраваДоступаПоДескриптору(

ВыборкаДетальныеЗаписи.Дескриптор,

Немедленно);

Иначе

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

КонецЕсли;

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

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

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

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

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

СоставГруппы = Новый ТаблицаЗначений;

СоставГруппы.Колонки.Добавить("Пользователь");

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

СоставГруппы = ДокументооборотПраваДоступаПовтИсп.ПолучитьСоставГруппыПользователей(Источник.Ссылка);

КонецЕсли;

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

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

СтарыйРодитель = ОбщегоНазначения.ПолучитьЗначениеРеквизита(Источник.Ссылка, "Родитель");

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

КонецЕсли;

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

СоставГруппы = Новый ТаблицаЗначений;

СоставГруппы.Колонки.Добавить("Пользователь");

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

СоставГруппы = Источник.Ссылка.Пользователи;

КонецЕсли;

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


КонецЕсли;

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

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

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

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

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

И Источник.ДополнительныеСвойства.ДобавленНовыйПользовательИБ)) Тогда

МассивПользователей = Новый Массив;

МассивПользователей.Добавить(Источник.Ссылка);

УправлениеДоступом.ОбновитьРолиПользователей(МассивПользователей);

РегистрыСведений.ДокументооборотПользователиГруппДоступа.ОбновитьВсе();

КонецЕсли;

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

МассивИзменений = Новый Массив;

ПолноеОбновление = Ложь;

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

СтарыйРодитель = Источник.ДополнительныеСвойства.СтарыйРодитель;

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

// Полное обновление

ПолноеОбновление = Истина;

СоставГруппы = ДокументооборотПраваДоступаПовтИсп.ПолучитьСоставГруппыПользователей(Источник.Ссылка);

Для Каждого Строка Из СоставГруппы Цикл

МассивИзменений.Добавить(Строка.Пользователь);

КонецЦикла;

КонецЕсли;

КонецЕсли;

Если Не ПолноеОбновление Тогда

// Поиск и обновление отличий в составе группы пользователей

НовыйСоставГруппы = ДокументооборотПраваДоступаПовтИсп.ПолучитьСоставГруппыПользователей(Источник.Ссылка);

СтарыйСоставГруппы = Источник.ДополнительныеСвойства.СтарыйСоставГруппы;

Для Каждого Строка Из НовыйСоставГруппы Цикл

Пользователь = Строка.Пользователь;

Если СтарыйСоставГруппы.Найти(Пользователь, "Пользователь") = Неопределено Тогда

Если МассивИзменений.Найти(Пользователь) = Неопределено Тогда

МассивИзменений.Добавить(Пользователь);

КонецЕсли;

КонецЕсли;

КонецЦикла;

Для Каждого Строка Из СтарыйСоставГруппы Цикл

Пользователь = Строка.Пользователь;

Если НовыйСоставГруппы.Найти(Пользователь, "Пользователь") = Неопределено Тогда

Если МассивИзменений.Найти(Пользователь) = Неопределено Тогда

МассивИзменений.Добавить(Пользователь);

КонецЕсли;

КонецЕсли;

КонецЦикла;

КонецЕсли;

УправлениеДоступом.ОбновитьРолиПользователей(МассивИзменений);

РегистрыСведений.ДокументооборотПользователиГруппДоступа.ОбновитьВсе();

КонецЕсли;

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


НовыйСоставГруппы = Источник.Пользователи;

СтарыйСоставГруппы = Источник.ДополнительныеСвойства.СтарыйСоставГруппы;

МассивИзменений = Новый Массив;

Для Каждого Строка Из НовыйСоставГруппы Цикл

Пользователь = Строка.Пользователь;

Если СтарыйСоставГруппы.Найти(Пользователь, "Пользователь") = Неопределено Тогда

Если МассивИзменений.Найти(Пользователь) = Неопределено Тогда

МассивИзменений.Добавить(Пользователь);

КонецЕсли;

КонецЕсли;

КонецЦикла;

Для Каждого Строка Из СтарыйСоставГруппы Цикл

Пользователь = Строка.Пользователь;

Если НовыйСоставГруппы.Найти(Пользователь, "Пользователь") = Неопределено Тогда

Если МассивИзменений.Найти(Пользователь) = Неопределено Тогда

МассивИзменений.Добавить(Пользователь);

КонецЕсли;

КонецЕсли;

КонецЦикла;

ОбновитьМассивПользователейИГруппПользователей(МассивИзменений);

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

КонецЕсли;

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

// Группы доступа

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ГруппыДоступа.Ссылка КАК Ссылка

|ИЗ

| Справочник.ГруппыДоступа КАК ГруппыДоступа

|ГДЕ

| ГруппыДоступа.Профиль = &Профиль";

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

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

Для Каждого ГруппаДоступа Из Результат Цикл

МассивИзменений = Новый Массив;

Для Каждого Строка Из ГруппаДоступа.Пользователи Цикл

МассивИзменений.Добавить(Строка.Пользователь);

КонецЦикла;

ОбновитьМассивПользователейИГруппПользователей(МассивИзменений);

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

КонецЦикла;

КонецЕсли;

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

Процедура ОбновитьМассивПользователейИГруппПользователей(МассивИзменений)

МассивИзмененийРазвернутый = Новый Массив;

Для Каждого ПользовательИлиГруппа Из МассивИзменений Цикл

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

Если МассивИзмененийРазвернутый.Найти(ПользовательИлиГруппа) = Неопределено Тогда

МассивИзмененийРазвернутый.Добавить(ПользовательИлиГруппа);

КонецЕсли;

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

СоставГруппы = ДокументооборотПраваДоступаПовтИсп.ПолучитьСоставГруппыПользователей(ПользовательИлиГруппа);


Для Каждого Строка Из СоставГруппы Цикл

Если МассивИзмененийРазвернутый.Найти(Строка.Пользователь) = Неопределено Тогда

МассивИзмененийРазвернутый.Добавить(Строка.Пользователь);

КонецЕсли;

КонецЦикла;

КонецЕсли;

КонецЦикла;

УправлениеДоступом.ОбновитьРолиПользователей(МассивИзмененийРазвернутый);

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

Процедура ОбновитьПраваЗависимыхДанных(ОбъектСсылка)

ДокументооборотПраваДоступаПереопределяемый.ОбновитьПраваЗависимыхДанных(ОбъектСсылка);

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

Процедура ОбновитьПраваПустыхДескрипторов()

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ РАЗЛИЧНЫЕ

| ПраваПоДескрипторамДоступа.Дескриптор

|ИЗ

| РегистрСведений.ПраваПоДескрипторамДоступа КАК ПраваПоДескрипторамДоступа

| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ДескрипторыДоступаОбъектов КАК ДескрипторыДоступаОбъектов

| ПО ПраваПоДескрипторамДоступа.Дескриптор = ДескрипторыДоступаОбъектов.Ссылка

|ГДЕ

| ДескрипторыДоступаОбъектов.ЭтоПустойДескриптор";

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

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

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

Немедленно = Не ДокументооборотПраваДоступаПовтИсп.ОтложенноеОбновлениеПравДоступа();

ОбновитьПраваДоступаПоДескриптору(ВыборкаДетальныеЗаписи.Дескриптор, Немедленно);

КонецЦикла;

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

// Возвращает Истина если переданная ссылка является ссылкой на любой бизнес-процесс

Функция ЭтоБизнесПроцесс(Ссылка)

МетаданныеОбъекта = Ссылка.Метаданные();

Возврат Метаданные.БизнесПроцессы.Содержит(МетаданныеОбъекта);

КонецФункции

// Обрабатывает запись набора записей РС ИсполнителиЗадач

Процедура ПриЗаписиИсполнителейЗадач(Источник)

Если Источник.Количество() = 0 Тогда

// Обработка удаления набора записей

РольИсполнителя = Источник.Отбор.РольИсполнителя.Значение;

ОсновнойОбъектАдресации = Источник.Отбор.ОсновнойОбъектАдресации.Значение;

ДополнительныйОбъектАдресации = Источник.Отбор.ДополнительныйОбъектАдресации.Значение;

// Поиск дескрипторов по ТЧ Пользователи

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ РАЗЛИЧНЫЕ

| ДескрипторыДоступаОбъектовПользователи.Ссылка

|ИЗ

| Справочник.ДескрипторыДоступаОбъектов.Пользователи КАК ДескрипторыДоступаОбъектовПользователи

|ГДЕ

| ДескрипторыДоступаОбъектовПользователи.Пользователь = &Пользователь