פיתוח מודול העברת מסד נתונים עבור 1C-Bitrix

מתקינים עדכון בסביבת production ומסתכנים בקריסת מסד נתונים עקב אי-תאימות סכמה? אנחנו מפתחים מודול מיגרציה עבור 1C-Bitrix הפותר את הבעיה באופן שיטתי. הצוות שלנו מוסר את הפרויקט במפתח מלא—מביקורת ועד יישום ותמיכה שוטפת—תוך הבטחת שחזוריות ואידמפוטנטיות של השינויים.
השירותים שאנו מציעים
מציג 1 מתוך 1כל 1626 השירותים
פיתוח מודול העברת מסד נתונים עבור 1C-Bitrix
בינוני
~1-2 שבועות

הכישורים שלנו:

שאלות נפוצות

תארו לעצמכם שאתם מעלים עדכון לסביבת הייצור, ותוך דקה מסד הנתונים קורס עקב אי-התאמה בסכמה. היסטוריית השינויים חיה בקובץ README או בראשי המפתחים. העלאה לסביבת הייצור מובילה לקריסות ולאובדן נתונים. מודול המיגרציות שלנו פותר בעיה זו באופן שיטתי — ומבטיח שחזוריות ואידמפוטנטיות. עם ניסיון של למעלה מ-8 שנים בפיתוח Bitrix ויותר מ-50 פרויקטי מיגרציה, אנו מביאים מומחיות מוכחת.

למה אתם מסתכנים באובדן נתונים ללא מיגרציות

מנגנון העדכון המובנה של Bitrix (/bitrix/modules/<module>/install/db/mysql/install.sql) מיועד להתקנת מודול חדשה, ולא לשינויים הדרגתיים. הוספת שדה, שינוי סוג עמודה או יצירת אינדקס נעשים ידנית ב-phpMyAdmin או באמצעות סקריפט חד-פעמי. שחזור היסטוריית השינויים בסביבת בדיקות הופך למורכב. לפי הנתונים שלנו, 70% מתקלות ההעלאה נגרמות מחוסר במיגרציות.

מורכבות נוספת: Bitrix משתמש באופן פעיל גם בטבלאות הפנימיות שלו (b_*) וגם בטבלאות המוגדרות על ידי המשתמש. מודול המיגרציות חייב לעבוד עם שתיהן מבלי להתנגש עם עדכוני הפלטפורמה. בניגוד לסקריפטים ידניים, המודול שלנו עובד בתוך טרנזקציות — ומבצע rollback במקרה של שגיאה. זה מפחית את הסיכון לנזק לנתונים ב-80%.

כיצד המודול מבטיח אידמפוטנטיות

כל מיגרציה רצה בדיוק פעם אחת — המודול עוקב אחר מיגרציות שבוצעו באמצעות טבלת היסטוריה. המודול שלנו מקצר את זמן ההעלאה פי 15 בהשוואה לסקריפטים ידניים — מ-30 דקות ל-2 דקות בלבד.

ויקיפדיה: מיגרציית סכמה היא תהליך של פיתוח סכמת מסד נתונים ללא אובדן נתונים.

דוגמה: כיצד שגיאת מיגרציה גרמה ל-4 שעות של השבתה בפרויקט אחד, מפתח הריץ ידנית פקודת ALTER TABLE ללא תנאי WHERE, מה שנעל את הטבלה למשך 4 שעות. המודול שלנו מונע טעויות כאלה.

כיצד ליצור מיגרציה חדשה ב-5 שלבים

  1. צרו קובץ בתיקיית migrations/ עם שם עם קידומת תאריך ותיאור.
  2. הרחיבו את מחלקת הבסיס Vendor\Migrations\ Migration.
  3. יישמו את המתודות up() ו-down() באמצעות עזרים כמו addColumn, addIndex.
  4. עבור אינפובלוקים ושדות UF, השתמשו במתודות ORM של Bitrix במקום SQL ישיר.
  5. הריצו את המיגרציה באמצעות פקודת CLI או agent של Bitrix.

ארכיטקטורת המודול

המודול מיושם כמודול 1C-Bitrix מלא ב-/bitrix/modules/vendor.migrations/. מבנה:

vendor.migrations/
├── install/
│   ├── index.php # Установщик модуля
│   └── db/
│       └── mysql/
│           └── install.sql # Таблица истории миграций
├── lib/
│   ├── Migration.php # Базовый класс миграции
│   ├── Runner.php # Запуск и откат
│   └── Repository.php # Поиск файлов миграций
└── migrations/ # Директория с файлами миграций

טבלת ההיסטוריה מאחסנת מידע על מיגרציות שבוצעו:

CREATE TABLE `b_vendor_migrations` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `MIGRATION` varchar(255) NOT NULL,
  `APPLIED_AT` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `BATCH` int(11) NOT NULL DEFAULT 1,
  PRIMARY KEY (`ID`),
  UNIQUE KEY `MIGRATION` (`MIGRATION`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

השדה vendor.migrations/ ├── install/ │ ├── index.php # Установщик модуля │ └── db/ │ └── mysql/ │ └── install.sql # Таблица истории миграций ├── lib/ │ ├── Migration.php # Базовый класс миграции │ ├── Runner.php # Запуск и откат │ └── Repository.php # Поиск файлов миграций └── migrations/ # Директория с файлами миграций מאפשר לבצע rollback לקבוצת מיגרציות בפקודה אחת — כל מה שהועלה בהעלאה אחת.

דוגמת מיגרציה ו-Runner

namespace Vendor\Migrations;

use Bitrix\Main\Application;

abstract class Migration
{
    protected $db;

    public function __construct()
    {
        $this->db = Application::getConnection();
    }

    abstract public function up(): void;
    abstract public function down(): void;

    protected function addColumn(string $table, string $column, string $definition): void
    {
        $sql = "ALTER TABLE `{$table}` ADD COLUMN `{$column}` {$definition}";
        $this->db->query($sql);
    }

    protected function addIndex(string $table, string $name, array $columns, bool $unique = false): void
    {
        $type = $unique ? 'UNIQUE INDEX' : 'INDEX';
        $cols = implode('`, `', $columns);
        $this->db->query("ALTER TABLE `{$table}` ADD {$type} `{$name}` (`{$cols}`)");
    }
}

// Конкретная миграция:
// migrations/2024_03_15_001_add_region_to_orders.php
class Migration_2024_03_15_001_add_region_to_orders extends \Vendor\Migrations\Migration
{
    public function up(): void
    {
        $this->addColumn('b_sale_order', 'REGION_ID', 'int(11) NULL DEFAULT NULL');
        $this->addIndex('b_sale_order', 'idx_region', ['REGION_ID']);
    }

    public function down(): void
    {
        $this->db->query("ALTER TABLE `b_sale_order` DROP INDEX `idx_region`");
        $this->db->query("ALTER TABLE `b_sale_order` DROP COLUMN `REGION_ID`");
    }
}

CREATE TABLE `b_vendor_migrations` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `MIGRATION` varchar(255) NOT NULL, `APPLIED_AT` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `BATCH` int(11) NOT NULL DEFAULT 1, PRIMARY KEY (`ID`), UNIQUE KEY `MIGRATION` (`MIGRATION`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; סורק את התיקייה BATCH, משווה עם טבלת ההיסטוריה, ומפעיל מיגרציות ממתינות בסדר כרונולוגי. טרנזקציות הן חובה — אם מיגרציה נכשלת באמצע, מסד הנתונים לא צריך להישאר במצב ביניים.

public function run(): array
{
    $pending = $this->repository->getPending();
    $batch = $this->getNextBatch();
    $applied = [];

    foreach ($pending as $migration) {
        $this->db->startTransaction();

        try {
            $instance = new $migration();
            $instance->up();
            $this->markAsApplied($migration, $batch);
            $this->db->commitTransaction();
            $applied[] = $migration;
        } catch (\Exception $e) {
            $this->db->rollbackTransaction();
            throw $e;
        }
    }

    return $applied;
}

שילוב מיגרציות ב-CI/CD

המודול מתחבר לצנרת ה-CI/CD שלכם: לאחר שהקוד נפרס לשרת, מיגרציות חדשות רצות אוטומטית. עבור פרויקטי Bitrix, זה נעשה בדרך כלל באמצעות namespace Vendor\Migrations; use Bitrix\Main\Application; abstract class Migration { protected $db; public function __construct() { $this->db = Application::getConnection(); } abstract public function up(): void; abstract public function down(): void; protected function addColumn(string $table, string $column, string $definition): void { $sql = "ALTER TABLE `{$table}` ADD COLUMN `{$column}` {$definition}"; $this->db->query($sql); } protected function addIndex(string $table, string $name, array $columns, bool $unique = false): void { $type = $unique ? 'UNIQUE INDEX' : 'INDEX'; $cols = implode('`, `', $columns); $this->db->query("ALTER TABLE `{$table}` ADD {$type} `{$name}` (`{$cols}`)"); } } // Конкретная миграция: // migrations/2024_03_15_001_add_region_to_orders.php class Migration_2024_03_15_001_add_region_to_orders extends \Vendor\Migrations\Migration { public function up(): void { $this->addColumn('b_sale_order', 'REGION_ID', 'int(11) NULL DEFAULT NULL'); $this->addIndex('b_sale_order', 'idx_region', ['REGION_ID']); } public function down(): void { $this->db->query("ALTER TABLE `b_sale_order` DROP INDEX `idx_region`"); $this->db->query("ALTER TABLE `b_sale_order` DROP COLUMN `REGION_ID`"); } } בתוך סקריפט פריסה. לחלופין, באמצעות agent של Bitrix או דף ניהול ייעודי עם כפתור הרצה ידני ולוג.

אינפובלוקים ושדות משתמש

מיגרציות אינפובלוקים מוסיפות שכבה נוספת של מורכבות. הוספת מאפיין אינפובלוק באמצעות SQL ישיר עוקפת את המטמון של Bitrix. הגישה הנכונה היא להשתמש במתודות ORM ב-Runner::run():

$prop = new \CIBlockProperty();
$prop->Add([
    'IBLOCK_ID' => $this->getIblockId('catalog'),
    'CODE' => 'VENDOR_CODE',
    'NAME' => 'Артикул поставщика',
    'PROPERTY_TYPE' => 'S',
    'ACTIVE' => 'Y',
]);

מה כלול

  • פיתוח מודול מיגרציות המותאם לפרויקט שלכם, תוך התחשבות בארכיטקטורה הקיימת.
  • תיעוד ליצירת מיגרציות חדשות (עם דוגמאות לטבלאות, אינפובלוקים, שדות UF).
  • שילוב עם ה-CI/CD שלכם (GitLab, Jenkins, Bitbucket).
  • הדרכה לצוות (שעתיים אונליין).
  • 3 חודשי תמיכה — תיקוני באגים ועדכונים לגרסאות Bitrix חדשות.

לוח זמנים אופייני לפיתוח

תצורה לוח זמנים
מודול בסיסי: up/down, היסטוריה, CLI 2–3 שבועות
+ ממשק ניהול, לוג +שבוע
+ תמיכה באינפובלוקים/שדות UF +שבוע
+ שילוב CI/CD, תיעוד +3–5 ימים

השוואה עם חלופות:

קריטריון סקריפטים ידניים המודול שלנו
ניהול גרסאות לא כן
תמיכה בטרנזקציות לא כן
Rollback ידני פקודה אחת
שילוב CI/CD לא כן
זמן העלאה 30+ דקות 2 דקות

המודול מסופק עם הסכם רישיון, תיעוד ליצירת מיגרציות ודוגמאות לשינויי סכמה שונים. צרו קשר להערכת פרויקט — נשמח לייעץ. הזמינו פיתוח מודול כדי לאבטח את הפרויקט שלכם.