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