Skip to content

[FP] EventHandlerInvalidSignature: Error на обработчиках с меньшим числом параметров, которые платформа вызывает без ошибки #4572

Description

@Shpaton

Диагностика

EventHandlerInvalidSignature

Версия

v1.1.0-rc.5; в develop (7bee672) код диагностики тот же.

Описание ложного срабатывания диагностики

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

Проверено на платформе 8.3.27.1989, тонкий клиент, в режимах совместимости 8.3.27, 8.3.12 и 8.2.16 (результат во всех трех одинаковый). Обработка с управляемой формой, результат каждого обработчика выводился в поле формы:

Объявление Что пришло Итог
ПриОткрытии() без Отказ вызвана работает, ошибки нет
ОбработкаОповещения(ИмяСобытия, Источник) после Оповестить("Проба", "ЗначениеПараметра", "ЗначениеИсточника") во втором параметре "ЗначениеПараметра" значения по позиции: пропуск среднего параметра сдвигает значения
НачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) в третьем Истина (Булево) сигнатура до 8.3.23 поддержана платформой отдельно: пришла СтандартнаяОбработка, а не ВыборДобавлением (было бы Ложь)
то же, поле ссылочного типа, в обработчике СтандартнаяОбработка = Ложь форма выбора не открылась отказ от стандартной обработки работает
НачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка) третий Ложь, четвертый Истина полная форма, для сравнения
НачалоВыбора(Элемент, Второй) во втором ДанныеВыбора по позиции

Проверка модулей в Конфигураторе (/CheckModules -ThinClient -Server) на всех вариантах: «Синтаксических ошибок не обнаружено!».

Итого есть три разных случая, а диагностика не различает их и на все выдает Error:

  1. Не хватает хвостовых параметров (ПриОткрытии(), ПередЗаписью(Отказ) без ПараметрыЗаписи): работает, ошибки нет. Это самый частый случай: на двух рабочих конфигурациях диагностика дает 951 и 3070 срабатываний, почти все ложные.
  2. НачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка): работает, платформа распознает ее отдельно. Это штатная сигнатура до 8.3.23: ВыборДобавлением у НачалоВыбора и ОбработкаВыбора добавлен в 8.3.23 (описание изменений 8.3.23.1688, раздел про РасширенноеРедактированиеМножественныхЗначений), так что она есть во всем коде, написанном раньше.
  3. Пропущен средний параметр (ОбработкаОповещения(ИмяСобытия, Источник)): компилируется и вызывается, но в Источник приходит Параметр. Это настоящая ошибка, и ее хорошо бы ловить.

Пример кода

&НаКлиенте
Процедура ПриОткрытии() // срабатывает, но ошибки нет
	Заголовок = "Проба";
КонецПроцедуры

&НаКлиенте
Процедура ТоварНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) // срабатывает, но ошибки нет
	СтандартнаяОбработка = Ложь; // работает: форма выбора не открывается
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Источник) // настоящая ошибка: в Источник придет Параметр
КонецПроцедуры

Скриншоты

Нет, результаты опыта - в таблице выше.

Дополнительная информация

Предложение:

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

Про источник правила: в описании диагностики указан стандарт Структура модуля, но он про области модуля, не про параметры обработчиков. Требования объявлять полный набор параметров я не нашел ни в стандартах v8std, ни в проверках v8-code-style. Ближайшее - методическая статья ИТС metod8dev, 2587: «как правило» набор параметров как у события, иначе обработка «может получиться неполной» - это рекомендация, а не ошибка. А в стандарте Описание процедур и функций есть пример Процедура ПередЗаписью() без параметров.

В описании диагностики сейчас сказано, что при меньшем числе параметров «runtime либо выдаст ошибку, либо параметр будет обрезан». Для событий формы опыт показывает, что ошибки нет. События модулей объектов (ПриЗаписи() из примера в описании) я не проверял.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    type/FPFalse positive

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions