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

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

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

Понимание архитектуры бизнес-процессов и задач в 1С

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

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

Основная проблема: Сбор данных для точки выбора вариантов

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

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

Шаг 1: Подготовка реквизитов бизнес-процесса и задачи

Для хранения выбора пользователя нам понадобится специальный реквизит. Мы рекомендуем создать его в объекте метаданных `БизнесПроцесс.<ИмяВашегоБизнесПроцесса>`. Это обеспечит доступность данных на протяжении всего жизненного цикла процесса, а не только в рамках одной задачи.

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

  1. Перечисление: Если варианты ответов фиксированы и не меняются часто. Например, "БудетБрать", "ПереданоКоллегам", "ПерезвонитьЧерезКвартал", "ВЧерныйСписок".
  2. Справочник: Если варианты могут добавляться или изменяться администратором без изменения конфигурации. В этом случае реквизит будет ссылкой на элемент соответствующего справочника.

Для нашего примера с реактивацией клиента, мы можем создать новое Перечисление под названием РезультатыРеактивацииКлиента со значениями: "БудетБрать", "ПереданоКоллегам", "ПерезвонитьЧерезКвартал", "ВЧерныйСписок". Реквизит РезультатРеактивации в бизнес-процессе будет иметь тип Перечисления.РезультатыРеактивацииКлиента.

Шаг 2: Разработка собственной формы задачи

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

  1. Создание формы: В конфигураторе, в ветке метаданных Задачи.<ИмяВашейЗадачи> (например, Задача.ЗадачаРеактивации), создайте новую форму. Назовем её, например, ФормаЗадачиРеактивацииКлиента. Для ускорения разработки элементов интерфейса можно использовать функции программного изменения форм или применить текучий конструктор для модификации форм.
  2. Размещение элементов: На этой форме мы разместим поле для выбора нашего реквизита РезультатРеактивации. Это может быть поле ввода с типом ПолеКомбинированногоСписка или ПолеВыбора.
    • Добавьте на форму реквизит формы с именем, например, РезультатРазговора.
    • Свяжите этот реквизит формы с реквизитом объекта задачи, а точнее, с реквизитом бизнес-процесса, к которому относится задача. Поскольку у объекта Задача есть стандартный реквизит БизнесПроцесс, мы можем получить экземпляр бизнес-процесса и работать с его реквизитами.
  3. Привязка данных: Убедитесь, что выбранное пользователем значение в поле формы будет сохраняться в реквизит РезультатРеактивации соответствующего экземпляра бизнес-процесса при выполнении задачи. Это может быть реализовано через событие "При изменении" поля формы, либо в обработчике команды "Выполнено" на форме задачи.

Шаг 3: Подмена стандартной формы задачи на пользовательскую

Это один из наиболее важных технических шагов. Мы должны указать системе, какую форму использовать для конкретной точки маршрута нашего бизнес-процесса. Это делается в Модуле менеджера объекта метаданных Задача.<ИмяВашейЗадачи>.

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

