При визуализации бизнес-процессов в 1С часто возникает задача показать пользователю не только задачи, находящиеся в работе или уже выполненные, но и весь фактический путь прохождения маршрута. Сюда входят точки старта, ветвления условий, разделения, слияния, а также соединительные линии между ними. Разберем особенности платформенных механизмов, выясним причины ограничений и рассмотрим практические способы решения этой задачи.
Платформа 1С предоставляет встроенный метод для отображения текущего состояния бизнес-процесса. Посмотрим на типовой пример получения карты маршрута:
КартаМаршрута = ЭтотОбъект.ПолучитьКартуМаршрута();
Элементы.ПолеСхемы.УстановитьСхему(КартаМаршрута);
Метод ПолучитьКартуМаршрута() возвращает объект ГрафическаяСхема, в котором оформление рассчитывается исключительно на основе задач, созданных объектом БизнесПроцесс:
Платформа не сохраняет в базе данных факты прохождения неинтерактивных узлов и выбранные ветки в точках условий. Соответственно, чтобы выделить реальный пройденный маршрут, нам необходимо самостоятельно сохранять историю переходов и применять к схеме программное оформление.
Для надежного сохранения истории выполнения процесса создадим непериодический регистр сведений, например, ИсторияПереходовБизнесПроцессов. Использование независимого регистра предпочтительнее табличной части самого бизнес-процесса, так как это упрощает работу с транзакциями, циклическими участками и возвратами назад.
Проанализируем структуру регистра:
БизнесПроцесс (тип Ссылка), НомерШага (тип Число).ТочкаМаршрута (тип ТочкаМаршрутаБизнесПроцессаСсылка), ВариантПерехода (тип Строка или ПеречислениеСсылка), Период (тип Дата), Актуален (тип Булево).Запись факта прохождения точек выполняется непосредственно в серверных обработчиках карты маршрута модуля бизнес-процесса. Рассмотрим пример логирования точки старта и точки условия:
Процедура ТочкаСтартаПриВыполнении(ТочкаМаршрута)
ЗафиксироватьШагМаршрута(ЭтотОбъект.Ссылка, ТочкаМаршрута, "Старт");
КонецПроцедуры
Процедура ПроверкаУсловияПроверка(ТочкаМаршрута, Результат)
// Выполняем бизнес-логику проверки
Если СуммаДокумента > 100000 Тогда
Результат = Истина;
Иначе
Результат = Ложь;
КонецЕсли;
// Логируем выбранную ветку
Вариант = ?(Результат, "Да", "Нет");
ЗафиксироватьШагМаршрута(ЭтотОбъект.Ссылка, ТочкаМаршрута, Вариант);
КонецПроцедуры
При откате бизнес-процесса назад или циклическом повторении этапов достаточно увеличивать инкрементный НомерШага, либо устанавливать флаг Актуален = Ложь для аннулированных шагов.
После того как история переходов сохранена, мы можем программно изменить внешний вид элементов схемы перед ее выводом в форму. Получив объект ГрафическаяСхема, обойдем коллекцию ЭлементыГрафическойСхемы.
Разберем пример серверной процедуры оформления карты маршрута:
&НаСервере
Функция ПолучитьОформленнуюКартуМаршрута(БизнесПроцессСсылка)
БизнесПроцессОбъект = БизнесПроцессСсылка.ПолучитьОбъект();
Схема = БизнесПроцессОбъект.ПолучитьКартуМаршрута();
// Получаем список пройденных точек из регистра сведений
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| История.ТочкаМаршрута КАК ТочкаМаршрута
|ИЗ
| РегистрСведений.ИсторияПереходовБизнесПроцессов КАК История
|ГДЕ
| История.БизнесПроцесс = &БизнесПроцесс
| И История.Актуален = ИСТИНА";
Запрос.УстановитьПараметр("БизнесПроцесс", БизнесПроцессСсылка);
ПройденныеТочки = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("ТочкаМаршрута");
// Раскрашиваем пройденные логические элементы схемы
Для Каждого ЭлементСхемы Из Схема.ЭлементыГрафическойСхемы Цикл
Если ПройденныеТочки.Найти(ЭлементСхемы.ТочкаМаршрута) <> Неопределено Тогда
ЭлементСхемы.ЦветФона = WebЦвета.СветлоЗеленый;
ЭлементСхемы.ЦветЛинии = WebЦвета.ТемноЗеленый;
КонецЕсли;
КонецЦикла;
Возврат Схема;
КонецФункции
На клиенте результат функции передается в элемент формы:
&НаКлиенте
Процедура ОбновитьСхемуНаФорме()
СхемаМаршрута = ПолучитьОформленнуюКартуМаршрута(Объект.Ссылка);
Элементы.ПолеГрафическойСхемы.УстановитьСхему(СхемаМаршрута);
КонецПроцедуры
Если требуется подсветить не только сами узлы, но и направляющие соединительные линии (стрелки переходов), встроенных методов изменения цвета отдельных линий в объектной модели ГрафическаяСхема может быть недостаточно. В этом случае применяется сериализация схемы в XML.
Разберем порядок действий по шагам:
ГрафическаяСхема в XML-строку с помощью объекта СериализаторXDTO.ДокументDOM или обрабатываем через ЧтениеXML / ЗаписьXML.ГрафическаяСхема и отображаем пользователю на форме.Комбинация логирования промежуточных этапов в регистре сведений и последующей программной модификации графической схемы позволяет получить наглядный и полностью контролируемый маршрут движения любого бизнес-процесса в 1С.