Разработка кастомных страниц на D7 1С-Битрикс
Кастомная страница в административной части Битрикс — это не просто HTML-файл, брошенный в /bitrix/admin/. Это контроллер, который проверяет права, принимает параметры, выполняет бизнес-логику и рендерит результат через шаблон. D7 предоставляет для этого механизм \Bitrix\Main\Engine\Controller с маршрутизацией, проверкой CSRF и сессиями без самописного велосипеда.
Два подхода к кастомным страницам
Классический admin-файл (/bitrix/admin/my_page.php) — простейший вариант, пригодный для вспомогательных инструментов:
<?php
require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_admin_before.php");
use Bitrix\Main\Loader;
use Bitrix\Main\Localization\Loc;
Loader::includeModule('my.module');
// Проверка прав
if (!$APPLICATION->IsAdminPage() || !\CMain::GetUserRight("main") >= "S") {
$APPLICATION->AuthForm("Доступ запрещён");
}
$APPLICATION->SetTitle("Мой инструмент");
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_admin_after.php");
// Вывод содержимого страницы
?>
<form method="post" action="<?= $APPLICATION->GetCurPage() ?>">
<?= bitrix_sessid_post() ?>
<!-- поля формы -->
<input type="submit" value="Выполнить">
</form>
<?php
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/epilog_admin.php");
MVC через Controller — правильный путь для страниц с логикой:
namespace MyProject\Controllers;
use Bitrix\Main\Engine\Controller;
use Bitrix\Main\Engine\ActionFilter;
class ReportController extends Controller
{
public function configureActions(): array
{
return [
'getReport' => [
'prefilters' => [
new ActionFilter\Authentication(),
new ActionFilter\HttpMethod(['GET', 'POST']),
new ActionFilter\Csrf(),
],
],
];
}
public function getReportAction(int $periodDays = 30): array
{
// права проверяются в prefilters
$data = \MyProject\Services\ReportService::build($periodDays);
return ['data' => $data, 'total' => count($data)];
}
}
Маршрутизация в Битрикс
Для контроллеров нужна регистрация маршрутов. В /local/php_interface/init.php или в методе модуля:
\Bitrix\Main\Routing\Router::getInstance()->add(
'/local/my-tool/report/',
['controller' => '\MyProject\Controllers\ReportController', 'action' => 'getReport'],
'GET'
);
Альтернатива — UrlManager в конфиге модуля или файл /local/routes.php (Битрикс 22+, нужно включить в настройках ядра).
Кастомная страница публичной части
Для публичных страниц — стандартный механизм компонентов. Но иногда нужна страница вне компонентной системы: утилита, колбек от платёжного шлюза, вебхук. Тогда создаётся файл страницы с подключением ядра:
<?php
define('STOP_STATISTICS', true); // не пишем в статистику
define('NO_AGENT_STATISTIC', true); // не запускаем агенты
define('NOT_CHECK_PERMISSIONS', true); // отключаем проверку прав Битрикс
define('NO_LANG_FILES', false);
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php');
// теперь доступны все классы Битрикс
// Вся логика через D7
$request = \Bitrix\Main\Application::getInstance()->getContext()->getRequest();
if (!$request->isPost()) {
http_response_code(405);
exit;
}
// ... обработка
Постраничная навигация D7
Для страниц со списками данных:
use Bitrix\Main\UI\PageNavigation;
$nav = new PageNavigation('page');
$nav->allowAllRecords(false)
->setPageSize(20)
->initFromUri();
$result = \MyProject\Storage\OrderLogTable::getList([
'select' => ['*'],
'order' => ['ID' => 'DESC'],
'count_total' => true,
'offset' => $nav->getOffset(),
'limit' => $nav->getLimit(),
]);
$nav->setRecordCount($result->getCount());
// Рендер постранички через $nav->getPageNavString(...)
Права доступа на кастомных страницах
Проверка прав на основе групп пользователей:
global $USER;
if (!$USER->IsAdmin() && !$USER->IsInGroup([MANAGER_GROUP_ID])) {
LocalRedirect('/access-denied/');
}
Для модульных страниц — через API прав доступа Битрикс:
if (\CModule::IncludeModule('my.module')) {
$rights = \CMyModule::GetCurrentUserPermissions();
if ($rights < MY_MODULE_PERMISSION_WRITE) {
ShowError('Недостаточно прав');
exit;
}
}
Интеграция с UI Битрикс: гриды и фильтры
Для административных страниц со списками — готовый UI: CAdminList, CAdminFilter. Это обеспечивает консистентный с ядром вид:
$adminList = new CAdminList('my_list', $by, $order);
$adminList->AddColumn(['id' => 'ID', 'content' => 'ID', 'sort' => 'ID']);
$adminList->AddColumn(['id' => 'NAME', 'content' => 'Название', 'sort' => 'NAME']);
while ($row = $result->fetch()) {
$adminRow = $adminList->AddRow($row['ID'], $row);
$adminRow->AddActions([
['text' => 'Изменить', 'href' => '/bitrix/admin/my_edit.php?ID=' . $row['ID']],
['text' => 'Удалить', 'action' => "if(confirm('Удалить?')) window.location='...';"],
]);
}
$adminList->DisplayList();
Сроки
| Задача | Срок |
|---|---|
| Простая admin-страница (форма + вывод данных) | 2–3 дня |
| Страница со списком, постраничкой, фильтром и действиями | 4–7 дней |
| Полный CRUD-интерфейс для кастомной сущности с правами и логами | 1.5–2.5 недели |
Кастомная страница на D7 — это не замена компонентной системе. Это инструмент для задач, которые не укладываются в стандартную модель: инструменты администратора, интерфейсы импорта, дашборды с агрегированными данными. Написанные правильно, они не конфликтуют с ядром при обновлениях.







