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