Пример кода для подмены формы:


Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
    // Проверяем, что запрашивается форма объекта (не списка) и есть ключ объекта
    Если ВидФормы = "ФормаОбъекта" И Параметры.Свойство("Ключ") Тогда
        Перем СсылкаНаЗадачу;

        // Параметры.Ключ может быть СсылкойНаОбъект или УникальнымИдентификатором
        Если ТипЗнч(Параметры.Ключ) = Тип("УникальныйИдентификатор") Тогда
            // Если пришел УникальныйИдентификатор, пытаемся получить ссылку
            // Предполагаем, что наша задача называется "ЗадачаРеактивации"
            СсылкаНаЗадачу = Задачи.ЗадачаРеактивации.ПолучитьСсылку(Параметры.Ключ);
        ИначеЕсли ТипЗнч(Параметры.Ключ) = Тип("СсылкаОбъекта") Тогда
            // Если пришла СсылкаОбъекта, используем её напрямую
            СсылкаНаЗадачу = Параметры.Ключ;
        КонецЕсли;

        // Убедимся, что ссылка на задачу корректна
        Если Не СсылкаНаЗадачу.Пустая() Тогда
            // Получаем точку маршрута, к которой относится эта задача
            // Важно: ТочкаМаршрута хранится в самой задаче и указывает на точку БП,
            // в которой эта задача была создана.
            // Предполагаем, что наш бизнес-процесс называется "ПерезвонитьКонтрагенту"
            // и точка маршрута, требующая кастомной формы, также называется "ПерезвонитьКонтрагенту"
            Если СсылкаНаЗадачу.ТочкаМаршрута = БизнесПроцессы.ПерезвонитьКонтрагенту.ТочкиМаршрута.ПерезвонитьКонтрагенту Тогда
                // Отменяем стандартную обработку получения формы
                СтандартнаяОбработка = Ложь;
                // Указываем полный путь к нашей кастомной форме
                // Замените "ЗадачаРеактивации" на имя вашей задачи,
                // а "ФормаЗадачиРеактивацииКлиента" на имя вашей формы
                ВыбраннаяФорма = "Задача.ЗадачаРеактивации.ФормаЗадачиРеактивацииКлиента";
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Разъяснение кода:

Шаг 4: Передача результата из формы задачи в бизнес-процесс

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

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

Пример кода для передачу результата в бизнес-процесс:


// В МодулеОбъекта БизнесПроцесса (например, БизнесПроцессы.ПерезвонитьКонтрагенту)
// Процедура "ПриЗавершенииЗадачи" вызывается платформой при завершении задачи,
// которая относится к данному экземпляру бизнес-процесса.
Процедура ПриЗавершенииЗадачи(Задание, РезультатВыполнения)
    // Задание - это объект Задача, которое только что было выполнено
    // Мы можем проверить, что это та задача, результат которой нам нужен
    Если Задание.ТочкаМаршрута = БизнесПроцессы.ПерезвонитьКонтрагенту.ТочкиМаршрута.ПерезвонитьКонтрагенту Тогда
        // Получаем значение реквизита из завершенной задачи
        Перем ВыбранныйРезультат;
        Если Задание.Свойство("РезультатРеактивации") Тогда // Убедимся, что реквизит есть в задаче
            ВыбранныйРезультат = Задание.РезультатРеактивации;
        Иначе
            // Обработка ситуации, если реквизит не найден (например, ошибка)
            Сообщить("В завершенной задаче не найден реквизит 'РезультатРеактивации'.", СтатусСообщения.Внимание);
            Возврат;
        КонецЕсли;

        // Копируем полученное значение в реквизит текущего экземпляра бизнес-процесса
        ЭтаСсылка.РезультатРеактивации = ВыбранныйРезультат;
        ЭтаСсылка.Записать(); // Сохраняем изменение реквизита бизнес-процесса
    КонецЕсли;
КонецПроцедуры

Таким образом, реквизит РезультатРеактивации в объекте БизнесПроцессы.ПерезвонитьКонтрагенту будет содержать выбранное пользователем значение, готовое для использования.

Шаг 5: Настройка точки "Выбор варианта"

Теперь, когда у нас есть результат действия пользователя, сохраненный в реквизите бизнес-процесса, мы можем использовать его для маршрутизации процесса.

  1. Размещение точки: Разместим на карте маршрута бизнес-процесса точку "Выбор варианта" сразу после точки действия, в которой менеджер завершил задачу. От этой точки мы создадим несколько исходящих веток, каждая из которых будет соответствовать одному из возможных результатов реактивации. Например: "Будет брать", "Передано коллегам", "Позвонить через квартал", "В ЧС".
  2. Обработчик выбора варианта: Для точки "Выбор варианта" необходимо задать обработчик события ВыборВарианта в Модуле объекта вашего бизнес-процесса. Именно в этом обработчике мы будем анализировать значение реквизита РезультатРеактивации и устанавливать соответствующий вариант для дальнейшего движения процесса. Если значение не будет установлено, это приведет к ошибке и откату транзакции.

