Временная подписка на событие

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

В 1с, начиная с версии 8.1 существует возможность реализовать собственную обработку  событий объектов  без модификации кода основной конфигурации.

Суть метода в использовании  операторов «ДобавитьОбработчик» и «УдалитьОбработчик».

В документации 1с приведено весьма  туманное описание и пример ,  из которых сложно  понять можно ли определять события объектов  и как  должна быть описана  процедура обработчик события.

Методом  «научного тыка» установлено  следующее :

    1. ДобавитьОбработчик»  является полным аналогом подписки на событие для объекта Может быть определен практически везде, где есть доступ к объекту , кроме управляемой формы
    2. "УдалитьОбработчик" - удаляет  обработчик события только  назначный программно с помощью  "ДобавитьОбработчик"

Код

ДобавитьОбработчик ДокОбъект.ПриЗаписи, ПриЗаписиДокумента;

УдалитьОбработчик ДокОбъект.ПриЗаписи, ПриЗаписиДокумента;

Процедура ПриЗаписиДокумента(ИСТОЧНИК, Отказ) // важно правильное количество параметров

...

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

 

В  прилагаемой  обработка демонстрация того , как можно «на лету»  перехватить любое стандартное событие  произвольного документа или справочника.

P.S. если все это давно известно и где-либо описано, прошу «сильно не пинать» , а указать автору на ошибку .

Скачать файлы

Наименование Файл Версия Размер
ПодпискаНаСобытие.epf
.epf 8,48Kb
25.03.13
85
.epf 8,48Kb 85 Скачать

См. также

Добавить вознаграждение
Комментарии
1. Konstantin Konstantin (KonstB) 160 26.03.13 09:01 Сейчас в теме
Интересно :)

Иногда вылетает ошибка, что объект уже изменен, событие: "ПередЗаписью". Самому как-то лень смотреть.
2. p m (pm74) 50 26.03.13 09:28 Сейчас в теме
На стандартной Бухгалтерии 2 не смог воспроизвести ошибку. Проверял док Реализация,Поступление и спр. Номенклатура,Контрагенты. Можно подробнее?
3. p m (pm74) 50 26.03.13 09:39 Сейчас в теме
(1) KonstB,
там ничего особенного нет в коде
Объект=ЛюбаяСсылка.ПолучитьОбъект();

ДобавитьОбработчик..

Форма=Объект.ПолучитьФорму();
Форма.Открыть();
...Показать Скрыть
4. Алекс Ю (AlexO) 113 26.03.13 09:48 Сейчас в теме
(0)
"как можно «на лету» перехватить любое стандартное событие произвольного документа или справочника."

Автор, то ли специально "не хотите знать", то ли - жертва 1сового обмана и безобразия.
Все "события", которые можно "перехватить" ДобавитьОбработчик - перехватываются стандартной подпиской. Никаких "любых других событий" в 1С-объектах вы не изобрете и не перехватите.
Для чего вообще введен ДобавитьОбработчик - чтобы инициализировать "события" внешних COM-объетов (как в примере в справке, например - объекта "документ Word").
Все остальные "иммитации подписки", да еще якобы без "модификации кода" - прямой обман: если хотите перехватить что-то из конкретного документа - то либо подписка, либо - "врезка" в код конкретного документа и обработка "по возникновению события".
5. Konstantin Konstantin (KonstB) 160 26.03.13 09:50 Сейчас в теме
(2) pm74,
1. Открыл обработку.
2. Выбрал справочник "Контрагенты". Выбрал элемент.
3. Выбрал событие "ПередЗаписью"
4. Открыл выбранный элемент справочника. Записал. Закрыл.
5. Нажал кнопку "Добавить обработчик".

Ошибка.


