Доброго времени суток.
Стоит такая задача. На определенном этапе бизнес-процесса открывается 2 окна (карточки редактирования): счет и задача "Подтвердить счет". У пользователя два варианта: либо изменить дату начала/завершения задачи и сохранить задачу, либо подтвердить счет, при этом задача "Подтвердить счет" становится выполненной.
Вопрос такой. У задачи статус "Выполнена", но при этом остается висеть окно задачи с неактуальными данными. Хочу его автоматически закрывать. Возможно ли это?

Нравится

7 комментариев

Добрый день, Петр.
Метод, закрывающий окно: Close()
Если нужно обратиться в объекту окна, и вызвать его метод Close(), сделайте так:

  Window.Close();

"Фильковский Павел" написал:

Добрый день, Петр.

Метод, закрывающий окно: Close()

Если нужно обратиться в объекту окна, и вызвать его метод Close(), сделайте так:

  Window.Close();

Спасибо за ответ, Павел. Но в том то и проблема, что ссылки на объект окна у меня нет. Существует ли какая-нибудь возможность, например получить форму редактирования задачи зная ID задачи (если есть открытая форма, то получить ее) или список всех открытых окон экземпляра Террасофт Клиент (я бы их перебрал и по содержимому Attributes нужное окно нашел)?
Или все-таки придется городить огород с сохранением ссылок на все окна в какой-то коллекции?

Может проще не выводить два окна редактирования? а обойтись диалоговым окном с возможностью либо выбрать что делать дальше (задача или счет). Либо собственное окно с возможностью закрыть задачу либо подтвердить счет, пользователю же необязательно видеть всю карточку и счета, и задачи?

Добрый день, коллеги!

Но если же Вы все-таки желаете использовать связь между одельными окнами, посмотрите примеры использования:

  NotifyObject.Notify(Window, MSG_OK, null);

и

  FindEditWindow(USI, SearchFieldName, SearchValue);
  FindWindow(USI, RecordID);

"Александр Кудряшов" написал:Может проще не выводить два окна редактирования? а обойтись диалоговым окном с возможностью либо выбрать что делать дальше (задача или счет).

Сейчас уже не проще. Бизнес-процесс спроектирован так, что каждый его этап сопровождается выводом формы редактирования задачи, связанной с этим этапом (это фундаментальное требование). Плюс, для этапов, связанных с оформлением доментов, еще выводится форма редактирования этого документа. Ваше предложение предполагает переделывание кучи БП, а в данном случае я хотел обойтись малой кровью.

"Фильковский Павел" написал: NotifyObject.Notify(Window, MSG_OK, null);

Этот вариант не подойдет, поскольку ссылки на Window у меня нет, я не знаю как мне получить нужное окно.
"Фильковский Павел" написал: FindEditWindow(USI, SearchFieldName, SearchValue);
FindWindow(USI, RecordID);

А вот за это спасибо. У меня была мысль руками в

WinCache_Windows

поковыряться. Не подскажете, можно ли об этом механизме почитать поподробнее?
Ну и судя по этому куску кода из функции ShowEditWindowEx сервиса scr_WindowUtils

if ((!Services.AlwaysGetLastItemVersion) && 
    (IsUndefined(UseCache) || UseCache)) {
    // здесь пропущены проверки
    var EditWindow = WinCache_Get(EditWindowUSI, RecordID);
    if (!Assigned(EditWindow)) {
        return;
    }		
} else {
    var EditWindow = Services.GetNewItemByUSI(EditWindowUSI);
}

с выключенным кэшированием сервисов я таким образом окна получать не смогу?

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

С выключенным кэшированием можно будет обращаться к открытым окнам, пока они в ОЗУ.
После закрытия - уже нет.

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