Пример кода для обработчика ВыборВарианта:


// В МодулеОбъекта БизнесПроцесса (например, БизнесПроцессы.ПерезвонитьКонтрагенту)
// Процедура "ВыборВарианта" вызывается платформой, когда бизнес-процесс достигает точки "Выбор варианта".
Процедура ВыборВарианта(ТочкаМаршрута, Результат, Отказ)
    // ТочкаМаршрута - текущая точка "Выбор варианта", к которой относится этот обработчик
    // Результат - параметр, который мы должны установить равным имени одной из веток
    // Отказ - если нужно отменить выбор (например, из-за ошибки данных)

    // Проверяем, что это нужная нам точка выбора вариантов
    Если ТочкаМаршрута = БизнесПроцессы.ПерезвонитьКонтрагенту.ТочкиМаршрута.ВыборДействияПослеРеактивации Тогда // Предположим, так называется ваша точка
        // Получаем значение реквизита из текущего экземпляра бизнес-процесса
        Перем ВыборПользователя;
        Если ЗначениеЗаполнено(ЭтаСсылка.РезультатРеактивации) Тогда
            ВыборПользователя = ЭтаСсылка.РезультатРеактивации;
        Иначе
            // Если по какой-то причине результат не был установлен,
            // можно установить вариант по умолчанию или вызвать ошибку.
            Отказ = Истина;
            Сообщить("Не удалось определить результат реактивации клиента. Бизнес-процесс остановлен.");
            Возврат;
        КонецЕсли;

        // В зависимости от значения реквизита, устанавливаем результат для точки выбора.
        // Имена веток в конфигураторе должны точно соответствовать этим строковым значениям!
        Если ВыборПользователя = Перечисления.РезультатыРеактивацииКлиента.БудетБрать Тогда
            Результат = "Будет брать"; // Имя ветки в конфигураторе
        ИначеЕсли ВыборПользователя = Перечисления.РезультатыРеактивацииКлиента.ПереданоКоллегам Тогда
            Результат = "Передано коллегам в отдел по территории"; // Имя ветки в конфигураторе
        ИначеЕсли ВыборПользователя = Перечисления.РезультатыРеактивацииКлиента.ПерезвонитьЧерезКвартал Тогда
            Результат = "Позвонить через квартал"; // Имя ветки в конфигураторе
        ИначеЕсли ВыборПользователя = Перечисления.РезультатыРеактивацииКлиента.ВЧерныйСписок Тогда
            Результат = "Не норм, в ЧС"; // Имя ветки в конфигураторе
        Иначе
            // Обработка непредвиденных значений (если такое возможно)
            Отказ = Истина;
            Сообщить("Некорректный результат реактивации: " + Строка(ВыборПользователя));
        КонецЕсли;

        // После установки Результат, процесс автоматически перейдет по соответствующей ветке.
    КонецЕсли;
КонецПроцедуры

Важно: Имена вариантов (веток), исходящих из точки "Выбор варианта" на карте маршрута в конфигураторе, должны точно соответствовать строковым значениям, которые мы устанавливаем в параметр Результат в обработчике `ВыборВарианта`. Если имя ветки не совпадет, процесс выдаст ошибку.

Итоги и рекомендации

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

  1. Создание реквизита в бизнес-процессе для хранения выбора пользователя.
  2. Разработка пользовательской формы задачи, содержащей элементы для ввода этого реквизита. При этом можно рассмотреть разработку интерфейса по текстовому описанию для прототипирования подобных форм.
  3. Программная подмена стандартной формы задачи на нашу кастомную с использованием обработчика `ОбработкаПолученияФормы` в модуле менеджера задачи.
  4. Передача выбранного значения из задачи в реквизит бизнес-процесса при завершении задачи с помощью обработчика `ПриЗавершенииЗадачи`.
  5. Настройка обработчика `ВыборВарианта` для точки выбора, который на основе реквизита бизнес-процесса определяет дальнейшее движение по маршруту.

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

← На главную