diff --git a/src/ScriptEngine.HostedScript/DefaultEventProcessor.cs b/src/ScriptEngine.HostedScript/DefaultEventProcessor.cs index aceb67955..74da39942 100644 --- a/src/ScriptEngine.HostedScript/DefaultEventProcessor.cs +++ b/src/ScriptEngine.HostedScript/DefaultEventProcessor.cs @@ -72,11 +72,15 @@ public void AddHandler( if (!_registeredHandlers.TryGetValue(eventSource, out var handlers)) { handlers = new Dictionary(); - handlers[eventName] = new HandlersList(); _registeredHandlers[eventSource] = handlers; } - handlers[eventName].Add(handlerScript, handlerMethod); + if (!handlers.TryGetValue(eventName, out var handlersList)) { + handlersList = new HandlersList(); + handlers[eventName] = handlersList; + } + + handlersList.Add(handlerScript, handlerMethod); } public void RemoveHandler( @@ -88,9 +92,13 @@ public void RemoveHandler( if (!(handlerTarget is ScriptDrivenObject handlerScript)) throw RuntimeException.InvalidArgumentType("handlerTarget"); - if (_registeredHandlers.TryGetValue(eventSource, out var handlers)) + if (!_registeredHandlers.TryGetValue(eventSource, out var handlers)) { - handlers[eventName].Remove(handlerScript, handlerMethod); + return; + } + + if (handlers.TryGetValue(eventName, out var handlersList)) { + handlersList.Remove(handlerScript, handlerMethod); } } @@ -99,7 +107,11 @@ public void HandleEvent(IRuntimeContextInstance eventSource, string eventName, I if (!_registeredHandlers.TryGetValue(eventSource, out var handlers)) return; - foreach (var handler in handlers[eventName]) + if (!handlers.TryGetValue(eventName, out var handlersList)) { + return; + } + + foreach (var handler in handlersList) { handler.Method(eventArgs); } diff --git a/tests/events.os b/tests/events.os index 3c65943c0..7d94060cd 100644 --- a/tests/events.os +++ b/tests/events.os @@ -16,6 +16,7 @@ ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоПодпискаПоОбъектуВидитТолькоЭкспорт"); ВсеТесты.Добавить("ТестДолжен_ПроверитьПодпискуНаСобытиеВВидеВыражения"); ВсеТесты.Добавить("ТестДолжен_ПроверитьПодпискуСОбработчикомВВидеВыражения"); + ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоУИсточникаМожетБытьНесколькоСобытий"); Возврат ВсеТесты; @@ -175,4 +176,23 @@ КонецПроцедуры +Процедура ТестДолжен_ПроверитьЧтоУИсточникаМожетБытьНесколькоСобытий() Экспорт + + Источник = Новый ТестСобытий; + + ДобавитьОбработчик Источник.МоеСобытие, ОбработчикСобытияВнутр; + ДобавитьОбработчик Источник.МоеСобытиеВторое, ОбработчикСобытияВнутр; + + МассивПараметров = Новый Массив; + МассивПараметров.Добавить("П1"); + МассивПараметров.Добавить("П2"); + + Источник.СгенерироватьСобытие("МоеСобытие", МассивПараметров); + юТест.ПроверитьРавенство(1, СчетчикВызовов); + + Источник.СгенерироватьСобытие("МоеСобытиеВторое", МассивПараметров); + юТест.ПроверитьРавенство(2, СчетчикВызовов); + +КонецПроцедуры + ПодключитьСценарий(ТекущийСценарий().Источник, "ТестСобытий"); \ No newline at end of file