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.

