Почему не стартует бизнес-процесс в 1С, если код скопирован с рабочего аналога?

Программист 1С v8.3 (Обычные формы)
← На главную

Часто при разработке в 1С возникает ситуация, когда новый бизнес-процесс, созданный по аналогии с уже работающим, отказывается стартовать. При этом никаких явных ошибок система не выдает, а отладка модуля объекта задачи не показывает проблем. Проанализируем типичный случай и разберем по шагам, как найти и устранить истинную причину такого поведения.

Представим ситуацию: вы создали для нового вида документа бизнес-процесс, скопировав логику с существующего. Код в модуле объекта Задачи полностью аналогичен, но для нового документа задачи не создаются, и процесс не запускается. Первое, что приходит на ум, — это отладка, но где именно нужно искать проблему?

Ловушка отладки: почему модуль Задачи не поможет

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

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

Правильный подход: ищем точку входа

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

Разберем по шагам, как действовать:

  1. Найдите место запуска. Используйте глобальный поиск по конфигурации (Ctrl+Shift+F), чтобы найти все упоминания метода Старт() для вашего типа бизнес-процесса. Скорее всего, вы найдете его в модуле объекта документа, при проведении которого должен запускаться процесс.
  2. Установите точку останова. Поставьте точку останова в коде перед вызовом метода Старт(). Это позволит "поймать" момент инициализации процесса.
  3. Запустите отладку. В пользовательском режиме выполните действие, которое должно инициировать процесс (например, проведите новый документ).
  4. Проанализируйте переменные. Когда отладчик остановится на точке останова, внимательно изучите объект бизнес-процесса, который готовится к старту. Проверьте его реквизиты. Заполнены ли они? Соответствуют ли они ожиданиям?

Чаще всего проблема кроется именно на этапе заполнения реквизитов бизнес-процесса перед его стартом.

Пример из практики: пустые данные на входе

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

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

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

Общий алгоритм запуска и отладки бизнес-процесса

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


// 1. Создание нового объекта бизнес-процесса
// Обычно происходит в модуле объекта документа, при проведении
НовыйБП = БизнесПроцессы.МойБизнесПроцесс.СоздатьБизнесПроцесс();

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

// 3. Запись и запуск
// Запись необходима, чтобы присвоить объекту ссылку
НовыйБП.Записать();

// Непосредственно запуск, после которого создается первая задача
// !!! Вот здесь нужно ставить точку останова для отладки !!!
НовыйБП.Старт();

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

Чек-лист для проверки, если бизнес-процесс не стартует

Если вы столкнулись с подобной проблемой, пройдитесь по следующему списку:

  1. Найдите вызов Старт(): убедитесь, что код, запускающий бизнес-процесс, в принципе выполняется для вашего случая.
  2. Проверьте данные перед стартом: с помощью отладчика посмотрите, какие значения содержатся в реквизитах объекта бизнес-процесса прямо перед вызовом метода Старт().
  3. Проверьте настроечные данные: если логика старта зависит от данных в справочниках или регистрах сведений (например, списки согласующих, настройки маршрутов), убедитесь, что для нового процесса или документа эти данные внесены в систему.
  4. Проверьте карту маршрута: откройте карту маршрута вашего бизнес-процесса в конфигураторе. Убедитесь, что у нее есть точка старта, и от нее идут корректные связи к первым точкам действия. Иногда проблема может быть в самой схеме.
  5. Проверьте права доступа: удостоверьтесь, что у пользователя, от имени которого запускается процесс, есть права на создание и запуск объектов данного бизнес-процесса и связанных с ним задач.

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

← На главную