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