Как установить пометку удаления интерактивно без окна вопроса "Пометить на удаление?"

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

В процессе разработки на платформе 1С:Предприятие 8.3 (Управляемые формы) часто возникает задача упростить работу пользователя, убрав лишние диалоговые окна. Одной из таких "назойливых" функций является стандартный вопрос системы: "Пометить объект на удаление?" или "Снять пометку удаления?". Несмотря на то, что это важная защита от случайных действий, для опытных пользователей или при специфических бизнес-процессах этот вопрос может замедлять работу.

В этой статье мы подробно разберем, почему стандартные методы из "обычных форм" здесь не работают, и какими способами можно реализовать "тихое" удаление в современном интерфейсе 1С.

Почему не работают старые методы?

Проанализируем ситуацию, с которой сталкиваются многие разработчики, перешедшие с версии 7.7 или 8.2 (Обычные формы). Раньше в расширении формы списка существовало событие ДокументСписокПередУстановкойПометкиУдаления. В управляемом приложении работа со списками строится на базе объекта ДинамическийСписок.

У динамического списка в управляемых формах нет события, которое бы возникало "перед" стандартным действием платформы по установке пометки. Платформа перехватывает нажатие клавиши Del или нажатие стандартной кнопки "Пометить на удаление / Снять пометку" и самостоятельно вызывает диалог. Код в модуле объекта (например, в процедуре ПередЗаписью) исполняется уже после того, как пользователь ответил "Да" в окне вопроса. Следовательно, стандартными обработчиками событий формы это поведение не изменить.

Способ 1. Создание собственной команды и перехват горячих клавиш

Рассмотрим самый надежный способ решения задачи. Чтобы система не задавала вопрос, нам нужно полностью заменить стандартную команду платформы на свою собственную. Разберем по шагам, как это сделать для конкретного справочника (например, "Номенклатура").

  1. Откроем форму списка нужного объекта.
  2. Перейдем в список Команд формы и создадим новую команду, назовем её УстановитьСнятьПометкуБезВопроса.
  3. В свойствах команды в поле Сочетание клавиш выберем Del (клавиатура). Это критически важно: когда пользователь нажмет привычную кнопку на клавиатуре, сработает наша логика, а не стандартная системная.
  4. Вынесем команду на командную панель формы. При этом стандартную кнопку "Пометить на удаление" нужно либо скрыть (сняв галочку "Видимость"), либо удалить из состава командной панели.

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


&НаКлиенте
Процедура УстановитьСнятьПометкуБезВопроса(Команда)
    
    ТекущиеДанные = Элементы.Список.ТекущиеДанные;
    
    Если ТекущиеДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    // Вызываем серверный метод для изменения пометки
    ИзменитьПометкуНаСервере(ТекущиеДанные.Ссылка);
    
КонецПроцедуры

&НаСервере
Процедура ИзменитьПометкуНаСервере(ВыбраннаяСсылка)
    
    ОбъектДляИзменения = ВыбраннаяСсылка.ПолучитьОбъект();
    
    // Инвертируем текущее состояние
    НовоеСостояние = Не ОбъектДляИзменения.ПометкаУдаления;
    
    // Устанавливаем пометку программно. 
    // Метод УстановитьПометкуУдаления() при программном вызове не задает вопросов.
    ОбъектДляИзменения.УстановитьПометкуУдаления(НовоеСостояние);
    
    Попытка
        ОбъектДляИзменения.Записать();
    Исключение
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
    КонецПопытки;
    
КонецПроцедуры

Способ 2. Реализация через Общую Команду и Расширение

Если заказчик просит внедрить такое поведение для всей конфигурации или для большой группы справочников, прописывать код в каждой форме — не наш метод. Выясним, как использовать механизм расширений и общих команд.

Создадим в расширении Общую команду. В её свойствах укажем тип параметра команды (например, СправочникСсылка.Номенклатура, СправочникСсылка.Контрагенты и т.д.). В коде команды используем объектную технику:


&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    
    // ПараметрКоманды содержит ссылку на выбранный элемент или массив ссылок
    Если ТипЗнч(ПараметрКоманды) = Тип("Массив") Тогда
        Для Каждого СсылкаИзМассива Из ПараметрКоманды Цикл
            ИнвертироватьПометкуНаСервере(СсылкаИзМассива);
        КонецЦикла;
    Иначе
        ИнвертироватьПометкуНаСервере(ПараметрКоманды);
    КонецЕсли;
    
КонецПроцедуры

Важным преимуществом этого метода является то, что программная запись объекта через Объект.Записать() обходит интерактивные проверки платформы, но при этом полностью отрабатывает вся бизнес-логика, прописанная в модуле объекта (процедуры ПередЗаписью и ПриЗаписи).

Зачем это нужно? Пример с кастомной логикой

Как отмечалось в обсуждении, иногда заказчику нужно не просто убрать вопрос, а заменить его своим поведением. Рассмотрим ситуацию: при попытке пометить на удаление "важный" товар, система должна не спрашивать "Да/Нет", а проверять остатки и, если они есть, выдавать ошибку, а если нет — молча ставить пометку.

В нашей кастомной команде мы можем реализовать это так:


&НаСервере
Функция ПопытатьсяПометитьНаУдаление(Ссылка)
    
    Объект = Ссылка.ПолучитьОбъект();
    
    Если Не Объект.ПометкаУдаления Тогда
        // Проверяем остатки только при попытке УСТАНОВИТЬ пометку
        Если РегистрыНакопления.Запасы.Остаток(Ссылка) > 0 Тогда
            Возврат "Нельзя удалить товар, пока он есть на складе!";
        КонецЕсли;
    КонецЕсли;
    
    Объект.УстановитьПометкуУдаления(Не Объект.ПометкаУдаления);
    Объект.Записать();
    
    Возврат ""; // Успех
    
КонецФункции

Таким образом, мы получаем гораздо более гибкий интерфейс, чем предоставляет стандартная кнопка 1С.

Важные замечания по безопасности

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

  1. Ролевая модель: реализуйте "тихое" удаление только для пользователей с определенной ролью (например, ПолныеПрава или Администратор). Обычным пользователям лучше оставить стандартный вопрос для защиты данных.
  2. Оповещение: после успешного изменения пометки без вопроса, используйте ПоказатьОповещениеПользователя(). Это даст визуальное подтверждение того, что действие произошло, и пользователь увидит, какой именно объект он только что пометил.
  3. Групповая обработка: если пользователю нужно массово помечать объекты на удаление, лучше научить его пользоваться стандартной обработкой "Групповое изменение реквизитов". Она работает быстро и не требует внесения изменений в код конфигурации.

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

← На главную