Похоже в методе addAttributeRangeToQuery класса DimensionProvider в строке 58 используют не правильный тип соединения
X++:
public QueryBuildRange addAttributeRangeToQuery(Query _query, str _dataSourceName, str _dimensionFieldName, DimensionComponent _dimensionComponent, anytype _value, str _dimensionAttributeName='', boolean _isDefaultRange = false)
{
...
// Change the join to an inner join since it is now restricting
qbds.joinMode(JoinMode::InnerJoin);
...
}
При таком соединении из выборки уходят все строки, у которых не определено значение фин. аналитики, по которой накладываем условие.
Т.е. когда мы используем конструкцию вида
X++:
...
SysQuery::addDimensionAttributeRange(
query,
qbds.name(),
fieldStr(Example, DefaultDimension),
DimensionComponent::DimensionAttribute,
SysQuery::valueUnlimited(),
dimensionName,
true);
...
будут отобраны все записи из таблицы Example, у которых аналитика dimensionName не пустая, даже не смотря на то, что значение мы передаем любое.
И еще один момент, в соседнем методе addAttributeFilterToQuery(он почти повторяет данный метод за исключением методов к которым применяются значения условий) этого же класса, используется уже OuterJoin.
X++:
public QueryFilter addAttributeFilterToQuery(Query _query, str _dataSourceName, str _dimensionFieldName, DimensionComponent _dimensionComponent, anytype _value, str _dimensionAttributeName = '')
{
...
// Change the join to an outer join since it is now restricting with a filter
qbds.joinMode(JoinMode::OuterJoin);
...
}