אוטומציה של עיבוד החזרות ב-1C-Bitrix במפתח סוהר

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

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

שאלות נפוצות

הגדרת עיבוד החזרות אוטומטי ב-1C-Bitrix

אוטומציה של החזרות נדרשת במקומות שבהם הנפח עולה על 20–30 בקשות ביום והמנהל מבלה זמן רב בפעולות שגרתיות: בדיקת תשלום ההזמנה, יצירת החזרה ב-1C, עיבוד ההחזר הכספי, שליחת דוא"ל ללקוח.

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

הצוות שלנו, לאורך 8 שנים של עבודה עם הפלטפורמה, הטמיע יותר מ-40 אוטומציות של החזרות עבור חנויות מקוונות בגדלים שונים.

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

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

מודל אירועי החזרה

המודול sale מייצר אירועים בעבודה עם החזרות. נקודות מפתח לאוטומציה:

  • OnSaleOrderReturnSaved — יצירה או עדכון של בקשה
  • OnSaleOrderReturnStatusChange — שינוי סטטוס
  • OnSalePaymentCollectionReturnAdd — הוספת החזרת תשלום

רישום מטפלים ב-/local/php_interface/init.php:

$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('sale', 'OnSaleOrderReturnSaved', [\Local\Returns\AutoProcessor::class, 'onReturnSaved']);
$eventManager->addEventHandler('sale', 'OnSaleOrderReturnStatusChange', [\Local\Returns\AutoProcessor::class, 'onStatusChange']);

פעולות אוטומטיות בעת יצירת בקשת החזרה

namespace Local\Returns;

class AutoProcessor
{
    public static function onReturnSaved(\Bitrix\Main\Event $event): void
    {
        $return = $event->getParameter('ENTITY');
        if (!$return instanceof \Bitrix\Sale\OrderReturn) return;

// Only on creation (not on update) if (!$event->getParameter('IS_NEW')) return; $returnId = $return->getId(); // 1. Assign a responsible person by rotation self::assignResponsible($returnId);

        // 2. Send confirmation to the customer
        Notifications::sendToCustomer($returnId, 'RETURN_CREATED');

// 3. Notify the manager Notifications::sendToManager($returnId, 'NEW_RETURN'); // 4. If the return amount is small — auto-approve self::tryAutoApprove($return); }

    public static function onStatusChange(\Bitrix\Main\Event $event): void
    {
        $returnId = $event->getParameter('RETURN_ID');
        $newStatus = $event->getParameter('NEW_STATUS_ID');
        $oldStatus = $event->getParameter('OLD_STATUS_ID');

        $handler = new self();
        $handler->handleStatusTransition($returnId, $oldStatus, $newStatus);
    }

    private function handleStatusTransition(int $returnId, string $from, string $to): void
    {
        match ($to) {
            'APPROVED' => $this->onApproved($returnId),
            'RECEIVED' => $this->onReceived($returnId),
            'REJECTED' => $this->onRejected($returnId),
            'REFUND' => $this->onRefunded($returnId),
            default => null,
        };
    }
}

אישור אוטומטי של החזרות קטנות

החזרות מתחת לסכום מסוים (סף שניתן להגדרה) אינן דורשות בדיקה ידנית:

private static function tryAutoApprove(\Bitrix\Sale\OrderReturn $return): void
{
    $autoApproveLimit = (float)\Bitrix\Main\Config\Option::get(
        'local.returns',
        'auto_approve_limit',
        500
    );
    $returnAmount = (float)$return->getField('REFUND_AMOUNT');
    if ($returnAmount <= 0 || $returnAmount > $autoApproveLimit) {
        return;
    }
    // Check: customer has no history of disputed returns
    $userId = $return->getOrder()->getUserId();
    if (self::hasDisputeHistory($userId)) {
        return;
    }
    // Automatically change status to APPROVED
    $return->setField('STATUS_ID', 'APPROVED');
    $return->setField('MANAGER_COMMENT', 'Auto-approved: amount up to ' . $autoApproveLimit . ' RUB');
    $result = $return->save();
    if ($result->isSuccess()) {
        \CEventLog::Add([
            'SEVERITY' => 'INFO',
            'AUDIT_TYPE_ID' => 'RETURN_AUTO_APPROVED',
            'MODULE_ID' => 'local.returns',
            'DESCRIPTION' => "Return #{$return->getId()} auto-approved, amount: {$returnAmount}",
        ]);
    }
}

private static function hasDisputeHistory(int $userId): bool
{
    // Count rejected returns over the last 6 months
    $dateFrom = new \Bitrix\Main\Type\Date();
    $dateFrom->add('-180 days');
    $result = \Bitrix\Sale\OrderReturnTable::getList([
        'filter' => [
            '=ORDER.USER_ID' => $userId,
            'STATUS_ID' => 'REJECTED',
            '>=DATE_INSERT' => $dateFrom,
        ],
        'select' => ['ID'],
    ]);
    return (bool)$result->fetch();
}

החזר אוטומטי בעת אישור

בעת מעבר לסטטוס "מאושר" — אנו יוזמים החזר אוטומטי דרך ה-API של מערכת התשלומים:

private function onApproved(int $returnId): void {
    $return = \Bitrix\Sale\OrderReturn::loadById($returnId);
    if (!$return) return;

$order = $return->getOrder(); $payments = $order->getPaymentCollection(); foreach ($payments as $payment) { if (!$payment->isPaid()) continue;

        $psHandler = \Bitrix\Sale\PaySystem\Manager::getObjectById(
            $payment->getPaymentSystemId()
        );
        if (!$psHandler) continue;

        $supportsRefund = method_exists($psHandler, 'refund');
        if (!$supportsRefund) {
            // מערכת התשלומים אינה תומכת בהחזר אוטומטי — יש להוסיף אותה לתור לעיבוד ידני
            $this->flagForManualRefund($returnId, 'PS does not support auto refund');
            continue;
        }

        $refundAmount = (float)$return->getField('REFUND_AMOUNT');
        $result = $psHandler->refund($payment, $refundAmount);

        if ($result->isSuccess()) {
            $return->setField('STATUS_ID', 'REFUND');
            $return->setField('REFUND_DATE', new \Bitrix\Main\Type\DateTime());
            $return->save();
            Notifications::sendToCustomer($returnId, 'RETURN_REFUNDED');
        } else {
            $this->flagForManualRefund($returnId, implode('; ', $result->getErrorMessages()));
        }
    }
}

אימות אוטומטי של קבלת סחורה באמצעות מספר מעקב

אם הקונה שולח את הפריט בחזרה באמצעות מספר מעקב, ניתן לעקוב אחר המשלוח באופן אוטומטי:

class TrackingWatcher { // סוכן שמופעל כל שעתיים
    public static function checkPendingReturns(): string {
        $returns = \Bitrix\Sale\OrderReturnTable::getList([
            'filter' => [
                'STATUS_ID' => 'APPROVED',
                'UF_TRACKING' => ['!=', '', false], // בקשות עם מספר מעקב
            ],
            'select' => ['ID', 'UF_TRACKING', 'UF_CARRIER'],
        ]);
        $checker = new \Local\Delivery\TrackingChecker();
        while ($row = $returns->fetch()) {
            $status = $checker->getStatus($row['UF_TRACKING'], $row['UF_CARRIER'] ?? 'pochta');
            if ($status === 'delivered') {
                $return = \Bitrix\Sale\OrderReturn::loadById($row['ID']);
                $return->setField('STATUS_ID', 'RECEIVED');
                $return->save();
            }
        }
        return 'checkPendingReturns();'; // הפעלה מחדש של הסוכן
    }
}

הסלמה של בקשות באיחור

סוכן לניטור SLA של החזרות:

class SlaWatcher {
    private const SLA_HOURS = [
        'WAIT' => 24, // review within 24 hours
        'REVIEW' => 48, // make a decision within 48 hours
    ];

