Спасибо за ответы.
[QUOTE]
Евгений Жуков написал:
Скоро это изменится.[/QUOTE]
Следовало ожидать, что кулхацкерские решения по обходу определённого функционала в будущем могут выйти боком.
[QUOTE]
Евгений Жуков написал:
Поэтому и убирается.[/QUOTE]
Разумное предположение. Только после него до меня дошло, что "группировка" может означать "схлопывание" списка предложений в одну сущность. Но тут есть такие но:
[LIST]
[*]В основном описании настройки значится "[B]Свойства для отбора предложений[/B]" - довольно пространный текст, из которого я понял, что ТП будут не группироваться, а выбираться по этому свойству.
[*]В дополнительном попапе написано "[B]Свойства, по значениям которых будут группироваться торговые предложения[/B]" - но он отображается только при наведении, и звучит это противоречиво относительно изначального описания.
[/LIST]
Попробовал очистить список "[B]Свойства для отбора предложений[/B]". Не сработало - [FONT=monospace]DISPLAY_PROPERTIES[/FONT] всё так же остаётся пустым списком.
Дело скорее в этом методе, достающем свойства, которые нужно удалить из отображения:[CODE]Catalog\Product\PropertyCatalogFeature::getOfferTreePropertyCodes(
$this->storage['CATALOGS'][$iblockId]['IBLOCK_ID'],
['CODE' => 'Y']
);[/CODE]
Потому что этот метод работает даже из командной строки, без участия каких-либо настроек какого-либо компонента - он в любом случае возвращает массив [FONT=monospace]['RAZMER'][/FONT], повелевающий удалить размеры из торговых предложений.
Код метода таков:[CODE]/**
* Unified method for obtaining properties used to select offers.
*
* @param int $iblockId Iblock identifier.
* @param array $parameters Options
* keys are case sensitive:
* <ul>
* <li>CODE Return symbolic code as identifier (Y/N, default N).
* </ul>
* @return array|null
* @throws Main\ArgumentException
* @throws Main\ArgumentNullException
* @throws Main\ArgumentOutOfRangeException
* @throws Main\ObjectPropertyException
* @throws Main\SystemException
*/
public static function getOfferTreePropertyCodes($iblockId, array $parameters = [])
{
$iblockId = (int)$iblockId;
if ($iblockId <= 0)
return null;
$catalog = \CCatalogSku::GetInfoByOfferIBlock($iblockId);
if (empty($catalog))
return null;
if (!self::isEnabledFeatures())
return self::getOfferTreePropertyByTypes($catalog, $parameters);
$filter = [
'=MODULE_ID' => 'catalog',
'=FEATURE_ID' => self::FEATURE_ID_OFFER_TREE_PROPERTY,
'=PROPERTY.MULTIPLE' => 'N',
'!=PROPERTY.ID' => $catalog['SKU_PROPERTY_ID'],
[
'LOGIC' => 'OR',
[
'@PROPERTY.PROPERTY_TYPE' => [
Iblock\PropertyTable::TYPE_ELEMENT,
Iblock\PropertyTable::TYPE_LIST
]
],
[
'=PROPERTY.PROPERTY_TYPE' => Iblock\PropertyTable::TYPE_STRING,
'=PROPERTY.USER_TYPE' => 'directory'
]
]
];
return self::getFilteredPropertyCodes($iblockId, $filter, $parameters);
}[/CODE]
Самое интересное место тут:[CODE]if (!self::isEnabledFeatures())
return self::getOfferTreePropertyByTypes($catalog, $parameters);[/CODE]Код проверяет установку галочки "[URL=https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=42&LESSON_ID=1986]Использовать параметры свойств в компонентах и формах[/URL]" в настройках модуля инфоблока, и вызывает соответствующий метод. У нас эта галочка не стоит.
Вот вызываемый метод:[CODE]/**
* Getting the properties used to select offers when feature engine is off.
* Internal method.
*
* @param array $catalog Catalog description.
* @param array $parameters Options
* keys are case sensitive:
* <ul>
* <li>CODE Return symbolic code as identifier (Y/N, default N).
* </ul>
* @return array|null
* @throws Main\ArgumentException
* @throws Main\ObjectPropertyException
* @throws Main\SystemException
*/
private static function getOfferTreePropertyByTypes(array $catalog, array $parameters = [])
{
$result = [];
$getCode = (isset($parameters['CODE']) && $parameters['CODE'] == 'Y');
$filter = [
'=IBLOCK_ID' => $catalog['IBLOCK_ID'],
'!=ID' => $catalog['SKU_PROPERTY_ID'],
'=ACTIVE' => 'Y',
'=MULTIPLE' => 'N',
[
'LOGIC' => 'OR',
[
'@PROPERTY_TYPE' => [
Iblock\PropertyTable::TYPE_ELEMENT,
Iblock\PropertyTable::TYPE_LIST
]
],
[
'=PROPERTY_TYPE' => Iblock\PropertyTable::TYPE_STRING,
'=USER_TYPE' => 'directory'
]
]
];
$iterator = Iblock\PropertyTable::getList([
'select' => ['ID', 'CODE', 'SORT'],
'filter' => $filter,
'order' => ['SORT' => 'ASC', 'ID' => 'ASC']
]);
while ($row = $iterator->fetch())
$result[(int)$row['ID']] = self::getPropertyCode($row, $getCode);
unset($row, $iterator);
unset($filter, $getCode);
return (!empty($result) ? array_values($result) : null);
}[/CODE]
Он собирает такой фильтр:[CODE]array:5 [
"=IBLOCK_ID" => 6
"!=ID" => 87
"=ACTIVE" => "Y"
"=MULTIPLE" => "N"
0 => array:3 [
"LOGIC" => "OR"
0 => array:1 [
"@PROPERTY_TYPE" => array:2 [
0 => "E"
1 => "L"
]
]
1 => array:2 [
"=PROPERTY_TYPE" => "S"
"=USER_TYPE" => "directory"
]
]
][/CODE]
Видно, что он выбирает свойства "[B]Привязка к элементам[/B]", "[B]Список[/B]" и что-то про директории. У нас свойство "[B]Размер[/B]" это как раз "[B]Список[/B]" - список с разнообразными размерами, и каждое торговое предложение привязано к одному из значений этого списка.
И вот Битрикс решает, что его надо выкинуть из отображения на списочных страницах товаров.
Что по коду происходит - примерно понятно. Но логика происходящего, и как сделать, чтобы оно не происходило - непонятно.
Можно предположить, что "[B]Размер[/B]" должен быть не списком, а каким-нибудь числом или строкой, но:
[URL=https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=42&LESSON_ID=3155&LESSON_PATH=3912.4771.5220.6772.3155]https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=42&LESSON_ID=3155&LESSO...[/URL]
здесь на скриншотах указаны конкретно списочные свойства, и особо отмечено, что "[COLOR=#790000]Важно! Отбор торговых предложений может выполняться только по свойствам типа Список, Справочник и Привязка к элементам, причем они не должны быть множественными.[/COLOR]"
Свойство "[B]Размер[/B]" у нас активно и не является множественным - должно подходить по всем критериям. Но Битрикс именно вот это подходящее свойство упорно выкидывает из отображения.
Как же его убедить, что всё должно быть совсем наоборот?