Розроблення адміністративного інтерфейсу масових операцій у 1С-Бітрікс
Менеджер вибирає 200 товарів у стандартному списку Бітрікса, натискає «Дії» — і бачить лише п'ять пунктів: активувати, деактивувати, видалити, змінити розділ, експорт. Користувацьких операцій немає. Додайте їх через розширення адміністративного інтерфейсу.
Архітектура адміністративних сторінок Бітрікса
Адміністративний список товарів будується компонентом bitrix:iblock.admin.element.list в /bitrix/modules/iblock/admin/. Для додавання користувацьких дій над виборкою не потрібно редагувати системні файли — існує механізм розширення через адміністративний меню-файл та користувацький обробник.
Користувацька адміністративна сторінка розташовується в /bitrix/admin/my_bulk_action.php. Вона отримує список ID через $_REQUEST['ID'][] — це стандарт для передачі виділених елементів з списків Бітрікса.
Додавання пункту в меню дій
Стандартний список інфоблока підтримує додавання кнопок через файл admin_action.php модуля або через JavaScript-інжекцію. Чистіший шлях — реєстрація користувацької дії через CAdminContextMenu:
// У файлі /bitrix/admin/my_module_actions.php
// Включається через /bitrix/php_interface/init.php
AddEventHandler('main', 'OnAdminListDisplay', function() {
global $APPLICATION;
$page = $APPLICATION->GetCurPage();
// Додати кнопку лише на сторінці списку елементів потрібного інфоблока
if (strpos($page, 'iblock_list_admin.php') !== false
&& (int)$_GET['IBLOCK_ID'] === MY_CATALOG_IBLOCK_ID)
{
// Реєстрація не робиться через подію — використовуємо JS
}
});
На практиці простіше додати кнопку через JavaScript, внедрений в кінець сторінки через $APPLICATION->AddHeadScript() або через включаємий файл в /bitrix/admin/.
JavaScript для додавання кнопки:
document.addEventListener('DOMContentLoaded', function () {
var toolbar = document.querySelector('.adm-toolbar-panel');
if (!toolbar) return;
var btn = document.createElement('input');
btn.type = 'button';
btn.value = 'Оновити ціни';
btn.className = 'adm-btn';
btn.addEventListener('click', function () {
var form = document.getElementById('list_form');
var action = document.createElement('input');
action.type = 'hidden';
action.name = 'action';
action.value = 'bulk_price_update';
var target = document.createElement('input');
target.type = 'hidden';
target.name = 'target_url';
target.value = '/bitrix/admin/my_bulk_price_update.php';
form.appendChild(action);
form.appendChild(target);
form.submit();
});
toolbar.appendChild(btn);
});
Обробник масової операції
Файл /bitrix/admin/my_bulk_price_update.php — сторінка обробки:
<?php
require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_admin_before.php';
$APPLICATION->SetTitle('Масове оновлення цін');
// Перевірити права
if (!\Bitrix\Main\Engine\CurrentUser::get()->isAdmin()) {
die('Access denied');
}
$ids = array_map('intval', (array)$_REQUEST['ID']);
$ids = array_filter($ids);
require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_admin_after.php';
if (!empty($ids) && $_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['confirm'])) {
// Виконати операцію
$markup = (float)$_POST['markup'];
foreach (array_chunk($ids, 50) as $chunk) {
foreach ($chunk as $id) {
$purchase = getPurchasePrice($id);
if ($purchase > 0) {
updateRetailPrice($id, $purchase * (1 + $markup / 100));
}
}
}
LocalRedirect('/bitrix/admin/iblock_list_admin.php?IBLOCK_ID=' . MY_CATALOG_IBLOCK_ID . '&lang=uk');
}
?>
<!-- Форма підтвердження -->
<form method="post" action="">
<p>Вибрано товарів: <b><?= count($ids) ?></b></p>
<label>Надбавка (%):
<input type="number" name="markup" value="40" min="0" max="500">
</label>
<?php foreach ($ids as $id): ?>
<input type="hidden" name="ID[]" value="<?= $id ?>">
<?php endforeach; ?>
<input type="hidden" name="confirm" value="Y">
<?= bitrix_sessid_post() ?>
<input type="submit" value="Оновити" class="adm-btn-green">
<a href="javascript:history.back()" class="adm-btn">Скасувати</a>
</form>
<?php require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/epilog_admin.php'; ?>
Прогресс-бар для тривалих операцій
При оновленні 1000+ елементів потрібен прогресс-індикатор. Бітрікс реалізує це через механізм CAdminProgress або AJAX-пулінг.
Паттерн з AJAX: операція розбивається на кроки, кожен крок — AJAX-запрос, який обробляє пакет і повертає {processed: N, total: M}. JavaScript оновлює прогресс-бар і запускає наступний крок. Збереження черги між кроками — через $_SESSION або b_option по тимчасовому ключу.
Контроль доступу
Кожен обробник масової операції перевіряє:
- CSRF-токен через
check_bitrix_sessid(). - Права користувача через
\Bitrix\Main\Engine\CurrentUser::get()->isAdmin()або\Bitrix\Main\Access. - Приналежність передадених ID до очікуваного інфоблока — захист від підстановки чужих ID.







