Форум Кладовочки АЛьФ`а

Обсуждение проектов => FormEx => Тема начата: Arbuz от 04 марта 2024, 17:28

Название: Баг: Теряется контекст при срабатывании ОкноСообщений.УстановитьКоординаты
Отправлено: Arbuz от 04 марта 2024, 17:28
Теряется переменная контекста формы обработки при срабатывании ОкноСообщений.УстановитьКоординаты.

Плохо воспроизводимый глюк. В давно отлаженном механизме подбора номенклатуры ТиС стали сыпать ошибки про отсутствие объекта (СписокЗначений) в Форма.Параметр. Стал разбираться и обнаружил такую штуку.
Реализовано увеличение окна сообщений при появлении там сообщения и через 5 секунд его уменьшение.
Соответственно в ГМ такие функции:
Процедура глСпрятатьОкноСообщений() Экспорт
глСервис.ОбработкаОжидания("глСпрятатьОкноСообщений", 0);
Если глОкноСообщений.Парковка = 1 Тогда
_высота = "";
глОкноСообщений.ПолучитьКоординаты(,,_высота);
Если _высота = 96 Тогда
глОкноСообщений.УстановитьКоординаты(,,25); // <-- ЕСЛИ УБРАТЬ, БАГА НЕТ
глСервис.ОбработкаОжидания("глСпрятатьОкноСообщений", 250);
Иначе
глОкноСообщений.ПоказатьСтроку(-1);
КонецЕсли;
КонецЕсли;
КонецПроцедуры // глСпрятатьОкноСообщений

Процедура ПриВыводеСообщения(пИдентификаторОкнаСообщений, пТекстСообщения, пМаркерСообщения, пСтрокаКода, пИдМодуль, пИмяМодуля, пСтандартнаяОбработка)
Если пИдентификаторОкнаСообщений = 0 Тогда
Если ПустоеЗначение(глОкноСообщений) = 0 Тогда
Если глОкноСообщений.Парковка = 1 Тогда
_высота = "";
глОкноСообщений.ПолучитьКоординаты(,,_высота);
Если _высота < 26 Тогда
глОкноСообщений.УстановитьКоординаты(,,96);
КонецЕсли;
глСервис.ОбработкаОжидания("глСпрятатьОкноСообщений", 0);
глСервис.ОбработкаОжидания("глСпрятатьОкноСообщений", 5000);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры

При этом в обработке ВводКоличестваИЦены есть такой код:
Процедура ПриЗакрытии()
//  НИКАКИМ ОБРАЗОМ ПРИ НОРМАЛЬНЫХ УСЛОВИЯХ ЭТО УСЛОВИЕ НЕ МОЖЕТ БЫТЬ ИСТИННЫМ
Если ТипЗначенияСтр(Форма.Параметр) <> "СписокЗначений" Тогда
глОтладка("ПЗ " + ТипЗначенияСтр(Форма.Параметр),,0);
Возврат;
КонецЕсли;

Последовательность такая:
В подборе номенклатуры ОбработкаВнешнегоСобытия со сканера открывается ВводКоличестваИЦены.
Из неё передаётся следующий штрихкод обратно и опять открывается ВводКоличестваИЦены.
В какой-то момент бьётся отсутствующий в базе штрих, соответственно в окно сообщений выводится сообщение, оно увеличивается.
Далее бьётся существующий штрихкод, выводится форма ВводКоличестваИЦены.
Ждём 5 секунд. Окно сообщений уменьшается.
И в обработке ВводКоличестваИЦены Форма.Параметр теряется.
Название: Re: Баг: Теряется контекст при срабатывании ОкноСообщений.УстановитьКоординаты
Отправлено: Arbuz от 04 марта 2024, 17:42
Вот скринкаст:
https://yadi.sk/i/dgZWYTF2AQT_Lg (https://yadi.sk/i/dgZWYTF2AQT_Lg)
Открываем подбор.
Сканером бьём два раза существующий товар.
Потом отсутствующий.
Потом второй существующий.
Ждём пока не уменьшится окно сообщений.
Нажимаем Отмена и получаем сообщение из ПриЗакрытии об отсутствии Форма.Параметр.
 
PS: не обязательно в ПриЗакрытии, тоже самое и в любом событии формы после того как уменьшится окно сообщений.
Название: Re: Баг: Теряется контекст при срабатывании ОкноСообщений.УстановитьКоординаты
Отправлено: Arbuz от 04 марта 2024, 18:03
Причём после однократного появления такой ошибки, она очень нестабильно (редко) проявляется до тех пор пока не переоткроешь форму подбора (из которой вызывается ВводКоличестваИЦены). Первый раз поведение очень стабильное.
Название: Re: Баг: Теряется контекст при срабатывании ОкноСообщений.УстановитьКоординаты
Отправлено: АЛьФ от 04 марта 2024, 20:49
Если убрать УстановитьКоординаты, а вместо него вызвать глОкноСообщений.Видимость(1), получится глюк повторить?
Название: Re: Баг: Теряется контекст при срабатывании ОкноСообщений.УстановитьКоординаты
Отправлено: Злоп от 04 марта 2024, 21:55
Чисто попутно:
Цитата: Arbuz от 04 марта 2024, 17:42Вот скринкаст:
колонку раскраски поставь ПОСЛЕ колонки "N" (номера строк) - разлиновка будет ровной.
Название: Re: Баг: Теряется контекст при срабатывании ОкноСообщений.УстановитьКоординаты
Отправлено: Djelf от 05 марта 2024, 13:13
Контекст не теряется, Форма.Параметры выводится как тип "НеизвестныйОбъект", а это может происходить при Форма.Параметры=Форма или  Форма.Параметры=СоздатьОбъект("Форма").
Можешь посмотреть информатором из 1с++ таблицу свойств или методов Форма.Параметры, вангую там именно Форма.
Но в коде MessageContext.cpp никаких подобных присвоений нет.
Каким образом комментирование строки глОкноСообщений.УстановитьКоординаты(,,25); убирает этот глюк совершенно не понятно. Поищи в коде присвоение в Форма.Параметры.
Кроме того не понятно, как так обработка работала, и с ней ничего не делалали, но одновременно "Реализовано увеличение окна". Могли что-то еще зацепить по ходу дела...
Название: Re: Баг: Теряется контекст при срабатывании ОкноСообщений.УстановитьКоординаты
Отправлено: Arbuz от 05 марта 2024, 15:20
Цитата: АЛьФ от 04 марта 2024, 20:49Если убрать УстановитьКоординаты, а вместо него вызвать глОкноСообщений.Видимость(1), получится глюк повторить?

Если просто поставить глОкноСообщений.Видимость(1) вместо глОкноСообщений.УстановитьКоординаты(,,25)
глюк не повторяется, но если вместо глОкноСообщений.УстановитьКоординаты(,,25) поставить глОкноСообщений.Видимость(0), а вместо глОкноСообщений.УстановитьКоординаты(,,96) поставить глОкноСообщений.Видимость(1), то глюк опять повторяется. Т.е. фактически вместо изменения размеров окна сообщений оно прячется/показывается.

Цитата: Djelf от 05 марта 2024, 13:13Контекст не теряется, Форма.Параметры выводится как тип "НеизвестныйОбъект", а это может происходить при Форма.Параметры=Форма или  Форма.Параметры=СоздатьОбъект("Форма").
Можешь посмотреть информатором из 1с++ таблицу свойств или методов Форма.Параметры, вангую там именно Форма.

Чуть позже посмотрю, у меня самого такая мысль возникла, но там не всегда тип "НеизвестныйОбъект", иногда тип — пустая строка (?).

Цитата: Djelf от 05 марта 2024, 13:13Но в коде MessageContext.cpp никаких подобных присвоений нет.
Каким образом комментирование строки глОкноСообщений.УстановитьКоординаты(,,25); убирает этот глюк совершенно не понятно. Поищи в коде присвоение в Форма.Параметры.
Кроме того не понятно, как так обработка работала, и с ней ничего не делалали, но одновременно "Реализовано увеличение окна". Могли что-то еще зацепить по ходу дела...
Да, первым делом же посмотрел. Нет там никакого присвоения. Насчет "Реализовано увеличение окна", ты видимо, невнимательно посмотрел. Это увеличение/уменьшение окна сообщений только. Реализовано двумя вышеприведёнными процедурами в ГМ. И всё, больше никаких изменений. И да, я посмотрел может быть какие-то события в форме обработки ВводКоличестваИЦены срабатывают, но нет там очень простой код.
Хотя может быть что-то отрабатывает в родительской форме подбора номенклатуры или в ГМ что-то ещё...
А можно как-то изменить Форма.Параметр у уже открытой формы?
Название: Re: Баг: Теряется контекст при срабатывании ОкноСообщений.УстановитьКоординаты
Отправлено: Arbuz от 05 марта 2024, 15:37
Цитата: Djelf от 05 марта 2024, 13:13Контекст не теряется, Форма.Параметры выводится как тип "НеизвестныйОбъект", а это может происходить при Форма.Параметры=Форма или  Форма.Параметры=СоздатьОбъект("Форма").
Можешь посмотреть информатором из 1с++ таблицу свойств или методов Форма.Параметры, вангую там именно Форма.
Но в коде MessageContext.cpp никаких подобных присвоений нет.

Посмотрел. Что методы, что свойства — возвращается пустая таблица. А вот ТипЗначенияСтрВнутр выбрасывает исключение "Данный метод применяется только для агрегатных типов".
Название: Re: Баг: Теряется контекст при срабатывании ОкноСообщений.УстановитьКоординаты
Отправлено: Arbuz от 05 марта 2024, 15:44
Даже необязательна такая сложная последовательность со сканером. Достаточно открыть форму ВводКоличестваИЦены из подбора, дождаться уменьшения/скрытия окна сообщений и Форма.Параметр портится.
Название: Re: Баг: Теряется контекст при срабатывании ОкноСообщений.УстановитьКоординаты
Отправлено: Arbuz от 05 марта 2024, 16:14
В целом я обвёл проблему тем, что первой строкой в ПриОткрытии делаю ФормаПараметр=Форма.Параметр, а в ПриЗакрытии последней Форма.Параметр=ФормаПараметр и, соответственно, везде в коде формы ВводКоличестваИЦены заменил Форма.Параметр на ФормаПараметр.

И у меня какое-то дежавю — мне кажется, что где-то на форуме 1срр уже обсуждалась проблема того, что при переключении контекстов портится Форма.Параметр.
Название: Re: Баг: Теряется контекст при срабатывании ОкноСообщений.УстановитьКоординаты
Отправлено: АЛьФ от 05 марта 2024, 16:22
Сможешь набросать тестовую конфигу, на которой я мог бы явно воспроизвести глюк?
Название: Re: Баг: Теряется контекст при срабатывании ОкноСообщений.УстановитьКоординаты
Отправлено: Arbuz от 05 марта 2024, 16:48
Попробую, но не быстро. У меня это вылезло только в случае Журнал > Документ > Подбор > ВводКоличестваИЦены > ОбработкаОжиданияГМ > Изменение видимости/размера окна сообщений > порча параметра формы в ВводКоличестваИЦены. Что-то в этой цепочке, возможно, необязательно.

ЗЫ: А, ещё момент — это вылазит только один раз пока открыт подбор, т.е. после появления бага следующие манипуляции с окном сообщений не влияют на формЫ открываемых/закрываемых обработок ВводКоличестваИЦены. Чтобы повторить надо переоткрывать родительскую форму подбора.
Название: Re: Баг: Теряется контекст при срабатывании ОкноСообщений.УстановитьКоординаты
Отправлено: Djelf от 05 марта 2024, 18:10
Цитата: Arbuz от 05 марта 2024, 15:37
Цитата: Djelf от 05 марта 2024, 13:13Контекст не теряется, Форма.Параметры выводится как тип "НеизвестныйОбъект", а это может происходить при Форма.Параметры=Форма или  Форма.Параметры=СоздатьОбъект("Форма").
Можешь посмотреть информатором из 1с++ таблицу свойств или методов Форма.Параметры, вангую там именно Форма.
Но в коде MessageContext.cpp никаких подобных присвоений нет.

Посмотрел. Что методы, что свойства — возвращается пустая таблица. А вот ТипЗначенияСтрВнутр выбрасывает исключение "Данный метод применяется только для агрегатных типов".
В этом случае действительно контекст испорчен, но как это возможно воспроизвести?
Я не очень понимаю, как это выловить...  :(

Название: Re: Баг: Теряется контекст при срабатывании ОкноСообщений.УстановитьКоординаты
Отправлено: Arbuz от 07 марта 2024, 15:07
Попробовал на пустой конфигурации воспроизвести глюк. С моим набором внешних компонент и подобной логике. По быстрому, на двух формах обработок воспроизвести не удалось. Всё работает корректно.
Решил посмотреть трассировку. Затянуло, развлекаюсь. Обнаружил, что ПриЗавершенииРаботы вызывается два раза подряд.