Показать сообщение отдельно
Старый 09.03.2011, 12:37   #15  
someOne is offline
someOne
Участник
Аватар для someOne
 
173 / 423 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Кажется, понял причину проблемы потери фокуса окна поиска в формах "SalesTable" и "PurchTable"

Проблема там вызвана, судя по всему, функциональностью формата адресов доставки,
которая используется в локализации Аксапта.

Каждый раз, при отрабатывании метода active источника данных формы происходит "перерисовывание" контролов на закладке "Адрес". При этом обновление контролов происходит как в самом заказе, так и в строках заказа (даже если у вас отключен конфигурационный ключ "TradeMultiShipTo" - "Несколько получателей", и закладка "Адрес" в строках - не видима!). Именно в полях адреса имеется контрол "StaticText" который "забирает" фокус.

Решить проблему можно таким способом.
1. Если вы не используется функциональность "Несколько получателей" - лучше всего вообще отключить функциональность Адресов для строк заказа (закупки).
(или "повесить" туда конфигурационный ключ "TradeMultiShipTo")
class FormRunListener_Address_RU
X++:
public static container addressInfo(Args _args)
...
            case formstr(SalesTable) :
                return [[#HeaderDeliveryAddress, tablenum(AddressMap)]];
...
2. Перенести "обновление" полей адреса из метода active источника данных, например, в метод активации закладки "адрес" формы "заказы"
X++:
public void pageActivated()
{
    SysSetupFormRun SysSetupFormRun = element;
    ;
    SysSetupFormRun.active_W();

    super();
}
и отключить его для метода active :
class Info:
X++:
void formNotify(FormRun formRun,FormNotify event)
...
            // <GEEU>
            if (SysDictClass::is(formRun, classnum(SysSetupFormRun)))
            {
                // исправить ошибку потери фокуса при открытии окна поиска, перерисовка происходит при активации tabPage
                if (formRun.name() == FormStr(PurchTable) || formRun.name() == FormStr(SalesTable))
                    break;
                // <--

                sysSetupFormRun = formRun;
                sysSetupFormRun.active_W();
            }
            // </GEEU>

...
Эти меры позволяют не только избежать ошибки потери фокуса, но и по моим ощущениям, ускорить работу самой формы заказы (закупки).
(Так как больше не происходит лишних действий по обновлению полей адреса)