Очень часто в разных проектных решениях наблюдаю такую картину: при изменении в карточке редактирования поля "Тип" при появлении пользовательских полей или полей предварительно скрываемых/отображаемых начинается "дикое передергивание" контролов. Оказывается, есть способ избавиться от этого.
Дело в том, что у сервиса окна есть два замечательных метода, BeginUpdate() и EndUpdate(), которые и следует использовать для "замораживания" контролов.
В качестве примера возьмем карточку редактирования "Контрагентов". Опишу немного реализацию: для контрола edtAccountType на его метод OnPrepareSelectWindow вешаем вызов BeginUpdate() (т.е. на инициацию клика по контролу), а на метод датасетлинка dlDataOnDatasetDataChange - EndUpdate() (т.е. EndUpdate должен отработать после того, как выбрано значение в лукап-контроле). Кроме того, следует помнить: чтобы OnPrepareSelectWindow отрабатывал всегда, когда мы будем кликать по контролу типа контрагента необходимо вызывать его метод UnPrepareDropDownList().
А теперь сам код:
Initialize();
wnd_BaseDBEditOnPrepare(Window);
edtAccountType.UnPrepareDropDownList();
}
function edtAccountTypeOnPrepareSelectWindow(LookupDataControl, SelectWindow) {
Self.BeginUpdate();
}
function dlDataOnDatasetDataChange(DataField) {
if (DataField.Name == 'AccountTypeID') {
Self.EndUpdate();
edtAccountType.UnPrepareDropDownList();
}
}
К слову, применив эти методы окна для отображения деталей в разделе, сами детали визуально отображаются "приятнее" и визуально быстрее.
На PrepareSelectWindow делаем BeginUpdate, а после того, как значение выбрано, делаем EndUpdate. В результате этого при отрисовке пользовательских полей (что вызывает обычно передергивания) окно на этот момент , так сказать, "замораживается". Попробуй добавить с десяток пользовательских полей для разных типов контрагентов и сравни эффект без подобного кода и с ним.
Если таким образом можно избавится от передёргивания окна - в базовую версию надо добавлять.