אינטגרציית Bitrix24-יאנדקס.טרקר: אנחנו מגשרים על הפער בין מפתחים למנהלים
מצב טיפוסי: מפתחים חיים ביאנדקס טרקר, בעוד מנהלים מטפלים בעסקאות מול לקוחות ב-Bitrix24. משימה נוצרת בטרקר — המנהל לא רואה את הסטטוס העדכני שלה. סטטוס משתנה ב-Bitrix24 — המפתח לומד על כך דרך גורמים שלישיים. העברה ידנית גוזלת שעות מדי יום ומובילה לשגיאות. קחו לדוגמה חברת IT טיפוסית: צוות הפיתוח משתמש ביאנדקס טרקר לניהול משימות, בעוד מחלקת המכירות עובדת ב-Bitrix24. בעת יישור משימות, נוצר נתק — סטטוסים לא מסונכרנים, והמידע מתיישן תוך שעה. האינטגרציה שלנו מבטלת את הפער הזה אוטומטית, מפחיתה את הסיכוי לשגיאות ומאיצה את השלמת המשימות. כבר יישמנו פתרונות כאלה עבור לקוחות במגוון תעשיות, כולל חברות עם מאות עובדים. אנו מציעים אינטגרציה במפתח מלא — מתכנון ועד תמיכה לאחר ההשקה. צרו קשר כדי לזהות את המקרה שלכם.
אילו בעיות האינטגרציה פותרת?
העברת משימות ידנית. עובדים מבזבזים 30–60 דקות ביום בהעתקת כותרות וסטטוסים בין מערכות. הסקריפט שלנו הופך זאת לאוטומטי לחלוטין.
אובדן עדכניות. המידע מתיישן תוך שעה — המנהל רואה "בביצוע" בעוד המשימה כבר סגורה. סנכרון בזמן אמת מבטל את העיכוב.
קונפליקט סטטוסים. ל-Bitrix24 יש מודל סטטוסים אחד, ולטרקר יש מודל אחר. נדרש מיפוי ברור, אחרת הסנכרון יגרום לבלבול.
איך אנחנו עושים את זה: טכנולוגיה וארכיטקטורה
יאנדקס טרקר API: שיטות מפתח
טרקר מספק REST API עם אימות OAuth 2.0. הטוקן של הארגון מועבר בכותרת של כל בקשה. כתובת בסיס: https://api.tracker.yandex.net/v3/. נקודות קצה עיקריות:
| שיטה | נקודת קצה | מטרה |
|---|---|---|
| POST | /issues/ |
יצירת משימה |
| PATCH | /issues/{issueKey} |
עדכון משימה |
| GET | /issues/{issueKey} |
קבלת משימה |
| POST | /issues/{issueKey}/transitions/{id}/_execute |
שינוי סטטוס |
| GET | /issues/{issueKey}/comments |
תגובות למשימה |
| POST | /issues/{issueKey}/comments |
הוספת תגובה |
עבור webhooks, משתמשים בטריגרים — המוגדרים בממשק טרקר ברמת התור.
ארכיטקטורת אינטגרציה
האינטגרציה היא דו-כיוונית, ולכן יש להימנע מלולאות. הפתרון: דגל "עדכון מאינטגרציה" (מנגנון נעילה).
טבלת מיפוי משימות:
class TrackerBitrix24TaskTable extends \Bitrix\Main\ORM\Data\DataManager { public static function getTableName(): string { return 'b_local_tracker_task_map'; } public static function getMap(): array { return [ new IntegerField('ID', ['primary' => true, 'autocomplete' => true]), new IntegerField('BITRIX_TASK_ID'), // ID задачи в Битрикс24 new StringField('TRACKER_ISSUE_KEY'), // Например, "DEV-123" new StringField('SYNC_DIRECTION'), // B24_TO_TRACKER | TRACKER_TO_B24 | BIDIRECTIONAL new DatetimeField('LAST_SYNC_AT'), new StringField('SYNC_LOCK'), // NULL или UUID текущей операции ]; } } סנכרון Bitrix24 → יאנדקס טרקר
אנו משתמשים באירוע class TrackerBitrix24TaskTable extends \Bitrix\Main\ORM\Data\DataManager { public static function getTableName(): string { return 'b_local_tracker_task_map'; } public static function getMap(): array { return [ new IntegerField('ID', ['primary' => true, 'autocomplete' => true]), new IntegerField('BITRIX_TASK_ID'), // ID задачи в Битрикс24 new StringField('TRACKER_ISSUE_KEY'), // Например, "DEV-123" new StringField('SYNC_DIRECTION'), // B24_TO_TRACKER | TRACKER_TO_B24 | BIDIRECTIONAL new DatetimeField('LAST_SYNC_AT'), new StringField('SYNC_LOCK'), // NULL или UUID текущей операции ]; } } מהמודול OnTaskUpdate:
// /local/modules/local.trackerintegration/lib/handlers/taskhandler.php namespace Local\TrackerIntegration\Handlers; class TaskHandler { public static function onTaskUpdate(int $taskId, array $arFields): void { $map = TrackerBitrix24TaskTable::getByBitrixId($taskId); if (!$map || $map['SYNC_LOCK'] !== null) { return; // Нет маппинга или уже синхронизируем } // Ставим лок TrackerBitrix24TaskTable::update($map['ID'], ['SYNC_LOCK' => uniqid()]); try { $client = new TrackerApiClient(); $payload = []; if (isset($arFields['TITLE'])) { $payload['summary'] = $arFields['TITLE']; } if (isset($arFields['DESCRIPTION'])) { $payload['description'] = $arFields['DESCRIPTION']; } if (isset($arFields['STATUS'])) { // Маппинг статусов Битрикс24 → Трекер $trackerStatus = StatusMapper::b24ToTracker($arFields['STATUS']); $client->executeTransition($map['TRACKER_ISSUE_KEY'], $trackerStatus); } if (!empty($payload)) { $client->updateIssue($map['TRACKER_ISSUE_KEY'], $payload); } TrackerBitrix24TaskTable::update($map['ID'], [ 'SYNC_LOCK' => null, 'LAST_SYNC_AT' => new \Bitrix\Main\Type\DateTime(), ]); } catch (\Exception $e) { TrackerBitrix24TaskTable::update($map['ID'], ['SYNC_LOCK' => null]); \Bitrix\Main\Diag\Debug::addToLog('TrackerSync error: ' . $e->getMessage()); } } } רישום ה-handler:
\Bitrix\Main\EventManager::getInstance()->addEventHandler( 'tasks', 'OnTaskUpdate', [\Local\TrackerIntegration\Handlers\TaskHandler::class, 'onTaskUpdate'] ); Webhook מיאנדקס טרקר → Bitrix24
ה-handler של ה-webhook הוא בקר הנגיש דרך כתובת URL ציבורית. בטרקר מוגדר טריגר: "כשהסטטוס משתנה → POST לכתובת https://company.bitrix24.ru/local/tracker/webhook/".
// /local/tracker/webhook/index.php $rawBody = file_get_contents('php://input'); $event = json_decode($rawBody, true); // Проверяем secret-заголовок (задаётся в настройках триггера Трекера) $secret = $_SERVER['HTTP_X_TRACKER_SECRET'] ?? ''; if ($secret !== TRACKER_WEBHOOK_SECRET) { http_response_code(403); exit; } $issueKey = $event['issue']['key'] ?? null; $newStatus = $event['updatedAttributes']['status']['to']['key'] ?? null; if (!$issueKey || !$newStatus) { http_response_code(200); exit; } $map = TrackerBitrix24TaskTable::getByTrackerKey($issueKey); if (!$map || $map['SYNC_LOCK'] !== null) { http_response_code(200); exit; } TrackerBitrix24TaskTable::update($map['ID'], ['SYNC_LOCK' => uniqid()]); $b24Status = StatusMapper::trackerToB24($newStatus); $task = new \CTasks(); $task->Update($map['BITRIX_TASK_ID'], ['STATUS' => $b24Status], false); TrackerBitrix24TaskTable::update($map['ID'], ['SYNC_LOCK' => null, 'LAST_SYNC_AT' => new \Bitrix\Main\Type\DateTime()]); http_response_code(200); echo json_encode(['ok' => true]); מיפוי סטטוסים
הסטטוסים בשתי המערכות אינם תואמים — יש צורך בטבלת התאמה:
| Bitrix24 (STATUS) | יאנדקס טרקר (מפתח) |
|---|---|
| 1 (חדש) | open |
| 2 (התקבל) | inProgress |
| 3 (בביצוע) | inProgress |
| 4 (ממתין לבקרה) | needInfo |
| 5 (הושלם) | closed |
| 7 (נדחה) | onHold |
המיפוי נשמר בקובץ תצורה או ב-tasks.
איך להימנע מלולאות בסנכרון דו-כיווני?
בסנכרון דו-כיווני, מנגנון נעילה הוא קריטי למניעת לולאות אינסופיות. כאשר ה-handler // /local/modules/local.trackerintegration/lib/handlers/taskhandler.php namespace Local\TrackerIntegration\Handlers; class TaskHandler { public static function onTaskUpdate(int $taskId, array $arFields): void { $map = TrackerBitrix24TaskTable::getByBitrixId($taskId); if (!$map || $map['SYNC_LOCK'] !== null) { return; // Нет маппинга или уже синхронизируем } // Ставим лок TrackerBitrix24TaskTable::update($map['ID'], ['SYNC_LOCK' => uniqid()]); try { $client = new TrackerApiClient(); $payload = []; if (isset($arFields['TITLE'])) { $payload['summary'] = $arFields['TITLE']; } if (isset($arFields['DESCRIPTION'])) { $payload['description'] = $arFields['DESCRIPTION']; } if (isset($arFields['STATUS'])) { // Маппинг статусов Битрикс24 → Трекер $trackerStatus = StatusMapper::b24ToTracker($arFields['STATUS']); $client->executeTransition($map['TRACKER_ISSUE_KEY'], $trackerStatus); } if (!empty($payload)) { $client->updateIssue($map['TRACKER_ISSUE_KEY'], $payload); } TrackerBitrix24TaskTable::update($map['ID'], [ 'SYNC_LOCK' => null, 'LAST_SYNC_AT' => new \Bitrix\Main\Type\DateTime(), ]); } catch (\Exception $e) { TrackerBitrix24TaskTable::update($map['ID'], ['SYNC_LOCK' => null]); \Bitrix\Main\Diag\Debug::addToLog('TrackerSync error: ' . $e->getMessage()); } } } מקבל אירוע, הוא בודק את השדה \Bitrix\Main\EventManager::getInstance()->addEventHandler( 'tasks', 'OnTaskUpdate', [\Local\TrackerIntegration\Handlers\TaskHandler::class, 'onTaskUpdate'] ); בטבלת המיפוי. אם // /local/tracker/webhook/index.php $rawBody = file_get_contents('php://input'); $event = json_decode($rawBody, true); // Проверяем secret-заголовок (задаётся в настройках триггера Трекера) $secret = $_SERVER['HTTP_X_TRACKER_SECRET'] ?? ''; if ($secret !== TRACKER_WEBHOOK_SECRET) { http_response_code(403); exit; } $issueKey = $event['issue']['key'] ?? null; $newStatus = $event['updatedAttributes']['status']['to']['key'] ?? null; if (!$issueKey || !$newStatus) { http_response_code(200); exit; } $map = TrackerBitrix24TaskTable::getByTrackerKey($issueKey); if (!$map || $map['SYNC_LOCK'] !== null) { http_response_code(200); exit; } TrackerBitrix24TaskTable::update($map['ID'], ['SYNC_LOCK' => uniqid()]); $b24Status = StatusMapper::trackerToB24($newStatus); $task = new \CTasks(); $task->Update($map['BITRIX_TASK_ID'], ['STATUS' => $b24Status], false); TrackerBitrix24TaskTable::update($map['ID'], ['SYNC_LOCK' => null, 'LAST_SYNC_AT' => new \Bitrix\Main\Type\DateTime()]); http_response_code(200); echo json_encode(['ok' => true]); אינו null, זה אומר שהשינוי כבר מעובד על ידי הצד השני — ה-handler יוצא ללא ביצוע. גישה זו עובדת מהר יותר ואמינה יותר מאשר בדיקות חותמות זמן, מכיוון שהיא מבטלת מצבי מרוץ בבקשות מקבילות. לפי התיעוד הרשמי של Bitrix24, האירוע b_option מופעל על כל שינוי במשימה, כך שללא מנגנון נעילה, הסנכרון היה נכנס ללולאה במהירות. היישום שלנו מבטיח שכל עדכון מעובד בדיוק פעם אחת.
יצירת משימה בטרקר מתוך עסקה ב-Bitrix24
תרחיש נוסף: כאשר נוצרת עסקה מסוג מסוים, נוצרת אוטומטית משימה בטרקר. מיושם דרך תהליך עסקי או דרך ה-handler של האירוע OnTaskUpdate:
public static function onCrmDealAdd(int $dealId, array $arFields): void { if ($arFields['TYPE_ID'] !== 'DEVELOPMENT') { return; } $client = new TrackerApiClient(); $issue = $client->createIssue([ 'queue' => 'DEV', 'summary' => 'CRM Deal #' . $dealId . ': ' . $arFields['TITLE'], 'type' => 'task', 'assignee' => UserMapper::b24ToTracker($arFields['ASSIGNED_BY_ID']), 'tags' => ['crm', 'auto-created'], ]); // Сохранить маппинг TrackerBitrix24TaskTable::add([ 'BITRIX_TASK_ID' => 0, // Нет задачи, только сделка 'TRACKER_ISSUE_KEY' => $issue['key'], 'SYNC_DIRECTION' => 'BIDIRECTIONAL', ]); // Записать ключ задачи в поле сделки \CCrmDeal::Update($dealId, ['UF_TRACKER_ISSUE_KEY' => $issue['key']], false); } תהליך העבודה
- ניתוח — אנו לומדים את התהליכים העסקיים הקיימים, מזהים ישויות לסנכרון.
- תכנון — אנו מתכננים ארכיטקטורה, טבלת מיפוי, מנגנון נעילה.
- יישום — אנו כותבים קוד ב-PHP 8.1+, תוך שימוש ב-Bitrix24 ORM וב-Tracker REST API.
- בדיקות — אנו בודקים סנכרון על משימות בדיקה, מדמים קונפליקטים.
- פריסה — אנו פורסים לסביבת הייצור, מגדירים ניטור.
- תמיכה — לאחר ההשקה, אנו מספקים תמיכת אחריות ותיעוד.
לוחות זמנים משוערים
| אפשרות | היקף | לוח זמנים |
|---|---|---|
| סנכרון חד-כיווני | Bitrix24 → טרקר או להיפך | מ-4 עד 6 ימים |
| סנכרון דו-כיווני | משימות, סטטוסים, תגובות | מ-8 עד 12 ימים |
| אינטגרציה מלאה | + יצירה אוטומטית מעסקאות, מיפוי משתמשים | מ-12 עד 16 ימים |
העלות מחושבת באופן אישי — תלויה במורכבות ובהיקף העבודה. לקבלת הערכה מדויקת, צרו קשר.
למה לבחור באינטגרציה שלנו?
אינטגרציה דרך REST API ו-webhooks עובדת ביציבות ללא עומס על השרת. אנו משתמשים ב-cache מתויג וב-agents למשימות רקע. למהנדסים שלנו יש ניסיון של למעלה מ-8 שנים בפיתוח Bitrix24. סנכרון אוטומטי מסתיים תוך שניות, בעוד העברה ידנית אורכת עד 30–60 דקות ביום — האינטגרציה שלנו מאיצה את העבודה פי 50. אנו מבטיחים פעולה תקינה לאחר ההשקה ומספקים פתרונות מתועדים.
מה כלול בעבודה
- תיעוד להתקנה ותפעול.
- גישה למאגר הקוד.
- הדרכת עובדים (שעה אונליין).
- תמיכה ל-30 יום לאחר ההשקה.
- אפשרות לשינויים בתרחישים חדשים.
הזמינו אינטגרציה — המהנדסים שלנו ינתחו את התהליכים שלכם ויציעו את הפתרון האופטימלי. קבלו ייעוץ עכשיו על ידי תיאור המשימה שלכם.







