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