המרת Bitrix ל-D7 ORM: הורדת עלויות תמיכה

כאשר אנו פותחים פרויקט Bitrix שנכתב לפני מספר שנים, הדבר הראשון שתופס את העין הוא משתנים גלובליים ומחרוזות SQL משורשרות. לקוחות מתלוננים על ביצועים איטיים של הקטלוג, וכל בקשה לתכונה חדשה הופכת לשכתוב של חצי מהקוד. אחד הלקוחות שלנו, חנות מקוונת לחלקי חילוף לרכב
השירותים שאנו מציעים
מציג 1 מתוך 1כל 1626 השירותים
המרת Bitrix ל-D7 ORM: הורדת עלויות תמיכה
בינוני
~1-2 שבועות

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

שאלות נפוצות

העבודות האחרונות

  • image_website-b2b-advance_0.webp
    פיתוח אתר חברה B2B ADVANCE
    1454
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    פיתוח אתר לחברת FIXPER
    1018
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    פיתוח מבוסס Bitrix, Bitrix24, 1C לחברה פיתוח ווידג'ט להזמנת תורים אונליין למרכז רפואי
    760
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    פיתוח על בסיס 1C Enterprise עבור MIRSANBEL
    879
  • image_crm_dolbimby_434_0.webp
    פיתוח אתר על CRM Bitrix24 עבור DOLBIMBY
    803
  • image_crm_technotorgcomplex_453_0.webp
    פיתוח על בסיס Bitrix24 עבור חברת TECHNOTORGKOMPLEKS
    1162

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

לקוחות מתלוננים על ביצועים איטיים של הקטלוג, וכל בקשה לתכונה חדשה הופכת לשכתוב של חצי מהקוד. אחד הלקוחות שלנו, חנות מקוונת לחלקי רכב, איבד עד 15% מההזמנות בגלל שגיאות בחישוב משלוח שנגרמו מ-API מיושן. אחרי הרפקטורינג ל-D7, צמצמנו את הזמן להוספת שיטות משלוח חדשות מ-3 ימים ל-4 שעות, ועלויות התמיכה ירדו ב-40%. בפרויקט עם 50,000 שורות קוד על ה-API הישן, כל תכונה חדשה עלתה פי שלושה יותר בגלל הצורך לעקוף תלויות גלובליות. הרפקטורינג שלנו אינו "שכתוב לשם שכתוב" — הוא נועד להוריד את עלויות התמיכה ולחסל את מחלקת השגיאות האופיינית לקוד פרוצדורלי. החיסכון בתמיכה משמעותי, עם החזר השקעה מתחת ל-12 חודשים. צרו קשר להערכה חינמית של הפרויקט שלכם.

מה בדיוק משתנה במעבר ל-D7

פונקציות גלובליות → מתודות DataManager:

// Было — старый API $res = CIBlockElement::GetList( ['SORT' => 'ASC'], ['IBLOCK_ID' => 5, 'ACTIVE' => 'Y'], false, ['nPageSize' => 20], ['ID', 'NAME', 'PROPERTY_PRICE'] ); while ($arItem = $res->GetNextElement()) { $arFields = $arItem->GetFields(); $arProps = $arItem->GetProperties(); } // Стало — D7 ORM $result = \Bitrix\Iblock\Elements\ElementProductsTable::getList([ 'select' => ['ID', 'NAME', 'PROPERTY_PRICE_VALUE'], 'filter' => ['=IBLOCK_ID' => 5, '=ACTIVE' => 'Y'], 'order' => ['SORT' => 'ASC'], 'limit' => 20, ]); foreach ($result->fetchCollection() as $element) { $name = $element->getName(); $price = $element->get('PROPERTY_PRICE_VALUE'); } 

מחרוזות SQL → Connection API:

// Было — прямой SQL с конкатенацией global $DB; $id = intval($id); // вся «защита» $res = $DB->Query("SELECT * FROM b_custom_table WHERE ID = " . $id); // Стало — параметризованные запросы $connection = \Bitrix\Main\Application::getConnection(); $result = $connection->query( "SELECT * FROM my_custom_table WHERE ID = ?", [$id] ); // или через SqlHelper для сложных случаев $helper = $connection->getSqlHelper(); $safeId = $helper->forSql((string)$id); 

// Было — старый API $res = CIBlockElement::GetList( ['SORT' => 'ASC'], ['IBLOCK_ID' => 5, 'ACTIVE' => 'Y'], false, ['nPageSize' => 20], ['ID', 'NAME', 'PROPERTY_PRICE'] ); while ($arItem = $res->GetNextElement()) { $arFields = $arItem->GetFields(); $arProps = $arItem->GetProperties(); } // Стало — D7 ORM $result = \Bitrix\Iblock\Elements\ElementProductsTable::getList([ 'select' => ['ID', 'NAME', 'PROPERTY_PRICE_VALUE'], 'filter' => ['=IBLOCK_ID' => 5, '=ACTIVE' => 'Y'], 'order' => ['SORT' => 'ASC'], 'limit' => 20, ]); foreach ($result->fetchCollection() as $element) { $name = $element->getName(); $price = $element->get('PROPERTY_PRICE_VALUE'); } גלובלי → Context ו-Application:

// Было global $APPLICATION; $APPLICATION->SetTitle('Моя страница'); $APPLICATION->IncludeFile('/local/include/header.php'); // Стало — в контексте компонента или контроллера $this->arResult['PAGE_TITLE'] = 'Моя страница'; // Подключение через D7-механизмы или Inertia/React-подход 

