Вызов окна wnd_TasksGridArea

Добрый день.

С системой работаем недавно, поэтому даже тривиальные вещи вызывают вопросы :)

Есть следующая задача: при открытии формы редактирования Контрагента (Юрлица) вызвать окно с перечнем задач, определенных для этого Юрлица.

В процессе реализации возникло несколько вопросов.

В событии OnShow окна wnd_AccountEdit прописано wnd_BaseDBEditOnShow.

Вопрос 1: чтобы реализовать свой код в событии OnShow мне необходимо сначала вызвать базовую функцию (т.е. wnd_BaseDBEditOnShow) и только после этого писать свой код?

Вопрос 2: делаю так

var taskWindow = Services.GetNewItemByUSI('wnd_TaskEditGridArea');
// пока пробуем без фильтрации
taskWindow.Prepare();
taskWindow.Show();

окно задач отображается, однако оно пусто, и только после того как я сделаю переключение "Мои задачи" - "Все задачи" появляются задачи. Такое впечатление что не открывается Dataset.

С чем может быть связано такое поведение?

Заранее благодарен за помощь.

Нравится

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

"Сасин Артем Сергеевич" написал:Вопрос 1: чтобы реализовать свой код в событии OnShow мне необходимо сначала вызвать базовую функцию (т.е. wnd_BaseDBEditOnShow) и только после этого писать свой код?

Все верно.

"Сасин Артем Сергеевич" написал:
Вопрос 2: делаю так

var taskWindow = Services.GetNewItemByUSI('wnd_TaskEditGridArea');
// пока пробуем без фильтрации
taskWindow.Prepare();
taskWindow.Show();
окно задач отображается, однако оно пусто, и только после того как я сделаю переключение "Мои задачи" - "Все задачи" появляются задачи. Такое впечатление что не открывается Dataset.

Попробуйте так:

var taskWindow = Services.GetNewItemByUSI('wnd_TaskEditGridArea');
// пока пробуем без фильтрации
taskWindow.Prepare();
var dataset = taskWindow.ComponentsByName('dlData').Dataset;
//ApplyDatasetFilter(dataset, 'AccountID', AccountID, true);
dataset.Open();
taskWindow.Show();

"Валерий Андрусик" написал:Попробуйте так:
var taskWindow = Services.GetNewItemByUSI('wnd_TaskEditGridArea');
// пока пробуем без фильтрации
taskWindow.Prepare();
var dataset = taskWindow.ComponentsByName('dlData').Dataset;
//ApplyDatasetFilter(dataset, 'AccountID', AccountID, true);
dataset.Open();
taskWindow.Show();

Большое спасибо, все заработало.

Возникла еще одна проблема.

"Валерий Андрусик" написал:ApplyDatasetFilter(dataset, 'AccountID', AccountID, true);

Фильтр отрабатывает только если в задачах есть хоть одна запись с указанным AccountID.

Если в задачах нет записей с указанным AccountID, то выводятся все задачи из таблицы.

В какую сторону смотреть?

Заранее благодарен за помощь.

Попробуйте такой вариант, это будет правильнее:

var taskWindow = Services.GetNewItemByUSI('wnd_TasksGridArea');
taskWindow.Attributes('ParentItemFieldName') = 'AccountID';
taskWindow.Attributes('ParentItemID') = AccountID;
taskWindow.Prepare();
var dataset = taskWindow.ComponentsByName('dlData').Dataset;
dataset.Open();
taskWindow.Show();

"Валерий Андрусик" написал:Попробуйте такой вариант, это будет правильнее:
var taskWindow = Services.GetNewItemByUSI('wnd_TasksGridArea');
taskWindow.Attributes('ParentItemFieldName') = 'AccountID';
taskWindow.Attributes('ParentItemID') = AccountID;
taskWindow.Prepare();
var dataset = taskWindow.ComponentsByName('dlData').Dataset;
dataset.Open();
taskWindow.Show();

К сожалению проблема не решилась.
Если использовать приведенный код, то отображаемая форма всегда показывает ВСЕ задачи.
Если же к нему добавить

ApplyDatasetFilter(dataset, 'AccountID', AccountID, true);

То опять фильтр работает только если есть хоть одна запись с указанным AccountID.
Вообще странное поведение. Я посмотрел sql-запрос - вроде бы никаких подводных камней.

Заранее благодарен за помощь.

Проблема в том, что в sq_Task фильтр с кодом "AccountID" не простой фильтр сравнения, а набор фильтров. Для вашей задачи лучше сделать в sq_Task свой фильтр сравнения с кодом, например, "AccountID2" (и соответствующий параметр в sq_Task, м включать его вызовом ApplyDatasetFilter

"Валерий Андрусик" написал:Для вашей задачи лучше сделать в sq_Task свой фильтр сравнения с кодом, например, "AccountID2" (и соответствующий параметр в sq_Task, м включать его вызовом ApplyDatasetFilter

Спасибо огромное, все получилось.

Есть еще один общий вопрос. Добавил проверку не пуст ли Dataset, и если не пуст, то только потом показываю окно:

if (!IsDatasetEmpty(taskDataset)) {
	taskWindow.ShowModal();
}

Но перед этим у меня в любом случае выполняется:

taskWindow.Prepare();

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

Заранее благодарен за помощь.

Здравствуйте Артем Сергеевич,

В наших проектах мы память при вызове ShowModal() явным образом, не освобождаем.

С точки зрения экономии ресурсов создавать и не показывать окно плохо. Можно попробовать так:

var taskDataset = Services.GetNewItemByUSI('ds_Task');
ApplyDatasetFilter(taskDataset, 'AccountID2', AccountID, true);
taskDataset.Open();
if (taskDataset.IsEmptyPage)
{
taskDataset.Close();
}
else
{
var taskWindow = Services.GetNewItemByUSI('wnd_TaskEditGridArea');
taskWindow.Prepare();
taskWindow.ComponentsByName('dlData').Dataset = taskDataset;
taskWindow.Show();
}
Показать все комментарии