Вот так получается универсально получить пользовательские фильтры из родительской части формы. Исключаются "случайные связи", если форма просто была вызвана из другой формы, для которой она не является частью.
X++:
void new(FormRun _callerFormRun)
{
Query localQuery;
FormDatasource formDatasource;
int i;
PartList partList;
Object obj;
boolean partExists(FormRun _formRun, str _name)
{
PartList partListLocal = new PartList(_formRun);
FormRun part;
int j;
for(j = 1; j <= partListLocal.partCount(); j++)
{
part = partListLocal.getPartById(j);
if (part && part.name() == _name)
{
return true;
}
}
return false;
}
;
partList = new PartList(_callerFormRun);
if (!partList.partCount()) //если на форме нет частей, то предполашаем, что эта форма - часть родительскрй формы, которая находится в args().caller()
{
obj = _callerFormRun.args();
if (obj)
obj = obj.caller(); //получаем родительскую форму
if (obj && (obj is FormRun))
{
if (partExists(obj, _callerFormRun.name())) //проверяем, что текущая форма действительно является частью родительской формы, а не просто вызвана из другой формы
{
formDatasource = obj.dataSource(1);
localQuery = formDatasource.queryRun().Query();
info(localQuery.datasourceNo(1).toString()); //достаем запрос родительской формы
for (i = 1; i <= localQuery.queryFilterCount(); i++)
{
info(localQuery.queryFilter(i).toString()); //достаем пользовательские фильтры из родительской формы
//if (localQuery.queryFilter(i).dataSource().name() == qbds.name())
// Query.addQueryFilter(qbds, localQuery.queryFilter(i).field()).value(localQuery.queryFilter(i).value());
}
}
}
}
}