Столкнулся с проблемой активности элементов, если активность элементов изменена напрямую в БД. В инфоблоке около 60 тысяч товаров и каждый час им переустанавливается активность, исходя из пришедших данных. Естественно, загонять в цикл CIBlockElement::Update() и устанавливать активность для каждого элемента - плохой вариант. Поэтому был написан скрипт, который меняет активность элементов прямо в БД в таблице b_iblock_element массово. Но потом в админке и в работе API начинаются глюки:
Вот все товары раздела без учета активности:
Но если в фильтре установить отбор только активных товаров - их не покажет, их будето нет.
Также и CIBlockElement::GetList() не возвращает активные элементы
Очевидно, это какой-то кеш, то ли MySQL, то ли в битриксе. Подскажите, куда копать, как очищать такой кеш после работы с БД напрямую?
Очистка всего кеша битрикса не помогает.
Всё, разобрался. В выборке еще участвует индекс. Запрос к бд формируется такой:
Проблема решается обновлением индекса с помощью функции
Но опять это поэлементный перебор и вся скорость обработки опять никакая. Ладно, буду дальше искать
Вот все товары раздела без учета активности:
Но если в фильтре установить отбор только активных товаров - их не покажет, их будето нет.
Также и CIBlockElement::GetList() не возвращает активные элементы
Очевидно, это какой-то кеш, то ли MySQL, то ли в битриксе. Подскажите, куда копать, как очищать такой кеш после работы с БД напрямую?
Очистка всего кеша битрикса не помогает.
Всё, разобрался. В выборке еще участвует индекс. Запрос к бд формируется такой:
| Код |
|---|
SEL ECT COUNT(DISTINCT BE.ID) as CNT FR OM b_iblock B INNER JOIN b_lang L ON B.LID=L.LID INNER JOIN b_iblock_element BE ON BE.IBLOCK_ID = B.ID INNER JOIN b_iblock_27_index FC on FC.ELEMENT_ID = BE.ID WHERE 1=1 AND ( (FC.SECTION_ID = 5405 AND FC.FACET_ID = 1 AND FC.VALUE_NUM = 0 AND FC.VALUE in (0)) AND ((((BE.IBLOCK_ID = '27')))) AND ((((BE.ACTIVE='Y')))) ) AND (((BE.WF_STATUS_ID=1 AND BE.WF_PARENT_ELEMENT_ID IS NULL))) |
| Код |
|---|
\Bitrix\Iblock\PropertyIndex\Manager::updateElementIndex(IBLOCK_ID_CATALOG, $id); |