(3) pm74,
Код понятно, что просто, но лень )))
6. p m (pm74) 50 26.03.13 09:56 Сейчас в теме
(5) KonstB,
немного не так
1. Открыл обработку.
2. Выбрал справочник "Контрагенты". Выбрал элемент.
3. Выбрал событие "ПередЗаписью"
4. Нажал кнопку "Добавить обработчик". Откроется основная форма справочника
4. В открытой форме справочника нажать ОК
7. Алекс Ю (AlexO) 113 26.03.13 09:59 Сейчас в теме
(5) KonstB,
нельзя одновременно править один и тот же объект - хоть "программно-программно", хоть "вручную-программно".
Это - 1С.
8. Алекс Ю (AlexO) 113 26.03.13 10:01 Сейчас в теме
(6) pm74,
4. Нажал кнопку "Добавить обработчик". Откроется основная форма справочника
4. В открытой форме справочника нажать ОК

Во-первых, у справочника нет основной формы.
Форма есть у элемента, у справочникам - список.
Во-вторых, чем это отличается от обычного "программного" открытия формы элемента и обработки события (да хоть через подписку)?
9. p m (pm74) 50 26.03.13 10:11 Сейчас в теме
(4) AlexO,
"Все "события", которые можно "перехватить" ДобавитьОбработчик - перехватываются стандартной подпиской. Никаких "любых других событий" в 1С-объектах вы не изобрете и не перехватите
я и написал "любое стандартное событие" и "является аналогом подписки на событие для объекта " и никого не пытаюсь ввести в заблуждение
(4)"Для чего вообще введен ДобавитьОбработчик - чтобы инициализировать "события" внешних COM-объетов (как в примере в справке, например - объекта "документ Word")."
никто не спорит
(4) "Все остальные "иммитации подписки", да еще якобы без "модификации кода" - прямой обман: если хотите перехватить что-то из конкретного документа - то либо подписка, либо - "врезка" в код конкретного документа и обработка "по возникновению события". "
Почему "якобы" ?? Я не вношу никаких изменений ни в код модуля объекта и не добавляю никаких подписок в конфигурации.
10. Алекс Ю (AlexO) 113 26.03.13 10:16 Сейчас в теме
В УПП, которая является сборкой всех остальных конф в той или иной мере - инструкция ДобавитьОбработчик не используется НИ РАЗУ.
Почему?? Кто сможет ответить по б) и в)? :))
Ответы:
а) разработчики конф не знают о такой волшебной инструкции; ;)
б) ...???
в) ...???
Подсказка: данная инструкция там не нужна, потому что б) и в)...
11. Konstantin Konstantin (KonstB) 160 26.03.13 10:19 Сейчас в теме
(6) pm74, это я так понял, как пользоваться обрботкой. в (5) я написал, как получается ошибка.

(7) AlexO, да, в курсе :) но я не правлю одно "временно". Открыл форму, записал, закрыл. Нажал кнопку "обработчик..." - добавился обработчки. Записал.
12. Алекс Ю (AlexO) 113 26.03.13 10:19 Сейчас в теме
(9) pm74,
никто не спорит

Только ваша статья не дает ни одного ответа по вопросу, но сильно "намекает", что волшебная "ДобавитьОбработчик" в 1С - это создание недостающих событий объектов и их обработка "в отрыве от объекта". :)
Например, как давно желаемая возможность пользовать события объектов без их инициализации (которое в 1С равно созданию/получению объекта).
13. p m (pm74) 50 26.03.13 10:21 Сейчас в теме
(8) AlexO,
"чем это отличается от обычного "программного" открытия формы элемента и обработки события (да хоть через подписку)? "
форма объекта тут вообще не причем , просто сделано для наглядности, чтобы было видно что код выполняется именно при событии объекта С таким же успехом можно программно получить объект, установить для него свой обработчик события напр. "ОбработкаПроведения" и записать его без открытия формы.
14. Алекс Ю (AlexO) 113 26.03.13 10:24 Сейчас в теме
(9) pm74,
Я не вношу никаких изменений ни в код модуля объекта и не добавляю никаких подписок в конфигурации.

