Как выделить пройденный путь и логические точки на графической схеме бизнес-процесса в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При визуализации бизнес-процессов в 1С часто возникает задача показать пользователю не только задачи, находящиеся в работе или уже выполненные, но и весь фактический путь прохождения маршрута. Сюда входят точки старта, ветвления условий, разделения, слияния, а также соединительные линии между ними. Разберем особенности платформенных механизмов, выясним причины ограничений и рассмотрим практические способы решения этой задачи.

Ограничения штатного механизма получения карты маршрута

Платформа 1С предоставляет встроенный метод для отображения текущего состояния бизнес-процесса. Посмотрим на типовой пример получения карты маршрута:


КартаМаршрута = ЭтотОбъект.ПолучитьКартуМаршрута();
Элементы.ПолеСхемы.УстановитьСхему(КартаМаршрута);

Метод ПолучитьКартуМаршрута() возвращает объект ГрафическаяСхема, в котором оформление рассчитывается исключительно на основе задач, созданных объектом БизнесПроцесс:

  1. Выполненные точки действия отображаются со штриховкой фона.
  2. Активные (текущие невыполненные) точки действия обводятся пунктирной рамкой.
  3. Промежуточные логические точки (точки старта, условий, выбора, обработки, разделения и слияния), а также соединительные линии остаются в исходном виде, так как они не порождают объекты задач в базе данных.

Платформа не сохраняет в базе данных факты прохождения неинтерактивных узлов и выбранные ветки в точках условий. Соответственно, чтобы выделить реальный пройденный маршрут, нам необходимо самостоятельно сохранять историю переходов и применять к схеме программное оформление.

Способ 1. Фиксация истории переходов через регистр сведений

Для надежного сохранения истории выполнения процесса создадим непериодический регистр сведений, например, ИсторияПереходовБизнесПроцессов. Использование независимого регистра предпочтительнее табличной части самого бизнес-процесса, так как это упрощает работу с транзакциями, циклическими участками и возвратами назад.

Проанализируем структуру регистра:

  1. Измерения: БизнесПроцесс (тип Ссылка), НомерШага (тип Число).
  2. Ресурсы / Реквизиты: ТочкаМаршрута (тип ТочкаМаршрутаБизнесПроцессаСсылка), ВариантПерехода (тип Строка или ПеречислениеСсылка), Период (тип Дата), Актуален (тип Булево).

Запись факта прохождения точек выполняется непосредственно в серверных обработчиках карты маршрута модуля бизнес-процесса. Рассмотрим пример логирования точки старта и точки условия:


Процедура ТочкаСтартаПриВыполнении(ТочкаМаршрута)
    ЗафиксироватьШагМаршрута(ЭтотОбъект.Ссылка, ТочкаМаршрута, "Старт");
КонецПроцедуры

Процедура ПроверкаУсловияПроверка(ТочкаМаршрута, Результат)
    // Выполняем бизнес-логику проверки
    Если СуммаДокумента > 100000 Тогда
        Результат = Истина;
    Иначе
        Результат = Ложь;
    КонецЕсли;

    // Логируем выбранную ветку
    Вариант = ?(Результат, "Да", "Нет");
    ЗафиксироватьШагМаршрута(ЭтотОбъект.Ссылка, ТочкаМаршрута, Вариант);
КонецПроцедуры

При откате бизнес-процесса назад или циклическом повторении этапов достаточно увеличивать инкрементный НомерШага, либо устанавливать флаг Актуален = Ложь для аннулированных шагов.

Способ 2. Программная раскраска элементов графической схемы

После того как история переходов сохранена, мы можем программно изменить внешний вид элементов схемы перед ее выводом в форму. Получив объект ГрафическаяСхема, обойдем коллекцию ЭлементыГрафическойСхемы.

Разберем пример серверной процедуры оформления карты маршрута:


&НаСервере
Функция ПолучитьОформленнуюКартуМаршрута(БизнесПроцессСсылка)
    БизнесПроцессОбъект = БизнесПроцессСсылка.ПолучитьОбъект();
    Схема = БизнесПроцессОбъект.ПолучитьКартуМаршрута();

    // Получаем список пройденных точек из регистра сведений
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   История.ТочкаМаршрута КАК ТочкаМаршрута
        |ИЗ
        |   РегистрСведений.ИсторияПереходовБизнесПроцессов КАК История
        |ГДЕ
        |   История.БизнесПроцесс = &БизнесПроцесс
        |   И История.Актуален = ИСТИНА";
    Запрос.УстановитьПараметр("БизнесПроцесс", БизнесПроцессСсылка);
    ПройденныеТочки = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("ТочкаМаршрута");

    // Раскрашиваем пройденные логические элементы схемы
    Для Каждого ЭлементСхемы Из Схема.ЭлементыГрафическойСхемы Цикл
        Если ПройденныеТочки.Найти(ЭлементСхемы.ТочкаМаршрута) <> Неопределено Тогда
            ЭлементСхемы.ЦветФона = WebЦвета.СветлоЗеленый;
            ЭлементСхемы.ЦветЛинии = WebЦвета.ТемноЗеленый;
        КонецЕсли;
    КонецЦикла;

    Возврат Схема;
КонецФункции

На клиенте результат функции передается в элемент формы:


&НаКлиенте
Процедура ОбновитьСхемуНаФорме()
    СхемаМаршрута = ПолучитьОформленнуюКартуМаршрута(Объект.Ссылка);
    Элементы.ПолеГрафическойСхемы.УстановитьСхему(СхемаМаршрута);
КонецПроцедуры

Способ 3. Раскраска соединительных линий через XML

Если требуется подсветить не только сами узлы, но и направляющие соединительные линии (стрелки переходов), встроенных методов изменения цвета отдельных линий в объектной модели ГрафическаяСхема может быть недостаточно. В этом случае применяется сериализация схемы в XML.

Разберем порядок действий по шагам:

  1. Сериализуем объект ГрафическаяСхема в XML-строку с помощью объекта СериализаторXDTO.
  2. Загружаем полученную строку в ДокументDOM или обрабатываем через ЧтениеXML / ЗаписьXML.
  3. Находим узлы соединительных линий, связывающие пройденные точки маршрута, и модифицируем их атрибуты оформления (толщину линии, цвет границы).
  4. Десериализуем измененный XML обратно в объект ГрафическаяСхема и отображаем пользователю на форме.

Комбинация логирования промежуточных этапов в регистре сведений и последующей программной модификации графической схемы позволяет получить наглядный и полностью контролируемый маршрут движения любого бизнес-процесса в 1С.

← На главную