gifts2017

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

Опубликовал Павел С (pavel_pss) в раздел Программирование - Практика программирования

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

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

 

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

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

 

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

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


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

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

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

 

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

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

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

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

 

 

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

 

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

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Марк (marku) 11.11.11 20:10
Спасибо за пример с использованием оповещения
2. Влад Кайзер (Torin) 11.11.11 23:03
3. Артур Аюханов (artbear) 12.11.11 10:24
ИМХО проще юзать подписку на событие "Запись документа", намного меньше кода, да и контроль проще.
Пока что минусую
4. Alexandr Mal (zaoproxy) 12.11.11 16:52
может и проще с подпиской на события, но сколько людей, столько и мнений. Этот способ тоже имеет право на жизнь. и не стоит из-за того что кто-то считает другой способ проще ставить ему минус.
5. Roman Biblbox (mr zafod) 13.11.11 09:30
(3) artbear, +1
По теме, извините конечно за критику, но
1. Все действия должны выполнятся в одной транзакции (пометка удаления - это операция записи источника и подчиненных документов с установленным свойством ПометкаУдаления и не более - остальное делает платформа)
2. Использование обработок оповещения в модулях объектов да еще и в транзакции - я лично приравниваю к вызову Предупреждение() в обработке проведения

Как идея (технология) +, но как рабочий вариант - здесь однозначно подписка на событие
6. apalon_pss (pavel_pss) 14.11.11 02:15
artbear пишет:

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

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


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


Проверил, тоже работает.
7. Серазм С (sserazm) 14.11.11 12:37
вариант через подписку предпочтительнее.
см желтые книжки
8. Алексей Новоселов (a-novoselov) 16.11.11 11:14
9. 1 (chumadan) 13.12.11 20:18
Может кто может выложить обработку которая помечает все документы на удаление?
10. apalon_pss (pavel_pss) 13.12.11 21:50
(9) chumadan,

вытащи из любой типовой конфигурации обработку "Групповая обработка справочников и документов"
11. Алексей Лейт (AlekseiLeit) 05.05.12 14:07
да, приколько...пригодилось!
и как пример хороший, у себя что-то похожее замутил
12. Den (Dvornik) 13.06.12 11:13
В коде только я застопорился?
1. "ПередЗаписью" Это сервер.
2. "ОтключитьОбработчикОповещения" Доступность: Тонкий клиент, веб-клиент, толстый клиент.
13. Den (Dvornik) 13.06.12 11:44
И "оповестить" тоже не работает на сервере. Как вставлять этот код в процедуру "ПередЗаписью"?
Извините, думал это код управляемого приложения. Комментарии удалить не могу.
14. Михаил Ражиков (tango) 13.06.12 12:12
редкий случай - согласен с artbear :)

реализация не комильфо совсем, а идея - более чем сомнительна:
пометили и подчиненные, да? а с подчиненными подчиненных что делать - пусть остаются? или таки тоже - того? а если тоже того - то что будете делать, если влетите в кольцо подчиненных?
15. Сергей Галюк (dj_serega) 11.04.14 12:58
К сожалению не работает на тонком клиенте... А так идея супер.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа