Как реализовать дополнительные вопросы пользователю перед установкой пометки на удаление в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке на управляемых формах 1С часто возникает задача: выполнить проверку или уточнить детали у пользователя непосредственно перед тем, как система пометит документ на удаление. Главная трудность заключается в том, что стандартная процедура установки пометки на удаление выполняется платформой автоматически, а серверные события, такие как ПередЗаписью в модуле объекта, не имеют доступа к пользовательскому интерфейсу для вызова диалоговых окон.

Рассмотрим, как правильно подойти к решению этой задачи, чтобы обеспечить корректную работу системы и удобство для пользователя.

Почему нельзя просто использовать стандартную кнопку

Стандартная команда Пометить на удаление является платформенным механизмом. Когда пользователь нажимает кнопку на форме, платформа сама открывает диалог подтверждения, а затем инициирует серверный вызов для записи объекта. Вклиниться в этот процесс с дополнительным вопросом «А нужно ли удалить связанные перемещения?» невозможно, так как серверный код не может «попросить» клиента дождаться ответа на новый вопрос.

Попытки перехватить событие ПередЗаписью или подписки на события также не дадут результата, так как на этом этапе выполнение кода уже находится на сервере, и попытка вызова Вопрос() приведет к ошибке.

Решение 1: Создание собственной команды удаления

Самый надежный и профессиональный способ — это отказ от использования стандартной кнопки и замена её на собственную команду. Давайте разберем этот процесс по шагам.

  1. Создание команды на форме: Добавьте новую команду в форму документа. Назовите её, например, УдалитьСПроверкой.
  2. Реализация логики на клиенте: В обработчике команды вы можете реализовать любую цепочку вопросов. Поскольку мы находимся на клиенте, мы можем использовать асинхронные методы (в современных версиях платформы это ВопросАсинх).
  3. Цепочка диалогов: Вы можете вызывать вопросы последовательно. Если пользователь нажал «Да» на первый вопрос, открывается второй, и только после получения всех ответов вызывается серверная процедура.

Пример логики такой команды:


&НаКлиенте
Процедура УдалитьСПроверкой(Команда)
    // Задаем первый вопрос
    Оповещение = Новый ОписаниеОповещения("ПослеВопросаОбУдалении", ЭтотОбъект);
    ПоказатьВопрос(Оповещение, "Пометить документ на удаление?", РежимДиалогаВопрос.ДаНет);
КонецПроцедуры

&НаКлиенте
Процедура ПослеВопросаОбУдалении(Результат, ДопПараметры) Экспорт
    Если Результат = КодВозвратаДиалога.Да Тогда
        // Задаем второй вопрос про связанные документы
        Оповещение2 = Новый ОписаниеОповещения("ПослеВопросаОСвязанных", ЭтотОбъект);
        ПоказатьВопрос(Оповещение2, "Удалить связанные перемещения?", РежимДиалогаВопрос.ДаНет);
    КонецЕсли;
КонецПроцедуры

Решение 2: Ограничение прав доступа

Чтобы пользователи не использовали стандартную кнопку, когда у вас уже готова своя, необходимо ограничить права доступа к интерактивной установке пометки на удаление.

Если вы снимете право Интерактивная пометка удаления для стандартной роли у пользователей, стандартная кнопка исчезнет из интерфейса (или станет неактивной). При этом ваша собственная команда, которую вы написали программно, будет работать исправно, так как выполнение серверного кода из-под команды можно обернуть в привилегированный режим, если это необходимо.

Рекомендации по реализации

При проектировании такой системы придерживайтесь следующих правил:

Таким образом, разобрав ситуацию, мы видим, что путь попыток «перехватить» платформенную кнопку является тупиковым. Самым верным подходом для программиста будет создание собственной функциональности, которая дает полный контроль над логикой диалогов и порядком выполнения операций в системе.

← На главную