Диагностика
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:
- Не хватает хвостовых параметров (
ПриОткрытии(), ПередЗаписью(Отказ) без ПараметрыЗаписи): работает, ошибки нет. Это самый частый случай: на двух рабочих конфигурациях диагностика дает 951 и 3070 срабатываний, почти все ложные.
НачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка): работает, платформа распознает ее отдельно. Это штатная сигнатура до 8.3.23: ВыборДобавлением у НачалоВыбора и ОбработкаВыбора добавлен в 8.3.23 (описание изменений 8.3.23.1688, раздел про РасширенноеРедактированиеМножественныхЗначений), так что она есть во всем коде, написанном раньше.
- Пропущен средний параметр (
ОбработкаОповещения(ИмяСобытия, Источник)): компилируется и вызывается, но в Источник приходит Параметр. Это настоящая ошибка, и ее хорошо бы ловить.
Пример кода
&НаКлиенте
Процедура ПриОткрытии() // срабатывает, но ошибки нет
Заголовок = "Проба";
КонецПроцедуры
&НаКлиенте
Процедура ТоварНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) // срабатывает, но ошибки нет
СтандартнаяОбработка = Ложь; // работает: форма выбора не открывается
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Источник) // настоящая ошибка: в Источник придет Параметр
КонецПроцедуры
Скриншоты
Нет, результаты опыта - в таблице выше.
Дополнительная информация
Предложение:
- не считать ошибкой нехватку хвостовых параметров (или вынести это в отдельный параметр диагностики / понизить до замечания);
- ловить именно сдвиг: объявленный параметр назван как параметр контракта, но стоит не на своей позиции (
Источник вторым вместо третьего);
- принимать
НачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) (и так же ОбработкаВыбора без ВыборДобавлением, если платформа поддерживает ее так же - не проверял) как допустимую перегрузку.
Про источник правила: в описании диагностики указан стандарт Структура модуля, но он про области модуля, не про параметры обработчиков. Требования объявлять полный набор параметров я не нашел ни в стандартах v8std, ни в проверках v8-code-style. Ближайшее - методическая статья ИТС metod8dev, 2587: «как правило» набор параметров как у события, иначе обработка «может получиться неполной» - это рекомендация, а не ошибка. А в стандарте Описание процедур и функций есть пример Процедура ПередЗаписью() без параметров.
В описании диагностики сейчас сказано, что при меньшем числе параметров «runtime либо выдаст ошибку, либо параметр будет обрезан». Для событий формы опыт показывает, что ошибки нет. События модулей объектов (ПриЗаписи() из примера в описании) я не проверял.
Диагностика
EventHandlerInvalidSignature
Версия
v1.1.0-rc.5; в develop (7bee672) код диагностики тот же.
Описание ложного срабатывания диагностики
Диагностика считает ошибкой любой обработчик события, у которого параметров меньше, чем в контракте события. Платформа такие обработчики вызывает без ошибки: значения раскладываются по позиции, лишние хвостовые просто не передаются.
Проверено на платформе 8.3.27.1989, тонкий клиент, в режимах совместимости 8.3.27, 8.3.12 и 8.2.16 (результат во всех трех одинаковый). Обработка с управляемой формой, результат каждого обработчика выводился в поле формы:
ПриОткрытии()безОтказОбработкаОповещения(ИмяСобытия, Источник)послеОповестить("Проба", "ЗначениеПараметра", "ЗначениеИсточника")"ЗначениеПараметра"НачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)Истина(Булево)СтандартнаяОбработка, а неВыборДобавлением(было быЛожь)СтандартнаяОбработка = ЛожьНачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка)Ложь, четвертыйИстинаНачалоВыбора(Элемент, Второй)ДанныеВыбораПроверка модулей в Конфигураторе (
/CheckModules -ThinClient -Server) на всех вариантах: «Синтаксических ошибок не обнаружено!».Итого есть три разных случая, а диагностика не различает их и на все выдает Error:
ПриОткрытии(),ПередЗаписью(Отказ)безПараметрыЗаписи): работает, ошибки нет. Это самый частый случай: на двух рабочих конфигурациях диагностика дает 951 и 3070 срабатываний, почти все ложные.НачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка): работает, платформа распознает ее отдельно. Это штатная сигнатура до 8.3.23:ВыборДобавлениемуНачалоВыбораиОбработкаВыборадобавлен в 8.3.23 (описание изменений 8.3.23.1688, раздел проРасширенноеРедактированиеМножественныхЗначений), так что она есть во всем коде, написанном раньше.ОбработкаОповещения(ИмяСобытия, Источник)): компилируется и вызывается, но вИсточникприходитПараметр. Это настоящая ошибка, и ее хорошо бы ловить.Пример кода
Скриншоты
Нет, результаты опыта - в таблице выше.
Дополнительная информация
Предложение:
Источниквторым вместо третьего);НачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)(и так жеОбработкаВыборабезВыборДобавлением, если платформа поддерживает ее так же - не проверял) как допустимую перегрузку.Про источник правила: в описании диагностики указан стандарт Структура модуля, но он про области модуля, не про параметры обработчиков. Требования объявлять полный набор параметров я не нашел ни в стандартах v8std, ни в проверках v8-code-style. Ближайшее - методическая статья ИТС metod8dev, 2587: «как правило» набор параметров как у события, иначе обработка «может получиться неполной» - это рекомендация, а не ошибка. А в стандарте Описание процедур и функций есть пример
Процедура ПередЗаписью()без параметров.В описании диагностики сейчас сказано, что при меньшем числе параметров «runtime либо выдаст ошибку, либо параметр будет обрезан». Для событий формы опыт показывает, что ошибки нет. События модулей объектов (
ПриЗаписи()из примера в описании) я не проверял.