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