Перейти к содержимому

Как удалить инфоблоки 1с битрикс

  • автор:

Форум

Как удалить инфоблок. Я полагаю, что этот вопрос необходимо вынести в документацию.
Я думала, что это делается так: Контент -> Информационные блоки -> Типы информационных блоков.
Там выбираем те блоки, которые нужно удалить и жмем на крестик внизу.

Оказывается как-то не так. Вопрос: как?

Сообщений: 1126 Баллов: 569 Регистрация: 23.03.2005
05.07.2006 13:57:22

Цитата
Гость пишет:
Оказывается как-то не так. Вопрос: как?

именно так и удаляются типы информационных блоков.
Чтобы удалить информационный блок, нужно зайти в его тип и там проделать вышеуказанную операцию.

студия Leveret
05.07.2006 15:29:57

Не получается. Пожалуйста, укажите на раздел в документации, где подробно указана данная процедура. Я думаю, что такой раздел просто обязан быть в документации.

05.07.2006 15:34:42

Не работают функции редактирования и удаления записей. И еще раз прошу дать ссылку нараздел в документации.

05.07.2006 15:40:06
Просто удивительно! в опере все работает, в а IE — нет.
Администратор
Сообщений: 2449 Баллов: 271 Регистрация: 30.12.2002
05.07.2006 16:01:34

Цитата
Гость пишет:
Просто удивительно! в опере все работает, в а IE — нет.

Не совсем понятен вопрос, что и где не получается удалить?

Если проблему решить не удается, создайте пожалуйста обращение в техподдержку, проконсультируем.

Заглянувший
Сообщений: 4 Регистрация: 27.09.2016
27.09.2016 09:30:58
У меня инфоблок создался с пустым именем. теперь не могу его удалить
Как удалить его
Заглянувший
Сообщений: 2 Регистрация: 28.10.2017
01.07.2021 15:53:30

Цитата
Сико Дос написал:
У меня инфоблок создался с пустым именем. теперь не могу его удалить
Как удалить его

Поддерживаю, такая же ситуация. Не знаю как так получилось, но у клиента Инфоблок с пустым именем, соответственно нет возможности его удалить стандартными средствами. Только через базу походу (если он там будет)

Страницы: 1

Центр поддержки

Продукты

Управление сайтом
Битрикс24
Интернет-магазин + CRM

Решения

Для интернет-магазинов
Каталог готовых решений

Внедрение

Выбрать партнера
Проверить партнера
Стать партнером

1С-Битрикс http://www.1c-bitrix.ru Общие вопросы info@1c-bitrix.ru Приобретение и лицензирование продуктов : sales@1c-bitrix.ru Маркетинг/мероприятия/PR marketing@1c-bitrix.ru Партнерская программа partners@1c-bitrix.ru Мы работаем с 10:00 до 19:00 по московскому времени. Офис в Москве 127287 Россия Московская область Москва 2-я Хуторская улица дом 38А строение 9 Офис в Калининграде +7 (4012) 51-05-64 Офис в Калининграде 236001 Россия Калининградская область Калининград Московский проспект 261 Офис в Киеве ukraine@1c-bitrix.ru Телефон в Киеве +3 (8044)221-55-33 Офис в Киеве 01033 Украина Калининградская область Киев улица Шота Руставели 39/41 офис 1507

Контент для лиц от 16 лет и старше

© 2001-2023 «Битрикс», «1С-Битрикс». Работает на 1С-Битрикс: Управление сайтом. Политика конфиденциальности

1С-Битрикс. Как массово и достаточно быстро удалить все разделы в инфоблоке?

Добрый день!
Подскажите пожалуйста как массово и достаточно быстро удалить все разделы в инфоблоке?
Всего разделов 55к
Через админку всё виснет, несмотря на больше max execution time.

