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