למה ה-API הישן מעכב פיתוח?

אבטחה: שרשור מחרוזות SQL הוא דרך ישירה ל-SQL injection. ביצועים: // Было — прямой SQL с конкатенацией global $DB; $id = intval($id); // вся «защита» $res = $DB->Query("SELECT * FROM b_custom_table WHERE ID = " . $id); // Стало — параметризованные запросы $connection = \Bitrix\Main\Application::getConnection(); $result = $connection->query( "SELECT * FROM my_custom_table WHERE ID = ?", [$id] ); // или через SqlHelper для сложных случаев $helper = $connection->getSqlHelper(); $safeId = $helper->forSql((string)$id); ללא מגבלות שופך את כל הטבלה. יכולת בדיקה: תלויות גלובליות מונעות בידוד של לוגיקה עסקית. קראו עוד על שאילתות פרמטריות ב-ויקיפדיה.

איך לבצע רפקטורינג שלב אחר שלב?

שכתוב כל הפרויקט בבת אחת הוא רעיון רע. אפילו חנות מקוונת קטנה מכילה 50,000+ שורות קוד. הגישה הנכונה היא רפקטורינג שכבות עם מיון עדיפויות.

תוכנית רפקטורינג שלב אחר שלב
  1. ביקורת. מלאי של אזורים בעייתיים:
    • שאילתות SQL עם שרשור מחרוזות (פוטנציאל ל-SQL injections)
    • משתנים גלובליים בלוגיקה ($APPLICATION, // Было global $APPLICATION; $APPLICATION->SetTitle('Моя страница'); $APPLICATION->IncludeFile('/local/include/header.php'); // Стало — в контексте компонента или контроллера $this->arResult['PAGE_TITLE'] = 'Моя страница'; // Подключение через D7-механизмы или Inertia/React-подход , CIBlockElement::GetList())
    • שאילתות כבדות דרך global $DB ללא מגבלות
    • קוד כפול לאותה לוגיקה בקבצים שונים
  2. יצירת שכבת שירות. מחלקות שירות חדשות על D7 API לכל תחום אחריות. קוד ישן קורא לשירותים חדשים.
  3. החלפה הדרגתית. לפי מודולים ובלוקים פונקציונליים. כל בלוק שהוחלף — בדיקות רגרסיה.
  4. הסרת קוד מיושן. רק אחרי שהנתיב החדש הוכח בייצור.

מה כלול ברפקטורינג ל-D7?

ביקורת מלאה של בסיס הקוד לזיהוי אזורים קריטיים, יצירת שכבת שירות ומעבר ל-D7 ORM, החלפת שאילתות SQL בפרמטריות דרך global $USER, הגדרת מטמון מתויג ו-agents, בדיקות רגרסיה לכל החלפה, תיעוד הארכיטקטורה החדשה, והכשרת הצוות שלכם על D7. אחריות על העבודה המבוצעת קבועה בחוזה.

בלוקי מידע: מעבר למחלקות D7

מגרסת ביטריקס הנוכחית, מחלקות שנוצרות אוטומטית לבלוקי מידע זמינות דרך global $APPLICATION:

// Включение в настройках инфоблока — флаг "API-код" // Генерируется класс с namespace Bitrix\Iblock\Elements $result = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([ 'select' => ['ID', 'NAME', 'IBLOCK_SECTION_ID'], 'filter' => ['=ACTIVE' => 'Y'], ]); 

זו אינה תחליף מלא ל-CIBlockElement::GetList — לכתיבה (הוספה/עדכון), ה-API הישן עדיין בשימוש לעתים קרובות מכיוון ש-wrapperים של D7 לכתיבת בלוקי מידע אינם מכסים את כל התרחישים.

מלכודות טיפוסיות במהלך רפקטורינג

אובדן אירועים. אם קוד ישן קרא ל-Connection::query, מטפלי אירועים (Bitrix\Iblock\Elements) היו מחוברים. במעבר למתודות D7, אירועי ORM שונים. נדרשת בדיקה אילו מטפלים קשורים לאירועים ישנים.

הבדל בתוצאות GetList לעומת getList. // Включение в настройках инфоблока — флаг "API-код" // Генерируется класс с namespace Bitrix\Iblock\Elements $result = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([ 'select' => ['ID', 'NAME', 'IBLOCK_SECTION_ID'], 'filter' => ['=ACTIVE' => 'Y'], ]); מחזיר מאפייני בלוק מידע בפורמט ספציפי עם סיומות CIBlockElement, CIBlockElement::Update(). מתודות ORM מחזירות מבנה שונה. יש להתאים קוד שמעבד את התוצאה.

טרנזקציות. ה-API הישן לא תמיד עטף פעולות בטרנזקציות. D7 מספק טרנזקציות מפורשות:

$connection = \Bitrix\Main\Application::getConnection(); $connection->startTransaction(); try { // несколько операций $connection->commitTransaction(); } catch (\Throwable $e) { $connection->rollbackTransaction(); throw $e; } 

איך אנחנו מבטיחים איכות?

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

מה לרפקטור ראשון

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

לוחות זמנים

היקף פרויקט לוח זמנים לרפקטורינג
אתר קטן (עד 30 קבצי לוגיקה) 2–4 שבועות
חנות מקוונת בינונית (50–150 קבצים) 2–3 חודשים
פורטל גדול או מרקטפלייס 4–8 חודשים (בשלבים)

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