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