Как устранить и предотвратить дублирование бизнес-процессов в 1С:Документооборот?

Программист 1С v8.3 (Управляемые формы) 1С:Документооборот IT и автоматизация бизнеса
← На главную

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

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

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

Выясним основные причины, ведущие к формированию повторных процессов согласования и исполнения:

  1. Задержка интерфейса и человеческий фактор: При высокой нагрузке на сервер или в тонком/веб-клиенте между нажатием кнопки старта и обновлением состояния формы проходит время. Если интерактивные элементы не блокируются, пользователь кликает по кнопке повторно.
  2. Фоновый старт процессов: Если в настройках включена обработка старта процессов через фоновые задания, процесс создается не в текущем сеансе, а откладывается. Документ визуально не меняет статус сразу, что провоцирует пользователя на повторные действия.
  3. Отсутствие штатного запрета на уровне платформы: В базовом функционале редакции 2.1 конфигурации 1С:Документооборот нет отдельной настройки, строго блокирующей повторный запуск аналогичного комплексного процесса по предмету.

Как предотвратить повторный запуск процессов (программно и инструментально)

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

1. Использование условия маршрутизации в шаблоне или подписки на событие

Наиболее надежным способом является проверка наличия активных процессов по данному предмету перед запуском нового. Эту проверку можно внедрить в условие маршрутизации шаблона процесса или в подписку на событие ПередЗаписью бизнес-процесса.

Разберем пример запроса, который определяет, запущен ли уже активный комплексный процесс по указанному предмету и шаблону:


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

Запрос.УстановитьПараметр("Предмет", Предмет);
Запрос.УстановитьПараметр("Шаблон", Шаблон);

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

2. Блокировка элементов формы на клиенте

В управляемой форме старта процесса при нажатии кнопки запуска следует мгновенно делать её недоступной (Элементы.ФормаЗапустить.Доступность = Ложь). Это предотвратит повторные клики пользователя во время длительного вызова сервера.

3. Использование управляемых блокировок

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

Как исправить уже созданные дубли и восстановить статус документа

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

Разберем алгоритм исправления ошибочно записанных данных:

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

В современной редакции 3.0 конфигурации 1С:Документооборот концепция работы с процессами была пересмотрена: вместо разрозненных процессов используется единый механизм «Обработка документа», исключающий размножение параллельных веток согласования по одному предмету.

← На главную