    public static function checkOverdue(): string {
        foreach (self::SLA_HOURS as $statusId => $maxHours) {
            $deadline = new \Bitrix\Main\Type\DateTime();
            $deadline->add('-' . $maxHours . ' hours');

            $overdueReturns = \Bitrix\Sale\OrderReturnTable::getList([
                'filter' => [
                    'STATUS_ID' => $statusId,
                    '<=DATE_STATUS' => $deadline,
                ],
                'select' => ['ID', 'RESPONSIBLE_ID', 'ORDER_ID'],
            ]);

            while ($row = $overdueReturns->fetch()) {
                Notifications::escalate($row['ID'], $row['RESPONSIBLE_ID'], $statusId, $maxHours);
            }
        }

        return 'checkOverdue();';
    }
}

היקף העבודה

  • מטפלי אירועים: OnSaleOrderReturnSaved, OnSaleOrderReturnStatusChange
  • לוגיקת אישור אוטומטי בהתבסס על סכום והיסטוריית לקוח
  • החזרים אוטומטיים באמצעות ממשקי API של מערכות תשלום (YuKassa, Tinkoff וכו')
  • סוכן מעקב חבילות נכנסות (Russian Post, CDEK, Boxberry)
  • סוכן ניטור SLA עם הסלמה של בקשות באיחור
  • אוטומציה של דואר אלקטרוני: תבניות לכל סטטוס

לוחות זמנים: אוטומציה בסיסית (התראות + החזרים אוטומטיים) — 2–3 שבועות. מחסנית מלאה עם ניטור SLA ומעקב — 4–6 שבועות.

תיאור תהליך מפורט

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

בכל שלב, אנו מספקים תיעוד מפורט ומבצעים בדיקות בסביבת staging לפני ההשקה בייצור. הפתרונות שלנו מתוכננים תוך התחשבות בשיטות העבודה המומלצות בתעשייה ויכולים להפחית משמעותית את עלויות התפעול.

האחריות שלנו לאיכות

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

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

דוגמאות לפרויקטים מוצלחים

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

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

היתרונות של הגישה שלנו

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

אנשי קשר ושלבים הבאים

אם החברה שלך מתמודדת עם הבעיה המתוארת, צור איתנו קשר. אנו ננתח את המערכת שלך ונציע את הפתרון האופטימלי.

עלות הפרויקט תלויה במורכבות ובהיקף העבודה, אך עבור פתרונות טיפוסיים אנו תמיד מספקים אומדן מדויק בהתבסס על ניתוח מקדים של הדרישות.

טכנולוגיות וכלים

בעבודה שלנו אנו משתמשים בסטאק מודרני: מטפלי אירועים D7, Bitrix ORM לפעולות מסד נתונים, מטמון דרך המודול הראשי, אינטגרציות עם APIs חיצוניים דרך לקוח ה-HTTP Guzzle.

עבור שערי תשלום אנו משתמשים ב-SDKs רשמיים מבנקים וממערכות תשלום — זה מבטיח את היציבות והאבטחה של פעולות ההחזר. הבדיקות מתבצעות בסביבת staging עם העתק מלא של נתוני ה-production לפני פריסת השינויים לסביבת ה-live.