Отлов пометки на удаление документа из формы списка, через "ПодключитьОбработчикОповещения"

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

Для реализации этого нужно проделать слдующее:

 

В любом из общих модулей вставляем процедуру:

Процедура глОбработкаОповещения(Событие, Параметр, Источник) Экспорт
    Если
Событие = «ПоставитьСнятьПометкуУдаления» Тогда
        Если
Источник <> Неопределено Тогда
           
ЕстьПодчиненныеДокументы = НайтиПодчиненныеДокументы(Источник.Ссылка, ,НЕ Параметр);
               
Сообщить(«Так же » + ?(НЕ Параметр, «сняты пометки удаления: «,«помечены на удаление: «));
                Для Каждого
ТекСтрока Из ЕстьПодчиненныеДокументы Цикл
                   
ДокументОбъект = ТекСтрока.Ключ.ПолучитьОбъект();
                   
ДокументОбъект.УстановитьПометкуУдаления(?(ТекСтрока.Ключ.ПометкаУдаления, Ложь, Истина));
                   
Сообщить(Строка(ДокументОбъект));
              КонецЦикла;
          КонецЕсли;
     КонецЕсли;
КонецПроцедуры

 

затем в форме списка документа создаем следующую процедуру:

Процедура ДокументСписокПередУстановкойПометкиУдаления(Элемент, Отказ)
    Если Не
Отказ Тогда
       
ТекущаяСсылка = ЭлементыФормы.ДокументСписок.ТекущиеДанные.Ссылка;

        // отлавливаем установку пометки удаления на док. по ОУ из формы списка документа
        // т.к. автоматически ставить пометку на удаление надо только для ОН, то соответственно ограничим вид документа.
        //
       
Если ТекущаяСсылка.ВидОперации = Перечисления.ВидыОперацииОбъектов.ОбъектыУчета Тогда
           
ПодключитьОбработчикОповещения(«глОбработкаОповещения»);
        КонецЕсли;

    КонецЕсли;
КонецПроцедуры

и в заключении, в модуле документа:

 

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

// отлавливаем установку пометки удаления на док. по ОУ из формы списка документа
//
// Как работает:
//
// В форме списка вызывается подключение «ПодключитьОбработчикОповещения(«глОбработкаОповещения»);»,
// далее после при любом действии с документом не важно откуда он выполняется, из формы списка или из самого док. или из обработки
// мы всегда попадем сюда.
// Далее мы проверяем что происходит с док. и говорим что конфигурацию надо оповестить, тоесть в Общем модуле «ПараметрыОбъектов»
// вызывается «процедура глОбработкаОповещения(Событие, Параметр, Источник) Экспорт» в которой мы и обрабатываем нужные действия.
// !!! — Внимание !!! — После выполнения, необходимо обязательно «ОтключитьОбработчикОповещения(«глОбработкаОповещения»);» — чтобы он не выполнялся опять.

Если ЭтотОбъект.ВидОперации = Перечисления.ВидыОперацииОбъектов.ОбъектыУчета Тогда
    Если
РежимЗаписи = РежимЗаписиДокумента.Запись Тогда
       
// если док. просто перезаписывается, то сюда попадем в любом случае. Но это оповещение не сработает. т.к. он не подключено в форме списка.
        // ЕСЛИ же оно сработало, значит кто-то накосячил, и после подключения «ПодключитьОбработчикОповещения(«глОбработкаОповещения»);» не отключил его.
       
Оповестить(«ПоставитьСнятьПометкуУдаления», ЭтотОбъект.ПометкаУдаления, ЭтотОбъект);
       
ОтключитьОбработчикОповещения(«глОбработкаОповещения»);
    КонецЕсли;
КонецЕсли;

КонецПроцедуры

 

 

Ну вот и все. Теперь если пользователь в форме списка на документе выбрал пункт контекстного меню «Установить пометку удаления» и на вопрос подтвеждения сказал «Да», то и у под чиненых док. тоже поставится пометка. Так же и с распроведением. Если на вопрос он сказал «Нет», то и подчиненые документы, обрабатываться не будут.

 

Вместо установки пометки вы можете сделать свое действие.

18 Comments

  1. marku

    Спасибо за пример с использованием оповещения

    Reply
  2. Torin

    Спасибо!!!!

    Reply
  3. artbear

    ИМХО проще юзать подписку на событие «Запись документа», намного меньше кода, да и контроль проще.

    Пока что минусую

    Reply
  4. zaoproxy

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

    Reply
  5. mr zafod

    (3) artbear, +1

    По теме, извините конечно за критику, но

    1. Все действия должны выполнятся в одной транзакции (пометка удаления — это операция записи источника и подчиненных документов с установленным свойством ПометкаУдаления и не более — остальное делает платформа)

    2. Использование обработок оповещения в модулях объектов да еще и в транзакции — я лично приравниваю к вызову Предупреждение() в обработке проведения

    Как идея (технология) +, но как рабочий вариант — здесь однозначно подписка на событие

    Reply
  6. pavel_pss
    artbear пишет:

    ИМХО проще юзать подписку на событие «Запись документа», намного меньше кода, да и контроль проще.

    Пока что минусую

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

    Проверил, тоже работает.

    Reply
  7. sserazm

    вариант через подписку предпочтительнее.

    см желтые книжки

    Reply
  8. a-novoselov

    Подписка рулит

    Reply
  9. chumadan

    Может кто может выложить обработку которая помечает все документы на удаление?

    Reply
  10. pavel_pss

    (9) chumadan,

    вытащи из любой типовой конфигурации обработку «Групповая обработка справочников и документов»

    Reply
  11. AlekseiLeit

    да, приколько…пригодилось!

    и как пример хороший, у себя что-то похожее замутил

    Reply
  12. Dvornik

    В коде только я застопорился?

    1. «ПередЗаписью» Это сервер.

    2. «ОтключитьОбработчикОповещения» Доступность: Тонкий клиент, веб-клиент, толстый клиент.

    Reply
  13. Dvornik

    И «оповестить» тоже не работает на сервере. Как вставлять этот код в процедуру «ПередЗаписью»?

    Извините, думал это код управляемого приложения. Комментарии удалить не могу.

    Reply
  14. tango

    редкий случай — согласен с artbear 🙂

    реализация не комильфо совсем, а идея — более чем сомнительна:

    пометили и подчиненные, да? а с подчиненными подчиненных что делать — пусть остаются? или таки тоже — того? а если тоже того — то что будете делать, если влетите в кольцо подчиненных?

    Reply
  15. dj_serega

    К сожалению не работает на тонком клиенте… А так идея супер.

    Reply
  16. goodwill

    Оповестить работает только на клиенте, здесь вызывается я так понимаю в модуле объекта на сервере. Хотя судя по дате публикации речь шла о толстом клиенте.

    Reply
  17. goodwill

    Оповестить работает только на клиенте, здесь вызывается я так понимаю в модуле объекта на сервере. Хотя судя по дате публикации речь шла о толстом клиенте.

    Увидел это уже обсуждали выше

    Reply
  18. pavel_pss

    (17) да, это было еще на толстом клиенте.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *