Отображение схемы комплексного процесса в карточке процесса через бесшовную интеграцию с ДО.
1C-admin
23.10.2019
В данной публикации я хочу описать доработку, с помощью которой можно вывести схему комплексного процесса через бесшовную интеграцию с ДО в форме комплексного процесса.
Схема комплексного процесса приходит в ERP со стороны ДО в виде двоичных данных. Для вывода схемы на форму комплексного процесса в базе ERP на форму "БизнесПроцессКомплексныйПроцесс" обработки "ИнтеграцияС1СДокументооборотот" необходимо добавить 2 страницы ("Основное", "Схема") и реквизит формы "пп_СхемаПроцесса" (тип — "ГрафическаяСхема"):
Далее необходимо добавить код в начало процедуры "ЗаполнитьФормуИзОбъектаXDTO" модуля формы "БизнесПроцессКомплексныйПроцесс":
Код процедуры "ЗаполнитьФормуИзОбъектаXDTO":
&НаСервере
Процедура ЗаполнитьФормуИзОбъектаXDTO(ОбъектXDTO)
//Добавление схемы комплексного процесса на схему
Если ЗначениеЗаполнено(ОбъектXDTO.diagram) Тогда
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("grs");
ОбъектXDTO.diagram.Записать(ИмяВременногоФайла);
пп_СхемаПроцесса = Новый ГрафическаяСхема;
пп_СхемаПроцесса.Прочитать(ИмяВременногоФайла);
УдалитьФайлы(ИмяВременногоФайла);
КонецЕсли;
//Типовой код
Если ОбъектXDTO.Установлено("objectID") Тогда
ID = ОбъектXDTO.objectId.id;
Тип = ОбъектXDTO.objectId.type;
КонецЕсли;
Обработки.ИнтеграцияС1СДокументооборот.УстановитьНавигационнуюСсылку(ЭтаФорма, ОбъектXDTO);
Обработки.ИнтеграцияС1СДокументооборот.ЗаполнитьСтандартнуюШапкуБизнесПроцесса(ЭтаФорма, ОбъектXDTO);
Обработки.ИнтеграцияС1СДокументооборот.УстановитьВидимостьКомандИзмененияСостоянияПроцесса(ЭтаФорма, ОбъектXDTO);
Обработки.ИнтеграцияС1СДокументооборот.ЗаполнитьКонтролераВФорме(ЭтаФорма, ОбъектXDTO);
Обработки.ИнтеграцияС1СДокументооборот.ЗаполнитьОбъектныйРеквизит(ЭтаФорма, ОбъектXDTO.routingType, "ПорядокВыполнения");
ОбработатьВыборПорядкаВыполнения();
Обработки.ИнтеграцияС1СДокументооборот.ЗаполнитьОбъектныйРеквизит(ЭтаФорма, ОбъектXDTO.businessProcessTemplate, "Шаблон");
Этапы.Очистить();
Номер = 1;
Для Каждого Этап Из ОбъектXDTO.stages Цикл
НоваяСтрока = Этапы.Добавить();
НоваяСтрока.НомерСтроки = Номер;
НоваяСтрока.ИдентификаторЭтапа = Этап.stageID;
НоваяСтрока.ИсполнителиЭтапаСтрокой = Этап.participants;
Обработки.ИнтеграцияС1СДокументооборот.ЗаполнитьОбъектныйРеквизит(НоваяСтрока, Этап.template, "ШаблонБизнесПроцесса");
ДополнитьИмяШаблонаПоТипуШаблона(НоваяСтрока);
НоваяСтрока.ПредшественникиЭтапаСтрокой = Этап.stagePredecessors;
НоваяСтрока.ПредшественникиВариантИспользования = Этап.predecessorsUseOption;
НоваяСтрока.БезусловныйПереходКСледующемуБылВыполнен = Этап.unconditionalPassageExecuted;
НоваяСтрока.ЗадачаВыполнена = Этап.executed;
Обработки.ИнтеграцияС1СДокументооборот.ЗаполнитьОбъектныйРеквизит(НоваяСтрока, Этап.businessProcess, "ЗапущенныйБизнесПроцесс");
Если Этап.Установлено("businessProcess") Тогда
НоваяСтрока.СрокВыполнения = Этап.businessProcess.dueDate;
КонецЕсли;
Если ЗначениеЗаполнено(НоваяСтрока.СрокВыполнения) И НЕ НоваяСтрока.ЗадачаВыполнена Тогда
НоваяСтрока.Срок = Формат(НоваяСтрока.СрокВыполнения,"ДФ='dd.MM.yyyy HH:mm'") + " ("+Этап.duration+")";
Иначе
НоваяСтрока.Срок = Этап.duration;
КонецЕсли;
Номер = Номер + 1;
КонецЦикла;
ПредшественникиЭтапов.Очистить();
Для каждого Предшественник из ОбъектXDTO.predecessors Цикл
НоваяСтрока = ПредшественникиЭтапов.Добавить();
НоваяСтрока.ИдентификаторПоследователя = Предшественник.followerID;
Если Предшественник.Установлено("predecessorID") Тогда
НоваяСтрока.ИдентификаторПредшественника = Предшественник.predecessorID;
КонецЕсли;
Обработки.ИнтеграцияС1СДокументооборот.ЗаполнитьОбъектныйРеквизит(НоваяСтрока, Предшественник.passageCondition, "УсловиеПерехода");
Обработки.ИнтеграцияС1СДокументооборот.ЗаполнитьОбъектныйРеквизит(НоваяСтрока, Предшественник.considerationCondition, "УсловиеРассмотрения");
НоваяСтрока.УсловныйПереходБылВыполнен = Предшественник.passageExecuted;
КонецЦикла;
// Возможно, изменение процесса запрещено его шаблоном.
ЗапрещеноИзменение = Ложь;
Если ОбъектXDTO.Свойства().Получить("blockedByTemplate") <> Неопределено Тогда
ЗапрещеноИзменение = ОбъектXDTO.blockedByTemplate;
КонецЕсли;
Элементы.Контролер.ТолькоПросмотр = Элементы.Контролер.ТолькоПросмотр
ИЛИ (ЗначениеЗаполнено(КонтролерID) И ЗапрещеноИзменение);
Элементы.СрокДата.ТолькоПросмотр = Элементы.СрокДата.ТолькоПросмотр
ИЛИ (ЗначениеЗаполнено(Срок) И ЗапрещеноИзменение);
Если Этапы.Количество() > 0 И ЗапрещеноИзменение Тогда
Элементы.Этапы.ТолькоПросмотр = Истина;
Элементы.ПорядокВыполненияПереключатель.Доступность = Ложь;
КонецЕсли;
КонецПроцедуры
Данная доработка позволяет вывести схему процесса только для визуального представления. Интерактивное взаимодействие со схемой (изменение элементов, редактирование процесса и т.д.) невозможно. В базу ДО никаких изменений вносить не требуется, свойство объекта xdto "diagram" заполняется типовыми средствами.
Результат доработки:
Данная доработка производилась в ERP 2.4.6.160 и ДО 2.1.14.4.
не написано только зачем это всё делать,
смысл не понял зачем
(1)Для визуального контроля схемы процесса из ERP. По умолчанию процесс не отображается в виде схемы.