Повисшие разделы

26.09.2013

Как то в поиске странного бага, я открыл для себя следующее: в битриксе при определенных обстоятельствах могут появляться Повисшие разделы. Это разделы на втором и последующих уровнях (DEPTH_LEVEL>1) у которых нет предка, т.е. нет раздела с ID==IBLOCK_SECTION_ID.

Такой раздел не наблюдается в админке, потому, что мы там смотрим или разделы первого уровня, или подразделы существующего раздела. Но у этого раздела, запросто может быть ACTIVE==Y, а также и GLOBAL_ACTIVE==Y. Также и элементы этого раздела будут откликаться на SECTION_ACTIVE==Y и SECTION_GLOBAL_ACTIVE==Y. Получается, что раздела как бы нет, но он всплывает в различных запросах, как и его элементы.

Как такое может произойти?

Дело в том, что удаление разделов в битриксе сделано через кхмы... то самое место. Когда мы удаляем раздел, содержащий другие разделы, происходит следующее: Строится список разделов, которые нужно удалить, а потом происходит поочередное удаление по одному! Причем после каждого удаления происходит пересчет MARGIN'ов у всех разделов. Если количество разделов большое, то удаление происходит продолжительное время. В моем случае количество разделов было порядка 10000, и удаление одного раздела происходило 3-4 секунды. Вот и считайте... Итак удаляем разделы, скажем 5 тыщ из 10 тыщ, процесс занимает пару тройку часов. Процесс может прерваться по таймауту, по исчерпанию процессорного времени, еще по какому-нибудь лимиту, и скорее всего прервется. Вот и получаем повисшие разделы... Я промолчу про такую реализацию удаления...

Как исправить?

Я написал скрипт, который получает все разделы, смотрит, если DEPTH_LEVEL>1, а раздела с ID==IBLOCK_SECTION_ID не существует, значит это повисший раздел - его удаляем:


CIBlockSection::Delete($ar_result['ID']);

НО!!! Перед удалением сделайте резервную копию базы!, потому, что удаляемый раздел, его потомки, и его элементы или элементы потомков могут содержать важные данные. В моем случае так и было, была настроена синхронизация с другой системой, и повисшие разделы с радостью откликались по XML_ID и продолжали участвовать в синхронизации. А операторы заполняли другие, уже нужные разделы с теми же XML_ID, вот и разберись потом что нужно, а что нет.

Сам код скрипта не привожу, т.к. он был написан под конкретную задачу, и не является универсальным. Там были разделы 3-х уровней, я сначала удалял повисшие разделы 2-го уровня, а затем 3-го.

Оставить комментарий:

Представьтесь пожалуйста:
Электронная почта:
Электронный адрес не публикуются
Текст сообщения:
Для подсветки кода, оборачивайте ваш код в теги <code></code>
Введите 5 цифр с картинки:

Рекомендую:

Поделюсь промокодами для хостинга TimeWeb!

Поддержать проект: