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