Чем вами "вдруг" найденная "волшебная" инструкция отличается от получения объекта и отрабатывания обычной подписки на него?
Ну, добавили вы в обработке свой "обработчик" события объекта. Тогда:
- если объект типовой - будете переписыать себе всю цепочку типового кода обработки этого события.
- если объект нетиповой - то ничего не мешает написать все нужное прямо в модулях в объекта.
- "перехват" и "обработка" другим обработчиком событий - только в рамках работы вашей обработки. Все остальные объекты будут отрабатывать "по-старинке".
15. Алекс Ю (AlexO) 113 26.03.13 10:25 Сейчас в теме
(13) pm74,
установить для него свой обработчик события напр. "ОбработкаПроведения" и записать его без открытия формы.

Можно пример, где вам нужен объект, который вы хотите обработать без увязки с типовыми механизмами обработки и проведения, и не передирая весь код из типовой?
16. p m (pm74) 50 26.03.13 10:40 Сейчас в теме
(12) AlexO,
никаких намеков , только голые факты )) и никаких "недостающих событий" кроме стандартных добавить к сожалению не получится.
17. Алекс Ю (AlexO) 113 26.03.13 10:44 Сейчас в теме
Кстати, УстановитьДействие у Формы намного полезней :)
18. Алекс Ю (AlexO) 113 26.03.13 10:45 Сейчас в теме
(16) pm74,
добавить к сожалению не получится.

Вот именно, что жесткие ограничения, не нужные 1скам, но нужные 1С, обойти не удается практически никогда :(
19. p m (pm74) 50 26.03.13 11:05 Сейчас в теме
(18) AlexO, кстати об ограничениях . Никто не мешает поэкспериментировать
с базовой версией. У меня к сожалению нет такой возможности, но думаю там тоже должно работать
20. Алекс Ю (AlexO) 113 26.03.13 11:13 Сейчас в теме
(19) pm74,
Никто не мешает поэкспериментировать
с базовой версией.
а чего такого уникального в базовой версии?
21. p m (pm74) 50 26.03.13 11:18 Сейчас в теме
(20) AlexO, насколько я помню там нельзя менять конфигурацию
22. Алекс Ю (AlexO) 113 26.03.13 11:30 Сейчас в теме
(21) pm74,
насколько я помню там нельзя менять конфигурацию

нет, я тоже слышал про .. чудаков, которые из экономии рабочие базы делают на учебных.
Но это исключение из правил, все-таки :)
Да и обновление бесплатное у базовых, и пользователь только 1 может работать.
Извращениям и издевательствам 1С нет предела.
Но, думаю, что для задач при их развитии ДобавитьОбработчик в таких условиях вас не спасет :)
Все равно передйт на небазовую версию.
23. Илья (i132) 112 26.03.13 11:47 Сейчас в теме
Временой подпиской удобно пользоваться для анализа изменений в объектах пример: http://infostart.ru/public/98910/
24. Konstantin Konstantin (KonstB) 160 26.03.13 19:12 Сейчас в теме
фигассе Вы здесь набомбили ) я как всегда не успел (
25. Роман Ложкин (webester) 21 27.03.13 16:48 Сейчас в теме
Файл не качал, но комменты, почитал. Немного не понимаю AlexO, автор говорит: смотрите я добавил подписку не трогая, конфигурацию. Ему возражают: да вы же добавили подписку которую можно добавить в метаданных! Автор то как бы и не возражал. Он говорит есть возможность добавить подписки программно и не более. А для чего... так как бы, это, всякое бывает, мало ли.
26. Алексей Т. (CratosX) 95 27.03.13 18:14 Сейчас в теме
(25) webester, правильно понял, алексо троллит всех подряд.

(19) и неправда про базовые, их можно править (с ключом от платформы проф)

(10) и про УПП алексо загоняется - она принципиально ничем не отличается от БП или УТ - а ну попробуй в своём сообщении
СтрЗаменить(Сообщение(10), "УПП", "БП");


(0) мне кажется, заголовок всё-таки надо подправить, при чём тут временная неясно, а вот что для внешних типовых обработок можно применять можно было бы отметить
27. p m (pm74) 50 27.03.13 22:57 Сейчас в теме
(25) webester,
автор говорит: смотрите я добавил подписку

Я сам ничего не добавлял , просто указал на неточность в документации , а использовать или нет каждый пусть решает.
(26) CratosX,
и неправда про базовые, их можно править (с ключом от платформы проф)

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

Название выбрал из за схожести механизмов действия ну и потому,что внимание лучше привлекает )). Конечно это в основном для внешних обработок, но никто не мешает использовать и в основной конфигурации. Например допроведение документа X в зависимости от результата проведения документа Y, или еще что нибудь )
28. Алексей Т. (CratosX) 95 28.03.13 00:38 Сейчас в теме
(27) pm74, про базовые - но это не значит, что это лицензионно правильно :-D

