т.е. если пользователь будет в двух группах, то получит обе, поэтому приоритеты разные,
<?
$sectionEntity = (\Bitrix\Iblock\Model\Section::compileEntityByIblock(self::IB_ID))::getEntity();
$sectionEntity->addField(
(
new Reference(
'ONE_LEVEL_UP',
$sectionEntity,
Join::on('this.IBLOCK_SECTION_ID', 'ref.ID')
)
)->configureJoinType('LEFT')
);
$subQueryCountAll = new \Bitrix\Main\Entity\Query(\Bitrix\Iblock\Elements\ElementPortalTable::getEntity());
$subQueryCountAll
->setSelect([
new ExpressionField(
'COUNT_ALL',
"COUNT(%s)",
['ID']
),
])
->setFilter([
'ACTIVE' => 'Y',
'IBLOCK_SECTION_ID' => new Bitrix\Main\DB\SqlExpression('%s'),
]);
$subQuerySqlCountAll = $subQueryCountAll->getQuery();
$query = new Bitrix\Main\Entity\Query($sectionEntity);
$query
->setFilter([
'IS_HIDE' => 'N',
'<DEPTH_LEVEL' => 3,
])
->setSelect([
'ID',
'PARENT_ID' => 'ONE_LEVEL_UP.ID',
'DEPTH_LEVEL',
'TEXT' => 'NAME',
'count_shown',
'count_all',
new ExpressionField(
'IS_HIDE',
"CASE WHEN %s = 0 THEN 'Y' ELSE 'N' END",
array('count_all')
),
])->setOrder(["left_margin"=>"asc"])
->registerRuntimeField('count_all', [
'expression' => ['(' . $subQuerySqlCountAll . ')', 'ID']
]);
$result = $query->exec()->fetchAll();
foreach($result as $key => $el){
// Построение дерева разделов
}
$product->getCml2Article()->getValue()
Это вариант вполне работает
Вот вам рабочий пример