gifts2017

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

Опубликовал 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) 26.03.13 09:01
Интересно :)

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

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

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

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

Ошибка.


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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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