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