Занялся исследованием этой хотелки и выплыло несколько моментов.
1. Что такое пользовательский фильтр? Это запрос, хранящийся в QueryRun датасоурса. Для того, чтобы он туда попал необходимо для начала создать этот QueryRun. Создается он ядром в вызове executeQuery датасоурса, после создания уходит на сервер. Отсюда первый момент - первоначально выполяется оригинальный Query.
2. Помимо того, что для наложения фильтра необходимо выполнить оригинальный запрос - результат этого запроса еще и отобразится на форме, т.е. если после этого накладывать пользовательский фильтр, то на форме появится мелькание.
3. Вызов формы возможен через "переход к основной таблице" - т.е. пользовательский фильтр может помешать отображению данных
Если обойти первый момент я не представляю как, то второй и третий обойти можно.
В общем, что бы не возиться с sysLastValue, написал класс-надстройку над движком расширенных фильтров.
Из нюансов.
1. Для использования советую перекрывать метод executeQuery() датасоурса - пример использования ниже
2. Выбор запросов для использования - по названию (как в списке фильтра) с помощью методов queryLoad() или queryLoadLastUsed() (этот метод вызывает "Ранее использованный запрос"). Получить названия можно с помощью пары методов SavedQueriesCount() и SavedQueryName(). Сюда же входят "Ранее использованный запрос" и "Используемый запрос"
3. Метод buildSavedQueriesBox() позволяет заполнять FormComboBox списком запросов.
Пример использования для формы LedgerTable.
1. В classDeclaration формы добавляется булевый флаг userFilter
2. В методе init() формы устанавливается значение этого флага в истину
3. Перекрывается метода executeQuery() на датасоурсе LedgerTable
X++:
public void executeQuery()
{
UserQuerySetup userQuerySetup;
boolean lookup = element.args().lookupValue() != "" || element.args().dataset();
// флаг для проверки перехода по JumpRef
;
super();
if (userFilter && !lookup)
{
userQuerySetup = new UserQuerySetup(element, LedgerTable_QR);
if (userQuerySetup.UserQuery())
{
userQuerySetup.queryLoadLastUsed(); // вызов "Ранее использованного запроса"
// или загрузка первого сохраненного запроса (или любого по номеру)
// userQuerySetup.queryLoad(userQuerySetup.SavedQueryName(1));
userQuerySetup.queryUpdate(); // обновление запроса в QueryRun датасоурса
userFilter = false;
LedgerTable_DS.research(); // запрос из QueryRun перевыполняется
}
}
userFilter = false;
}