Отмена задачи в 1С:ДО 2.1: сценарии и нюансы
Отмена задачи в «1С:Документооборот 2.1» — на первый взгляд рутинная операция. Однако типовой механизм достаточно сложен: есть три ветки развития маршрутов (незапущенная, в работе и завершённая), четыре варианта реакции системы на отмену (прерывание, очистка, возврат на шаг назад и уведомление) и один застарелый баг платформы, превращающий «отменить» в «тихо потерять исполнителя». Разберём, что на самом деле происходит с бизнес-процессом, когда пользователь нажимает кнопку «Отменить задачу», и какие ловушки ждут разработчика при кастомизации этого сценария.
1. Анатомия отмены: как устроен типовой механизм
В конфигурации «Документооборот 2.1» задача — это элемент справочника ЗадачиИсполнителей, связанный с точкой маршрута бизнес-процесса. Формальная отмена задачи не удаляет её, а устанавливает реквизит Отменена в значение Истина и запускает обработчик ОбработкаОтменыЗадачи в модуле менеджера БП. Однако есть существенная разница между отменой задачи на этапе «Назначено» и на этапе «В работе».
1.1. Отмена до старта
Если задачу отменяют до того, как исполнитель взял её в работу, типовой алгоритм просто снимает блокировку с маршрута. Никаких уведомлений задача не генерирует, но запись в регистре сведений «ДействияПоЗадаче» создаётся. Нюанс: если в точке маршрута включён флаг «Автоматически отправлять задачу следующему исполнителю при завершении текущего», система может бесконтрольно накопить неотменённые копии, если не обработать событие выхода из состояния.
Тезис для внедрения: отмена задачи не эквивалентна её удалению. База данных продолжает хранить ссылку, а бизнес-процесс — «помнить» точку. Если не очистить адресацию в подсистеме «Маршруты», новый исполнитель не сможет зайти в тот же этап без переназначения.
1.2. Отмена активной задачи
Сценарий «исполнитель уже работает» сложнее. Система проверяет, была ли зафиксирована дата начала работы (ДатаНачалаИсполнения), и если да — предлагает выбрать один из трёх вариантов действия:
- Прервать задачу — текущее состояние бизнес-процесса сбрасывается, но результат работы не сохраняется;
- Очистить и вернуть — удаляется заполненное содержимое (поля формы задачи) и отправляется обратно предыдущему исполнителю;
- Сохранить и отменить — задача отмечается отменённой, но введённые данные фиксируются в регистре состояния.
Логика выбора реализована в общей форме ФормаЗадачиИсполнителей. Разработчики часто забывают, что по умолчанию эти варианты показываются в диалоговом окне, и если пользователь создаёт задачу программно, её отмена без дополнительной реализации проходит молча, без опроса.
// Фрагмент из модуля менеджера бизнес-процесса.
// Вызывается при отмене задачи в типовой конфигурации ДО 2.1
Процедура ПриОтменеЗадачи(Задача, Отказ) Экспорт
Если Задача.ДатаНачалаИсполнения <> Дата(1,1,1) Тогда
ВыборДействия = Новый СписокЗначений;
ВыборДействия.Добавить("Прервать");
ВыборДействия.Добавить("Очистить");
ВыборДействия.Добавить("Сохранить");
Результат = ПоказатьВводПоВыбору(,ВыборДействия, "Выберите действие при отмене");
Если Результат = "Очистить" Тогда
// код очистки табличных частей
ИначеЕсли Результат = "Сохранить" Тогда
// сохранить данные, но не перезапускать маршрут
КонецЕсли;
КонецЕсли;
КонецПроцедуры
2. Нетривиальная ловушка: потеря контекста при отмене через HTTP-сервис
Редко обсуждаемая проблема — попытка отменить задачу из внешней системы (например, из АСУ ТП или портала). В «1С:Документооборот 2.1» есть механизм интеграции через COM-соединение или HTTP-сервисы. Когда внешняя система передаёт команду «Отменить», платформа не гарантирует корректную обработку свойства ТекущийПользователь в сеансе — внутренние методы ожидают именно интерактивного пользователя с лицензией, а не фоновое соединение.
2.1. Почему это критично
Если отменить задачу через ВызватьHTTPМетод в неаутентифицированном сеансе, объект ПользователиИнформационнойБазы.ТекущийПользователь() может вернуть Неопределено. Но модуль «ДействияПоЗадаче» в стандартном коде выполняет запись в регистр сведений «ИсторияРаботыПользователя» без проверки на Неопределено. Результат: исключение Значение не определено при попытке записи, задача формально отменяется, но точка маршрута остаётся заблокированной.
Предупреждение для интеграторов: если вы пишете обработку вызова HTTP-сервиса для отмены задачи — обязательно проверяйте наличие сеанса с идентификацией и, при необходимости, задавайте системного пользователя через УстановитьПользователя в параметрах сеанса. Иначе при высоких нагрузках гарантированы «зависшие» задачи без исполнителей.
2.2. Дополнительный риск — гонка состояний
При параллельной отмене задачи через стандартный интерфейс и через интеграцию в одну секунду, платформа может зафиксировать два события «Отмена» в регистре. Это не приведёт к потере данных, но в отчёте «Длительность выполнения» появится странное состояние: задача одновременно имеет флаг Отменена и Выполнена. Специалисы 1С с опытом знают, что такое возникает из-за того, что обработчик ПриОтменеЗадачи не блокирует запись на уровне транзакции. Решение — добавить ЗаблокироватьДанныеДляИзменения на запись в справочник ЗадачиИсполнителей внутри менеджера.
3. Сценарий «откат на предыдущего исполнителя» и ограничения типового механизма
В типовой конфигурации при отмене задачи с вариантом «Очистить и вернуть» система действительно удаляет реквизиты формы и переводит процесс на предыдущую точку маршрута. Но здесь скрыто несколько ограничений:
- Такой возврат работает только если не было факта «Принятия решения» предыдущей точкой (реквизит
РешениеПринятоне установлен); - При возврате теряются служебные данные, записанные во вложения прикреплённых файлов (файлы не удаляются, теряется привязка к этапу);
- Если маршрут содержит параллельные ветки, отмена одной задачи не приводит к отмене остальных — разработчик должен реализовать это самостоятельно в обработчике события.
3.1. Практический код для отмены параллельных ветвей
// Пример расширения для менеджера бизнес-процесса
// Обработка массовой отмены при завершении одной из задач параллельной ветки
Процедура ПриОтменеЗадачи(Задача, Отказ) Экспорт
// Получаем все задачи этого бизнес-процесса на параллельных точках
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Задачи.Ссылка КАК Ссылка
|ИЗ
| Справочник.ЗадачиИсполнителей КАК Задачи
|ГДЕ
| Задачи.ВладелецПроцесса = &ТекущийПроцесс
| И Задачи.Отменена = Ложь
| И Задачи.ТочкаМаршрута <> &ТекущаяТочка";
Запрос.УстановитьПараметр("ТекущийПроцесс", Задача.ВладелецПроцесса);
Запрос.УстановитьПараметр("ТекущаяТочка", Задача.ТочкаМаршрута);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат;
КонецЕсли;
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
ЗадачаПараллельная = Выборка.Ссылка.ПолучитьОбъект();
// Заблокируем данные для избежания гонки
ЗаблокироватьДанныеДляИзменения(ЗадачаПараллельная.Ссылка, РежимБлокировкиДанных.Исключительный);
ЗадачаПараллельная.Отменена = Истина;
ЗадачаПараллельная.Записать(РежимЗаписиСправочника.Запись);
// Уведомить менеджера процесса (если нужно)
МенеджерПроцесса = Обработки.УправлениеБизнесПроцессами.Создать();
МенеджерПроцесса.ОбработатьОтмену(ЗадачаПараллельная);
КонецЦикла;
КонецПроцедуры
4. Рекомендации и чек-лист для доработки
По результатам анализа механизма отмены задач в «1С:ДО 2.1» предлагаем следующий чек-лист для специалистов, дорабатывающих конфигурацию:
- Проверьте обработчик
ПриОтменеЗадачив своём расширении — не теряется ли контекст при вызове из HTTP-сервиса или фонового задания. Обязательно добавьте проверкуЕсли ПользователиИнформационнойБазы.ТекущийПользователь() = Неопределено Тогдаи укажите системного пользователя. - Добавьте блокировку данных при отмене: используйте
ЗаблокироватьДанныеДляИзмененияпо ссылке задачи, чтобы исключить двойную обработку. - Принудительно обрабатывайте вложения в событии отмены — если файлы были прикреплены, их привязку к этапу процесса нужно либо сохранить в отдельном регистре, либо очистить, иначе отчёт «Занятость по процессам» начнёт врать.
- Настройте уведомление для всех участников параллельного процесса при отмене: без доработки типовой функционал генерирует уведомление только для текущего исполнителя, остальные ветки «засыпают» без уведомления.
- Тестируйте отмену при пустых обязательных реквизитах — если в форме задачи есть обязательное поле (например, «Комментарий»), при программной отмене платформа может не сбросить проверку, и вы получите ошибку «Заполните обязательное поле».
4.1. Что делать прямо сейчас
После типового обновления «Документооборот 2.1» до версии 2.1.9.x (релиз 2025 г.) изменилась логика обработки свойства РешениеПринято при отмене на стадии «На согласовании». Рекомендуем:
- Запустить стандартную обработку «Поиск и удаление дублей задач»;
- Выполнить регламентное задание «Восстановление последовательности маршрутов» (раздел Администрирование — Обслуживание);
- Проверить журнал регистрации по событию «Отмена задачи» на предмет ошибок сеанса.
Ключевой вывод: отмена задачи — не просто установка флага, а сложное бизнес-событие. Если ваш «1С:Документооборот 2.1» интегрирован с внешними системами или имеет параллельные маршруты — обязательно доработайте обработчик отмены с учётом блокировок и контекста пользователя. Экономия часа разработки здесь оборачивается неделей анализа «зависших» задач в рабочей среде.
Попробовать НОПик →
Проверить свой уровень бесплатно →