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

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

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

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

Добавлен: 28.06.2023

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

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

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

НовыйДескриптор = Справочники.ДескрипторыДоступаРегистров.СоздатьНовыйДескриптор(ИдентификаторОбъектаМетаданных, Запись);

ГотовыйДескриптор = Справочники.ДескрипторыДоступаРегистров.НайтиДескрипторПоОбразцу(НовыйДескриптор);

Если ЗначениеЗаполнено(ГотовыйДескриптор) Тогда

Возврат ГотовыйДескриптор;

КонецЕсли;

// Запись нового дескриптора

Если Немедленно Тогда

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

КонецЕсли;

НовыйДескриптор.Записать();

Возврат НовыйДескриптор.Ссылка;

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

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

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

// Вызов переопределяемого метода

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

// Обновление прав на файлы

ОбновитьПраваФайловОбъекта(Объект);

// Обновление прав на регистры

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

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

"ВЫБРАТЬ

| ДескрипторыДоступаРегистров.Ссылка

|ИЗ

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

|ГДЕ

| ДескрипторыДоступаРегистров.ОбъектДоступа1 = &ОбъектДоступа1

|

|ОБЪЕДИНИТЬ ВСЕ

|

|ВЫБРАТЬ

| ДескрипторыДоступаРегистров.Ссылка

|ИЗ

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

|ГДЕ

| ДескрипторыДоступаРегистров.ОбъектДоступа2 = &ОбъектДоступа2

|

|ОБЪЕДИНИТЬ ВСЕ

|

|ВЫБРАТЬ

| ДескрипторыДоступаРегистров.Ссылка

|ИЗ

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

|ГДЕ

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

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

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

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

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

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

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

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

КонецЦикла;

// Обновление прав на задачи процессов

Если ЭтоБизнесПроцесс(Объект.Ссылка) Тогда

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

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

КонецЕсли;


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

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

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

Если Не ЗначениеЗаполнено(Папка) Тогда

Возврат;

КонецЕсли;

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

ИмяТаблицы = Папка.Метаданные().ПолноеИмя();

// Отбор всех папок в иерархии

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

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

"ВЫБРАТЬ

| ТаблицаПапок.Ссылка

|ИЗ

| #Таблица КАК ТаблицаПапок

|ГДЕ

| ТаблицаПапок.Ссылка В ИЕРАРХИИ (&Папка)";

Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Таблица", ИмяТаблицы);

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

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

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

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

// Обновление прав для каждой папки

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

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

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

КонецЦикла;

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

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

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

// Обновление дескрипторов объектов

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

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

"ВЫБРАТЬ

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

|ИЗ

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

|ГДЕ

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

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

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

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

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

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

КонецЦикла;

// Обновление дескрипторов файлов

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

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

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

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

ЗначенияДоступа = Новый Массив;

Для каждого Эл Из Профиль.ВидыДоступа Цикл

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

Если Эл.ВидДоступа = ПланыВидовХарактеристик.ВидыДоступа.ДополнительныеСведения

ИЛИ Эл.ВидДоступа = ПланыВидовХарактеристик.ВидыДоступа.Пользователи Тогда

Продолжить;

КонецЕсли;

ВсеЗначенияВида = ПолучитьВсеЗначенияВидаДоступа(Эл.ВидДоступа);

Для каждого ЗначениеВида Из ВсеЗначенияВида Цикл

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


КонецЦикла;

// Добавление пустой ссылки

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

КонецЦикла;

ОбновитьПраваПоЗначениямВидовДоступа(ЗначенияДоступа);

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

// Возвращает массив значений доступа, права по которым определяет указанная

// группа доступа

Функция ПолучитьЗначенияДоступаГруппыДоступа(ГруппаДоступа)

ЗначенияДоступа = Новый Массив;

Для каждого Эл Из ГруппаДоступа.Профиль.ВидыДоступа Цикл

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

Если Эл.ВидДоступа = ПланыВидовХарактеристик.ВидыДоступа.ДополнительныеСведения

ИЛИ Эл.ВидДоступа = ПланыВидовХарактеристик.ВидыДоступа.Пользователи Тогда

Продолжить;

КонецЕсли;

ВсеЗначенияВида = ПолучитьВсеЗначенияВидаДоступа(Эл.ВидДоступа);

Для каждого ЗначениеВида Из ВсеЗначенияВида Цикл

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

КонецЦикла;

// Добавление пустой ссылки

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

КонецЦикла;

Возврат ЗначенияДоступа;

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

Процедура ЗаполнитьЗначенияГруппыДоступаПоВидуДоступа(ЗначенияДоступа, ГруппаДоступа, ВидДоступа)

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

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

"ВЫБРАТЬ

| ЗначенияГруппДоступа.ЗначениеДоступа КАК ЗначениеДоступа,

| ЗначенияГруппДоступа.ТолькоВидДоступа КАК Разрешено

|ИЗ

| РегистрСведений.ЗначенияГруппДоступа КАК ЗначенияГруппДоступа

