Отсутствие защиты от дурака в 1С Документооборот 2.1 вынудило погрузиться в решение некоторых лежащих на поверхности проблем конфигурации 1С Документооборот государственного учреждения 2.1. Данное расширение конфигурации призвано
1. Запретить повторную отправку по маршруту документа, если выполнение предыдущего маршрута не завершено
2. Лишить возможности пользователя отправить документ по маршруту, не предназначенного для данного вида документа.
Расширение_ЗапретЗапускаДругогоПроцесса:
1. Для внутренних документов удалены варианты отправки по неродным маршрутам, кроме стандартных процессов.
А стандартные процессы убраны в группу для специальных случаев.
Для других документов все оставлено типовым.
2. Запрещено запускать документ по маршруту если такой же маршрут еще не завершен.
В Конфигурации:Общие — Общие модули -ПомощникОтправить — добавить в расширение
Общие — Бизнес-процессы — Комплексный процесс — добавить в расширение
В расширении:
Создать в Подписки на события подписку РасшЗЗДП_ПодпискаЗапускКомплексногоБП с обработчиком РасшЗЗДП_ПодпискаЗапускКомплексногоБППередЗаписью на событие ПередЗаписью в источнике БизнесПроцессОбъект.КомплексныйПроцесс
Содержание Общие Модули.ПомощникОтправить:
// Добавляет варианты создания процессов.
//
// Параметры:
// Помощник — см. Помощник()
//
#Область СлужебныеПроцедурыИФункции_ВариантыСозданияПроцессов
&Вместо («ДобавитьВДеревоВариантыСозданияПроцессов»)
// 2023-01-09 Модифицировал Богачев И.В.
// Для внутренних документов удалены варианты отправки по неродным маршрутам,
// кроме стандартных процессов
// Стандартные процессы убраны в группу для специальных случаев
Процедура ДобавитьВДеревоВариантыСозданияПроцессовДоработанная(Помощник) Экспорт
Если Не ПолучитьФункциональнуюОпцию(«ИспользоватьБизнесПроцессыИЗадачи») Тогда
Возврат;
КонецЕсли;
// Очищаем основные варианты создания процессов.
Помощник.ОсновныеВариантыСозданияПроцессов.Очистить();
// Выполняем заполнение данных по предметам.
ЗаполнитьДопустимыеТипыПредметовВПроцессах(Помощник);
ЗаполнитьПредметыПроцесса(Помощник);
Если ЗначениеЗаполнено(Помощник.ПредметыПроцесса)
И Не ЕстьПредметыДопустимыеВПроцессах(Помощник) Тогда
Возврат;
КонецЕсли;
ЗаполнитьДопустимыеТипыВариантовДляПредметов(Помощник);
// Вначале определяем все возможные варианты создания процессов,
// с учетом предметов процессов в помощнике.
/// Комплексный процесс, Обработка внутреннего документа, Исполнение, Ознакомление, Рассмотрение и т.п.
/// Надо эти варианты переместить в отдельную группу
ЗаполнитьВариантыСозданияПроцессовПоУмолчанию(Помощник);
/// ЗаполнитьОбщиеВариантыСозданияПроцессов
/// для Заявка на закупку показывает Договор на закупку
/// для Договор на закупку показывает Договор на закупку
ЗаполнитьОбщиеВариантыСозданияПроцессов(Помощник);
/// ЗаполнитьРекомендуемыеВариантыСозданияПроцессов — выводит список шаблонов, прописанных в виде документа в НСИ
ЗаполнитьРекомендуемыеВариантыСозданияПроцессов(Помощник);
/// ЗаполнитьДругиеВариантыСозданияПроцессов — создаёт ветку «Другие варианты», в которой остальные самописные шаблоны процессов
ЗаполнитьДругиеВариантыСозданияПроцессов(Помощник);
// После добавляем в дерево основные варианты создания процессов,
// в отдельной группе остальные доступные варианты.
ДокументЯвляетсяВнутренним = Ложь;
Для Каждого ОбъектОтправки Из Помощник.ОбъектыОтправки Цикл
Если Не ЗначениеЗаполнено(ОбъектОтправки) Тогда
Продолжить;
КонецЕсли;
Если ДелопроизводствоКлиентСервер.ЭтоВнутреннийДокумент(ОбъектОтправки) Тогда
ДокументЯвляетсяВнутренним = Истина;
КонецЕсли;
КонецЦикла;
Если ДокументЯвляетсяВнутренним = Истина Тогда
ДобавитьВКореньРекомендуемыеВариантыСозданияПроцесса(Помощник); // Автор Богачев
ДобавитьВДеревоСтандартныеВариантыСозданияПроцесса(Помощник); // Автор Богачев
Иначе
ДобавитьВДеревоОсновныеВариантыСозданияПроцесса(Помощник); // В типовой конфигурации
ДобавитьВДеревоОстальныеВариантыОтправки(Помощник);
КонецЕсли;
КонецПроцедуры
Процедура ДобавитьВКореньРекомендуемыеВариантыСозданияПроцесса(Помощник)
УстановитьПривилегированныйРежим(Истина);
ВариантыСозданияПроцесса = Новый СписокЗначений;
ЕстьПредметы = ЗначениеЗаполнено(Помощник.ПредметыПроцесса);
Для Каждого КлючЗначение Из Помощник.РекомендуемыеВариантыСозданияПроцессов Цикл
Если Не ВозможноДобавлениеВарианта(Помощник, КлючЗначение.Ключ)
И Не ВозможноДобавлениеВарианта(Помощник, КлючЗначение.Значение) Тогда
Продолжить;
КонецЕсли;
Если ЕстьПредметы И Помощник.ДопустимыеТипыВариантовДляПредметов[
КлючЗначение.Значение] = Неопределено Тогда
Продолжить;
КонецЕсли;
Если ЭтоВариантСозданияПроцессаОбработки(КлючЗначение.Значение)
И Не ВозможноДобавлениеВариантовСозданияПроцессаОбработкиДокументов(Помощник) Тогда
Продолжить;
КонецЕсли;
ВариантыСозданияПроцесса.Добавить(КлючЗначение.Ключ, Строка(КлючЗначение.Ключ));
КонецЦикла;
ВариантыСозданияПроцесса.СортироватьПоПредставлению();
Для Каждого ВариантСозданияПроцесса Из ВариантыСозданияПроцесса Цикл
СтрокаВарианта = Помощник.ДеревоВариантов.Строки.Добавить();
СтрокаВарианта.Вариант = ВариантСозданияПроцесса.Значение;
СтрокаВарианта.Представление = ВариантСозданияПроцесса.Представление;
КонецЦикла;
КонецПроцедуры
// Добавляет в дерево стандартные варианты создания процессов.
// Комплексный процесс, Обработка внутреннего документа, Исполнение, Ознакомление, Рассмотрение и т.п.
// Автор Богачев. На базе ДобавитьВДеревоОсновныеВариантыСозданияПроцесса
// Параметры:
// Помощник — см. Помощник
//
Процедура ДобавитьВДеревоСтандартныеВариантыСозданияПроцесса(Помощник)
УстановитьПривилегированныйРежим(Истина);
// Формируем общий список вариантов, добавляемых в корень дерева, из:
// шаблонов по умолчанию, общих и рекомендуемых шаблонов.
ВариантыСозданияПроцесса = Новый СписокЗначений;
ЕстьПредметы = ЗначениеЗаполнено(Помощник.ПредметыПроцесса);
Для Каждого КлючЗначение Из Помощник.ВариантыСозданияПроцессовПоУмолчанию Цикл
Если Не ВозможноДобавлениеВарианта(Помощник, КлючЗначение.Ключ)
И Не ВозможноДобавлениеВарианта(Помощник, КлючЗначение.Значение) Тогда
Продолжить;
КонецЕсли;
Если ЕстьПредметы И Помощник.ДопустимыеТипыВариантовДляПредметов[
КлючЗначение.Значение] = Неопределено Тогда
Продолжить;
КонецЕсли;
Если ЭтоВариантСозданияПроцессаОбработки(КлючЗначение.Значение)
И Не ВозможноДобавлениеВариантовСозданияПроцессаОбработкиДокументов(Помощник) Тогда
Продолжить;
КонецЕсли;
Представление = ПредставлениеВариантаСозданияПроцессаПоУмолчанию(
КлючЗначение.Ключ, Помощник);
ВариантыСозданияПроцесса.Добавить(КлючЗначение.Ключ, Представление);
КонецЦикла;
Для Каждого КлючЗначение Из Помощник.ОбщиеВариантыСозданияПроцессов Цикл
Если Не ВозможноДобавлениеВарианта(Помощник, КлючЗначение.Ключ)
И Не ВозможноДобавлениеВарианта(Помощник, КлючЗначение.Значение) Тогда
Продолжить;
КонецЕсли;
Если ЕстьПредметы И Помощник.ДопустимыеТипыВариантовДляПредметов[
КлючЗначение.Значение] = Неопределено Тогда
Продолжить;
КонецЕсли;
Если ЭтоВариантСозданияПроцессаОбработки(КлючЗначение.Значение)
И Не ВозможноДобавлениеВариантовСозданияПроцессаОбработкиДокументов(Помощник) Тогда
Продолжить;
КонецЕсли;
ВариантыСозданияПроцесса.Добавить(КлючЗначение.Ключ, Строка(КлючЗначение.Ключ));
КонецЦикла;
// Для Каждого КлючЗначение Из Помощник.РекомендуемыеВариантыСозданияПроцессов Цикл
// Если Не ВозможноДобавлениеВарианта(Помощник, КлючЗначение.Ключ)
// И Не ВозможноДобавлениеВарианта(Помощник, КлючЗначение.Значение) Тогда
// Продолжить;
// КонецЕсли;
// Если ЕстьПредметы И Помощник.ДопустимыеТипыВариантовДляПредметов[
// КлючЗначение.Значение] = Неопределено Тогда
// Продолжить;
// КонецЕсли;
// Если ЭтоВариантСозданияПроцессаОбработки(КлючЗначение.Значение)
// И Не ВозможноДобавлениеВариантовСозданияПроцессаОбработкиДокументов(Помощник) Тогда
// Продолжить;
// КонецЕсли;
// ВариантыСозданияПроцесса.Добавить(КлючЗначение.Ключ, Строка(КлючЗначение.Ключ));
// КонецЦикла;
ВариантыСозданияПроцесса.СортироватьПоПредставлению();
//////////////////////////
СтрокаВарианта = Помощник.ДеревоВариантов.Строки.Добавить();
СтрокаВарианта.Вариант = ПомощникОтправитьКлиентСервер.ГруппаДругихВариантовСозданияПроцессов();
СтрокаВарианта.Представление = НСтр(«ru = ‘Варианты для специальных случаев'»);
Помощник.НедоступныеВарианты[СтрокаВарианта.Вариант] = Истина;
/////////////////////////
Для Каждого ВариантСоздания Из ВариантыСозданияПроцесса Цикл
ПодчиненнаяСтрокаВариант = СтрокаВарианта.Строки.Добавить();
ПодчиненнаяСтрокаВариант.Вариант = ВариантСоздания.Значение;
ПодчиненнаяСтрокаВариант.Представление = ВариантСоздания.Представление;
КонецЦикла;
КонецПроцедуры
// Возвращает описание для группы стандартных вариантов.
//
// Возвращаемое значение:
// Строка
//
Функция ОписаниеГруппыСтандартныхВариантовСозданияПроцессов() Экспорт
Описание = НСтр(«ru = ‘Стандартные варианты формирования процессов.'»);
Возврат HTMLОписаниеВарианта(Описание);
КонецФункции
// Процедура РасшЗЗДП_ПодпискаЗапускКомплексногоБППередЗаписью создана системой при
// регистрации подписки на событие РасшЗЗДП_ПодпискаЗапускКомплексногоБП в расширении.
// Перед регистрацией обработчика в расширение надо добавить объект Бизнес-процессы.КомплексныйПроцесс
Процедура РасшЗЗДП_ПодпискаЗапускКомплексногоБППередЗаписью(Источник, Отказ) Экспорт
// Вставить содержимое обработчика.
// ТекстЗаголовка = НСтр(«ru = ‘TEST'»);
// ТекстСообщения = НСтр(«ru = ‘TEST успешно'»);
// Сообщить( ТекстСообщения);
Если НЕ ЗначениеЗаполнено(Источник.Ссылка) И ЗначениеЗаполнено(Источник.Шаблон) И Источник.Предметы.Количество() Тогда
УстановитьПривилегированныйРежим(Истина);
Предмет = Источник.Предметы[0].Предмет;
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| БизнесПроцессыПоШаблону.Ссылка КАК СсылкаСсылка
|ИЗ
| КритерийОтбора.БизнесПроцессыПоШаблону(&Шаблон) КАК БизнесПроцессыПоШаблону
| ЛЕВОЕ СОЕДИНЕНИЕ БизнесПроцесс.КомплексныйПроцесс.Предметы КАК КомплексныйПроцессПредметы
| ПО БизнесПроцессыПоШаблону.Ссылка = КомплексныйПроцессПредметы.Ссылка
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПроцессыДляЗапуска КАК ПроцессыДляЗапуска
| ПО БизнесПроцессыПоШаблону.Ссылка = ПроцессыДляЗапуска.БизнесПроцесс
|ГДЕ
| НЕ БизнесПроцессыПоШаблону.Ссылка.Завершен
| И БизнесПроцессыПоШаблону.Ссылка.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияБизнесПроцессов.Активен)
| И БизнесПроцессыПоШаблону.Ссылка <> &Ссылка
| И КомплексныйПроцессПредметы.Предмет = &Предмет
| И (ПроцессыДляЗапуска.Состояние ЕСТЬ NULL
| ИЛИ ПроцессыДляЗапуска.Состояние <> ЗНАЧЕНИЕ(Перечисление.СостоянияПроцессовДляЗапуска.СтартОтменен))
| И НЕ БизнесПроцессыПоШаблону.Ссылка.ПометкаУдаления»;
Запрос.УстановитьПараметр(«Ссылка», Источник.Ссылка);
Запрос.УстановитьПараметр(«Предмет», Предмет);
Запрос.УстановитьПараметр(«Шаблон», Источник.Шаблон);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(«Данный документ уже отправлен по этому маршруту!!!»);
Отказ = Истина;
КонецЕсли;
УстановитьПривилегированныйРежим(Ложь);
КонецЕсли;
КонецПроцедуры
#КонецОбласти