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