Файл: Разработка регламента выполнения процесса «Управление документооборотом» (1 Построение бизнес-процессов «как есть»).pdf
Добавлен: 28.06.2023
Просмотров: 333
Скачиваний: 2
СОДЕРЖАНИЕ
1 Построение бизнес-процессов «как есть»
1.1 Описание предметной области. Постановка задачи
1.2 Выбор средства для моделирования бизнес-процессов
1.3 Моделирование бизнес-процессов «как есть»
2 Построение бизнес-процессов «как должно быть»
2.1 Предлагаемые мероприятия по улучшению бизнес-процессов
Поз = Найти(Расширение, ".");
Если Поз = 0 Тогда
Возврат Новый Структура("Имя, Расширение", СокрЛП(ИмяФайла), "");
КонецЕсли;
Пока Поз > 0 Цикл
Расширение = Сред(Расширение, Поз + 1);
Поз = Найти(Расширение, ".");
КонецЦикла;
Имя = Лев(ИмяФайла, СтрДлина(ИмяФайла) - СтрДлина(Расширение) - 1);
Возврат Новый Структура("Имя, Расширение", СокрЛП(Имя), СокрЛП(Расширение));
КонецФункции
// Возвращает структуру
// Результат (Структура)
// - Каталог (Строка) - без последнего слеша
// - ИмяФайла (Строка) - имя файла с расширением
// - Имя (Строка)
// - Расширение (Строка) - без точки
//
// Параметры:
// - ПолноеИмяФайла (Строка)
//
Функция РазложитьПолноеИмяФайла(ПолноеИмяФайла) Экспорт
ИмяФайла = ПолноеИмяФайла;
Каталог = "";
Пока Истина Цикл
Поз = Макс(Найти(ИмяФайла, "\"), Найти(ИмяФайла, "/"));
Если Поз = 0 Тогда
Прервать;
КонецЕсли;
Каталог = Каталог + Лев(ИмяФайла, Поз);
ИмяФайла = Сред(ИмяФайла, Поз+1);
КонецЦикла;
ПоследнийСимволКаталога = Прав(Каталог, 1);
Если (ПоследнийСимволКаталога = "\") Или (ПоследнийСимволКаталога = "/") Тогда
Каталог = Лев(Каталог, СтрДлина(Каталог) - 1);
КонецЕсли;
ИияФайлаИнфо = РазложитьИмяФайла(ИмяФайла);
ИияФайлаИнфо.Вставить("ИмяФайла", ИмяФайла);
ИияФайлаИнфо.Вставить("Каталог", Каталог);
Возврат ИияФайлаИнфо;
КонецФункции
/////////////////////////////////////////////////////////////////////////////////////////
// РАБОТА С АДРЕСАМИ ЭЛЕКТРОННОЙ ПОЧТЫ
// Принимает строку почтовых адресов в виде
// "name1 <addr1@dom1>, name2 <addr2@dom2>, ..., nameN <addrN@domN>"
// или
// "name1 <addr1@dom1>; name2 <addr2@dom2>; ...; nameN <addrN@domN>"
// Возвращает:
// Результат (Массив)
// - Элемент (Структура)
// - Адрес (Строка)
// - Представление (Строка)
//
Функция РазложитьСтрокуПочтовыхАдресов(Знач ПочтовыеАдресаСтр) Экспорт
Результат = Новый Массив;
ПочтовыеАдресаСтр= СтрЗаменить(ПочтовыеАдресаСтр, ";", Символы.ПС);
ПочтовыеАдресаСтр = СтрЗаменить(ПочтовыеАдресаСтр, ",", Символы.ПС);
Для Счетчик = 1 По СтрЧислоСтрок(ПочтовыеАдресаСтр) Цикл
АдресСтр = СокрЛП(СтрПолучитьСтроку(ПочтовыеАдресаСтр, Счетчик));
Если ПустаяСтрока(АдресСтр) Тогда
Продолжить;
КонецЕсли;
АдресЭлектроннойПочтыИнфо = РазложитьПредставлениеАдресаЭлектроннойПочты(АдресСтр);
Результат.Добавить(АдресЭлектроннойПочтыИнфо);
КонецЦикла;
Возврат Результат;
КонецФункции
// Принимает строку почтового адреса в виде
// "name <addr@dom>"
// Возвращает:
// Результат (Структура)
// - Адрес (Строка) - addr@dom
// - ОтображаемоеИмя (Строка) - name
// - Пользователь (Строка)- addr
// - Домен (Строка) - dom
//
Функция РазложитьПредставлениеАдресаЭлектроннойПочты(Знач АдресЭлектроннойПочтыСтр) Экспорт
Результат = Новый Структура("Адрес, ОтображаемоеИмя, Пользователь, Домен", "", "", "", "");
АдресЭлектроннойПочтыСтр = СокрЛП(АдресЭлектроннойПочтыСтр);
Поз = Найти(АдресЭлектроннойПочтыСтр, "<");
Результат.ОтображаемоеИмя = "";
Результат.Адрес = АдресЭлектроннойПочтыСтр;
Если Поз > 0 Тогда
Результат.ОтображаемоеИмя = СокрЛП(Лев(АдресЭлектроннойПочтыСтр, Поз - 1));
АдресЭлектроннойПочтыСтр = Сред(АдресЭлектроннойПочтыСтр, Поз + 1);
Поз = Найти(АдресЭлектроннойПочтыСтр, ">");
Если Поз > 0 Тогда
Результат.Адрес = СокрЛП(Лев(АдресЭлектроннойПочтыСтр, Поз - 1));
Иначе
Результат.Адрес = "";
КонецЕсли;
КонецЕсли;
Если Не ЭтоАдресЭлектроннойПочты(Результат.Адрес) Тогда
Результат.Адрес = "";
Иначе
Поз = Найти(Результат.Адрес, "@");
Результат.Пользователь = Лев(Результат.Адрес, Поз - 1);
Результат.Домен = Сред(Результат.Адрес, Поз + 1);
КонецЕсли;
Возврат Результат;
КонецФункции
// Проверяет строку на формат адреса электронной почты
// проверка не точная но основные элементы на месте
//
Функция ЭтоАдресЭлектроннойПочты(АдресЭлектроннойПочты) Экспорт
Поз = Найти(АдресЭлектроннойПочты, "@");
Если Поз = 0 Тогда
Возврат Ложь;
КонецЕсли;
Если СтрЧислоВхождений(АдресЭлектроннойПочты, "@") <> 1 Тогда
Возврат Ложь;
КонецЕсли;
Если Прав(АдресЭлектроннойПочты, 1) = "."
Или Лев(АдресЭлектроннойПочты, 1) = "." Тогда
Возврат Ложь;
КонецЕсли;
Если Найти(АдресЭлектроннойПочты, "..") > 0 Тогда
Возврат Ложь;
КонецЕсли;
ДопустимыеСимволы = "-.0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz";
Для НомерСимвола = 1 По СтрДлина(АдресЭлектроннойПочты) Цикл
Если Найти(ДопустимыеСимволы, Сред(АдресЭлектроннойПочты, НомерСимвола, 1)) = 0 Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Пользователь = Лев(АдресЭлектроннойПочты, Поз - 1);
Если СтрДлина(Пользователь) = 0 Тогда
Возврат Ложь;
КонецЕсли;
Сервер = Сред(АдресЭлектроннойПочты, Поз + 1);
Если СтрДлина(Сервер) = 0 Тогда
Возврат Ложь;
КонецЕсли;
Поз = Найти(Сервер, ".");
Если Поз = 0 Тогда
Возврат Ложь;
КонецЕсли;
Возврат Истина;
КонецФункции
//Формирует представление адресата электронной почты
//
//Параметры
// Имя - Строка - имя адресата
// Адрес - Строка - адрес электронной почты адресата
// Контакт - СправочникСсылка - контакт, которому принадлежит имя и адрес почты.
//
// Результат (Строка) - "Имя <Адрес>" или "Адрес"
//
Функция ПолучитьПредставлениеАдресаЭлектроннойПочты(Имя, Адрес) Экспорт
Если ПустаяСтрока(Имя) Или Имя = Адрес Тогда
Результат = Адрес;
ИначеЕсли ПустаяСтрока(Адрес) Тогда
Результат = Имя;
Иначе
Результат = Имя + " <" + Адрес + ">";
КонецЕсли;
Возврат Результат;
КонецФункции
/////////////////////////////////////////////////////////////////////////////////////////
// РАБОТА С ТЕКСТОМ
// Удаляет недопустимые символы в XML-строке
// Параметры:
// - Текст (Строка)
// - СимволЗамены (Строка)
//
// Результат (Строка)
//
Функция УдалитьНедопустимыеСимволыXML(Знач Текст) Экспорт
#Если Не ВебКлиент Тогда
ПозицияНачала = 1;
Пока Истина Цикл
Если ПозицияНачала > СтрДлина(Текст) Тогда
Прервать;
КонецЕсли;
Позиция = НайтиНедопустимыеСимволыXML(Текст, ПозицияНачала);
Если Позиция = 0 Тогда
Прервать;
КонецЕсли;
// Если возращается позиция, больше чем должна быть, то корректируем ее.
Если Позиция > 1 Тогда
НедопустимыйСимвол = Сред(Текст, Позиция - 1, 1);
Если НайтиНедопустимыеСимволыXML(НедопустимыйСимвол) > 0 Тогда
Текст = СтрЗаменить(Текст, НедопустимыйСимвол, "");
КонецЕсли;
КонецЕсли;
НедопустимыйСимвол = Сред(Текст, Позиция, 1);
Если НайтиНедопустимыеСимволыXML(НедопустимыйСимвол) > 0 Тогда
Текст = СтрЗаменить(Текст, НедопустимыйСимвол, "");
КонецЕсли;
ПозицияНачала = Макс(1, Позиция - 1);
КонецЦикла;
#КонецЕсли
Возврат Текст;
КонецФункции
// Удаляет пустые строки в тексте.
//
Процедура УдалитьПустыеСтроки(Текст) Экспорт
Результат = "";
Для Индекс = 1 По СтрЧислоСтрок(Текст) Цикл
Строка = СтрПолучитьСтроку(Текст, Индекс);
Если ЗначениеЗаполнено(Строка) Тогда
ДобавитьЗначениеКСтрокеЧерезРазделитель(
Результат,
Символы.ПС,
Строка);
КонецЕсли;
КонецЦикла;
Текст = Результат;
КонецПроцедуры
// Добавляет к каждой строке спереди символ квотирования.
//
Процедура ДобавитьКвотирование(Текст, Знач СимволКвотирования) Экспорт
Результат = "";
Для Индекс = 1 По СтрЧислоСтрок(Текст) Цикл
Строка = СтрПолучитьСтроку(Текст, Индекс);
ДобавитьЗначениеКСтрокеЧерезРазделитель(
Результат,
Символы.ПС,
СимволКвотирования + Строка);
КонецЦикла;
Текст = Результат;
КонецПроцедуры
// Заменяет в переданном тексте ошибочные последовательности переноса строк.
// Все последовательности [ВК]+ПС заменяются на ВК+ПС.
// Все одиночные символы ВК заменяются на ВК+ПС.
//
Процедура ИсправитьПереносыСтрок(Текст) Экспорт
Пока Найти(Текст, Символы.ВК + Символы.ПС) > 0 Цикл
Текст = СтрЗаменить(Текст, Символы.ВК + Символы.ПС, Символы.ПС);
КонецЦикла;
Если Найти(Текст, Символы.ВК) > 0 Тогда
Текст = СтрЗаменить(Текст, Символы.ВК, Символы.ПС);
КонецЕсли;
КонецПроцедуры
/////////////////////////////////////////////////////////////////////////////////////////
// РАБОТА С ПРЕДСТАВЛЕНИЕМ РАЗМЕРОВ
// Принимает размер в байтах.
// Возвращает строку, например: 7.2 Кбайт, 35 Кбайт, 5.5 Мбайт, 12 Мбайт
Функция ПолучитьРазмерСтрокой(Размер) Экспорт
Если Размер = 0 Тогда
Возврат "-";
ИначеЕсли Размер < 1024 * 10 Тогда // < 10 Кб
Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = '%1 Кб'"),
Формат(Макс(1, Окр(Размер / 1024, 1, 1)), "ЧГ=0"));
ИначеЕсли Размер < 1024 * 1024 Тогда // < 1 Мб
Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = '%1 Кб'"),
Формат(Цел(Размер / 1024), "ЧГ=0"));
ИначеЕсли Размер < 1024 * 1024 * 10 Тогда // < 10 Мб
Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = '%1 Мб'"),
Формат(Окр(Размер / 1024 / 1024, 1, 1), "ЧГ=0"));
Иначе // >= 10 Мб
Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = '%1 Мб'"),
Формат(Цел(Размер / 1024 / 1024), "ЧГ=0"));
КонецЕсли;
КонецФункции
/////////////////////////////////////////////////////////////////////////////////////////
// РАБОТА С КОДИРОВКАМИ
// Функция возвращает таблицу имен кодировок
// Возвращаемое значение:
// Результат (СписокЗначений)
// - Значение (Строка) - например "ibm852"
// - Представление (Строка) - например "ibm852 (Центральноевропейская DOS)"
//
Функция ПолучитьСписокКодировок() Экспорт
СписокКодировок = Новый СписокЗначений;
СписокКодировок.Добавить("ibm852", "IBM852 (Центральноевропейская DOS)");
СписокКодировок.Добавить("ibm866", "IBM866 (Кириллица DOS)");
СписокКодировок.Добавить("iso-8859-1", "ISO-8859-1 (Западноевропейская ISO)");
СписокКодировок.Добавить("iso-8859-2", "ISO-8859-2 (Центральноевропейская ISO)");
СписокКодировок.Добавить("iso-8859-3", "ISO-8859-3 (Латиница 3 ISO)");
СписокКодировок.Добавить("iso-8859-4", "ISO-8859-4 (Балтийская ISO)");
СписокКодировок.Добавить("iso-8859-5", "ISO-8859-5 (Кириллица ISO)");
СписокКодировок.Добавить("iso-8859-7", "ISO-8859-7 (Греческая ISO)");
СписокКодировок.Добавить("iso-8859-9", "ISO-8859-9 (Турецкая ISO)");
СписокКодировок.Добавить("iso-8859-15", "ISO-8859-15 (Латиница 9 ISO)");
СписокКодировок.Добавить("koi8-r", "KOI8-R (Кириллица KOI8-R)");
СписокКодировок.Добавить("koi8-u", "KOI8-U (Кириллица KOI8-U)");
СписокКодировок.Добавить("us-ascii", "US-ASCII США");
СписокКодировок.Добавить("utf-8", "UTF-8 (Юникод UTF-8)");
СписокКодировок.Добавить("windows-1250", "Windows-1250 (Центральноевропейская Windows)");
СписокКодировок.Добавить("windows-1251", "windows-1251 (Кириллица Windows)");
СписокКодировок.Добавить("windows-1252", "Windows-1252 (Западноевропейская Windows)");
СписокКодировок.Добавить("windows-1253", "Windows-1253 (Греческая Windows)");
СписокКодировок.Добавить("windows-1254", "Windows-1254 (Турецкая Windows)");
СписокКодировок.Добавить("windows-1257", "Windows-1257 (Балтийская Windows)");
Возврат СписокКодировок;
КонецФункции
/////////////////////////////////////////////////////////////////////////////////////////
// ПРОЧИЕ ФУНКЦИИ
// Выделяет продстроку в скобках.
// Напрмер: ВыделитьПодстрокуВСкобках("Name <name@company.ru>", "<", ">") = "name@company.ru"
//
Функция ВыделитьПодстрокуВСкобках(Знач Строка, Знач ЛеваяСкобка, Знач ПраваяСкобка) Экспорт
Поз = Найти(Строка, ЛеваяСкобка);
Если Поз <> 0 Тогда
Строка = Сред(Строка, Поз+1);
КонецЕсли;
Поз = Найти(Строка, ПраваяСкобка);
Если Поз <> 0 Тогда
Строка = Лев(Строка, Поз-1);
КонецЕсли;
Возврат Строка;
КонецФункции
// Ищет подстроку в строке, после указанной позиции
//
Функция НайтиПосле(Строка, Подстрока, НачальнаяПозиция = 0) Экспорт
Позиция = Найти(Сред(Строка, НачальнаяПозиция + 1), Подстрока);
Если Позиция = 0 Тогда
Возврат 0;
КонецЕсли;
Возврат НачальнаяПозиция + Позиция;
КонецФункции
Функция ПолучитьСвязанныйДокумент(Документ, Знач ТипСвязи) Экспорт
Если ТипЗнч(ТипСвязи) = Тип("Строка") Тогда
ТипСвязи = Справочники.ТипыСвязей[ТипСвязи];
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
| СвязиДокументов.СвязанныйДокумент,
| СвязиДокументов.Комментарий,
| СвязиДокументов.Установил,
| СвязиДокументов.ДатаУстановки
|ИЗ
| РегистрСведений.СвязиДокументов КАК СвязиДокументов
|ГДЕ
| СвязиДокументов.Документ = &Документ
| И СвязиДокументов.ТипСвязи = &ТипСвязи";
Запрос.УстановитьПараметр("Документ", Документ);
Запрос.УстановитьПараметр("ТипСвязи", ТипСвязи);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат Неопределено;
КонецЕсли;
Выборка = Результат.Выбрать();
Выборка.Следующий();