про название - ну в любом случае "Временная" не стыкуется
29. Юрий Осипов (yuraos) 843 28.03.13 09:01 Сейчас в теме
Смотрю опять публикация по разжёвыванию 1С-ного манула...
...что-то популярно стало это в последнее время.
---
Плюс автору за уменьшение энтропии в 1С
:)))
30. Юрий Осипов (yuraos) 843 31.03.13 20:21 Сейчас в теме
(29)
Вопрос к ЗНОТОКАМ 1С-ного мануала:
В платформе 1С-8.2 с некоторого момента
у прикладных объектов конфигурации появилась
загадочная группа свойств "Характеристики".

Что это, зачем это и на что это влияет ???

Вразумительного ответа на это я нигде не смог найти...
;)
31. PlatonovStepan (Jogeedae) 38 02.04.13 04:22 Сейчас в теме
в МояВнешняяОбработка:
Процедура ПриЗаписиОбъекта(Объект) Экспорт
Сообщить("Произошло событие ""при записи"" для объекта:" + Объект);
КонецПроцедуры

Объект = Справочники.Контрагенты.СоздатьЭлемент();
ДобавитьОбработчик Объект.ПриЗаписи, МояВнешняяОбработка.ПриЗаписиОбъекта;

не работает.
32. p m (pm74) 50 02.04.13 07:37 Сейчас в теме
(31) Jogeedae,
Процедура ПриЗаписиОбъекта(Объект) Экспорт

Процедура ПриЗаписиОбъекта(Объект,ОТКАЗ) ДобавитьОбработчик Объект.ПриЗаписи, ПриЗаписиОбъекта; 
33. PlatonovStepan (Jogeedae) 38 02.04.13 07:49 Сейчас в теме
(32) pm74,
Досадная неточность
в МояВнешняяОбработка как раз таки:
Процедура ПриЗаписиОбъекта(Объект, Отказ) Экспорт

но тем не менее не работает. И, кстати, если бы различалось количество параметров то происходила бы ошибка ж.
у меня ошибок не происходит
34. p m (pm74) 50 02.04.13 08:24 Сейчас в теме
(33) Jogeedae,
почему экспорт ? почему "МояВнешняяОбработка.ПриЗаписиОбъекта" а не "ПриЗаписиОбъекта" ?
уточните условия плз
Из управляемой формы у меня не получилось такой фокус проделать я об этом говорил , но не факт что такого способа нет.
35. PlatonovStepan (Jogeedae) 38 02.04.13 08:35 Сейчас в теме
(34) pm74,
Экспорт, потому что метод должен быть в пределах видимости(с)Синтакс-помощник
Указание пути к методу опционально, вроде бы не возбраняется.
36. p m (pm74) 50 02.04.13 08:43 Сейчас в теме
(35) Jogeedae,
Экспорт, потому что метод должен быть в пределах видимости(с)Синтакс-помощник
Указание пути к методу опционально, вроде бы не возбраняется.

имелось ввиду, что исходных данных недостаточно и приходится додумывать.
Я так понимаю пытаетесь проделать это из управляемой формы ?
37. PlatonovStepan (Jogeedae) 38 02.04.13 09:14 Сейчас в теме
38. p m (pm74) 50 02.04.13 10:09 Сейчас в теме
(37) Jogeedae,
проверьте этой обработкой
(8.2.16.352)
Прикрепленные файлы:
МояВнешняяОбработка.epf