Файл: Разработка регламента выполнения процесса «Управление документооборотом» (1 Построение бизнес-процессов «как есть»).pdf
Добавлен: 28.06.2023
Просмотров: 346
Скачиваний: 2
СОДЕРЖАНИЕ
1 Построение бизнес-процессов «как есть»
1.1 Описание предметной области. Постановка задачи
1.2 Выбор средства для моделирования бизнес-процессов
1.3 Моделирование бизнес-процессов «как есть»
2 Построение бизнес-процессов «как должно быть»
2.1 Предлагаемые мероприятия по улучшению бизнес-процессов
КонецПроцедуры
// Извлечь текст из файла и поместить в ХранилищеЗначения
Функция ИзвлечьТекстВХранилищеЗначения(ПолноеИмяФайла) Экспорт
Текст = "";
ИзвлекатьТекстыФайловНаСервере = Константы.ИзвлекатьТекстыФайловНаСервере.Получить();
Если Не ИзвлекатьТекстыФайловНаСервере Тогда
ТипПлатформыСервера = ОбщегоНазначенияПовтИсп.ТипПлатформыСервера();
Если ТипПлатформыСервера = ТипПлатформы.Windows_x86 ИЛИ ТипПлатформыСервера = ТипПлатформы.Windows_x86_64 Тогда
Текст = ФайловыеФункцииКлиентСервер.ИзвлечьТекст(ПолноеИмяФайла);
КонецЕсли;
КонецЕсли;
Если ПустаяСтрока(Текст) Тогда
Возврат "";
КонецЕсли;
ХранилищеЗначения = Новый ХранилищеЗначения(Текст);
Возврат ХранилищеЗначения;
КонецФункции
// Разыменовать lnk файл
Функция РазыменоватьLnkФайл(ВыбранныйФайл) Экспорт
ТипПлатформыСервера = ОбщегоНазначенияПовтИсп.ТипПлатформыСервера();
Если ТипПлатформыСервера = ТипПлатформы.Windows_x86 ИЛИ ТипПлатформыСервера = ТипПлатформы.Windows_x86_64 Тогда
ShellApp = Новый COMОбъект("shell.application");
FolderObj = ShellApp.NameSpace(ВыбранныйФайл.Путь); // полный (только) путь на lnk-файл
FolderObjItem = FolderObj.items().item(ВыбранныйФайл.Имя); // только имя lnk-файла
Link = FolderObjItem.GetLink();
Возврат Новый Файл(Link.path);
КонецЕсли;
Возврат ВыбранныйФайл;
КонецФункции
// Рекурсивная функция импорта файлов с диска - принимает массив файлов (или каталогов)
// - если файл, просто добавляет его, если каталог - создает группу и рекурсивно вызывает саму себя
Процедура ИмпортФайлов(
Владелец,
Путь,
ФайлыАргумент,
Индикатор,
МассивИменФайловСОшибками,
МассивСтруктурВсехФайлов,
Комментарий,
ХранитьВерсии,
Рекурсивно,
КоличествоСуммарное,
Счетчик,
ИдентификаторФормы,
Знач ПсевдоФайловаяСистема,
ДобавленныеФайлы,
МассивВсехПапок,
РежимЗагрузки,
Пользователь,
ПараметрыРаспознавания) Экспорт
Перем ПерваяПапкаСТакимЖеИменем;
Перем ДокГруппаСсылка;
МаксРазмерФайла = ФайловыеФункции.ПолучитьМаксимальныйРазмерФайла();
ЗапретЗагрузкиФайловПоРасширению = ФайловыеФункции.ПолучитьЗапретЗагрузкиФайловПоРасширению();
СписокЗапрещенныхРасширений = ФайловыеФункции.ПолучитьСписокЗапрещенныхРасширений();
Для Каждого ВыбранныйФайл Из ФайлыАргумент Цикл
Попытка
Если ВыбранныйФайл.Существует() Тогда
Если ВыбранныйФайл.Расширение = ".lnk" Тогда
ВыбранныйФайл = РазыменоватьLnkФайл(ВыбранныйФайл);
КонецЕсли;
Если ВыбранныйФайл.ЭтоКаталог() Тогда
Если Рекурсивно = Истина Тогда
НовыйПуть = Строка(ВыбранныйФайл.Путь);
ОбщегоНазначенияКлиентСервер.ДобавитьСлешЕслиНужно(НовыйПуть, ОбщегоНазначенияПовтИсп.ТипПлатформыСервера());
НовыйПуть = НовыйПуть + Строка(ВыбранныйФайл.Имя);
МассивФайлов = ФайловыеФункцииКлиентСервер.НайтиФайлыПсевдо(ПсевдоФайловаяСистема, НовыйПуть);
// Создаем группу в справочнике - эквивалент папки на диске
Если МассивФайлов.Количество() <> 0 Тогда
ИмяФайла = ВыбранныйФайл.Имя;
Если РаботаСФайламиВызовСервера.ЕстьПапкаСТакимИменем(ИмяФайла, Владелец, ПерваяПапкаСТакимЖеИменем) Тогда
ДокГруппаСсылка = ПерваяПапкаСТакимЖеИменем;
Иначе
ДокГруппаСсылка = РаботаСФайламиВызовСервера.СправочникиПапкиСоздатьЭлемент(ИмяФайла, Владелец, Пользователь);
КонецЕсли;
ИмпортФайлов(
ДокГруппаСсылка,
НовыйПуть,
МассивФайлов,
Индикатор,
МассивИменФайловСОшибками,
МассивСтруктурВсехФайлов,
Комментарий,
ХранитьВерсии,
Рекурсивно,
КоличествоСуммарное,
Счетчик,
ИдентификаторФормы,
ПсевдоФайловаяСистема,
ДобавленныеФайлы,
МассивВсехПапок,
РежимЗагрузки,
Пользователь,
ПараметрыРаспознавания);
МассивВсехПапок.Добавить(НовыйПуть);
КонецЕсли;
КонецЕсли;
Продолжить;
КонецЕсли;
Если Не ФайловыеФункцииКлиентСервер.ФайлМожноЗагружать(ВыбранныйФайл, МаксРазмерФайла, ЗапретЗагрузкиФайловПоРасширению, СписокЗапрещенныхРасширений, МассивИменФайловСОшибками) Тогда
Продолжить;
КонецЕсли;
// Создаем Элемент справочника Файлы
ИмяБезРасширения = ВыбранныйФайл.ИмяБезРасширения;
Расширение = ВыбранныйФайл.Расширение;
Если РежимЗагрузки Тогда
Если РаботаСФайламиВызовСервера.ЕстьФайлСТакимИменем(ИмяБезРасширения, Владелец) Тогда
Запись = Новый Структура;
Запись.Вставить("ИмяФайла", ВыбранныйФайл.ПолноеИмя);
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Файл с таким именем уже есть в информационной базе в папке ""%1""'"),
Строка(Владелец));
Запись.Вставить("Ошибка", ТекстОшибки);
МассивИменФайловСОшибками.Добавить(Запись);
Продолжить;
КонецЕсли;
КонецЕсли;
АдресВременногоХранилищаФайла = ВыбранныйФайл.ПолноеИмя;
АдресВременногоХранилищаТекста = ИзвлечьТекстВХранилищеЗначения(
ВыбранныйФайл.ПолноеИмя);
// Создаем элемент справочника Файлы
РаботаСФайламиКлиентСервер.СоздатьЭлементСправочникаФайлы(ВыбранныйФайл, МассивСтруктурВсехФайлов,
Владелец, ИдентификаторФормы, Комментарий, ХранитьВерсии, ДобавленныеФайлы,
АдресВременногоХранилищаФайла, АдресВременногоХранилищаТекста, Пользователь,
ПараметрыРаспознавания);
Иначе
Запись = Новый Структура;
Запись.Вставить("ИмяФайла", ВыбранныйФайл.ПолноеИмя);
Запись.Вставить("Ошибка", НСтр("ru = 'Файл отсутствует на диске'"));
МассивИменФайловСОшибками.Добавить(Запись);
КонецЕсли;
Исключение
ОшибкаИнфо = ИнформацияОбОшибке();
СообщениеОбОшибке = "";
Если ОшибкаИнфо.Причина = Неопределено Тогда
СообщениеОбОшибке =ОшибкаИнфо.Описание;
Иначе
СообщениеОбОшибке = ОшибкаИнфо.Причина.Описание;
КонецЕсли;
Запись = Новый Структура;
Запись.Вставить("ИмяФайла", ВыбранныйФайл.ПолноеИмя);
Запись.Вставить("Ошибка", СообщениеОбОшибке);
МассивИменФайловСОшибками.Добавить(Запись);
КонецПопытки;
КонецЦикла;
КонецПроцедуры
// Импорт - с вспомогательными операциями типа проверки предельного размера и впоследствии удаления файлов и показа ошибок
// при импорте только одной папки - вернет на нее ссылку
Функция ИмпортФайловВыполнить(
ПапкаДляДобавления,
ВыбранныеФайлы,
Комментарий,
ХранитьВерсии,
УдалятьФайлыПослеДобавления,
Рекурсивно,
ИдентификаторФормы,
Знач ПсевдоФайловаяСистема,
ДобавленныеФайлы,
РежимЗагрузки,
Пользователь,
МассивИменФайловСОшибками,
СтратегияРаспознавания,
ЯзыкРаспознавания) Экспорт
Перем ПерваяПапкаСТакимЖеИменем;
Перем ПапкаДляДобавленияТекущая;
ВыбранКаталог = Ложь;
Путь = "";
КоличествоСуммарное = 0;
МассивФайлов = Новый Массив;
Счетчик = 0;
Индикатор = 0;
МассивСтруктурВсехФайлов = Новый Массив;
МассивВсехПапок = Новый Массив;
ПапкаДляДобавленияТекущая = Неопределено;
// параметры распознавания по умолчанию
РаспознатьПослеДобавления = Истина;
Если СтратегияРаспознавания = Перечисления.СтратегииРаспознаванияТекста.НеРаспознавать Тогда
РаспознатьПослеДобавления = Ложь;
КонецЕсли;
ИспользоватьРаспознавание = РаботаСФайламиВызовСервера.ПолучитьИспользоватьРаспознавание();
Если ИспользоватьРаспознавание = Ложь Тогда
РаспознатьПослеДобавления = Ложь;
КонецЕсли;
ПараметрыРаспознавания = Новый Структура("СтратегияРаспознавания, ЯзыкРаспознавания, РаспознатьПослеДобавления",
СтратегияРаспознавания, ЯзыкРаспознавания, РаспознатьПослеДобавления);
Для Каждого ИмяФайла Из ВыбранныеФайлы Цикл
Попытка
ВыбранныйФайл = Новый Файл(ИмяФайла.Значение);
ВыбранКаталог = Ложь;
Если ВыбранныйФайл.Существует() Тогда
ВыбранКаталог = ВыбранныйФайл.ЭтоКаталог();
КонецЕсли;
Если ВыбранКаталог Тогда
Путь = ИмяФайла.Значение;
МассивФайловЭтогоКаталога = ФайловыеФункцииКлиентСервер.НайтиФайлыПсевдо(ПсевдоФайловаяСистема, Путь);
ИмяПапки = ВыбранныйФайл.Имя;
Если РаботаСФайламиВызовСервера.ЕстьПапкаСТакимИменем(ИмяПапки, ПапкаДляДобавления, ПерваяПапкаСТакимЖеИменем) Тогда
ПапкаДляДобавленияТекущая = ПерваяПапкаСТакимЖеИменем;
Иначе
ПапкаДляДобавленияТекущая = РаботаСФайламиВызовСервера.СправочникиПапкиСоздатьЭлемент(ИмяПапки, ПапкаДляДобавления, Пользователь);
КонецЕсли;
// Собственно импорт
ИмпортФайлов(
ПапкаДляДобавленияТекущая,
Путь,
МассивФайловЭтогоКаталога,
Индикатор,
МассивИменФайловСОшибками,
МассивСтруктурВсехФайлов,
Комментарий,
ХранитьВерсии,
Рекурсивно,
КоличествоСуммарное,
Счетчик,
ИдентификаторФормы,
ПсевдоФайловаяСистема,
ДобавленныеФайлы,
МассивВсехПапок,
РежимЗагрузки,
Пользователь,
ПараметрыРаспознавания);
МассивВсехПапок.Добавить(Путь);
Иначе
МассивФайлов.Добавить(ВыбранныйФайл);
КонецЕсли;
Исключение
// запись в журнал регистрации
ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Ошибка автоматической загрузки файлов: ""%1""'"),
ОписаниеОшибки);
ЗаписьЖурналаРегистрации("Автоматическая загрузка файлов",
УровеньЖурналаРегистрации.Ошибка, , ,
ТекстСообщения);
КонецПопытки;
КонецЦикла;
Если МассивФайлов.Количество() <> 0 Тогда
// Собственно импорт
ИмпортФайлов(
ПапкаДляДобавления,
Путь,
МассивФайлов,
Индикатор,
МассивИменФайловСОшибками,
МассивСтруктурВсехФайлов,
Комментарий,
ХранитьВерсии,
Рекурсивно,
КоличествоСуммарное,
Счетчик,
ИдентификаторФормы,
ПсевдоФайловаяСистема,
ДобавленныеФайлы,
МассивВсехПапок,
РежимЗагрузки,
Пользователь,
ПараметрыРаспознавания);
КонецЕсли;
Если УдалятьФайлыПослеДобавления = Истина Тогда
ФайловыеФункцииКлиентСервер.УдалитьФайлыПослеДобавления(МассивСтруктурВсехФайлов, МассивВсехПапок, РежимЗагрузки);
КонецЕсли;
// Вывод сообщений об ошибках
Для Каждого Выборка Из МассивИменФайловСОшибками Цикл
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Ошибка автоматической загрузки файла ""%1"": ""%2""'"),
Выборка.ИмяФайла, Выборка.Ошибка);
ЗаписьЖурналаРегистрации("Автоматическая загрузка файлов",
УровеньЖурналаРегистрации.Ошибка, , ,
ТекстСообщения);
КонецЦикла;
Если ВыбранныеФайлы.Количество() <> 1 Тогда
ПапкаДляДобавленияТекущая = Неопределено;
КонецЕсли;
Возврат ПапкаДляДобавленияТекущая;
КонецФункции
Функция ЕстьПравоДоступа(Пользователь, Папка)
// если не включена функциональная опция "использовать права доступа" - то не делаем проверки.
Если Не УправлениеДоступом.ОграничиватьДоступНаУровнеЗаписей() Тогда
Возврат Истина;
КонецЕсли;
Возврат ДокументооборотПраваДоступа.ПолучитьПраваПоОбъекту(Папка, Пользователь).Добавление;
КонецФункции
Процедура ЗагрузкаФайлов(МассивНастроек) Экспорт
Если ТипЗнч(МассивНастроек) <> Тип("Массив") Тогда
Возврат;
КонецЕсли;
Для Каждого Настройка Из МассивНастроек Цикл
КаталогНаДиске = "";
ТипПлатформыСервера = ОбщегоНазначенияПовтИсп.ТипПлатформыСервера();
Если ТипПлатформыСервера = ТипПлатформы.Windows_x86 ИЛИ ТипПлатформыСервера = ТипПлатформы.Windows_x86_64 Тогда
КаталогНаДиске = Настройка.КаталогWindows;
Иначе
КаталогНаДиске = Настройка.КаталогLinux;
КонецЕсли;
Папка = Настройка.Папка;
Пользователь = Настройка.Пользователь;
СтратегияРаспознавания = Неопределено;
ЯзыкРаспознавания = Неопределено;
Если Настройка.Свойство("СтратегияРаспознавания") Тогда
СтратегияРаспознавания = Настройка.СтратегияРаспознавания;
Иначе
СтратегияРаспознавания = Перечисления.СтратегииРаспознаванияТекста.ПоместитьТолькоВТекстовыйОбраз;
КонецЕсли;
Если Настройка.Свойство("ЯзыкРаспознавания") Тогда
ЯзыкРаспознавания = Настройка.ЯзыкРаспознавания;
Иначе
ЯзыкРаспознавания = РаботаСФайламиВызовСервера.ПолучитьЯзыкРаспознавания();
КонецЕсли;
Если ПустаяСтрока(КаталогНаДиске) Тогда
ЗаписьЖурналаРегистрации("Автоматическая загрузка файлов",
УровеньЖурналаРегистрации.Ошибка, , ,
НСтр("ru = 'Не указан каталог на диске'"));
Продолжить;
КонецЕсли;
ФайлКаталога = Новый Файл(КаталогНаДиске);
Если Не ФайлКаталога.Существует() Тогда
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Неверный путь к каталогу на диске: ""%1""'"),
КаталогНаДиске);