1С 8.3. Расширение - ошибка конфликта обработчика событий формы

Дано: платформа 1С 8.3.10 (на примере конфигурации 1С: Университет ПРОФ)
Проблема: перестало работать событие формы в одном из расширений.
Описание:
Два программиста написали два разных расширения конфигурации, в которых сослались на одну и ту же форму и унаследовали одно и то же событие формы - "ПриСозданииНаСервере".
В расширении №1 использовался тип перехватчика события "После".
В расширении №2 использовался тип перехватчика события "Вместо".
Пока не было добавлено расширение 2, первое расширение работало нормально. Однако после загрузки второго расширения, событие из первого перестало работать (событие из второго расширения работало).

Этапы решения проблемы:
Как мы знаем, аннотации (&Вместо, &Перед, &После) для обработчиков событий форм не используются (по крайней мере, пробовала это сделать, но ничего не получилось). Приходится фактически заменять сам обработчик и прописывать его в свойствах самой формы. Т.е. при попытке добавить расширение для обработчика возникнет такое сообщение:
"Метод является обработчиком события. Добавить расширение обработчика?"


Пыталась нажимать "Нет" и делать с аннотациями, но, как уже писала раньше, это не работает.

Вот пример двух расширений, ссылающихся на одну и ту же форму:


Свойства первого расширения, задание обработчика "После":


Свойства второго расширения, задание обработчика "Вместо":


Так это выглядит непосредственно в коде расширения:


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


При запуске конфигурации получаю ошибку:
Ошибка инициализации модуля по причине:
{ГрафикПлатежей Справочник.Объекты.Форма.ФормаЭлемента.Форма(589,11)}: 
Процедура или функция с указанным именем уже определена (УП_ПриСозданииНаСервереПосле)
Процедура <<?>>УП_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)



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


Однако опять возникла ошибка:
{ДоговорУП Справочник.Объекты.Форма.ФормаЭлемента.Форма(184)}: 
Ошибка при вызове метода контекста (Добавить)
Команда = ЭтаФорма.Команды.Добавить("ФильтрацияУП");
по причине: Имя не уникально


Почему-то событие формы начало отрабатывать дважды, а т.к. там добавление пункта меню, оно вызывало эту ошибку.
Тут оказалась сама виновата, т.к. при переименовании процедуры обработчика, нужно было зайти в свойства самой формы и также заменить процедуру обработчика события:


Вроде бы всё должно работать нормально, но при запуске объекта с данным расширением опять ошибка:
Запрещено изменение параметра, отменяющего действие (параметр номер 1 в процедуре)


Т.е. ругается на попытку сделать отказ в процедуре второго расширения:
Отказ = Истина;


Получается в обработчике типа После нельзя делать "Отказ". Но мы знаем, что в типе "Вместо" работало. Проверяем, как работает в типе "Перед":



Теперь работает нормально, с другим не конфликтует.

PS: в итоге, с целью избавиться от подобных проблем в будущем, всё равно оптимизировала код так, что перехват этих обработчиков больше не потребовался :)

(с) Ella S.
Если Вам понравилась статья, пожалуйста, поставьте лайк, сделайте репост или оставьте комментарий. Если у Вас есть какие-либо замечания, также пишите комментарии.

4 комментария:

  1. Однако, тоже пригодилось! На платформе 8.3.10.2667 в БП КОРП 3.0.55.14.
    Единственное отличие в том, что у меня таких проблем с серверными обработчиками не возникло (ОбработкаПроверкиЗаполненияНаСервереПосле), а, вот, обработка ПередЗаписьюПосле стала выдавать "Запрещено изменение параметра, отменяющего действие (параметр номер 1 в процедуре)". Предложенная Вами перестановка на ПередЗаписьюПеред помогла.

    ОтветитьУдалить
    Ответы
    1. Хм... интересно, т.е. не на всех обработчиках событий формы срабатывает эта ошибка...

      Удалить