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