Когда нужно обработать 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, импорт данных, долгие операции.