К статье
Практический материал

Разработка и Конфигурация · 11 мин

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

Как программно запустить бизнес-процесс в 1С: метод Записать и Старт, заполнение параметров, старт по расписанию и из внешних систем. Примеры кода и типичные ошибки.

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

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

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

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

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

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

Важно понимать разницу между записью и стартом. Метод Записать() только сохраняет объект в базе — процесс при этом остаётся нестартованным, задачи не создаются. Активация маршрута происходит только при вызове метода Старт() (в типовых конфигурациях также встречается обработчик ПриЗаписи с флагом старта или собственные процедуры запуска).

Минимальный код запуска процесса

Базовый фрагмент выглядит одинаково для любой конфигурации на обычных или управляемых формах:

НовыйПроцесс = БизнесПроцессы.СогласованиеЗаявки.СоздатьБизнесПроцесс();

НовыйПроцесс.Дата = ТекущаяДатаСеанса();

НовыйПроцесс.Автор = Пользователи.ТекущийПользователь();

НовыйПроцесс.Предмет = СсылкаНаЗаявку;

НовыйПроцесс.Записать();

НовыйПроцесс.Старт();

Имя вида процесса (СогласованиеЗаявки в примере) должно совпадать с именем объекта метаданных в конфигураторе. Набор реквизитов — Автор, Предмет, Инициатор и другие — определяется тем, какие реквизиты заведены у конкретного вида процесса. Если реквизит не существует, обращение к нему вызовет ошибку исполнения.

Порядок программного старта
  1. 1
    Создайте объект: БизнесПроцессы.<Имя>.СоздатьБизнесПроцесс()
  2. 2
    Заполните дату, автора и все обязательные реквизиты и параметры маршрута
  3. 3
    Вызовите Записать() и убедитесь, что исключений не возникло
  4. 4
    Вызовите Старт() — платформа создаст задачи первой точки маршрута
  5. 5
    Проверьте свойство Стартован и наличие задач у исполнителей

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

Заполнение параметров и реквизитов перед стартом

Большинство реальных процессов не стартуют «пустыми»: маршрут содержит условия, которые читают параметры процесса, и точки действия с адресацией на роли или конкретных исполнителей. Если параметр, используемый в условии, не заполнен, процесс либо пойдёт не по той ветке, либо остановится с ошибкой формирования задач.

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

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

Если Не НовыйПроцесс.ПроверитьЗаполнение() Тогда

ВызватьИсключение "Процесс не заполнен корректно, старт отменён";

КонецЕсли;

Старт из документа, по расписанию и извне

Старт при записи документа

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

Старт регламентным заданием

Для периодических процессов — например, ежедневной сверки или напоминаний — создают регламентное задание, в обработчике которого формируется и стартует процесс. Здесь важны два момента: задание выполняется на сервере под служебным пользователем, поэтому автора процесса нужно задавать явно; при падении задания ошибка видна только в журнале регистрации, поэтому стоит обернуть старт в попытку с записью диагностики.

Старт из внешней системы

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

Сравнение способов запуска

Из обработчика записи документа

Мгновенная реакция на событие; минус — риск блокировок и дублей при перезаписи, нужна проверка существующих процессов

Регламентное задание

Подходит для отложенного и периодического старта; минус — задержка до ближайшего запуска и ошибки только в журнале регистрации

HTTP/веб-сервис

Единственный вариант для внешних систем; требует аутентификации, валидации данных и защиты от повторных вызовов

Проверка результата и диагностика

После вызова Старт() минимальная проверка — прочитать свойство Стартован у объекта процесса: оно должно быть равно Истина. Дополнительно стоит запросом убедиться, что по процессу созданы задачи и у них заполнен исполнитель или роль.

