Как программно запустить бизнес-процесс в 1С:Предприятие 8

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

Запуск бизнес-процесса программным способом — это базовая задача при автоматизации документооборота и бизнес-логики. Несмотря на кажущуюся простоту метода Старт(), существует множество нюансов, связанных с записью объекта, заполнением карты маршрута и особенностями конкретных конфигураций, таких как «1С:Документооборот». В этой статье мы подробно разберем, как правильно инициировать бизнес-процесс из кода, чтобы задачи исполнителям создались корректно.

Базовый механизм платформы: Метод Старт

На уровне платформы «1С:Предприятие 8» за движение бизнес-процесса отвечает объект БизнесПроцессОбъект. Основной метод, который заставляет систему анализировать карту маршрута и создавать задачи, называется Старт(). Рассмотрим простейший алгоритм запуска:

Для начала проанализируем, что происходит при вызове этого метода. Система обращается к карте маршрута и начинает движение от «Точки старта». Она проходит все промежуточные точки (условия, разделения) до тех пор, пока не встретит «Точку действия» или «Точку вложенного бизнес-процесса». Именно в этот момент платформа физически записывает задачи для исполнителей в базу данных.

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


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

Если на карте маршрута определено несколько точек старта, метод Старт() потребует параметр — ссылку на конкретную точку маршрута. Если точка одна, параметр можно не указывать.

Особенности работы в конфигурации «1С:Документооборот»

В типовых решениях, таких как «1С:Документооборот» (EDO), недостаточно просто вызвать платформенный метод. Здесь бизнес-процессы обросли сложной логикой: шаблонами, предметами (документами) и ролевой маршрутизацией. Разберем, как использовать штатные возможности конфигурации для запуска процесса «Исполнение».

Проанализируем ситуацию, когда нам нужно создать процесс по заранее настроенному шаблону. Это наиболее правильный путь, так как шаблон уже содержит настройки сроков, исполнителей и условий.


// Программное создание процесса по шаблону в 1С:ДО
Бп = БизнесПроцессы.Исполнение.СоздатьБизнесПроцесс();

// Используем встроенные механизмы заполнения
// Параметры: Шаблон, Предмет (ссылка на документ), Автор
Бп.ЗаполнитьПоШаблонуИПредмету(Справочники.ШаблоныИсполнения.НайтиПоНаименованию("ШаблонИсполненияПриказа"), Объект.Ссылка, Пользователи.ТекущийПользователь());

Бп.Наименование = "Исполнение по документу: " + Объект.Ссылка;
Бп.Дата = ТекущаяДатаСеанса();

// Обработка мультипредметности (если к процессу привязано несколько документов)
Мультипредметность.ПередатьПредметыПроцессу(Бп, Объект.Ссылка, Ложь, Истина);

Бп.Записать();
Бп.Старт();

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

Программное создание вложенных бизнес-процессов

Часто возникает задача запустить подчиненный процесс внутри основного (например, в рамках одного из этапов «Комплексного процесса»). Ключевым моментом здесь является реквизит ВедущаяЗадача.

Рассмотрим пошагово, как связать два процесса:

  1. Создаем новый объект бизнес-процесса (подчиненный).
  2. Находим задачу основного процесса, на которой выполнение должно «остановиться» до завершения вложенного.
  3. Записываем эту задачу в реквизит ВедущаяЗадача создаваемого процесса.
  4. Для корректного отображения в интерфейсе (в дереве связей) необходимо также внести записи в табличные части Этапы основного процесса, если речь идет о комплексном процессе.

Важно помнить: пока вложенный процесс не будет завершен (не будет выполнена его финальная точка маршрута), ВедущаяЗадача не перейдет в состояние «Выполнена», и основной процесс не двинется дальше по своей карте.

Транзакционная модель и обработка событий

Проанализируем техническую сторону выполнения метода Старт(). Весь путь от точки старта до первой точки действия выполняется в рамках одной транзакции базы данных. Это означает следующее:

Во-первых, если в коде обработчика события ПередСтартом или непосредственно в карте маршрута возникнет ошибка (например, деление на ноль в условии), транзакция откатится. В итоге бизнес-процесс не будет создан, а запись в базе исчезнет.

Во-вторых, не рекомендуется размещать тяжелые вычисления сразу после метода Старт() в той же процедуре. Лучше убедиться, что процесс запустился успешно. Хорошим тоном считается проверка свойства Стартован перед вызовом метода, чтобы избежать повторного запуска, который вызовет исключение.


Если Не БпОбъект.Стартован Тогда
    Попытка
        БпОбъект.Старт();
    Исключение
        ЗаписьЖурналаРегистрации("Ошибка запуска БП", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
        ВызватьИсключение "Не удалось запустить процесс: " + ОписаниеОшибки();
    КонецПопытки;
КонецЕсли;

Работа с исполнителями и предметами

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


Бп = БизнесПроцессы.Исполнение.СоздатьБизнесПроцесс();
Бп.Дата = ТекущаяДатаСеанса();
Бп.Автор = Пользователи.ТекущийПользователь();

// Заполнение исполнителей (параллельное исполнение)
Бп.ВариантИсполнения = Перечисления.ВариантыМаршрутизацииЗадач.Параллельно;
НоваяСтрока = Бп.Исполнители.Добавить();
НоваяСтрока.Исполнение = Справочники.Пользователи.НайтиПоНаименованию("Иванов И.И.");
НоваяСтрока.СрокИсполнения = ТекущаяДатаСеанса() + 86400; // +1 день

// Привязка предмета через типовой механизм
Мультипредметность.ПередатьПредметыПроцессу(Бп, СсылкаНаДокумент, Ложь, Истина);

// Установка наименования по правилам системы
МультипредметностьКлиентСервер.ЗаполнитьНаименованиеПроцесса(Бп, "Исполнить поручение по приказу");

Бп.Записать();
Бп.Старт();

Обратите внимание на использование метода Мультипредметность.ПередатьПредметыПроцессу. Он гарантирует, что документ попадет в табличную часть Предметы с правильными ролями (Основной/Вспомогательный), что критично для работы автоподстановок (например, когда исполнитель должен быть «Руководителем автора документа»). Для настройки гибкой маршрутизации можно использовать подсистему пользовательских автоподстановок для 1С:Документооборот.

Фоновый старт для высоконагруженных систем

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

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

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

← На главную