Разработка и Конфигурация · 11 мин
Как программно запустить бизнес-процесс в 1С
Как программно создать и запустить бизнес-процесс в 1С: методы СоздатьБизнесПроцесс и Записать, старт из обработки, фоновый запуск, проверка результата и типичные ошибки.
Программный запуск бизнес-процесса в 1С нужен, когда старт процесса должен происходить автоматически: при записи документа, по расписанию, из внешней обработки или при обмене данными. Вместо ручного создания через интерфейс разработчик создаёт объект бизнес-процесса, заполняет его реквизиты и вызывает старт встроенным языком.
Базовый механизм одинаков для всех типовых и самописных конфигураций: менеджер бизнес-процесса создаёт объект, объект записывается, после чего вызывается старт. Отличия возникают только в составе реквизитов конкретного вида процесса и в наличии типовых процедур-обёрток, например в подсистеме бизнес-процессов БСП.
Ниже разобраны способы запуска с примерами кода, варианты запуска из регламентных заданий и обработчиков, проверка результата и ограничения, о которых нужно помнить, чтобы не получить дубли процессов или зависшие задачи.
Как устроен программный старт бизнес-процесса
Бизнес-процесс в 1С — это объект метаданных, экземпляр которого создаётся через менеджер БизнесПроцессы.<ИмяВида>. Метод СоздатьБизнесПроцесс() возвращает новый объект, который существует только в памяти, пока не будет записан. Старт процесса выполняет метод Старт(): он записывает объект и создаёт задачи по первой точке маршрута.
Важно понимать разницу между записью и стартом. Метод Записать() фиксирует процесс в базе в незапущенном состоянии — такой объект можно подготовить заранее и стартовать позже. Метод Старт() сам выполняет запись, поэтому вызывать Записать() перед ним отдельно не обязательно, если все реквизиты уже заполнены.
Если конфигурация построена на Библиотеке стандартных подсистем, часто уже есть готовые программные интерфейсы, например функции работы с задачами и процессами в общих модулях подсистемы. Перед написанием собственного кода стоит проверить наличие таких обёрток — они учитывают нумерацию, права и особенности конкретной конфигурации.
Базовый пример: запуск из встроенного языка
Минимальный код запуска выглядит так:
Процесс = БизнесПроцессы.СогласованиеЗаявки.СоздатьБизнесПроцесс();
Процесс.Дата = ТекущаяДатаСеанса();
Процесс.Автор = Пользователи.ТекущийПользователь();
Процесс.Предмет = СсылкаНаЗаявку;
Процесс.Инициатор = СсылкаНаСотрудника;
Процесс.Старт();
Метод Старт() возвращает булево: Истина, если процесс успешно стартовал и задачи созданы. Результат стоит проверять и фиксировать в журнале регистрации, особенно при автоматическом запуске без участия пользователя.
Если нужно получить ссылку на созданный процесс после старта, используйте Процесс.Ссылка — объект уже записан, и ссылка доступна. По этой ссылке позже можно найти задачи процесса запросом к таблице задач с отбором по реквизиту БизнесПроцесс.
Процесс = БизнесПроцессы.СогласованиеЗаявки.СоздатьБизнесПроцесс();
Процесс.Дата = ТекущаяДатаСеанса();
Процесс.Предмет = СсылкаНаЗаявку;
Если Не Процесс.Старт() Тогда
ЗаписьЖурналаРегистрации("Старт БП", УровеньЖурналаРегистрации.Ошибка,,, "Не удалось стартовать процесс");
КонецЕсли;Запуск при записи документа через подписку на событие
Самый частый сценарий — автоматический старт процесса при проведении документа. Для этого создаётся подписка на событие ПриЗаписи нужного вида документов, а обработчик размещается в общем модуле с установленным признаком «Сервер».
В обработчике обязательно проверяйте условия, иначе процесс будет стартовать при каждой перезаписи документа. Типовые проверки: документ проведён, процесс по этому документу ещё не создан, дополнительные условия по виду операции или сумме.
Процедура СтартоватьСогласованиеПриЗаписи(Источник, Отказ) Экспорт
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
Если Не Источник.Проведен Тогда
Возврат;
КонецЕсли;
Если ПроцессПоДокументуСуществует(Источник.Ссылка) Тогда
Возврат;
КонецЕсли;
Процесс = БизнесПроцессы.СогласованиеЗаявки.СоздатьБизнесПроцесс();
Процесс.Дата = ТекущаяДатаСеанса();
Процесс.Предмет = Источник.Ссылка;
Процесс.Старт();
КонецПроцедуры
Проверка ОбменДанными.Загрузка обязательна: без неё процессы будут стартовать при загрузке данных через обмен, массовой обработке или конвертации, что приведёт к лавине нежелательных задач.
Запуск из регламентного задания и в фоне
Если процессы должны создаваться по расписанию — например, ежедневный процесс сверки остатков — логика размещается в общем модуле, который вызывает регламентное задание. Код запуска тот же, но есть нюанс: в фоновом сеансе недоступен интерактивный контекст, поэтому автор и инициатор должны определяться явно, например через параметры задания или предопределённого пользователя.
Для запуска из клиентского приложения без блокировки интерфейса используется ФоновыеЗадания.Выполнить() с передачей параметров в виде массива. Учтите, что в фоновое задание можно передать только сериализуемые значения — ссылки передавать можно, а объекты (несохранённые) нельзя.
При массовом старте множества процессов в одном задании оборачивайте старт каждого процесса в попытку/исключение, чтобы ошибка в одном объекте не прерывала обработку остальных. Записывайте ошибки в журнал регистрации с указанием предмета процесса.
Проверка, что процесс действительно запустился
Успешный вызов Старт() — необходимое, но не всегда достаточное подтверждение. Надёжная проверка: запрос к задачам с отбором по бизнес-процессу. Если задачи созданы и не выполнены — процесс жив. Если задач нет, значит старт не состоялся или маршрут настроен так, что сразу ведёт к завершению.
Дополнительные контрольные точки: реквизит Стартован у объекта процесса должен быть истинным, Завершен — ложным. В типовых конфигурациях состояние процесса может дублироваться в специальном реквизите или регистре — сверяйтесь с ним, если он используется в отчётах.
Как проверить результат
Возвращено значение Истина
Возвращено Ложь или возникло исключение
Запрос по отбору БизнесПроцесс = Ссылка возвращает активные задачи
Задач нет или все сразу выполнены
Стартован = Истина, Завершен = Ложь
Стартован = Ложь — процесс записан, но не запущен
Типичные ошибки и ограничения
Одна из частых ошибок — попытка заполнить реквизиты процесса после вызова Старт(). После старта объект записан, и изменение реквизитов требует повторной записи, а задачи уже созданы со старыми данными. Сначала заполняйте всё, потом стартуйте.
Вторая типичная проблема — отсутствие прав у пользователя, под которым выполняется код. Фоновое задание исполняется под указанным пользователем, и если у него нет прав на создание бизнес-процессов или задач, старт завершится ошибкой. Проверяйте права до выкатывания в рабочую базу.
Третья ошибка — старт процесса в транзакции записи документа с последующим откатом. Если запись документа откатывается, а процесс стартовал в отдельной транзакции или уже зафиксирован, получается «осиротевший» процесс без предмета. Размещайте старт в обработчике после записи, когда основная транзакция завершена, либо контролируйте её границы.
Альтернативы прямому программному старту
Не всегда нужен собственный код. В конфигурациях на БСП есть механизм «Старт бизнес-процессов по событиям» и настройки шаблонов процессов, которые позволяют настроить автоматический запуск без доработки. Если задача решается настройкой, предпочтите её — меньше кода, меньше ошибок при обновлении.
Для интеграционных сценариев запуск возможен через HTTP-сервис или веб-сервис, опубликованный на стороне 1С: внешняя система вызывает сервис, а его код создаёт и стартует процесс. Это правильнее, чем запись напрямую в таблицы базы, — прямая запись нарушает логику маршрута и поддержку конфигурации.
Сравнение вариантов запуска
Максимальная гибкость, подходит для любых условий; требует доработки и сопровождения
Автоматический старт по факту записи; нужна защита от дублей и обмена данными
Запуск по расписанию без действий пользователя; нет интерактивного контекста
Без программирования; ограничены возможностями типовой подсистемы
Запуск из внешних систем; требует публикации и настройки аутентификации
Порядок внедрения программного запуска
- 1Определите вид бизнес-процесса и список обязательных реквизитов для старта
- 2Напишите процедуру запуска в общем серверном модуле с проверкой результата Старт()
- 3Добавьте защиту от дублей: поиск существующего процесса по предмету
- 4Подключите вызов: подписка на событие, регламентное задание или кнопка
- 5Проверьте права пользователя, под которым исполняется код
- 6Протестируйте на копии базы: старт, создание задач, повторная запись, обмен данными
После внедрения отслеживайте журнал регистрации первые дни: именно там видны отказы старта, ошибки прав и исключения в фоновых заданиях. Полезно временно добавить информационные записи о каждом успешном старте с указанием предмета и автора.
Что важно запомнить
Программный старт — это СоздатьБизнесПроцесс(), заполнение реквизитов и Старт(). Обязательны проверка результата, защита от дублей, отсечка загрузки при обмене и контроль прав. Сначала тест на копии, затем рабочая база.
Частые вопросы
Чем отличается Записать() от Старт() у бизнес-процесса?
Записать() сохраняет процесс в базе в незапущенном состоянии — задачи по маршруту не создаются. Старт() записывает объект и формирует задачи первой точки маршрута. Если нужно подготовить процесс заранее, используйте Записать(), а Старт() вызывайте позже отдельно.
Почему Старт() возвращает Ложь?
Чаще всего не заполнены обязательные для старта реквизиты, не настроена карта маршрута либо у пользователя нет прав на создание задач. Текст причины обычно фиксируется в сообщениях пользователю или журнале регистрации — проверьте оба источника.
Как найти задачи, созданные при старте процесса?
Запросом к таблице задач с отбором по реквизиту БизнесПроцесс: ВЫБРАТЬ Ссылка ИЗ Задача.ЗадачаИсполнителя ГДЕ БизнесПроцесс = &Процесс И НЕ Выполнена. Это надёжный способ убедиться, что процесс реально запущен.
Можно ли запустить процесс из внешнего приложения?
Да, через опубликованный HTTP-сервис или веб-сервис 1С: внешняя система вызывает сервис, а его обработчик создаёт и стартует процесс штатным кодом. Прямая запись в таблицы базы недопустима — она нарушает логику маршрута и целостность данных.
Как предотвратить повторный старт процесса по тому же документу?
Перед созданием выполняйте запрос: ищите процессы, у которых реквизит предмета равен ссылке на документ и Завершен = Ложь. Если такой процесс найден — не создавайте новый, а при необходимости работайте с существующим.
Работает ли Старт() в фоновом задании?
Да, метод полностью серверный и выполняется в фоновом сеансе. Ограничение одно: в фоне недоступен интерактивный контекст, поэтому автора, инициатора и прочие параметры нужно определять явно и передавать в задание сериализуемыми значениями.