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