Почему не создается следующая задача в бизнес-процессе 1С и как это исправить?

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

При разработке и сопровождении бизнес-процессов (БП) в среде «1С:Предприятие» разработчики часто сталкиваются с неочевидным поведением системы: текущая задача пользователя успешно выполняется, но следующая по маршруту задача не создается. Бизнес-процесс при этом просто «зависает» на определенном этапе.

В этой статье мы подробно проанализируем подобную техническую проблему на примере отраслевого решения «Бухгалтерия элеватора, мельницы и комбикормового завода для Украины» (разработка ЧП «ИН-АГРО», платформа 8.3). Мы рассмотрим причины возникновения этой ошибки, разберем по шагам методы диагностики с помощью отладчика и найдем способы её окончательного устранения.

Суть проблемы: зависание бизнес-процесса на стыке задач

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

При этом как интерактивное выполнение задачи пользователем в режиме «1С:Предприятие», так и программная установка признака выполнения дают одинаковый, неудовлетворительный результат:

Проанализируем эту ситуацию и выясним, почему стандартные механизмы платформы дают сбой.

Шаг 1. Исключаем невыполнение условий маршрутизации

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

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

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

Шаг 2. Проверка обработчиков событий создания задач

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

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


Процедура ПроверкаОхранойПередСозданиемЗадач(ТочкаМаршрута, ФормируемыеЗадачи, СтандартнаяОбработка)
    // Установим точку останова на этой строке
    ПредупреждениеОтладка = "Точка маршрута активна";
КонецПроцедуры

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

Главная причина: Блокировка процесса помеченными на удаление задачами

В сложных прикладных и отраслевых решениях (включая конфигурации для АПК от «ИН-АГРО») логика бизнес-процессов тесно связана с документами оперативного учета (такими как ТТН, акты взвешивания и лабораторные анализы). Чтобы избежать хаоса в учете, разработчики закладывают в систему жесткие проверки на уникальность выполняемых операций.

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ РАЗРЕШЕННЫЕ
    |	Задачи.Ссылка КАК Ссылка
    |ИЗ
    |	Задача.ЗадачиПользователей КАК Задачи
    |ГДЕ
    |	Задачи.БизнесПроцесс = &БизнесПроцесс
    |	И Задачи.ТочкаМаршрута = &ТочкаМаршрута";

Запрос.УстановитьПараметр("БизнесПроцесс", СсылкаНаБП);
Запрос.УстановитьПараметр("ТочкаМаршрута", ТекущаяТочка);

РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
    // Система считает, что задача уже создана, и прерывает алгоритм
    Возврат;
КонецЕсли;

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

Запрос находит эту «мусорную» запись, признает её существующей задачей и блокирует создание новой активной задачи для следующего шага. Бизнес-процесс при этом считает свою работу завершенной, а пользователь не видит никаких ошибок, так как исключение (отказ) не вызывается программно.

Решение проблемы по шагам

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

Шаг 3. Физическое удаление помеченных задач (пользовательский режим)

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

  1. Запустите сеанс «1С:Предприятие» под правами администратора.
  2. Перейдите в раздел Администрирование (или меню Операции в обычном интерфейсе) и выберите пункт Удаление помеченных объектов.
  3. В появившемся списке найдите объект метаданных Задачи (в частности, задачи, относящиеся к зависшему бизнес-процессу).
  4. Выполните поиск связей и запустите процедуру полного удаления.

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

Шаг 4. Корректировка программного кода контроля уникальности

Чтобы исключить повторение данной проблемы в будущем, необходимо внести изменения в конфигурацию (через расширение или напрямую, если база снята с поддержки). Найдите в коде процедуры, которые осуществляют контроль создания задач по точкам маршрута, и добавьте проверку флага ПометкаУдаления.

Исправленный вариант запроса должен выглядеть следующим образом:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ РАЗРЕШЕННЫЕ
    |	Задачи.Ссылка КАК Ссылка
    |ИЗ
    |	Задача.ЗадачиПользователей КАК Задачи
    |ГДЕ
    |	Задачи.БизнесПроцесс = &БизнесПроцесс
    |	И Задачи.ТочкаМаршрута = &ТочкаМаршрута
    |	И НЕ Задачи.ПометкаУдаления"; // Фильтруем удаленные задачи

Запрос.УстановитьПараметр("БизнесПроцесс", СсылкаНаБП);
Запрос.УстановитьПараметр("ТочкаМаршрута", ТекущаяТочка);

Использование конструкции И НЕ Задачи.ПометкаУдаления гарантирует, что система будет игнорировать помеченные на удаление задачи-«призраки», позволяя бизнес-процессу корректно создавать новые цепочки задач для пользователей.

Дополнительные технические нюансы при изменении карты маршрута

Если очистка помеченных задач не помогла, проанализируем еще два важных аспекта, связанных с изменением логики БП:

  1. Кэширование карты маршрута на сервере: При редактировании схемы бизнес-процесса в конфигураторе платформа 1С может продолжать использовать старую версию карты маршрута для уже запущенных (активных) экземпляров БП. В таком случае система пытается сопоставить новые задачи со старыми идентификаторами точек (GUID), что приводит к сбоям. Решается это перезапуском службы сервера «1С:Предприятия» или очисткой серверного кэша.
  2. Незавершенные транзакции записи: Если в точке Взвешивание прописан сложный код, который параллельно производит запись в регистры или документы оперативного учета, и эта запись блокируется из-за нехватки прав или взаимоблокировок базы данных, транзакция формирования следующей задачи может неявно откатываться. Проверьте технологический журнал на наличие скрытых ошибок СУБД.

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

← На главную