Как отследить пометку на удаление 1с

Обновлено: 07.07.2024

В общем задача состоит в том чтобы в модуле формы списка справочника отследить событие после пометки удаления. Кто может что-нибудь посоветовать как это осуществить.

Можно конечно и другим пойти, но не хотелось бы.
А нужно это для того, чтобы в режиме реального времени отслеживать все изменения справочника и передавать их автоматически по Оле в остальные базы.

(3)+ В ПередЗаписью.
Сравнить ПометкаУдаления с Ссылка.ПометкаУдаления

(2) Для этого еще в незапамятные времена придуманы планы обмена.

при активизации строки запоминаешь состояние пометки удаления. после записи его сравниваешь и вперед

(3) - При пометке удаления из списка в процедуры модуля формы объекта он не обращается.
(4) и (6) - в модуле формы списка нет процедуры "после записи", "при записи", "перед записью" и т.п.

у списка есть метод
ПередУстановкойПометкиУдаления?

(8) - Когда происходят изменения в модуле объекта все отслеживается правильно, а мне надо именно в модуле формы списка. Я на это акцентировал внимание в первом посте.
(9) - Этот метод не подходит. Потому как это именно "перед", т.е. перед тем как пользователю выводится окошечка для подтверждения действительно ли он хочет пометить на удаление объект или снять пометку, с вариантами Да и Нет, а вот как отловить точно, что нажал в итоге пользователь, он же может и отказаться от пометки.

(8) - В том то и дело, что пользователь не открывает форму объекта, когда помечает на удаления объект, поэтому этот вариант и не подходит.

(11) помойму событие модуля объекта ПриЗаписи просто обязано вызываться. даже, когда ты помечаешь на удаление из списка

это как пример. обработать, что пометка снимается нужно отдельно.

(13) - Спасибо. А я об этом даже не подумал. Вот что значит свежий взгляд.
(14) - Ну с этим я уже разберусь без проблем. Спасибо.

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

(5) - На данный момент у меня большой пробел со знаниями принципов работы с планами обмена. Просто никогда не использовал и почему-то даже мысль не приходила посмотреть, что это такое. Спасибо что надоумил, обязательно гляну и может действительно переделаю механизм перегрузок.

2(10) Почему надо "Перед"?
2(16) Планы обмена также будут регистрировать свершившееся.

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

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

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


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

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

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

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

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

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

Читайте также: