לעתים קרובות אנו נתקלים בתרחישים שבהם קטע הניהול הסטנדרטי של 1C-Bitrix אינו מכסה תהליכים עסקיים ספציפיים. סנכרון מלאי ידני ממערכת חיצונית, עדכוני מחירים בכמות גדולה באמצעות נוסחה, ניהול הגדרות אינטגרציה — כל אלה דורשים דפי ניהול מותאמים אישית. פיתוח ישירות ב-/bitrix/admin/ אינו מומלץ — עדכוני הפלטפורמה ידרסו את השינויים. הדרך הנכונה היא /local/. במשך יותר מ-5 שנים פיתחנו יותר מ-50 ממשקי ניהול מותאמים אישית עבור Bitrix, מטפסים פשוטים ועד לוחות מחוונים אנליטיים מרובי עמודים. מאמר זה מכסה את הפרטים הטכניים של יצירת דפים כאלה. דפי ניהול מותאמים אישית מאפשרים ליישם כל פונקציונליות שאינה זמינה בחבילה הסטנדרטית.
| גישה | יתרונות | חסרונות | מתי להשתמש |
|---|---|---|---|
/local/admin/ |
פשוטה, התחלה מהירה | ממשק מוגבל | דפים פשוטים עם טבלה אחת |
/local/components/ |
גמישות, שימוש חוזר, מטמון | מורכב יותר, דורש ידע במודל רכיבים | ממשקים מורכבים עם AJAX, זכויות גישה |
כיצד למקם ולבנות דפי ניהול מותאמים אישית?
מיקום ב-/local/admin/ — פיתוח דפי ניהול מותאמים אישית
מקמו קבצי דפים מותאמים אישית ב-/local/admin/. Bitrix כולל אוטומטית נתיב זה בעת חיפוש דפי ניהול. הדף הופך לנגיש ב-/bitrix/admin/my_page.php אם הקובץ נמצא ב-/local/admin/my_page.php. לחלופין, צרו את הדף כרכיב ב-/local/components/ וכללו אותו באמצעות wrapper. זוהי הגישה המועדפת לממשקים מורכבים.
מבנה של דף ניהול מינימלי
<?php // /local/admin/my_custom_page.php
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_admin_before.php');
// Проверка прав
$APPLICATION->SetTitle('Моя страница');
if (!$USER->IsAdmin() && !$USER->CanDoOperation('edit_php')) {
$APPLICATION->AuthForm('Нет доступа');
}
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_admin_after.php');
// Контент страницы
?>
<div class="adm-content-wrap">
<!-- HTML интерфейса -->
</div>
<?php
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/epilog_admin.php');
שלושה includes נדרשים יוצרים את ה-wrapper הנכון: כותרת, ניווט וכותרת תחתונה של קטע הניהול. בלעדיהם, הדף ייפתח ללא עיצוב.
שימוש ב-Bitrix Admin Helpers
Bitrix מספקת קבוצת מחלקות לבניית אלמנטים סטנדרטיים של ממשק ניהול. שימוש במחלקות אלה מעניק מראה טבעי וחוסך מאמץ עיצוב. שקלו את CAdminList ו-CAdminForm.
use Bitrix\Main\UI\Filter\Options as FilterOptions; // CAdminList — таблица с сортировкой, пагинацией и фильтром
$oList = new CAdminList('my_list_id');
$lAdmin->AddHeaders([
['id' => 'ID', 'content' => 'ID', 'sort' => 'ID'],
['id' => 'NAME', 'content' => 'Название', 'sort' => 'NAME'],
['id' => 'DATE', 'content' => 'Дата'],
]);
while ($row = $rsData->Fetch()) {
$oRow = &$oList->AddRow('ID_' . $row['ID'], $row);
$oRow->AddActions([
['TEXT' => 'Изменить', 'ONCLICK' => "jsUtils.Redirect([], 'my_edit.php?ID=" . $row['ID'] . "')],
['TEXT' => 'Удалить', 'ACTION' => $oList->ActionDoGroup($row['ID'], 'delete')],
]);
}
$oList->DisplayList();
// CAdminForm — форма редактирования с вкладками
$oTabControl = new CAdminTabControl('tabControl', [
['DIV' => 'tab1', 'TAB' => 'Основное', 'ICON' => 'main_user_edit'],
['DIV' => 'tab2', 'TAB' => 'Дополнительно'],
]);
$oTabControl->Begin();
$oTabControl->BeginNextTab();
// поля первой вкладки
$oTabControl->BeginNextTab();
// поля второй вкладки
$oTabControl->Buttons(['btnSave' => true, 'btnApply' => true, 'btnCancel' => true]);
$oTabControl->End(); כיצד להוסיף דף לתפריט ולהגדיר הרשאות?
הוספה לתפריט
הדף חייב להיות נגיש מהתפריט, לא רק דרך כתובת URL ישירה. רשמו אותו באמצעות event handler ב-<?php // /local/admin/my_custom_page.php require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_admin_before.php'); // Проверка прав $APPLICATION->SetTitle('Моя страница'); if (!$USER->IsAdmin() && !$USER->CanDoOperation('edit_php')) { $APPLICATION->AuthForm('Нет доступа'); } require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_admin_after.php'); // Контент страницы ?> <div class="adm-content-wrap"> <!-- HTML интерфейса --> </div> <?php require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/epilog_admin.php'); :
AddEventHandler('main', 'OnBuildGlobalMenu', function(&$globalMenu, &$moduleMenu) {
$moduleMenu[] = [
'parent_menu' => 'global_menu_services',
'sort' => 500,
'text' => 'Синхронизация',
'title' => 'Управление синхронизацией с внешней системой',
'url' => 'my_custom_page.php',
'icon' => 'main_menu_tasks',
'page_icon' => 'main_page_icon',
'more_url' => ['my_custom_page.php', 'my_custom_edit.php'],
];
});הפרמטר use Bitrix\Main\UI\Filter\Options as FilterOptions; // CAdminList — таблица с сортировкой, пагинацией и фильтром $oList = new CAdminList('my_list_id'); $lAdmin->AddHeaders([ ['id' => 'ID', 'content' => 'ID', 'sort' => 'ID'], ['id' => 'NAME', 'content' => 'Название', 'sort' => 'NAME'], ['id' => 'DATE', 'content' => 'Дата'], ]); while ($row = $rsData->Fetch()) { $oRow = &$oList->AddRow('ID_' . $row['ID'], $row); $oRow->AddActions([ ['TEXT' => 'Изменить', 'ONCLICK' => "jsUtils.Redirect([], 'my_edit.php?ID=" . $row['ID'] . "')], ['TEXT' => 'Удалить', 'ACTION' => $oList->ActionDoGroup($row['ID'], 'delete')], ]); } $oList->DisplayList(); // CAdminForm — форма редактирования с вкладками $oTabControl = new CAdminTabControl('tabControl', [ ['DIV' => 'tab1', 'TAB' => 'Основное', 'ICON' => 'main_user_edit'], ['DIV' => 'tab2', 'TAB' => 'Дополнительно'], ]); $oTabControl->Begin(); $oTabControl->BeginNextTab(); // поля первой вкладки $oTabControl->BeginNextTab(); // поля второй вкладки $oTabControl->Buttons(['btnSave' => true, 'btnApply' => true, 'btnCancel' => true]); $oTabControl->End(); נדרש כדי לשמור על פריט התפריט פעיל בעת ניווט לדפים קשורים.
זכויות גישה
דפים מותאמים אישית חייבים לבדוק הרשאות בעצמם. אפשרויות:
- בדיקת
/local/php_interface/init.php— רק לדפים הנגישים אך ורק למנהלים - בדיקת
AddEventHandler('main', 'OnBuildGlobalMenu', function(&$globalMenu, &$moduleMenu) { $moduleMenu[] = [ 'parent_menu' => 'global_menu_services', 'sort' => 500, 'text' => 'Синхронизация', 'title' => 'Управление синхронизацией с внешней системой', 'url' => 'my_custom_page.php', 'icon' => 'main_menu_tasks', 'page_icon' => 'main_page_icon', 'more_url' => ['my_custom_page.php', 'my_custom_edit.php'], ]; });— לשליטה מפורטת - בדיקת זכות מודול:
more_url
לפי תיעוד 1C-Bitrix הרשמי, אם דף צריך להיות נגיש לקבוצה ספציפית, עדיף ליצור מודול מותאם אישית עם רישום זכויות באמצעות $USER->IsAdmin().
עבודה עם נתונים: D7 ORM לעומת API ישן
לדפים מותאמים אישית, אנו ממליצים להשתמש ב-D7 ORM ($USER->CanDoOperation('название_операции')). אם הנתונים מאוחסנים בטבלאות מותאמות אישית, צרו מחלקת ישות:
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'),
];
}
}לאחר מכן CModule::IncludeModule('main') && $USER->GetRights('mymodule') >= 'W', RegisterModuleDependences, \Bitrix\Main\ORM, 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'), ]; } } פועלים דרך ה-ORM הסטנדרטי.
כיצד לטפל בטפסים ו-AJAX?
דפי ניהול של Bitrix משתמשים באופן מסורתי בטפסי POST עם אסימון CSRF (MyEntityTable::getList()). עבור בקשות AJAX:
// Проверка сессионного токена
if (!check_bitrix_sessid()) {
die(json_encode(['error' => 'Invalid session']));
}
// В JS (при использовании BX.ajax)
BX.ajax.runAction('local:my.action', {
data: {
param: value
},
sessid: BX.bitrix_sessid()
});לממשקי AJAX מודרניים, השתמשו ב-::add() עם ניתוב דרך ::update() — זוהי גישת D7 המומלצת לפיתוחים חדשים.
ציר זמן והיקף
| סוג משימה | ציר זמן |
|---|---|
| דף CRUD פשוט | 1–2 ימים |
| קטע מרובה עמודים עם מסננים ו-AJAX | 3–5 ימים |
| מודול מלא עם זכויות ואירועים | 1–2 שבועות |
העבודה כוללת:
- ביקורת על הארכיטקטורה הנוכחית ואישור TOR
- פיתוח אב טיפוס ב-
::delete()אוbitrix_sessid_post() - יישום לוגיקה באמצעות D7 ORM
- שילוב תפריט והגדרת זכויות גישה
- בדיקות על staging ושיפורים
- מסירת קוד מקור ותיעוד
- תמיכה באחריות ל-30 יום
מדריך שלב אחר שלב ליצירת דף מותאם אישית
- הגדירו דרישות: אילו נתונים, איזה ממשק, האם נדרשות הרשאות.
- צרו קובץ ב-
// Проверка сессионного токена if (!check_bitrix_sessid()) { die(json_encode(['error' => 'Invalid session'])); } // В JS (при использовании BX.ajax) BX.ajax.runAction('local:my.action', { data: { param: value }, sessid: BX.bitrix_sessid() });או רשמו רכיב. - כללו prolog ו-epilog ל-wrapper נכון.
- יישמו לוגיקה באמצעות CAdminList/CAdminForm או D7 ORM.
- הוסיפו פריט תפריט דרך OnBuildGlobalMenu.
- הגדירו בדיקת זכויות גישה.
- בדקו על staging ומסרו ללקוח.
משימות אופייניות לדפים מותאמים אישית
- לוח בקרת סנכרון עם 1C או APIs חיצוניים (הפעלה ידנית, יומן פעולות)
- עריכת מוצרים בכמות גדולה לפי קריטריונים לא סטנדרטיים
- לוח מחוונים אנליטי המבוסס על נתונים ממספר מודולים
- ניהול הגדרות אינטגרציה (מפתחות API, webhooks, מיפוי שדות)
- כלי העברת תוכן בין סביבות
למה לבחור בנו?
לצוות שלנו יש יותר מ-5 שנות ניסיון בפיתוח Bitrix והשלים למעלה מ-50 פרויקטים של התאמת פאנל הניהול. אנו מבטיחים תאימות לגרסאות הפלטפורמה העדכניות ביותר, מספקים תיעוד מלא ומציעים תמיכה לאחר המסירה. צרו קשר לייעוץ או הזמינו פיתוח turnkey — נבחן את הפרויקט שלכם תוך יום אחד. חסכו זמן בעיבוד נתונים ידני וקבלו עלות פרויקט שקופה — זה מה שתקבלו.

