Баг: Теряется контекст при срабатывании ОкноСообщений.УстановитьКоординаты

Автор Arbuz, 04 марта 2024, 17:28

« назад - далее »

Arbuz

Теряется переменная контекста формы обработки при срабатывании ОкноСообщений.УстановитьКоординаты.

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

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

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

Последовательность такая:
В подборе номенклатуры ОбработкаВнешнегоСобытия со сканера открывается ВводКоличестваИЦены.
Из неё передаётся следующий штрихкод обратно и опять открывается ВводКоличестваИЦены.
В какой-то момент бьётся отсутствующий в базе штрих, соответственно в окно сообщений выводится сообщение, оно увеличивается.
Далее бьётся существующий штрихкод, выводится форма ВводКоличестваИЦены.
Ждём 5 секунд. Окно сообщений уменьшается.
И в обработке ВводКоличестваИЦены Форма.Параметр теряется.

Arbuz

Вот скринкаст:
https://yadi.sk/i/dgZWYTF2AQT_Lg
Открываем подбор.
Сканером бьём два раза существующий товар.
Потом отсутствующий.
Потом второй существующий.
Ждём пока не уменьшится окно сообщений.
Нажимаем Отмена и получаем сообщение из ПриЗакрытии об отсутствии Форма.Параметр.
 
PS: не обязательно в ПриЗакрытии, тоже самое и в любом событии формы после того как уменьшится окно сообщений.

Arbuz

Причём после однократного появления такой ошибки, она очень нестабильно (редко) проявляется до тех пор пока не переоткроешь форму подбора (из которой вызывается ВводКоличестваИЦены). Первый раз поведение очень стабильное.

АЛьФ

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

Злоп

Чисто попутно:
Цитата: Arbuz от 04 марта 2024, 17:42Вот скринкаст:
колонку раскраски поставь ПОСЛЕ колонки "N" (номера строк) - разлиновка будет ровной.

Djelf

Контекст не теряется, Форма.Параметры выводится как тип "НеизвестныйОбъект", а это может происходить при Форма.Параметры=Форма или  Форма.Параметры=СоздатьОбъект("Форма").
Можешь посмотреть информатором из 1с++ таблицу свойств или методов Форма.Параметры, вангую там именно Форма.
Но в коде MessageContext.cpp никаких подобных присвоений нет.
Каким образом комментирование строки глОкноСообщений.УстановитьКоординаты(,,25); убирает этот глюк совершенно не понятно. Поищи в коде присвоение в Форма.Параметры.
Кроме того не понятно, как так обработка работала, и с ней ничего не делалали, но одновременно "Реализовано увеличение окна". Могли что-то еще зацепить по ходу дела...

Arbuz

Цитата: АЛьФ от 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); убирает этот глюк совершенно не понятно. Поищи в коде присвоение в Форма.Параметры.
Кроме того не понятно, как так обработка работала, и с ней ничего не делалали, но одновременно "Реализовано увеличение окна". Могли что-то еще зацепить по ходу дела...
Да, первым делом же посмотрел. Нет там никакого присвоения. Насчет "Реализовано увеличение окна", ты видимо, невнимательно посмотрел. Это увеличение/уменьшение окна сообщений только. Реализовано двумя вышеприведёнными процедурами в ГМ. И всё, больше никаких изменений. И да, я посмотрел может быть какие-то события в форме обработки ВводКоличестваИЦены срабатывают, но нет там очень простой код.
Хотя может быть что-то отрабатывает в родительской форме подбора номенклатуры или в ГМ что-то ещё...
А можно как-то изменить Форма.Параметр у уже открытой формы?

Arbuz

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

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

Arbuz

Даже необязательна такая сложная последовательность со сканером. Достаточно открыть форму ВводКоличестваИЦены из подбора, дождаться уменьшения/скрытия окна сообщений и Форма.Параметр портится.

Arbuz

В целом я обвёл проблему тем, что первой строкой в ПриОткрытии делаю ФормаПараметр=Форма.Параметр, а в ПриЗакрытии последней Форма.Параметр=ФормаПараметр и, соответственно, везде в коде формы ВводКоличестваИЦены заменил Форма.Параметр на ФормаПараметр.

И у меня какое-то дежавю — мне кажется, что где-то на форуме 1срр уже обсуждалась проблема того, что при переключении контекстов портится Форма.Параметр.

АЛьФ

Сможешь набросать тестовую конфигу, на которой я мог бы явно воспроизвести глюк?

Arbuz

Попробую, но не быстро. У меня это вылезло только в случае Журнал > Документ > Подбор > ВводКоличестваИЦены > ОбработкаОжиданияГМ > Изменение видимости/размера окна сообщений > порча параметра формы в ВводКоличестваИЦены. Что-то в этой цепочке, возможно, необязательно.

ЗЫ: А, ещё момент — это вылазит только один раз пока открыт подбор, т.е. после появления бага следующие манипуляции с окном сообщений не влияют на формЫ открываемых/закрываемых обработок ВводКоличестваИЦены. Чтобы повторить надо переоткрывать родительскую форму подбора.

Djelf

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

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


Arbuz

Попробовал на пустой конфигурации воспроизвести глюк. С моим набором внешних компонент и подобной логике. По быстрому, на двух формах обработок воспроизвести не удалось. Всё работает корректно.
Решил посмотреть трассировку. Затянуло, развлекаюсь. Обнаружил, что ПриЗавершенииРаботы вызывается два раза подряд.