При разработке бизнес-процессов в платформе 1С часто возникает необходимость валидации: перед тем как отметить задачу выполненной и перевести бизнес-процесс на следующий этап, необходимо проверить выполнение определенных условий (например, проведен ли связанный документ, заполнены ли нужные реквизиты или созданы ли подчиненные объекты).
Рассмотрим, почему стандартные обработчики проверки могут не срабатывать так, как ожидается, и разберем практические способы реализации проверки выполнения задач.
Распространенная ошибка разработчиков заключается в попытке использовать процедуру ОбработкаПроверкиВыполнения в модуле объекта задачи или у точки маршрута бизнес-процесса. При интерактивном нажатии кнопки «Выполнить» или при программном вызове метода ВыполнитьЗадачу() данный обработчик не вызывается автоматически.
Метод и соответствующий обработчик ОбработкаПроверкиВыполнения спроектированы исключительно для сценария, когда проверка вызывается явно через метод ЗадачаОбъект.ПроверитьВыполнение() (например, при автоматическом мониторинге задач). Для стандартного цикла выполнения задачи платформой 1С предусмотрены другие события.
Основным и наиболее надежным решением является использование предопределенного события ПередВыполнением в модуле объекта задачи. Это событие вызывается каждый раз при попытке завершить задачу — как интерактивно из формы, так и программно через метод ВыполнитьЗадачу().
Проанализируем пример кода в модуле объекта задачи, проверяющего проведение связанного документа:
Процедура ПередВыполнением(Отказ)
// Проверяем наличие и статус проведения связанного документа
Если ЗначениеЗаполнено(ДокументОснование) Тогда
Если НЕ ДокументОснование.Проведен Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Нельзя завершить задачу: документ """ + Строка(ДокументОснование) + """ не проведен!";
Сообщение.Сообщить();
КонецЕсли;
Иначе
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Нельзя завершить задачу: не указан связанный документ!";
Сообщение.Сообщить();
КонецЕсли;
КонецПроцедуры
Если в данной процедуре установить параметр Отказ = Истина, транзакция записи задачи будет отменена, а бизнес-процесс останется на текущей точке маршрута.
Если бизнес-логику проверки удобнее сосредоточить внутри самого бизнес-процесса, а не в объекте задачи, разберем обработчик точки маршрута ПриВыполнении.
В модуле объекта бизнес-процесса для конкретной точки действия можно назначить процедуру события:
Процедура ТочкаДействия1ПриВыполнении(ТочкаМаршрутаБизнесПроцесса, Задача, Отказ)
// Обращаемся к реквизитам задачи или связанного документа
Если ЗначениеЗаполнено(Задача.ДокументОснование) Тогда
Если НЕ Задача.ДокументОснование.Проведен Тогда
Отказ = Истина;
ВызватьИсключение "Выполнение задачи отклонено: связанный документ не проведен.";
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Данный обработчик также исполняется в транзакции выполнения задачи. Если флаг Отказ принимает значение Истина или вызывается исключение, задача не считается выполненной.
В ситуациях, когда документ проводит другой пользователь или внешняя система, можно реализовать автоматическое продвижение бизнес-процесса с использованием метода ПроверитьВыполнение().
Рассмотрим пошагово данную схему работы:
ОбработкаПроверкиВыполнения, где проверяем условие (например, ДокументОснование.Проведен) и при успехе присваиваем параметру Результат = Истина.ЗадачаОбъект.ПроверитьВыполнение().Истина, регламентное задание вызывает метод ЗадачаОбъект.ВыполнитьЗадачу().При работе с задачами и бизнес-процессами следует учитывать несколько ключевых правил платформы 1С:
Задача.Выполнена = Истина и вызов Записать() не продвигает бизнес-процесс дальше по карте маршрута. Продвижение происходит только при вызове метода ВыполнитьЗадачу() или при нажатии кнопки выполнения в форме.ПередВыполнением и ПриВыполнении исполняются на сервере в транзакции. В них недопустимо вызывать модальные окна, диалоги и клиентские функции. Для вывода ошибок используйте объект СообщениеПользователю или генерацию исключения.