Как привести тип точки маршрута бизнес-процесса в запросе и настроить отбор в 1С

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

При разработке отчетов и аналитических панелей на платформе 1С часто возникает задача работы со списком задач и бизнес-процессов. Если в конфигурации определено несколько видов бизнес-процессов, привязанных к одному объекту Задача, реквизит ТочкаМаршрута в таблице задач становится составным типом (включает точки всех существующих бизнес-процессов).

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

Особенности типа данных точки маршрута

Прежде чем приступать к коду, выясним внутреннюю природу объекта ТочкаМаршрутаБизнесПроцесса в платформе 1С:

  1. Предопределенный объект метаданных: Точки маршрута не являются элементами справочников или ссылочными сущностями базы данных. В физической структуре таблиц точка маршрута хранится как идентификатор внутри описания карты маршрута.
  2. Ограничение на обращение через точку: В языке запросов невозможно обратиться к реквизитам или свойствам точки маршрута (например, написать Задача.ТочкаМаршрута.Вид), так как у точки маршрута нет отдельной таблицы реквизитов в базе данных.
  3. Составной тип: Если задача связана с несколькими бизнес-процессами, поле ТочкаМаршрута содержит тип ТочкаМаршрутаБизнесПроцесса для каждого вида БП, что приводит к появлению окна уточнения типа в диалоге отбора.

Явное приведение типа точки маршрута в запросе

Для того чтобы ограничить составной тип реквизита ТочкаМаршрута конкретным бизнес-процессом непосредственно в тексте запроса, воспользуемся оператором ВЫРАЗИТЬ.

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


ВЫБРАТЬ
    БП.Ссылка КАК БизнесПроцесс,
    БП.Шаблон КАК Шаблон,
    ВЫРАЗИТЬ(Задачи.ТочкаМаршрута КАК БизнесПроцесс.КИОУТ_ПродажаДО.Точки) КАК ТочкаМаршрута
ИЗ
    БизнесПроцесс.КИОУТ_ПродажаДО КАК БП
        ЛЕВОЕ СОЕДИНЕНИЕ Задача.Задача1 КАК Задачи
        ПО БП.Ссылка = Задачи.БизнесПроцесс
        И НЕ Задачи.Выполнена
        И НЕ Задачи.ПометкаУдаления

После применения конструкции ВЫРАЗИТЬ(... КАК БизнесПроцесс.ИмяБП.Точки) поле ТочкаМаршрута получает единственный строго определенный тип. При передаче такого запроса в ПостроительОтчета пользователь при клике на поле значения отбора сразу увидит список точек выбранного бизнес-процесса без промежуточного окна выбора типа.

Ограничение типа поля через свойства построителя отчета

Если по каким-либо причинам менять текст запроса нежелательно, ограничить состав типов можно программно перед открытием формы настройки отборов. Разберем пример кода настройки свойства отбора в построителе:


// Ограничиваем тип доступных значений для поля отбора
ПостроительОтчета.Отбор.ТочкаМаршрута.ТипЗначения = Новый ОписаниеТипов("ТочкаМаршрутаБизнесПроцесса.КИОУТ_ПродажаДО");

Этот подход также предотвращает появление системного окна выбора типа метаданных при редактировании условий отбора в табличном поле.

Фильтрация списка выбора: исключение служебных точек маршрута

Часто в отборах отчетов требуется предоставить пользователю возможность выбирать только точки с видом Действие, исключив служебные точки схемы: точки старта, завершения, развилок (условий), разделения и слияния линий маршрута.

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

Вариант 1. Заполнение списка выбора фактически существующими задачами

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |	ВЫРАЗИТЬ(Задача.ТочкаМаршрута КАК БизнесПроцесс.КИОУТ_ПродажаДО.Точки) КАК ТочкаМаршрута
    |ИЗ
    |	Задача.Задача1 КАК Задача
    |ГДЕ
    |	Задача.БизнесПроцесс ССЫЛКА БизнесПроцесс.КИОУТ_ПродажаДО";

СписокТочек = Новый СписокЗначений;
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    СписокТочек.Добавить(Выборка.ТочкаМаршрута);
КонецЦикла;

// Назначаем список выбора элементу управления формы
ЭлементыФормы.Отбор.Колонки.Значение.ЭлементУправления.СписокВыбора = СписокТочек;
ЭлементыФормы.Отбор.Колонки.Значение.ЭлементУправления.РежимВыбораИзСписка = Истина;

Вариант 2. Программное получение точек через менеджер бизнес-процесса

Если бизнес-процесс только запущен и в базе еще нет созданных задач по всем этапам, список точек можно сформировать программно через коллекцию метаданных или менеджер бизнес-процесса:


СписокТочек = Новый СписокЗначений;

// Получаем коллекцию точек маршрута через менеджер бизнес-процесса
КоллекцияТочек = БизнесПроцессы.КИОУТ_ПродажаДО.ТочкиМаршрута;

Для Каждого Точка Из КоллекцияТочек Цикл
    // Добавляем точку в список для выбора
    СписокТочек.Добавить(Точка);
КонецЦикла;

Обработка множественного отбора (виды сравнения «В списке» и «Не в списке»)

При использовании сложных видов сравнения в отборе (например, В списке) пользователь открывает стандартный диалог подбора списка значений. Чтобы сохранить фильтрацию и не допустить выбор некорректных типов, рекомендуется перехватывать событие начала выбора:

  1. В обработчике события ОтборЗначениеНачалоВыбора проверяем, для какого поля выполняется редактирование.
  2. Анализируем текущий ВидСравнения в выбранной строке отбора.
  3. Если выбран списочный вид сравнения, устанавливаем параметр СтандартнаяОбработка = Ложь.
  4. Открываем собственную форму подбора или модальный диалог выбора из заранее подготовленного СпискаЗначений, содержащего только точки действия.

Использование явного приведения типов ВЫРАЗИТЬ(... КАК БизнесПроцесс.Имя.Точки) в сочетании с программным ограничением списков выбора позволяет создать чистый и интуитивно понятный пользовательский интерфейс для аналитических отчетов по бизнес-процессам.

← На главную