Пошаговая обработка большого количества элементов инфоблока, быстро скрипт

Внимание! Все сообщения на форуме проходят модерацию. Ваше сообщение появится после проверки.
Это быстрый черновик для будущей, развернутой заметки в блог.

Иногда нужно что-то массово сделать с элементами инфоблока, если их много можно упереться в лимиты.
Пошаговый скрипт для обработки элементов.

С помощью этого скрипта можно обработать элементы пошагово.
Размещаете скрипт на странице и открываете ее в браузере.
Код
<?php
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/header.php");

use Bitrix\Main\Loader;
Loader::includeModule("iblock");

$ibId = 5; // Ваш инфоблок
$elsCount = 10; // По сколько элементов обрабатывать за шаг
$lastId = $_POST['LAST_ID'];
$i = 0;
$ibElements = CIBlockElement::GetList(
    array('ID' => 'ASC'),
    array(
        'IBLOCK_ID' => $ibId,
        '>ID' => $lastId
    ),
    false,
    array(
        'nTopCount' => $elsCount
    ),
    array(
      // Тут указываете поля элемента, которые нужны для обработки
      // Для примера, нужен только ID
      'ID'
    )
);
while ($dbRes = $ibElements->Fetch()) {
    // Тут пишите свой обработчик элементов
    // Для примера удаление элементов
    CIBlockElement::Delete($dbRes['ID']);
    $lastId = $dbRes['ID'];
$i++;
}
?>
<form action="" method="POST">
        <input type="text" name="LAST_ID" value="<?echo $lastId > 2 ? $lastId : '1';?>">
        <button type="submit" id="go">Go</button>
</form>
<? if ($i > 1) {?>
    <script>
        $('#go').click();
    </script>
<?
} else {
    ?>
    Элементы обработаны
    <?php
} ?>

Скрипт написан по быстрому.

Смысл в том что, пошагово отправляем на страницу ID последнего обработанного элемента элемента
и на каждом шаге обновляем этот ID получая по nTopCount элементов за шаг.
Стартуем c 1-го ID, даже  если такого ID нет, счетчик сместится до ближайшего существующего.

В примере, пошагово удаляются элементы инфоблока. Но вы можете использовать это для любой обработки элементов.
Что-то перезаписать в них, изменить, обновить цены, остатки и так далее. В общем, что угодно.
Вариант для улучшения описаний товаров в магазине
Код
<?php
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/header.php");
use Bitrix\Main\Loader;
Loader::includeModule("iblock");

$IBID = 14;
$STEP = 2; // по 2 элемента за шаг
$DELAY_SEC = 3; // пауза между шагами в секундах
$lastId = (int)($_POST['LAST_ID'] ?? 0);

// API
$url = 'https://api.aitunnel.ru/v1/chat/completions';
$api_key = 'sk-aitunnel-123TGjGiXf3VA';

// Получаем следующие 2 элемента
$el = new CIBlockElement();
$rsElements = CIBlockElement::GetList(
    ['ID' => 'ASC'],
    [
        'IBLOCK_ID' => $IBID,
        '>ID' => $lastId
    ],
    false,
    ['nTopCount' => $STEP],
    ['ID', 'NAME', 'DETAIL_TEXT']
);

$processed = 0;