Скрипт такой набросал, но как-то долговато работает.. Или это норма?

 'asc'), array('IBLOCK_ID' => $infoblock)); while ( $ar_Section = $rs_Section->Fetch() ) < $ar_Resu[] = array( // собираем массив того, что нам нужно 'ID' =>$ar_Section['ID'], // id раздела 'NAME' => $ar_Section['NAME'], // имя раздела (что нас, собственно, интересует) 'IBLOCK_SECTION_ID' => $ar_Section['IBLOCK_SECTION_ID'], ); > foreach ($ar_Resu as $section) < CIBlockElement::Delete($section["ID"]); >?>
  • Вопрос задан более трёх лет назад
  • 7427 просмотров

Комментировать
Решения вопроса 0
Ответы на вопрос 4
можно попробовать отключить пересчет дерева или прямо из базы грохнуть
Ответ написан более трёх лет назад
Нравится 1 1 комментарий
TechNOIR @TechNOIR Автор вопроса
А как отключить пересчет дерева?
Илья @jasper-blondin

Скрипт уже закончил работу?
Я так понимаю, Вы запустили скрипт, а потом написали вопрос.

Оптимизировать можно следующим образом:
— в метод GetList добавить массив с полями выборки array(«ID»), чтобы не тянуть из базы значения, которые не нужны
— выполнять метод Delete прямо в теле цикла while, чтобы не собирать без надобности массив

Если все еще не хватает времени на выполнение, написать простенькую клиентскую часть с AJAX-запросом. Будет работать медленно, но гарантировано выполнит задачу и не уйдет в таймаут.

Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать

winer

занимаюсь разработкой сайтов на 1c-bitrix

При большом количестве разделов (30к+), Bitrix начинает вставлять палки в колеса как разработчику, так и пользователю, который будет работать с такими ИБ.
— Списки элементов ИБ будут безбожно тормозить в интерфейсе. На каждом хите будет добавляться фильтр по разделу.
— Редактировать их становится очень затруднительно, опять же из за долгой загрузки интерфейса и большого времени изменения.

Всё это из за того что разделы это NESTED SETS деревья. При добавлении/удалении раздела происходит вычисление LEFT_MARGIN и RIGHT_MARGIN для каждого раздела во всем инфоблоке.

Для добавления и обновления (CIBlockSection::Add, CIBlockSection::Update) есть параметр метода $bResort, который позволяет отключить этот перерасчёт в момент их выполнения.
Только после этого ОБЯЗАТЕЛЬНО надо выполнять CIBlockSection::Resort.

Это можно использовать при большом количестве операций Update и Add. Сначала выполняете все операции Update и Add с $bResort=false, а после них CIBlockSection::Resort

  • пересчет границ NESTED SETS,
  • CIblockElement::GetList (поиск вложенных элементов)
  • CIblockElement::Delete (если в разделе были элементы),
  • Запрос к таблице которая хранит множественные привязки элемента к разделам (поиск значений и их удаление)
  • CIBlockSection::GetList (поиск вложенных разделов)
  • CIBlockSection::Delete (удаление вложенных разделов)
  • Переиндексирование поиска
  • Запросы к UF_* полям раздела (поиск значений и их удаление)
  • При заполненных SEO полях, запросы к таблицам которые их хранят (поиск значений и их удаление)
  • При расширенном управлении правами это еще запросы к таблицам которые хранят эти настройки (поиск значений и их удаление)

и это скорее всего не полный список, а только то что могу назвать по памяти.

Нельзя быстро удалить разделы стандартным API без написания своих запросов к БД которые проделают всё что описано выше. В идеале надо взять код стандартного CIBlockSection::Delete, внимательно его изучить и написать свой метод который будет с помощью прямых запросов делать тоже самое, но оптимально.

Если же вопрос стоит в том чтобы удалить эти разделы за ЛЮБОЕ количество времени, тогда можно написать страничку с пошаговым удалением разделов, через ajax запросы. Причем надо учитывать, что вначале разделы будут удаляться ОЧЕНЬ медленно и ajax запрос может отвалиться по таймауту, поэтому надо будет за один шаг удалять пару разделов. А ближе к границе в 10к разделов, за один шаг можно будет удалять уже большее количество.

Пошаговое удаление элементов инфоблока

Иногда приходится сталкиваться с сайтами, которые размещены на очень слабом хостинге. Если на таком хостинге нужно удалить все элементы инфоблока — тут или удалять напрямую, через базу данных (что не очень хорошо), либо постранично удалять элементы, что тоже муторно:(

Представляю вашему вниманию скрипт, позволяющий настроить автоматическое удаление всех элементов инфоблока с постраничной переборкой элементов в автоматическом режиме:

use Bitrix\Main; use Bitrix\Main\Application; use \Bitrix\Main\Localization\Loc as Loc; use \Bitrix\Main\Data\Cache; require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_admin_before.php"); require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/prolog.php"); Loc::loadMessages(__FILE__); if (!Main\Loader::includeModule('iblock')) < die('Module `iblock` is not installed'); >CJSCore::Init(array('jquery')); $POST_RIGHT = $APPLICATION->GetGroupRight("catalog"); // если нет прав - отправим к форме авторизации с сообщением об ошибке if ($POST_RIGHT == "D") $APPLICATION->AuthForm(GetMessage("ACCESS_DENIED")); $context = Application::getInstance()->getContext(); $request = $context->getRequest(); if ($request->isPost() && $request->get('action') && $POST_RIGHT == "W" && check_bitrix_sessid()) < $arResult = array(); $arPostData = $request->getPostList()->toArray(); switch ($request->get('action')) < case 'clearElements': $arSelect = Array("ID", "IBLOCK_ID"); $arFilter = Array("IBLOCK_ID" =>IntVal($arPostData['IBLOCK_ID'])); $maxForStep = 5; $pagesParams = ($arPostData['num'] == 1) ? array('nPageSize' => $maxForStep) : array('nTopCount' => $maxForStep); $res = CIBlockElement::GetList(Array(), $arFilter, false, $pagesParams, $arSelect); $arResult['CNT'] = $res->NavPageCount; global $DB; while ($arFields = $res->GetNext()) < $DB->StartTransaction(); if (!\CIBlockElement::Delete($arFields['ID'])) < $arResult['STATUS']['ERROR'][] = $arFields['ID'] . ' not deleted!'; $DB->Rollback(); > else < $arResult['STATUS']['OK'][] = $arFields['ID']; $DB->Commit(); > // $arResult[] = $arFields; > break; default: print_r($arPostData); > if ($request->isAjaxRequest() && !empty($arResult)) < $APPLICATION->RestartBuffer(); header('Content-type: application/json'); echo \Bitrix\Main\Web\Json::encode($arResult); exit(); > > $APPLICATION->SetTitle('Обработчик элементов информационного блока'); require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_admin_after.php"); class clIblockEntitiesProcessor < public static function GetIblockTypes($life_time = 3600 * 24 * 30) < $result = false; $cache_params = array('function' =>'CIBlockType::GetList'); $cache_id = md5(serialize($cache_params)); $cache_dir = __CLASS__; $cache = Cache::createInstance(); if ($life_time < 0) < $cache->clean($cache_id, $cache_dir); > if ($cache->initCache($life_time, $cache_id, $cache_dir)) < $result = $cache->getVars(); > elseif ($cache->startDataCache() && \Bitrix\Main\Loader::includeModule('iblock')) < $db_iblock_type = \CIBlockType::GetList(); while ($ar_iblock_type = $db_iblock_type->Fetch()) < if ($arIBType = \CIBlockType::GetByIDLang($ar_iblock_type["ID"], LANG)) < $arIBType['NAME'] = htmlspecialcharsEx($arIBType["NAME"]); $result[$arIBType['IBLOCK_TYPE_ID']] = array( 'IBLOCK_TYPE_ID' =>$arIBType['IBLOCK_TYPE_ID'], 'NAME' => $arIBType['NAME'], ); > > $cache->endDataCache($result); > return $result; > public static function GetIblockList($filter = array(), $life_time = 3600 * 24 * 30) < $result = false; $cache_params = array('function' =>'CIBlock::GetList', 'filter_params' => $filter); $cache_id = md5(serialize($cache_params)); $cache_dir = __CLASS__; $cache = \Bitrix\Main\Data\Cache::createInstance(); if ($life_time < 0) < $cache->clean($cache_id, $cache_dir); > if ($cache->initCache($life_time, $cache_id, $cache_dir)) < $result = $cache->getVars(); > elseif ($cache->startDataCache() && \Bitrix\Main\Loader::includeModule('iblock')) < $res = \CIBlock::GetList( Array(), $filter, false ); while ($ar_res = $res->Fetch()) < $result[$ar_res['ID']] = array( 'ID' =>$ar_res['ID'], 'IBLOCK_TYPE_ID' => $ar_res['IBLOCK_TYPE_ID'], 'CODE' => $ar_res['CODE'], 'NAME' => $ar_res['NAME'], 'ACTIVE' => $ar_res['ACTIVE'], 'PICTURE' => $ar_res['PICTURE'], 'DESCRIPTION' => $ar_res['DESCRIPTION'], 'DESCRIPTION_TYPE' => $ar_res['DESCRIPTION_TYPE'], 'CATALOG' => \CCatalogSKU::GetInfoByProductIBlock(intval($ar_res['ID'])), ); > $cache->endDataCache($result); > return $result; > public static function GetIblockElementItems( $arParams = array('filter' => array(), 'select' => false, 'sort' => array('name' => 'asc'), 'page_params' => false, 'group' => false), $life_time = 3600) < if (!isset($arParams['filter']) || empty($arParams['filter'])) return false; $arFilter = $arParams['filter']; $arSelect = (isset($arParams['select'])) ? $arParams['select'] : false; $arSort = (isset($arParams['sort'])) ? $arParams['sort'] : array('name' =>'asc'); $pageParams = (isset($arParams['page_params'])) ? $arParams['page_params'] : false; $groupParams = (isset($arParams['group'])) ? $arParams['group'] : false; $result = false; $cache_params = array(); foreach (array_keys($arParams) as $array_key) < if (is_array($arParams[$array_key])) < foreach ($arParams[$array_key] as $key =>$value) < $cache_params[$array_key . '-' . $key] = $value; >> elseif (is_bool($arParams[$array_key])) < $cache_params[$array_key] = $arParams[$array_key] ? 1 : 0; >> $cache_id = md5(serialize($cache_params)); $cache_dir = __CLASS__ . '/' . __FUNCTION__; $cache = \Bitrix\Main\Data\Cache::createInstance(); if ($life_time < 0) < $cache->clean($cache_id, $cache_dir); > if ($cache->initCache($life_time, $cache_id, $cache_dir)) < $result = $cache->getVars(); > elseif ($cache->startDataCache() && \Bitrix\Main\Loader::includeModule('iblock')) < $rsItems = \CIBlockElement::GetList($arSort, $arFilter, $groupParams, $pageParams, $arSelect); if ( is_array($arSelect) && in_array('IBLOCK_ID', $arSelect) && in_array('ID', $arSelect) ) < $filterProperties = array(); foreach ($arSelect as $select) < if (strpos($select, 'PROPERTY_') !== false) < $filterProperties[] = str_replace('PROPERTY_', '', $select); >> while ($arElement = $rsItems->GetNextElement()) < $arFields = $arElement->GetFields(); if (!empty($filterProperties)) < foreach ($filterProperties as $arFilterCode) < if (!isset($arFields['PROPERTIES'])) $arFields['PROPERTIES'] = array(); $arFields['PROPERTIES'] = array_merge($arFields['PROPERTIES'], $arElement->GetProperties(false, array( 'CODE' => $arFilterCode ))); // $arFields['PROPERTIES'][$arFilterCode] = ; > // $arFields['PROPERTIES'] = $arElement->GetProperties(false,array('CODE'=>$filterProperties)); > $result[] = $arFields; > > elseif (empty($arSelect)) < while ($arElement = $rsItems->GetNextElement()) < $arFields = $arElement->GetFields(); $arFields['PROPERTIES'] = $arElement->GetProperties(); $result[] = $arFields; > > else < while ($arElement = $rsItems->GetNext()) < $result[] = $arElement; >> if (!empty($result)) < foreach ($result as $key =>$arItem) < if (!empty($arItem['PROPERTIES'])) < foreach ($arItem['PROPERTIES'] as $pCode =>$arProperty) < $result[$key]['PROPERTIES'][$pCode] = \CIBlockFormatProperties::GetDisplayValue( array('ID' =>$arItem['ID'], 'NAME' => $arItem['NAME']), $arProperty, ''); > > > > if (isset($pageParams) && !empty($pageParams) && $pageParams['nPageSize'] == 1 && !empty($result[0])) < $result = $result[0]; >$cache->endDataCache($result); > return $result; > > $tmp = clIblockEntitiesProcessor::GetIblockList(array('ACTIVE' => 'Y')); $arIblockList = array(); foreach ($tmp as $item) < $arIblockList[$item['ID']] = $item; >// echo '
'; print_r($arIblockList);echo '

'; ?>

Обработано: 0% (Строка: 1/ 0)

Таким образом, при первом аякс-запросе скрипт получает информацию о том, сколько всего страниц ему нужно обработать (количество элементов на странице выбирается на основании производительности сервера),а дальше уже проходится по всем страницам и производит удаление.

P.S. Скрипт написан в виде страницы административного раздела сайта

Количество показов: 4728
Если вам была полезна статья можете отблагодарить автора:

Разработка сайта

Подайте заявку на разработку сайта на базе готового решения от компании 1С-Битрикс или одного из партнеров компании. Максимально подробно опишите, чему будет посвящен сайт, если это интернет-магазин - что он будет продавать, нужна ли мультиязычность, будут ли разные типы цен (розница, опт, крупный опт), будет ли интеграция с 1С, будет ли выгрузка товаров на различные торговые площадки.

Заказать разработку сайта

Сопровождение сайта

Вы можете подать заявку на сопровождение вашего сайта на базе 1С-Битрикс. Сопровождение включает в себя: проверка актуальности обновлений сайта, проверка актуальности резервной копии, консультации по сайту. Опишите в заявке, какие еще объемы планируются на сопровождении и на какой срок вы планируете заключить договор на сопровождение - мы подберем подходящий вам бюджет на сопровождение

Подать заявку на сопровождение

Работы по сайту

Вы можете подать заявку на выполнение определенного объема работ по сайту. Опишите в заявке объем работ. Это может быть разработка какого-то нового функционала, доработки по имеющемуся функционалу, доработки под требования сео-специалистов. На основании заявки вам будет сформирован бюджет работ, а также названы сроки на выполнение тех или иных работ.

Подать заявку на выполнение работ

Copyright © pai-bx.com | Попович Алексей. Персональный сайт разработчика, 1986-2023

Проблема инфоблоков+ (CMS 1C-Битрикс) и "Got error 139 from storage engine"

Проявление проблемы: сайт не работает, ошибка MySQL «Got error 139 from storage engine».

Ошибка возникает из-за того, что в инфоблоке+ у нас много свойств (больше 80) и каждое свойство может содержать объёмный блок с контентом. В результате суммарная длина полей типа TEXT и VARCHAR в строке таблицы `b_iblock_element_prop_sXX` превышала ограничение MySQL на длину строки таблицы (примерно половина от размера страницы памяти 16 кБ).

Уменьшить количество свойств в инфоблоке в виду задач по проекту и нехватки времени не представляется возможным.

Рисунок: скриншот инфоблока со свойствами:

До возникновения проблемы

Рассмотрим варианты решения проблемы:

  1. Удалить MySQL, собрать MySQL из исходников изменив UNIV_PAGE_SIZE и UNIV_PAGE_SIZE_SHIFT. Тем самым увеличив размером страниц памяти. Как описано до нас: http://dev.1c-bitrix.ru/community/webde v/user/8078/blog/1797/
  2. Переделать инфоблок+ и вынести группы свойств в отдельный инфоблок.

Плюсы и минусы вариантов решений

1. Мы получаем кастомизированную MySQL и теперь данный сайт привязан к определённой конфигурации сервера. При том, что сайт не является мега проектом, кастомизировать сайт под сервер проще, чем наоборот.

  • При сборке MySQL из исходников потребуется удалить существующую БД . А следовательно приостановить все веб сайты на данном сервере. Включая доступы до FTP и web админки (при хранение данных в MySQL)$
  • При установки MySQL из исходников могут быть не найдены зависимые пакеты, компилятор и т. д. Потребуется дополнительно установить все недостающие зависимости. Возможно, это приведет к увеличению простоя.
  • После сборки пакета он может некорректно установится, мало вероятно, но возможность все еще остается, если мы говорим о боевом сервере данная возможность нас не радует.
  • Непредвиденные вещи. Linux, FreeBSD и т. д. не всегда гладко и хорошо работают при кастомизации. Фактически данный пункт включает в себя следующее: «Дать голову на отсечение, что все пройдет гладко, мы не сможем», собственно как и точные сроки простоя. Хоть операция и займёт не более 20 минут, но не имея клона боевого сервера для теста, лучше не рисковать.
  • В последствие возможно появление проблем, природа которых ближе к архитектуре самого MySQL нежели к привычной сфере PHP .
  • В нашем случае база данных была бы повреждена в 2:00 ночи. Утилита mysqlcheck проверяющая БД каждую ночь сочтет данную таблицу ошибочной и «восстановит», а фактически затрет ее.
  • Возможны проблемы при оптимизации БД утилитами.
  • При переносе сайта на другой сервер, БД умирает. При переносе сайта на сервер с отсутствием доступа ROOT SSH сайт вообще невозможно будет корректно запустить!

2. Модификация программного кода. Здесь необходима работа программиста. А также получаем не очень правильную структуру с точки зрения удобства заполнения контента.

Выбрали вариант 2:

После решения проблемы

ИТОГ: Вынесли некоторые свойства в отдельный связанный элемент.

Если у Вас есть комментарии и предложения, пишите!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Luxury Car Rental in Miami | Reserve a Premium Vehicle with RealCar