|ГДЕ

| ЗначенияГруппДоступа.ГруппаДоступа = &ГруппаДоступа

| И ЗначенияГруппДоступа.ВидДоступа = &ВидДоступа";

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

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

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

Если ВыборкаДетальныеЗаписи.Количество() <> 0 Тогда

Если ВыборкаДетальныеЗаписи.Количество() = 1 Тогда

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

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

// Указано разрешение или запрещение

ЗначениеДоступа = Новый Структура;

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

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

ЗначенияДоступа.Добавить(ЗначениеДоступа);

Иначе

// Все запрещены

ВсеЗначения = ПолучитьВсеЗначенияВидаДоступа(ВидДоступа);

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

ЗначениеДоступа = Новый Структура;


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

ЗначениеДоступа.Вставить("Разрешено", Ложь);

ЗначенияДоступа.Добавить(ЗначениеДоступа);

КонецЦикла;

КонецЕсли;

КонецЕсли;

Иначе

// Указан список разрешенных или запрещенных

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

Если ВыборкаДетальныеЗаписи.ЗначениеДоступа <> Неопределено Тогда

ЗначениеДоступа = Новый Структура;

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

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

ЗначенияДоступа.Добавить(ЗначениеДоступа);

КонецЕсли;

КонецЦикла;

КонецЕсли;

Иначе

// Все разрешены, добавляем все значения, соответствующие этому виду доступа

ВсеЗначения = ПолучитьВсеЗначенияВидаДоступа(ВидДоступа);

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

ЗначениеДоступа = Новый Структура;

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

ЗначениеДоступа.Вставить("Разрешено", Истина);

ЗначенияДоступа.Добавить(ЗначениеДоступа);

КонецЦикла;

КонецЕсли;

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

Функция ПолучитьВсеЗначенияВидаДоступа(ВидДоступа)

Типы = ВидДоступа.ТипЗначения.Типы();

Если Типы.Количество() > 1 Тогда

ВызватьИсключение НСтр("ru = 'Число типов вида доступа больше 1.'");

КонецЕсли;

МетаданныеТипа = Метаданные.НайтиПоТипу(Типы[0]);

ИмяТаблицы = МетаданныеТипа.ПолноеИмя();

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

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

"ВЫБРАТЬ

| Таблица.Ссылка

|ИЗ

| #Таблица КАК Таблица";

Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Таблица", ИмяТаблицы);

Возврат Запрос.Выполнить().Выгрузить();

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

Функция ПолучитьПустуюСсылкуДляВидаДоступа(ВидДоступа)

ПустаяСсылка = Неопределено;

Типы = ВидДоступа.ТипЗначения.Типы();

Если Типы.Количество() > 1 Тогда

ВызватьИсключение НСтр("ru = 'Число типов вида доступа больше 1.'");

КонецЕсли;

МетаданныеТипа = Метаданные.НайтиПоТипу(Типы[0]);

Менеджер = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(МетаданныеТипа.ПолноеИмя());

ПустаяСсылка = Менеджер.ПустаяСсылка();

Возврат ПустаяСсылка;

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

Процедура ОбновитьПраваЗависящиеОтГруппыДоступа(ГруппаДоступа)

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

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

ОбновитьПраваПоЗначениямВидовДоступа(ЗначенияДоступа);

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

// Обновляет права всех дескрипторов доступа в которых есть ссылки на


// указанные значения доступа

Процедура ОбновитьПраваПоЗначениямВидовДоступа(ЗначенияДоступа)

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

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

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

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

"ВЫБРАТЬ

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

|ИЗ

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

|ГДЕ

| ДескрипторыДоступаОбъектов.ВидОбъекта В(&ЗначенияДоступа)

|

|ОБЪЕДИНИТЬ ВСЕ

|

|ВЫБРАТЬ

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

|ИЗ

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

|ГДЕ

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

|

|ОБЪЕДИНИТЬ ВСЕ

|

|ВЫБРАТЬ

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

|ИЗ

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

|ГДЕ

| ДескрипторыДоступаОбъектов.ГрифДоступа В(&ЗначенияДоступа)

|

|ОБЪЕДИНИТЬ ВСЕ

|

|ВЫБРАТЬ

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

|ИЗ

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

|ГДЕ

| ДескрипторыДоступаОбъектов.Организация В(&ЗначенияДоступа)";

Запрос.УстановитьПараметр("ЗначенияДоступа", ЗначенияДоступа);

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

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

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

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

КонецЦикла;

// Поиск и обновление дексрипторов по группам доступа корреспондентов

ГруппыДоступаКорреспондентов = Новый Массив();

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

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

ГруппыДоступаКорреспондентов.Добавить(Эл);

КонецЕсли;

КонецЦикла;

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

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

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

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

|ИЗ

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

|ГДЕ

| ДескрипторыДоступаОбъектовКорреспонденты.ГруппаДоступа В(&ГруппыДоступаКорреспондентов)";

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

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

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

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

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