Обязательный комментарий при закрытии задачи в 1С: подписка ПередЗаписью без правок типовой конфигурации
Где живёт «выполнение задачи» в платформе
В любой конфигурации, использующей механизм бизнес-процессов 1С, задача — это специальный объект конфигурации «Задача» (или документ-задача в конкретной конфигурации, например в 1С:Документооборот 3). У него есть реквизит «Выполнена» и поле для комментария исполнителя. Когда пользователь нажимает «Выполнено» в форме задачи — платформа последовательно вызывает обработчики событий объекта: ПередЗаписью, ПриЗаписи, и только потом фактически пишет в базу.
Что нам это даёт
Если в обработчике ПередЗаписью мы поймём, что комментарий пустой, а пользователь отмечает задачу выполненной — можно отказаться от записи через Отказ = Истина. Платформа не позволит закрыть задачу, пользователь увидит сообщение и заполнит поле. Без обхода типового механизма, без перехвата команд формы. Ниже разбираем именно реализацию через подписку на событие, а не через модуль объекта самой задачи: подписка живёт в расширении и переживает обновления типовой конфигурации.
Базовая логика обработчика
Каркас обработчика подписки на событие (имена реквизитов «Выполнена» и «ТекстКомментария» — абстрактные, в вашей конфигурации они могут называться иначе; проверьте в Конфигураторе):
Процедура ПередЗаписьюЗадачи(Источник, Отказ) Экспорт
// Только при попытке закрыть задачу
Если НЕ Источник.Выполнена Тогда
Возврат;
КонецЕсли;
// Если задача только создаётся — пропускаем
Если Источник.ЭтоНовый() Тогда
Возврат;
КонецЕсли;
// Сравниваем с состоянием в базе: нужна проверка только в момент перехода
СтароеЗначение = Источник.Ссылка.Выполнена;
Если СтароеЗначение = Истина Тогда
// Уже была выполнена — это просто перезапись, пропускаем
Возврат;
КонецЕсли;
Если ПустаяСтрока(Источник.ТекстКомментария) Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Чтобы закрыть задачу, опишите, что именно вы сделали — это видят другие участники процесса и аудитор.";
Сообщение.Поле = "ТекстКомментария";
Сообщение.УстановитьДанные(Источник);
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Здесь две существенные детали:
- Используется объект
СообщениеПользователю— он позволяет привязать текст к конкретному реквизиту объекта и форме (черезУстановитьДанные), чего глобальная функцияСообщить()не умеет. В подписках наПередЗаписьюобъектный вариант предпочтительнее. - Состояние «было ли выполнено до записи» определяется сравнением с базой через
Источник.Ссылка.Выполнена— это дополнительный серверный запрос на каждую запись задачи. На единичных операциях он не заметен; при массовой обработке имеет смысл кешировать состояние или обходить подписку через флагИсточник.ДополнительныеСвойства. - В сценарии загрузки данных из обмена и при работе под РЛС логика проверки может конфликтовать с правами/режимом. Защититесь явным выходом в начале процедуры:
Если Источник.ОбменДанными.Загрузка Тогда Возврат КонецЕсли;, а само чтениеИсточник.Ссылка.Выполненапри необходимости заверните вУстановитьПривилегированныйРежим(Истина)/...Ложь.
Куда положить этот код, чтобы не сломать обновления
| Способ | Где живёт | Кому подходит | Минусы |
|---|---|---|---|
| 1. Подписка на событие в расширении | Расширение конфигурации (.cfe), общий модуль с обработчиком | Когда нужно сразу для всех видов задач, без правки конфигурации | Расширение нужно сопровождать при обновлениях типовой |
| 2. Доработка формы задачи в расширении | Расширение, переопределённая форма документа-задачи | Когда нужно проверять не только при записи, но и подсвечивать пустое поле в форме | Чувствительно к версии конфигурации — форма может меняться при обновлениях |
| 3. Прямая правка снятой с поддержки конфигурации | Конфигурация без поддержки | Только если вы полностью отвечаете за обновления и готовы вручную мержить | Каждое обновление от вендора — это долгие сравнения и объединения |
Если конфигурация на поддержке вендора — начинайте со Способа 1. Подписка из расширения переживёт большинство минорных обновлений; при мажорных (смена режима совместимости, переименование реквизитов задачи) её придётся ревизовать, но это всё равно несравнимо дешевле, чем держать снятую с поддержки конфигурацию ради одного обработчика.
Чек-лист внедрения
- В Конфигураторе найдите объект-задачу (Задача.* или Документ.* — зависит от конфигурации) и точное имя реквизита для текста комментария исполнителя.
- Создайте расширение конфигурации, добавьте в него подписку на событие
ПередЗаписьюдля нужного типа задачи. - В обработчике подписки реализуйте проверку: задача переводится в «выполнена», комментарий пуст →
Отказ = Истинаи сообщение пользователю. - Отдельно проверьте, что подписка не мешает фоновым процессам, которые могут писать задачу программно (массовые операции, обмены, регламентные задания). Если они есть — нужно явно их обходить: например, через привилегированный режим или через флаг в дополнительных параметрах.
- Протестируйте под обычным пользователем: создайте задачу, попробуйте закрыть с пустым комментарием, убедитесь, что отказ срабатывает и сообщение читаемо.
- Протестируйте обратный случай: задача редактируется без изменения статуса (исполнитель меняет срок) — запись должна проходить без сообщений.
- Опишите доработку в реестре расширений: что делает, какую задачу решает, кто заказчик. Через год это пригодится при первом мажорном обновлении конфигурации.
Типичные ошибки
- Проверка на каждой записи. Задача может перезаписываться много раз — при смене исполнителя, обновлении срока, отметке прочтения. Если требовать комментарий на любой записи, пользователь перестанет работать с задачами.
- Сообщение в стиле «Ошибка». «Не заполнено поле X» — формально верно, но не помогает. Объясните по-человечески: что писать и зачем («Чтобы закрыть, опишите, что сделали — это видят другие участники процесса и аудитор»).
- Проверка только в форме, без подписки. Программная запись задачи (массовые операции, обмен из другой системы) пройдёт мимо проверки формы. Подписка на
ПередЗаписьюловит и форму, и программную запись. - Жёсткая привязка к конкретному типу задачи. В одной конфигурации бывает несколько типов задач (согласование, исполнение, ознакомление). Если ваш обработчик привязан к одному — остальные останутся без проверки, и аудитор поймает на той задаче, про которую вы забыли.
- Игнорирование привилегированных операций. Иногда задача должна закрываться программно (массовая отмена, регламентное закрытие просроченных). Если ваша подписка слепо требует комментарий — эти процессы упадут. Используйте флаг в дополнительных параметрах источника записи, чтобы корректно обходить проверку для системных операций.
- «Решил, что работает на одной задаче — внедрим на всю компанию». Без обкатки на пилотной группе вы получите шквал «не могу закрыть задачу, что писать?» в техподдержку в день внедрения. Сначала пилот на 5–10 пользователей, потом масштабирование.
Перейти в каталог решений →