We often encounter scenarios where the standard admin section of 1C-Bitrix doesn't cover specific business processes. Manual stock synchronization from an external system, bulk price updates via formula, integration settings management — these require custom admin pages. Developing directly in /bitrix/admin/ is not advisable — platform updates will overwrite changes. The correct path is /local/. Over 5+ years, we have developed more than 50 custom admin interfaces for Bitrix, from simple forms to multi-page analytics dashboards. This article covers the technical details of creating such pages. Custom admin pages allow implementing any functionality not available in the standard package.
| Approach | Advantages | Disadvantages | When to use |
|---|---|---|---|
/local/admin/ |
Simple, quick start | Limited interface | Simple pages with one table |
/local/components/ |
Flexibility, reuse, caching | More complex, requires component model knowledge | Complex interfaces with AJAX, access rights |
How to Place and Structure Custom Admin Pages?
Placement in /local/admin/ — Developing Custom Admin Pages
Place custom page files in /local/admin/. Bitrix automatically includes this path when searching for admin pages. The page becomes accessible at /bitrix/admin/my_page.php if the file is at /local/admin/my_page.php. Alternatively, create the page as a component in /local/components/ and include it via a wrapper. This is the preferred approach for complex interfaces.
Structure of a Minimal Admin Page
<?php
// /local/admin/my_custom_page.php
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_admin_before.php');
// Check permissions
$APPLICATION->SetTitle('My Page');
if (!$USER->IsAdmin() && !$USER->CanDoOperation('edit_php')) {
$APPLICATION->AuthForm('Access denied');
}
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_admin_after.php');
// Page content
?>
<div class="adm-content-wrap">
<!-- Interface HTML -->
</div>
<?php
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/epilog_admin.php');
Three required includes form the correct wrapper: header, navigation, and footer of the admin section. Without them, the page will open without styling.
Using Bitrix Admin Helpers
Bitrix provides a set of classes for building standard admin UI elements. Using these classes gives a native look and saves layout effort. Consider CAdminList and CAdminForm.
use Bitrix\Main\UI\Filter\Options as FilterOptions;
// CAdminList — table with sorting, pagination, and filter
$oList = new CAdminList('my_list_id');
$lAdmin->AddHeaders([
['id' => 'ID', 'content' => 'ID', 'sort' => 'ID'],
['id' => 'NAME', 'content' => 'Name', 'sort' => 'NAME'],
['id' => 'DATE', 'content' => 'Date'],
]);
while ($row = $rsData->Fetch()) {
$oRow = &$oList->AddRow('ID_' . $row['ID'], $row);
$oRow->AddActions([
['TEXT' => 'Edit', 'ONCLICK' => "jsUtils.Redirect([], 'my_edit.php?ID=" . $row['ID'] . "')],
['TEXT' => 'Delete', 'ACTION' => $oList->ActionDoGroup($row['ID'], 'delete')],
]);
}
$oList->DisplayList();
// CAdminForm — edit form with tabs
$oTabControl = new CAdminTabControl('tabControl', [
['DIV' => 'tab1', 'TAB' => 'Main', 'ICON' => 'main_user_edit'],
['DIV' => 'tab2', 'TAB' => 'Additional'],
]);
$oTabControl->Begin();
$oTabControl->BeginNextTab();
// first tab fields
$oTabControl->BeginNextTab();
// second tab fields
$oTabControl->Buttons(['btnSave' => true, 'btnApply' => true, 'btnCancel' => true]);
$oTabControl->End();
How to Add a Page to the Menu and Set Up Permissions?
Adding to Menu
The page must be accessible from the menu, not just via direct URL. Register via event handler in /local/php_interface/init.php:
AddEventHandler('main', 'OnBuildGlobalMenu', function(&$globalMenu, &$moduleMenu) {
$moduleMenu[] = [
'parent_menu' => 'global_menu_services',
'sort' => 500,
'text' => 'Synchronization',
'title' => 'Manage synchronization with external system',
'url' => 'my_custom_page.php',
'icon' => 'main_menu_tasks',
'page_icon' => 'main_page_icon',
'more_url' => ['my_custom_page.php', 'my_custom_edit.php'],
];
});
The more_url parameter is needed to keep the menu item active when navigating to related pages.
Access Rights
Custom pages must check permissions themselves. Options:
- Check
$USER->IsAdmin()— only for pages accessible exclusively to admins - Check
$USER->CanDoOperation('operation_name')— for granular control - Check module right:
CModule::IncludeModule('main') && $USER->GetRights('mymodule') >= 'W'
According to official 1C-Bitrix documentation, if a page should be accessible to a specific group, it's better to create a custom module with rights registration via RegisterModuleDependences.
Working with Data: D7 ORM vs Old API
For custom pages, we recommend using D7 ORM (\Bitrix\Main\ORM). If data is stored in custom tables, create an entity class:
namespace Local\MyModule;
use Bitrix\Main\ORM\Data\DataManager;
use Bitrix\Main\ORM\Fields;
class MyEntityTable extends DataManager
{
public static function getTableName(): string
{
return 'my_custom_table';
}
public static function getMap(): array
{
return [
new Fields\IntegerField('ID', ['primary' => true, 'autocomplete' => true]),
new Fields\StringField('NAME', ['required' => true]),
new Fields\DatetimeField('CREATED_AT'),
];
}
}
Then MyEntityTable::getList(), ::add(), ::update(), ::delete() work via the standard ORM.
How to Handle Forms and AJAX?
Bitrix admin pages traditionally use POST forms with CSRF token (bitrix_sessid_post()). For AJAX requests:
// Check session token
if (!check_bitrix_sessid()) {
die(json_encode(['error' => 'Invalid session']));
}
// In JS (using BX.ajax)
BX.ajax.runAction('local:my.action', {
data: { param: value },
sessid: BX.bitrix_sessid()
});
For modern AJAX interfaces, use \Bitrix\Main\Engine\Controller with routing via /.action.php — this is the D7 approach recommended for new developments.
Timeline and Scope
| Task Type | Timeline |
|---|---|
| Simple CRUD page | 1–2 days |
| Multi-page section with filters and AJAX | 3–5 days |
| Full-featured module with rights and events | 1–2 weeks |
The work includes:
- Audit of current architecture and TOR approval
- Prototype development in
/local/admin/or/local/components/ - Logic implementation using D7 ORM
- Menu integration and access rights configuration
- Testing on staging and refinements
- Source code and documentation handover
- 30-day warranty support
Step-by-step guide to creating a custom page
- Define requirements: what data, what interface, whether permissions are needed.
- Create file in
/local/admin/or register a component. - Include prolog and epilog for correct wrapper.
- Implement logic using CAdminList/CAdminForm or D7 ORM.
- Add menu item via OnBuildGlobalMenu.
- Configure access rights check.
- Test on staging and hand over to client.
Typical Tasks for Custom Pages
- Synchronization control panel with 1C or external APIs (manual trigger, operation log)
- Bulk product editing by non-standard criteria
- Analytics dashboard based on data from multiple modules
- Integration settings management (API keys, webhooks, field mapping)
- Content migration tools between environments
Why Choose Us?
Our team has 5+ years of Bitrix development experience and has completed over 50 projects customizing the admin panel. We guarantee compatibility with the latest platform versions, provide full documentation, and offer post-delivery support. Contact us for a consultation or order turnkey development — we will assess your project within one day. Save time on manual data processing and get transparent project cost — that's what you receive.







