Бывает необходимость при настройке шаблонов процессов 1С Документооборот 8 отключить задачи ознакомления, произведем данные действия с использованием регистра сведений для настроек и расширения для логики настроек.
Начнем с добавления в основную конфигурацию справочника для хранения элементов настроек:
Далее добавим регистр настроек РАДО_НастройкиПроцессов:
ОбъектНастройки: СправочникСсылка.ВидыВнутреннихДокументов, СправочникСсылка.ШаблоныСогласования, СправочникСсылка.ВидыВходящихДокументов, СправочникСсылка.ШаблоныИсполнения, СправочникСсылка.ВидыИсходящихДокументов
Параметр: СправочникСсылка.РАДО_ПараметрыПроцессов
ЗначениеНастройки: Булево
В модуль менеджера регистра РАДО_НастройкиПроцессов добавим код с функцией получения параметров процессов:
Функция ПолучитьПараметрПроцесса(ОбъектНастройки, Параметр) Экспорт
УстановитьПривилегированныйРежим(Истина);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РАДО_НастройкиПроцессов.ЗначениеНастройки КАК ЗначениеНастройки
|ИЗ
| РегистрСведений.РАДО_НастройкиПроцессов КАК РАДО_НастройкиПроцессов
|ГДЕ
| РАДО_НастройкиПроцессов.ОбъектНастройки = &ОбъектНастройки
| И РАДО_НастройкиПроцессов.Параметр = &Параметр";
Запрос.УстановитьПараметр("ОбъектНастройки", ОбъектНастройки);
Запрос.УстановитьПараметр("Параметр", Параметр);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат Неопределено;
КонецЕсли;
ЗначениеПараметра = РезультатЗапроса.Выгрузить()[0].ЗначениеНастройки;
Возврат ЗначениеПараметра;
КонецФункции
Дальнейшие действия будем производить в расширении конфигурации.
Добавим в модуль объекта бизнес процесса согласование функцию ПолучитьПризнакОтключенияЗадачиОзнакомления, в ней будем в зависимости от результата согласования выбирать параметр, собирать массив предметов для анализа и передавая в функцию РАДО_УправлениеНастройками.ПолучитьПризнакОтключенияЗадачиОзнакомления определять необходимость отключения задач ознакомления:
Функция ПолучитьПризнакОтключенияЗадачиОзнакомления()
Если РезультатСогласования = Перечисления.РезультатыСогласования.СогласованоСЗамечаниями Тогда
ПараметрПроцесса = Справочники.РАДО_ПараметрыПроцессов.БезОзнакомленияПриСогласованоСЗамечаниями;
ИначеЕсли РезультатСогласования = Перечисления.РезультатыСогласования.НеСогласовано Тогда
ПараметрПроцесса = Справочники.РАДО_ПараметрыПроцессов.БезОзнакомленияПриНеСогласовано;
ИначеЕсли РезультатСогласования = Перечисления.РезультатыСогласования.Согласовано Тогда
ПараметрПроцесса = Справочники.РАДО_ПараметрыПроцессов.БезОзнакомленияПриСогласовано;
Иначе
Возврат Ложь;
КонецЕсли;
МассивПредметовЗадачи = Новый Массив;
Для Каждого СтрПредмет Из Предметы Цикл
Если ТипЗнч(СтрПредмет.Предмет) = Тип("СправочникСсылка.ВходящиеДокументы")
Или ТипЗнч(СтрПредмет.Предмет) = Тип("СправочникСсылка.ИсходящиеДокументы")
Или ТипЗнч(СтрПредмет.Предмет) = Тип("СправочникСсылка.ВнутренниеДокументы") Тогда
МассивПредметовЗадачи.Добавить(СтрПредмет.Предмет);
КонецЕсли
КонецЦикла;
ОтключениеЗадачиОзнакомления = РАДО_УправлениеНастройками.ПолучитьПризнакОтключенияЗадачиОзнакомления(Шаблон,
ПараметрПроцесса,
МассивПредметовЗадачи);
Возврат ОтключениеЗадачиОзнакомления;
КонецФункции
Для процедур ОзнакомитьсяПередСозданиемЗадач, ЗавершениеПриЗавершении модуля объекта бизнес процесса согласование сделаем вставки с обращением к функции ПолучитьПризнакОтключенияЗадачиОзнакомления перед созданием задач:
&ИзменениеИКонтроль("ОзнакомитьсяПередСозданиемЗадач")
Процедура РАДО_ОзнакомитьсяПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Если процесс завершился положительно, то задачу ознакомления формируем
// после завершения процесса.
Если РезультатСогласования = Перечисления.РезультатыСогласования.Согласовано Тогда
Возврат;
КонецЕсли;
#Вставка
Если ПолучитьПризнакОтключенияЗадачиОзнакомления() = Ложь Тогда
#КонецВставки
Задача = Задачи.ЗадачаИсполнителя.СоздатьЗадачу();
ЗаполнитьЗадачуОзнакомиться(Задача);
ЗадачаСсылка = Задачи.ЗадачаИсполнителя.ПолучитьСсылку();
Задача.УстановитьСсылкуНового(ЗадачаСсылка);
ФормируемыеЗадачи.Добавить(Задача);
УстановитьПривилегированныйРежим(Истина);
НоваяСтрока = РезультатыОзнакомлений.Добавить();
НоваяСтрока.НомерИтерации = НомерИтерации;
НоваяСтрока.ЗадачаИсполнителя = ЗадачаСсылка;
РаботаСБизнесПроцессами.ЗаписатьПроцесс(ЭтотОбъект, "ПростаяЗапись");
#Вставка
КонецЕсли;
#КонецВставки
КонецПроцедуры
&ИзменениеИКонтроль("ЗавершениеПриЗавершении")
Процедура РАДО_ЗавершениеПриЗавершении(ТочкаМаршрутаБизнесПроцесса, Отказ)
УстановитьПривилегированныйРежим(Истина);
ДатаЗавершения = ТекущаяДатаСеанса();
СрокИсполненияДатой = ДатаЗавершения;
РаботаСПроектами.ОтметитьОкончаниеВыполненияПроектнойЗадачи(ЭтотОбъект);
// Если процесс завершился положительно и нет задачи ознакомления (задача ознакомления могла быть
// создана до перехода на редакцию 2.1), то создаем задачу ознакомления с результатом.
Если РезультатСогласования = Перечисления.РезультатыСогласования.Согласовано
#Вставка
И ПолучитьПризнакОтключенияЗадачиОзнакомления() = Ложь
#КонецВставки
И РезультатыОзнакомлений.Найти(НомерИтерации, "НомерИтерации") = Неопределено Тогда
Задача = Задачи.ЗадачаИсполнителя.СоздатьЗадачу();
ЗаполнитьЗадачуОзнакомиться(Задача);
Задача.Записать();
НоваяСтрока = РезультатыОзнакомлений.Добавить();
НоваяСтрока.НомерИтерации = НомерИтерации;
НоваяСтрока.ЗадачаИсполнителя = Задача.Ссылка;
РаботаСБизнесПроцессами.ЗаписатьПроцесс(ЭтотОбъект, "ПростаяЗапись");
КонецЕсли;
КонецПроцедуры
В общем модуле расширения РАДО_УправлениеНастройками отработаем анализ данных регистра настроек РАДО_НастройкиПроцессов функцией ПолучитьПараметрПроцесса:
Функция ПолучитьПараметрПроцесса(ОбъектНастройки, Параметр) Экспорт
Возврат РегистрыСведений.РАДО_НастройкиПроцессов.ПолучитьПараметрПроцесса(ОбъектНастройки, Параметр);
КонецФункции
Добавим в общий модуль расширения РАДО_УправлениеНастройками функцию ПолучитьПризнакОтключенияЗадачиОзнакомления, в которой будем анализировать настройки шаблона и предметов процесса на необходимость отключения задач ознакомления:
Функция ПолучитьПризнакОтключенияЗадачиОзнакомления(Шаблон, ПараметрПроцесса, МассивПредметовЗадачи) Экспорт
КолвоПредметов = МассивПредметовЗадачи.Количество();
Если КолвоПредметов = 0 Тогда
ОтключениеЗадачиОзнакомления = ПолучитьПараметрПроцесса(Шаблон, ПараметрПроцесса);
Если ОтключениеЗадачиОзнакомления = Неопределено Тогда
Возврат Ложь;
Иначе
Возврат ОтключениеЗадачиОзнакомления;
КонецЕсли;
Иначе
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Шаблон", Шаблон);
Запрос.УстановитьПараметр("ПараметрПроцесса", ПараметрПроцесса);
Если КолвоПредметов = 1 Тогда
ПредметЗадачи = МассивПредметовЗадачи[0];
ИмяТаблицыПредмета = ОбщегоНазначения.ИмяТаблицыПоСсылке(ПредметЗадачи);
МассивТекстовЗапроса = Новый Массив;
ТекстЗапроса =
"ВЫБРАТЬ
| РАДО_НастройкиПроцессов.ЗначениеНастройки КАК ЗначениеНастройки
|ИЗ
| РегистрСведений.РАДО_НастройкиПроцессов КАК РАДО_НастройкиПроцессов
|ГДЕ
| РАДО_НастройкиПроцессов.ОбъектНастройки = &Шаблон
| И РАДО_НастройкиПроцессов.Параметр = &ПараметрПроцесса
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| РАДО_НастройкиПроцессов.ЗначениеНастройки КАК ЗначениеНастройки
|ИЗ
| РегистрСведений.РАДО_НастройкиПроцессов КАК РАДО_НастройкиПроцессов
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ";
МассивТекстовЗапроса.Добавить(ТекстЗапроса);
МассивТекстовЗапроса.Добавить(ИмяТаблицыПредмета);
ТекстЗапроса = " КАК ТаблицаДокумента
| ПО (РАДО_НастройкиПроцессов.ОбъектНастройки = ТаблицаДокумента.ВидДокумента
| И ТаблицаДокумента.Ссылка = &ПредметЗадачи
| И РАДО_НастройкиПроцессов.Параметр = &ПараметрПроцесса)";
МассивТекстовЗапроса.Добавить(ТекстЗапроса);
Запрос.Текст = СтрСоединить(МассивТекстовЗапроса);
Запрос.УстановитьПараметр("ПредметЗадачи", ПредметЗадачи);
РезультатПакет = Запрос.ВыполнитьПакет();
РезультатЗапросаШаблона = РезультатПакет[0];
РезультатЗапросаПредметов = РезультатПакет[1];
Иначе
СоответствиеТиповПредметов = Новый Соответствие;
Для Каждого Предмет Из МассивПредметовЗадачи Цикл
ТипПредмета = ТипЗнч(Предмет);
МассивПредметовТипа = СоответствиеТиповПредметов.Получить(ТипПредмета);
Если МассивПредметовТипа = Неопределено Тогда
МассивПредметовТипа = Новый Массив;
МассивПредметовТипа.Добавить(Предмет);
СоответствиеТиповПредметов.Вставить(ТипПредмета, МассивПредметовТипа);
Иначе
МассивПредметовТипа.Добавить(Предмет);
КонецЕсли;
КонецЦикла;
МассивТекстовЗапроса = Новый Массив;
НомерЗапроса = 1;
ТекстЗапроса = "ВЫБРАТЬ
| РАДО_НастройкиПроцессов.ЗначениеНастройки КАК ЗначениеНастройки
|ИЗ
| РегистрСведений.РАДО_НастройкиПроцессов КАК РАДО_НастройкиПроцессов
|ГДЕ
| РАДО_НастройкиПроцессов.ОбъектНастройки = &Шаблон
| И РАДО_НастройкиПроцессов.Параметр = &ПараметрПроцесса";
МассивТекстовЗапроса.Добавить(ТекстЗапроса);
Для Каждого ТипПредмета Из СоответствиеТиповПредметов Цикл
Если НомерЗапроса = 1 Тогда
ТекстЗапроса = "
|;
|
|////////////////////////////////////////////////////////////////////////////////";
Иначе
ТекстЗапроса = "
|
|ОБЪЕДИНИТЬ ВСЕ
|";
КонецЕсли;
МассивТекстовЗапроса.Добавить(ТекстЗапроса);
ИмяТаблицыПредмета = ОбщегоНазначения.ИмяТаблицыПоСсылке(ТипПредмета.Значение[0]);
ИмяПараметраПредметов = "ПредметыПроцесса" + Формат(НомерЗапроса, "ЧГ=0");
Если НомерЗапроса = 1 Тогда
ТекстЗапроса = "
|ВЫБРАТЬ
| ЕСТЬNULL(РАДО_НастройкиПроцессов.ЗначениеНастройки, ЛОЖЬ) КАК ЗначениеНастройки
|ПОМЕСТИТЬ ВР_НастройкиПроцессов
|ИЗ
| ";
Иначе
ТекстЗапроса = "
|ВЫБРАТЬ
| ЕСТЬNULL(РАДО_НастройкиПроцессов.ЗначениеНастройки, ЛОЖЬ) КАК ЗначениеНастройки
|ИЗ
| ";
КонецЕсли;
МассивТекстовЗапроса.Добавить(ТекстЗапроса);
МассивТекстовЗапроса.Добавить(ИмяТаблицыПредмета);
ТекстЗапроса =
" КАК ТаблицаПредмета
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РАДО_НастройкиПроцессов КАК РАДО_НастройкиПроцессов
| ПО РАДО_НастройкиПроцессов.ОбъектНастройки = ТаблицаПредмета.ВидДокумента
| И РАДО_НастройкиПроцессов.Параметр = &ПараметрПроцесса
|ГДЕ
| ТаблицаПредмета.Ссылка В (&";
МассивТекстовЗапроса.Добавить(ТекстЗапроса);
МассивТекстовЗапроса.Добавить(ИмяПараметраПредметов);
МассивТекстовЗапроса.Добавить(")");
НомерЗапроса = НомерЗапроса + 1;
Запрос.УстановитьПараметр(ИмяПараметраПредметов, ТипПредмета.Значение);
КонецЦикла;
ТекстЗапроса = "
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| МИНИМУМ(ВР_НастройкиПроцессов.ЗначениеНастройки) КАК ЗначениеНастройки
|ИЗ
| ВР_НастройкиПроцессов КАК ВР_НастройкиПроцессов";
МассивТекстовЗапроса.Добавить(ТекстЗапроса);
Запрос.Текст = СтрСоединить(МассивТекстовЗапроса);
РезультатПакет = Запрос.ВыполнитьПакет();
РезультатЗапросаШаблона = РезультатПакет[0];
РезультатЗапросаПредметов = РезультатПакет[2];
КонецЕсли;
Если РезультатЗапросаШаблона.Пустой() Тогда
Если РезультатЗапросаПредметов.Пустой() Тогда
ОтключениеЗадачиОзнакомления = Ложь;
Иначе
ОтключениеЗадачиОзнакомления = РезультатЗапросаПредметов.Выгрузить()[0].ЗначениеНастройки;
Если ОтключениеЗадачиОзнакомления = Null Тогда
Возврат Ложь;
Иначе
Возврат ОтключениеЗадачиОзнакомления;
КонецЕсли;
КонецЕсли
Иначе
ОтключениеЗадачиОзнакомления = РезультатЗапросаШаблона.Выгрузить()[0].ЗначениеНастройки;
КонецЕсли;
КонецЕсли;
Возврат ОтключениеЗадачиОзнакомления;
КонецФункции
Тестирование проводилось на платформе 8.3.18.1334 и конфигурации Документооборот 8 КОРП, редакция 2.1 (2.1.29.18).