Воспроизвести можно на любой форме с датасорсами и дисплейными методами.
Достаточно вызвать форму фильтров и сделать, как написал
petergunn
Происходит это, на мой взгляд, из-за того, что форма не отслеживает в каком контексте выполняются вызовы.
Т.е., при открытом из формы диалоговом окне обработка событий происходит внутри метода wait(). При нажатии на ESC на форме отрабатывает стандартная последовательность закрытия формы. При этом, во внутренние флаги записывается информация, что форма готова к закрытию. Но, так как управление возвращается в метод wait(), то закрытие окна с формой и уничтожения класса формы не происходит.
Внешне это проявляется в запрете вызова дисплейных методов для датасорса (и сбросе их из кэша) - в результате чего, данные просто не отоборажаются или отображаются неверно. Есть еще одно проявление - если закрыть диалоговое окно и внести изменение в какое-либо поле не сохраняя эти изменения, то по ESC форма закроется без запроса на сохранение изменений - метод CanClose() вообще не будет вызван.
Помимо изменений в ядре - что бы оно отслеживало эту ситуация, единственное, что мне приходит в голову для исправления - это перекрыть метод CanClose() в классе SysSetupFormRun и в нем отслеживать наличие в стеке вызовов метода Wait().
X++:
public boolean canClose()
{
boolean ret;
container c;
int i;
;
ret = super();
c = xSession::xppCallStack();
i = 1;
while (i <= conLen(c))
{
if (typeof(conpeek(c, i)) == Types::String)
{
if (match(@"\\FormRun\\wait>", conpeek(c, i)))
{
ret = false;
break;
}
}
i++;
}
return ret;
}