Вкратце: при создании раздела, если в форму редактирования выведена вкладка "Свойства элементов" (или они выведены в какой-нибудь другой вкладке), фасетный индекс начинает требовать обновления. И из-за этого время от времени пропадают товары из публички (особенности работы CIBlockElement::GetList). Ясное дело, меня это не устраивало. (Можно просто скрыть вывод "Свойств элементов", но это слишком просто для таких извращенцев, как я)
Собственно мне помогло вот это в init.php
AddEventHandler("iblock", "OnBeforeIBlockSectionAdd", "OnBeforeIBlockSectionAddHandler");
/*
* Удаляет из массива настройки свойств элементов, если они не изменились.
* Если ничего не изменилось, не придётся пересоздавать фасетный индекс.
*/
function OnBeforeIBlockSectionAddHandler(&$arFields)
{
if(!empty($arFields['SECTION_PROPERTY']))
{
$arPropLinks = CIBlockSectionPropertyLink::GetArray($arFields['IBLOCK_ID'], $arFields['IBLOCK_SECTION_ID']);
// Если у инфоблока есть торговые предложения, пройдёмся по их свойствам тоже
$arCatalog = false;
if (CModule::IncludeModule("catalog"))
$arCatalog = CCatalogSku::GetInfoByProductIBlock($arFields['IBLOCK_ID']);
if (is_array($arCatalog))
$arPropLinks += CIBlockSectionPropertyLink::GetArray($arCatalog['IBLOCK_ID']);
foreach($arFields['SECTION_PROPERTY'] as $propId => $options)
{
if(!empty($arPropLinks[$propId]))
{
// Форма возвращает нам SMART_FILTER и DISPLAY_EXPANDED либо как 'Y', либо как null,
// CIBlockSectionPropertyLink::GetArray может вернуть и 'N'. Не порядок.
if($arPropLinks[$propId]['SMART_FILTER'] === 'N')
$arPropLinks[$propId]['SMART_FILTER'] = null;
if($arPropLinks[$propId]['DISPLAY_EXPANDED'] === 'N')
$arPropLinks[$propId]['DISPLAY_EXPANDED'] = null;
if($arPropLinks[$propId]['FILTER_HINT'] === null) // такое тоже бывает
$arPropLinks[$propId]['FILTER_HINT'] = '';
foreach($options as $key => $value) {
if($arPropLinks[$propId][$key] !== $value)
return;
}
}
}
unset($arFields['SECTION_PROPERTY']);
}
}
CIBlockSectionPropertyLink::GetArray - подсмотрел в /bitrix/modules/iblock/admin/iblock_section_edit.php. Документации нет, но есть хороший комментарий здесь.
В принципе всё. В комментариях в коде самое главное написано. В любом случае, если соберётесь использовать это у себя - перепроверьте. Мало ли что.
P.S. При таком подходе (как и при скрытии вывода "Свойств элементов") у свежесозданных разделов (у которых вы ничего не меняли в "Свойствах элементов" при создании) теряется возможность редактировать эти самые "Свойства элементов", что нормально. Тут что скриптом исключай, что изначально не отображай. И тут уж вам самим выбирать, пересоздавать ли фасетный индекс при добавлении любого раздела, или получить нередактируемые поля.
Всё ещё считаю, что такое поведение GetList'а - это чёрная магия
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».