while ($arElement = $rsElements->Fetch()) {
    $id = (int)$arElement['ID'];
    $name = trim($arElement['NAME']);
    $desc = trim($arElement['DETAIL_TEXT'] ?? '');

    echo "<p><strong>:f09f9484: Обработка ID {$id}</strong>: " . htmlspecialchars(substr($name, 0, 60)) . "…</p>\n";

 $systemPrompt = "Ты — опытный автор объявлений для доски объявлений с б/у товарами. Пиши только сплошным текстом — никаких списков, маркированных пунктов, заголовков, жирного шрифта или спецсимволов. Описание должно быть информативным, честным (всегда уточняй, что товар б/у), подчёркивать практическую пользу, совместимость, состояние и особенности использования. Включи ключевые параметры: модель, тип вилок/розеток, максимальную нагрузку, габариты, вес, цвет, бренд — но интегрируй их естественно в повествование, без сухого перечисления. Не выдумывай параметры, которых нет в исходных данных. Сохрани нейтрально-доброжелательный тон, избегай шаблонных фраз вроде «не упусти шанс» или «только сегодня». Заверши призывом к действию: возможность осмотреть, забрать, отправить и т.п. Объём — около 1500 символов.";

    $userPrompt = "Название: {$name}\nХарактеристики: {$desc}";

    $data = [
        'model' => 'gpt-5-mini',
        'max_tokens' => 1000,
        'temperature' => 0.5,
        'messages' => [
            ['role' => 'system', 'content' => $systemPrompt],
            ['role' => 'user',   'content' => $userPrompt],
        ],
    ];


    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Content-Type: application/json',
        'Authorization: Bearer ' . $api_key,
    ]);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);

    $result = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($httpCode === 200 && $result) {
        $resp = json_decode($result, true);
        if (!empty($resp['choices'][0]['message']['content'])) {
            $newText = trim($resp['choices'][0]['message']['content']);
            // Обрезаем, если сильно превышает (~1600 симв. макс.)
            if (mb_strlen($newText) > 1600) {
                $newText = mb_substr($newText, 0, 1600) . '…';
            }

            $updateOk = $el->Update($id, ['DETAIL_TEXT' => $newText]);
            if ($updateOk) {
                echo "<p style='color:green;'>✅ ID {$id} — обновлён.</p>\n";
            } else {
                echo "<p style='color:red;'>❌ ID {$id} — ошибка обновления: " . htmlspecialchars($el->LAST_ERROR) . "</p>\n";
            }
        } else {
            echo "<p style='color:orange;'>⚠️ ID {$id} — пустой ответ от ИИ.</p>\n";
        }
    } else {
        echo "<p style='color:red;'>❌ ID {$id} — ошибка API (HTTP {$httpCode}): " . htmlspecialchars(substr($result, 0, 200)) . "</p>\n";
    }

    $lastId = $id;
    $processed++;
}

if ($processed > 0) {
    echo "<hr><p>Обработано: {$processed}. Следующий старт с ID: {$lastId}</p>";
    ?>
    <form id="nextStep" method="POST">
        <input type="hidden" name="LAST_ID" value="<?= htmlspecialchars($lastId) ?>">
        <button type="submit">Следующий шаг (автозапуск через <span id="countdown"><?= $DELAY_SEC ?></span> с)</button>
    </form>

    <script>
        let sec = <?= (int)$DELAY_SEC ?>;
        const countdownEl = document.getElementById('countdown');
        const interval = setInterval(() => {
            sec--;
            countdownEl.textContent = sec;
            if (sec <= 0) {
                clearInterval(interval);
                document.getElementById('nextStep').submit();
            }
        }, 1000);
    </script>
    <?php
} else {
    echo "<h2 style='color:green;'>✅ Все элементы обработаны!</h2>";
}
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/footer.php");
?>
Форма ответов
 
Текст сообщения*
Перетащите файлы
Ничего не найдено
Файл
 

Стоимость разработки на 1С-Битрикс:

Индивидуальная разработка магазина

от 450 000 руб. от 5-ти недель

Разработка магазина на 1С-Битрикс с нуля. Дизайн, сборка и оптимизация производительности под конкретный проект и требования. Реализация любого функционала без ограничений готовых решений.

Запуск сайта на готовом решении

от 100 000 руб. от 7-ми дней

Вариант для тех, кто не хочет тратить много средств на индивидуальный проект, и не имеет серьезных требований к сайту. Магазин, быстро запускается на базе одного из 200-та готовых решений.

Мобильное приложение

от 450 000 руб. от 1-го месяца

Разработка кроссплатформенного мобильного приложения, которое не уступает нативным решениям как в производительности, так и пользовательском опыте. Публикуется в AppStore, GooglePlay и RuStore

Сайт компании

от 300 000 руб. от 1-го месяца

Корпоративный сайт с информационными разделами, каталогом товаров или услуг. Включает формы обратной связи карточек каталога, любое количество статичных и динамичных разделов.

Инфресурс

от 350 000 руб. от 5-ти недель

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

Лечение сайтов от вирусов

от 40 000 руб. от 2-х дней

Выполню полную проверку сайта и окружения. В случае обнаружения вирусов проведу полный комплекс лечения проекта и закрытия лазеек.