Замена порядка Show - Prepare, ver. 3.2.0.33, 3.2.0.16

Имеется такой вопрос: чем может грозить замена порядка Show-Prepare в функции

function ShowEditWindowEx(EditWindowUSI, Attributes, DefaultValues, UseCache) {
        if (IsUndefined(UseCache) || UseCache) {
                if (Assigned(Attributes)) {
                        var RecordID = Attributes('RecordID');
                        if (IsUndefined(RecordID) || RecordID == GUID_NULL) {
                                RecordID = EmptyStr;
                        }
                } else {
                        var RecordID = EmptyStr;
                }
                var EditWindow = WinCache_Get(EditWindowUSI, RecordID);
                if (!Assigned(EditWindow)) {
                        return;
                }
        } else {
                var EditWindow = Services.GetNewItemByUSI(EditWindowUSI);
        }
        SetAttributesByDictionary(EditWindow, Attributes);
        SetAttribute(EditWindow, 'DefaultValues', DefaultValues);
        EditWindow.Show();
        System.BeginProcessing();
        System.ProcessMessages();
        EditWindow.Prepare();
        System.EndProcessing();
        return EditWindow;
}

(скрипт scr_WindowUtils)
Замена следующая:

...
SetAttribute(EditWindow, 'DefaultValues', DefaultValues);
        System.BeginProcessing();
        System.ProcessMessages();
        EditWindow.Prepare();
        System.EndProcessing();
        EditWindow.Show();
        return EditWindow;
}

Нравится

2 комментария

Здравствуйте, Дмитрий!

Изменение последовательности Show-Prepare ничем страшным не грозит.

ShowEditWindowEx используется везде, где нужно открыть окно редактирования. Поэтому, если Вы хотите поменять реализацию этой функции только для каких-то конкретных случаев, можно переписать ее так:

function ShowEditWindowEx(EditWindowUSI, Attributes, DefaultValues, UseCache,

ShowAfterPrepare) {

if ((!Services.AlwaysGetLastItemVersion) &&

(IsUndefined(UseCache) || UseCache)) {

if (Assigned(Attributes)) {

var RecordID = Attributes('RecordID');

if (IsUndefined(RecordID) || RecordID == GUID_NULL) {

RecordID = EmptyStr;

}

} else {

var RecordID = EmptyStr;

}

var EditWindow = WinCache_Get(EditWindowUSI, RecordID);

if (!Assigned(EditWindow)) {

return;

}

} else {

var EditWindow = Services.GetNewItemByUSI(EditWindowUSI);

}

SetAttributesByDictionary(EditWindow, Attributes);

SetAttribute(EditWindow, 'DefaultValues', DefaultValues);

if (!ShowAfterPrepare) {

EditWindow.Show();

}

System.BeginProcessing();

System.ProcessMessages();

EditWindow.Prepare();

System.EndProcessing();

if (!!ShowAfterPrepare) {

EditWindow.Show();

}

return EditWindow;

}

А в нужном для Вас месте вызываем эту функцию с ShowAfterPrepare=true. И получим последовательность выполнения Prepare, Show. Тогда как по всей системе останется Show, Prepare

Если же хотите, чтобы эта последовательность работала по всей системе, То можно реализовать функцию так как написали Вы. Ошибки могут возникнуть только в тех окнах, в которых есть обработчики событий OnShow, при этом в них инициализируются некоторые данные, которые используются в OnPrepare.

Terrasoft Support Team

Добрый день, Дмитрий!

Реализовать данную замену не рекомендуется. Функция ShowEditWindowEx используется для показа абсолютно всех окон редактирования в системе. В случае, если происходит показ окна редактирования, в котором необходимо показать пользовательские поля, то это может привести к нарушению размеров окна (исправить которое будет очень непросто, т.к. изменение размеров выполняется компонентом UserFieldsGroup из ядра системы).
Не совсем понятно, почему возник данный вопрос. При использовании достаточно быстрых машин промежуток времени с момента показа окна и до момента завершения обработчика OnPrepare достаточно невелик и незаметен пользователю.
Желаю успехов!

Показать все комментарии