Запрос = Новый Запрос(

"ВЫБРАТЬ Задача.Ссылка, Задача.Исполнитель

|ИЗ Задача.ЗадачаИсполнителя КАК Задача

|ГДЕ Задача.БизнесПроцесс = &Процесс И НЕ Задача.Выполнена");

Запрос.УстановитьПараметр("Процесс", НовыйПроцесс.Ссылка);

Контрольные точки

Как проверить результат

Свойство Стартован у объекта процесса
Норма

Равно Истина сразу после вызова Старт()

Тревожный признак

Ложь — старт не выполнен, смотрите исключения и права

Задачи по процессу
Норма

Есть невыполненные задачи с заполненным исполнителем или ролью

Тревожный признак

Задач нет или исполнитель пуст — ошибка в адресации или параметрах

Карта маршрута
Норма

Активная точка соответствует ожидаемому первому шагу

Тревожный признак

Процесс ушёл не по той ветке — проверяйте параметры условий

Если процесс стартовал, но задач нет, причина почти всегда в адресации: роль не имеет исполнителей в заданной области адресации, либо параметр, от которого зависит выбор исполнителя, пуст. Проверяйте регистры адресации и состав ролей исполнителей до повторного старта.

Ограничения и типичные ошибки

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

Вторая группа ограничений — конкурентный доступ. Одновременный старт нескольких процессов по одному предмету из разных сеансов может привести к конфликту блокировок. Решение — устанавливать управляемую блокировку на предмет до создания процесса или проверять существование активного процесса в той же транзакции.

Типичные ошибки
01
Вызов Старт() без Записать() или наоборот — процесс либо не сохранён, либо сохранён, но никогда не активируется
02
Отсутствие проверки дублей — каждая перезапись документа создаёт новый процесс согласования
03
Старт из клиентского контекста — методы работы с объектами доступны только на сервере, нужен серверный вызов
04
Игнорирование исключений — процесс не стартовал, а пользователь или внешняя система считают, что всё запущено
05
Заполнение несуществующих реквизитов — обращение к реквизиту, которого нет у вида процесса, вызывает ошибку исполнения

Отдельно отметим типовые механизмы: в конфигурациях на БСП и в 1С:Документооборот часто есть готовые API для запуска (процедуры вида «СтартоватьПроцесс», работа с шаблонами). Используйте их вместо прямого обращения к объектам — так код переживёт обновления конфигурации без доработок.

Итог

Что важно запомнить

Программный старт — это СоздатьБизнесПроцесс(), заполнение реквизитов, Записать(), Старт(). Обязательны проверка заполнения параметров маршрута, контроль дублей по предмету и проверка результата: свойство Стартован и наличие задач с исполнителями. Права на добавление процессов нужны и у служебных учётных записей регламентных заданий и сервисов.

Частые вопросы

Можно ли стартовать процесс без записи в базу?

Нет. Метод Старт() работает с сохранённым объектом: платформе нужна ссылка процесса, чтобы связать с ним создаваемые задачи. Правильная последовательность — сначала Записать(), затем Старт().

Как перезапустить завершённый или прерванный процесс?

Штатно повторный старт того же экземпляра не предусмотрен. Практикуемый вариант — создать новый экземпляр процесса с теми же параметрами и предметом. Прерванный процесс при этом остаётся в базе для истории.

Почему процесс стартует, но задачи никому не приходят?

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

Как запустить процесс от имени конкретного пользователя из регламентного задания?

Сеанс регламентного задания сменить пользователя не может, но реквизиты процесса — Автор, Инициатор — заполняются явно ссылкой на нужного пользователя. Задачи исполнителям создадутся корректно независимо от того, под кем выполнялся код.

Чем программный старт отличается от старта по шаблону?

Шаблон — это предзаполненный набор параметров и маршрута. Старт по шаблону избавляет от ручного заполнения десятков реквизитов и снижает риск ошибок; программно это реализуется созданием процесса и копированием параметров из шаблона штатными средствами конфигурации.

Безопасно ли стартовать процесс в транзакции записи документа?

Технически работает, но при откате транзакции откатится и процесс, а при длительной записи растёт риск блокировок. Надёжнее зафиксировать документ, а старт выполнить отдельно — через фоновое задание или очередь событий.