Блог Горошко Андрея 1C-Битрикс Bitrix\Main\Update\Stepper: Обработка больших данных по шагам с прогресс-баром

Bitrix\Main\Update\Stepper: Обработка больших данных по шагам с прогресс-баром

Средний рейтинг
Еще нет оценок

Когда нужно обработать 100 000 элементов или импортировать огромный файл, обычный скрипт упадет с ошибкой max_execution_time.

Решение — выполнять задачу порциями (по шагам).

В Битрикс для этого есть стандартный и красивый механизм — Stepper.

Он не только управляет шагами, но и показывает пользователю прогресс-бар.

Шаг 1: Создание класса Степпера

Создайте класс, наследующий \Bitrix\Main\Update\Stepper. Он должен лежать в папке lib вашего модуля.

namespace My\Module;

use Bitrix\Main\Update\Stepper;

class MyImportStepper extends Stepper
{
    // Уникальный ID модуля
    protected static $moduleId = "my.module";

    /**
     * Основной метод, выполняющий один шаг
     * @param array $option Массив данных о текущем состоянии
     * @return bool true - продолжать, false - закончить
     */
    public function execute(array &$option)
    {
        // 1. Инициализация параметров при первом запуске
        if (empty($option["count"])) {
            $option["count"] = \My\Data::getCount(); // Общее кол-во элементов
            $option["steps"] = 0; // Текущий прогресс
        }

        // 2. Выполнение порции работы
        $limit = 50; // Обрабатываем по 50 штук за раз
        
        $items = \My\Data::getList([
            'limit' => $limit,
            'offset' => $option["steps"]
        ]);

        $processedCount = 0;
        while ($item = $items->fetch()) {
            // ... Тяжелая логика обработки элемента ...
            // \My\Processor::doWork($item);
            
            $processedCount++;
        }

        // 3. Обновление прогресса
        $option["steps"] += $processedCount;

        // 4. Условие завершения
        if ($processedCount < $limit) {
            // Данные кончились, удаляем задачу
            return false;
        }

        // Задача не закончена, продолжаем
        return true;
    }
}

Шаг 2: Запуск (регистрация) степпера

Чтобы запустить процесс, нужно «связать» степпер с модулем. Это делается один раз в месте старта (например, по нажатию кнопки).

// Где-то в контроллере или admin-скрипте
\My\Module\MyImportStepper::bind();

Битрикс создаст запись в таблице b_option и начнет выполнять execute() на хитах.

Шаг 3: Вывод прогресс-бара

Чтобы пользователь видел, что происходит, нужно вывести JS-виджет степпера. Обычно это делается на странице настроек модуля или списка элементов.

// В админ-части (prolog_admin_after уже подключен)

// Получаем HTML всех активных степперов для нашего модуля
$stepperHtml = \Bitrix\Main\Update\Stepper::getHtml("my.module");

echo $stepperHtml;

Битрикс сам проверит, есть ли активные задачи для my.module. Если есть — покажет красивую полоску прогресса с процентами. Если нет — выведет пустоту. JS сам будет дергать аяксом выполнение шагов, пока задача не завершится.

Особенности:

  • Stepper работает на хитах (через AJAX при открытой странице админки или через обычные хиты пользователей).
  • В массиве $option можно хранить любые данные между шагами (ID последнего элемента, счетчики ошибок и т.д.).

Вывод:
Stepper — это профессиональный способ реализации долгих фоновых процессов в интерфейсе.

Он обеспечивает стабильность (скрипт не падает), информативность (пользователь видит прогресс) и простоту реализации (не нужно писать свой JS для AJAX-запросов).

Stepper, Битрикс степпер, пошаговое выполнение, фоновые задачи, progress bar, импорт данных, долгие операции.

Мой рейтинг:

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

Related Post

Компонент main.ui.grid: Создание современной таблицы данных в БитриксКомпонент main.ui.grid: Создание современной таблицы данных в Битрикс

Средний рейтинг Еще нет оценок Старые таблицы (CAdminList) работают только в админке. Для публичной части (и современных админок) Битрикс предлагает компонент bitrix:main.ui.grid. Это мощный JS-грид с поддержкой сортировки, перетаскивания колонок,

component_epilog.php Выполнение кода после вывода шаблона компонентаcomponent_epilog.php Выполнение кода после вывода шаблона компонента

Средний рейтинг Еще нет оценок В жизненном цикле компонента Битрикс есть специальный файл — component_epilog.php. Он выполняется после того, как отработал template.php, то есть после того, как основной HTML компонента уже был сгенерирован и

Отложенные функции в шаблонах: SetViewTarget и ShowViewContentОтложенные функции в шаблонах: SetViewTarget и ShowViewContent

Средний рейтинг Еще нет оценок Частая задача верстальщика: компонент (например, детальная новость) выводится в основной области контента, но какую-то его часть (дату, теги, кнопку «Поделиться») нужно отобразить в другом месте