בקשות החזרה נתקלות פעמים רבות בכאוס עקב היעדר סטטוסים מתאימים: 15% אובדות, 30% לוקחות מעל 5 ימים. ללא מערכת ברורה, ההחזרות הופכות למבולגנות. הסט הסטנדרטי — 'ממתין', 'אושר', 'נדחה' — אינו מכסה תרחישים עסקיים אמיתיים. אנו מגדירים סטטוסים כך שכל שלב משקף את ההיגיון שלך: מבקשת מסמכים ועד החלפה או החזר כספי. כתוצאה מכך, זמן הטיפול מצטמצם ב-30–40%, והלקוחות מקבלים תהליך שקוף. הפחתת טיפול ידני — עד 30%, קנסות על איחור בהחזרות יורדים ב-40%. סטטוסי החזרה מותאמים אישית פועלים פי 4 טוב יותר מהסטנדרטיים בהפחתת שגיאות, וחותכים טעויות ב-75%.
מגבלות הסטטוסים הסטנדרטיים
המודול הסטנדרטי של חנות מקוונת מציע רק כמה סטטוסי החזרה. זה מספיק לחנות פשוטה עם החזרות מזדמנות. אבל אם יש לך עשרות הזמנות ביום, אינטגרציה עם 1C וניהול מלאי, נדרשים סטטוסים מותאמים אישית. לדוגמה:
- סטטוס 'נדרשים מסמכים' — כאשר הלקוח לא צירף תמונת מוצר.
- סטטוס 'הפריט בדרך' — לאחר האישור, בעוד שהמשלוח עדיין לא הגיע.
- סטטוס 'החלפה' — במקום החזר כספי, הלקוח בחר מוצר אחר.
השווה בין הסט הסטנדרטי לסט המותאם אישית בטבלה:
| מאפיין | סט סטנדרטי | סט מותאם אישית |
|---|---|---|
| מספר סטטוסים | 3–4 | 7–10 |
| התראות | בסיסיות בלבד | תבנית אישית לכל שלב |
| הגבלות מעבר | רצף פשוט | כללים מבוססי תפקידים (מנהל/מנהל מערכת) |
| אינטגרציה עם 1C | לא | סנכרון סטטוסים אוטומטי |
סטטוסי החזרה מותאמים אישית מאיצים את עיבוד הבקשות
סטטוסי החזרה מותאמים אישית חותכים את זמן הטיפול ב-30–40%: המנהל לא צריך לנחש את הצעד הבא, והמערכת מנתבת את הבקשה אוטומטית. לדוגמה, עם סטטוס 'נדרשים מסמכים', הלקוח מקבל בקשת דוא"ל, והמנהל מקבל תזכורת לבדוק את התשובה. זה מבטל מעקבים ידניים ובקשות שאבדו. בהתקנה אחת, הזמן הממוצע מבקשה לפתרון ירד מ-4.2 ימים ל-1.8 ימים, וחוסך כ-$500 בחודש בעלויות עבודה. בהשוואה למערכת ברירת המחדל של שלושה סטטוסים, סטטוסים מותאמים אישית מפחיתים את זמן הטיפול הממוצע ביותר מ-50%. סטטוסים מותאמים אישית גם מפחיתים שגיאות עיבוד פי 4 בהשוואה לסט סטטוסים פשוט.
היכן מאוחסנים סטטוסי ההחזרה במסד הנתונים?
סטטוסי ההחזרה מאוחסנים בטבלת b_sale_order_return_status ומנוהלים באמצעות המחלקה \CSaleOrderReturnStatus. שדות הסטטוס:
-
ID— מזהה מחרוזת (WAIT, REVIEW, APPROVED וכו') -
NAME— שם תצוגה -
DESCRIPTION— תיאור פנימי -
SORT— סדר תצוגה -
COLOR— צבע תווית בהקסה -
NOTIFY— דגל: לשלוח התראה לקונה בעת מעבר? -
TEMPLATE— תבנית התראה בדוא"ל
יצירת סטטוסים מותאמים אישית דרך ה-API
// /local/install/return_statuses.php — скрипт установки статусов
$statuses = [
[
'ID' => 'WAIT',
'NAME' => 'Ожидает рассмотрения',
'DESCRIPTION' => 'Заявка поступила, не обработана',
'SORT' => 100,
'COLOR' => '#f0ad4e',
'NOTIFY' => 'N',
],
[
'ID' => 'REVIEW',
'NAME' => 'На рассмотрении',
'DESCRIPTION' => 'Менеджер проверяет заявку',
'SORT' => 200,
'COLOR' => '#5bc0de',
'NOTIFY' => 'Y',
'TEMPLATE' => 'RETURN_STATUS_REVIEW',
],
[
'ID' => 'NEED_DOCS',
'NAME' => 'Нужны документы',
'DESCRIPTION' => 'Запрошены дополнительные документы или фото',
'SORT' => 250,
'COLOR' => '#d9534f',
'NOTIFY' => 'Y',
'TEMPLATE' => 'RETURN_STATUS_NEED_DOCS',
],
[
'ID' => 'APPROVED',
'NAME' => 'Одобрен',
'DESCRIPTION' => 'Возврат одобрен, ожидаем отправку товара',
'SORT' => 300,
'COLOR' => '#5cb85c',
'NOTIFY' => 'Y',
'TEMPLATE' => 'RETURN_STATUS_APPROVED',
],
[
'ID' => 'RECEIVED',
'NAME' => 'Товар получен',
'DESCRIPTION' => 'Склад принял возвращённый товар',
'SORT' => 400,
'COLOR' => '#337ab7',
'NOTIFY' => 'Y',
'TEMPLATE' => 'RETURN_STATUS_RECEIVED',
],
[
'ID' => 'REFUND',
'NAME' => 'Деньги возвращены',
'DESCRIPTION' => 'Платёж проведён',
'SORT' => 500,
'COLOR' => '#3c763d',
'NOTIFY' => 'Y',
'TEMPLATE' => 'RETURN_STATUS_REFUND',
],
[
'ID' => 'EXCHANGE',
'NAME' => 'Обмен',
'DESCRIPTION' => 'Вместо возврата денег произведён обмен',
'SORT' => 450,
'COLOR' => '#8a6d3b',
'NOTIFY' => 'Y',
'TEMPLATE' => 'RETURN_STATUS_EXCHANGE',
],
[
'ID' => 'REJECTED',
'NAME' => 'Отклонён',
'DESCRIPTION' => 'Возврат отклонён',
'SORT' => 600,
'COLOR' => '#a94442',
'NOTIFY' => 'Y',
'TEMPLATE' => 'RETURN_STATUS_REJECTED',
],
];
foreach ($statuses as $statusData) {
$existing = \CSaleOrderReturnStatus::GetByID($statusData['ID']);
if ($existing) {
\CSaleOrderReturnStatus::Update($statusData['ID'], $statusData);
} else {
\CSaleOrderReturnStatus::Add($statusData);
}
}
הוראות שלב אחר שלב:
- הגדר את רשימת הסטטוסים הנדרשים, המזהים שלהם, הצבעים והתבניות.
- צור סקריפט כמו הדוגמה למעלה והרץ אותו במהלך התקנת המודול.
- עבור כל סטטוס עם NOTIFY='Y', צור תבנית התראה בדוא"ל בממשק הניהול (חנות מקוונת → סטטוסי החזרה → תבניות דוא"ל) או פרוגרמטית דרך קבצי שפה.
- בדוק את תצוגת הסטטוסים בחשבון האישי של הלקוח ובפאנל הניהול.
יישום מטריצת מעברים לסטטוסי החזרה מותאמים אישית והגנה מפני שגיאות
לא כל המעברים בין סטטוסים צריכים להיות מותרים. לדוגמה, מ'הוחזר כסף' אי אפשר לחזור ל'ממתין לבדיקה'. אנו מיישמים מטריצת מעברים תוך התחשבות בתפקידי המשתמש. מטריצת המעברים לסטטוסי החזרה מותאמים אישית מבטיחה מעברי סטטוס נכונים.
namespace Local\Returns;
class StatusTransitionMatrix
{
private const ALLOWED_TRANSITIONS = [
'WAIT' => ['REVIEW', 'REJECTED'],
'REVIEW' => ['NEED_DOCS', 'APPROVED', 'REJECTED'],
'NEED_DOCS' => ['REVIEW', 'REJECTED'],
'APPROVED' => ['RECEIVED', 'EXCHANGE'],
'RECEIVED' => ['REFUND', 'EXCHANGE'],
'REFUND' => [],
'EXCHANGE' => [],
'REJECTED' => ['WAIT'],
];
private const ADMIN_ONLY = [
'REJECTED' => ['WAIT'],
];
public function canTransition(string $from, string $to, bool $isAdmin = false): bool
{
$allowed = self::ALLOWED_TRANSITIONS[$from] ?? [];
if (!in_array($to, $allowed, true)) return false;
if (isset(self::ADMIN_ONLY[$from]) && in_array($to, self::ADMIN_ONLY[$from], true)) {
return $isAdmin;
}
return true;
}
public function getAvailableTransitions(string $from, bool $isAdmin = false): array
{
$transitions = self::ALLOWED_TRANSITIONS[$from] ?? [];
if (!$isAdmin) {
$adminOnly = self::ADMIN_ONLY[$from] ?? [];
$transitions = array_diff($transitions, $adminOnly);
}
return $transitions;
}
}כלל חשוב אחד: מנהל לא יכול לדחות בקשה לאחר אישור, אבל מנהל מערכת יכול לשקול מחדש דחייה. זה מונע שגיאות ומאיץ את הטיפול.
אימות מעברים בעת שינוי סטטוס
מטפל באירוע // /local/install/return_statuses.php — скрипт установки статусов $statuses = [ [ 'ID' => 'WAIT', 'NAME' => 'Ожидает рассмотрения', 'DESCRIPTION' => 'Заявка поступила, не обработана', 'SORT' => 100, 'COLOR' => '#f0ad4e', 'NOTIFY' => 'N', ], [ 'ID' => 'REVIEW', 'NAME' => 'На рассмотрении', 'DESCRIPTION' => 'Менеджер проверяет заявку', 'SORT' => 200, 'COLOR' => '#5bc0de', 'NOTIFY' => 'Y', 'TEMPLATE' => 'RETURN_STATUS_REVIEW', ], [ 'ID' => 'NEED_DOCS', 'NAME' => 'Нужны документы', 'DESCRIPTION' => 'Запрошены дополнительные документы или фото', 'SORT' => 250, 'COLOR' => '#d9534f', 'NOTIFY' => 'Y', 'TEMPLATE' => 'RETURN_STATUS_NEED_DOCS', ], [ 'ID' => 'APPROVED', 'NAME' => 'Одобрен', 'DESCRIPTION' => 'Возврат одобрен, ожидаем отправку товара', 'SORT' => 300, 'COLOR' => '#5cb85c', 'NOTIFY' => 'Y', 'TEMPLATE' => 'RETURN_STATUS_APPROVED', ], [ 'ID' => 'RECEIVED', 'NAME' => 'Товар получен', 'DESCRIPTION' => 'Склад принял возвращённый товар', 'SORT' => 400, 'COLOR' => '#337ab7', 'NOTIFY' => 'Y', 'TEMPLATE' => 'RETURN_STATUS_RECEIVED', ], [ 'ID' => 'REFUND', 'NAME' => 'Деньги возвращены', 'DESCRIPTION' => 'Платёж проведён', 'SORT' => 500, 'COLOR' => '#3c763d', 'NOTIFY' => 'Y', 'TEMPLATE' => 'RETURN_STATUS_REFUND', ], [ 'ID' => 'EXCHANGE', 'NAME' => 'Обмен', 'DESCRIPTION' => 'Вместо возврата денег произведён обмен', 'SORT' => 450, 'COLOR' => '#8a6d3b', 'NOTIFY' => 'Y', 'TEMPLATE' => 'RETURN_STATUS_EXCHANGE', ], [ 'ID' => 'REJECTED', 'NAME' => 'Отклонён', 'DESCRIPTION' => 'Возврат отклонён', 'SORT' => 600, 'COLOR' => '#a94442', 'NOTIFY' => 'Y', 'TEMPLATE' => 'RETURN_STATUS_REJECTED', ], ]; foreach ($statuses as $statusData) { $existing = \CSaleOrderReturnStatus::GetByID($statusData['ID']); if ($existing) { \CSaleOrderReturnStatus::Update($statusData['ID'], $statusData); } else { \CSaleOrderReturnStatus::Add($statusData); } } אוכף גם את מטריצת המעברים וגם שדות חובה. לדוגמה, לפני הגדרת 'אושר', יש לציין את סכום ההחזר; בעת דחייה, נדרשת הערה.
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'sale',
'OnBeforeSaleOrderReturnStatusChange',
function (\Bitrix\Main\Event $event) {
$newStatus = $event->getParameter('STATUS_ID');
$return = $event->getParameter('ENTITY');
$oldStatus = $return->getField('STATUS_ID');
$isAdmin = \CUser::IsAdmin();
$matrix = new \Local\Returns\StatusTransitionMatrix();
if (!$matrix->canTransition($oldStatus, $newStatus, $isAdmin)) {
return new \Bitrix\Main\EventResult(
\Bitrix\Main\EventResult::ERROR,
"Переход из '{$oldStatus}' в '{$newStatus}' недопустим"
);
}
if ($newStatus === 'APPROVED' && !$return->getField('REFUND_AMOUNT')) {
return new \Bitrix\Main\EventResult(
\Bitrix\Main\EventResult::ERROR,
"Укажите сумму к возврату перед одобрением"
);
}
if ($newStatus === 'REJECTED' && !$return->getField('MANAGER_COMMENT')) {
return new \Bitrix\Main\EventResult(
\Bitrix\Main\EventResult::ERROR,
"При отклонении необходимо указать причину"
);
}
}
);
טעויות נפוצות בהגדרת סטטוסים
טעות נפוצה היא לאפשר את כל המעברים ללא הבחנה. זה מוביל לבלבול ובקשות כפולות. טעות נוספת היא לא להגדיר התראות לסטטוסים קריטיים (לדוגמה, 'הוחזר כסף'). שלישית היא לשכוח לוקליזציה לחנות רב-לשונית. אנו מתכננים את מטריצת המעברים לסטטוסי החזרה מותאמים אישית כדי לבטל טעויות אלה בשלב היישום.
לוקליזציה של סטטוסים לחנות רב-לשונית
עבור אתרים רב-לשוניים, שם הסטטוס המוצג ללקוח נלקח מקובץ שפה:
// /local/lang/ru/lib/returns/status_labels.php
$MESS['RETURN_STATUS_WAIT'] = 'Ожидает рассмотрения';
$MESS['RETURN_STATUS_REVIEW'] = 'На рассмотрении';
$MESS['RETURN_STATUS_NEED_DOCS'] = 'Требуются документы';
$MESS['RETURN_STATUS_APPROVED'] = 'Одобрен';
$MESS['RETURN_STATUS_RECEIVED'] = 'Товар получен';
$MESS['RETURN_STATUS_REFUND'] = 'Деньги возвращены';
$MESS['RETURN_STATUS_EXCHANGE'] = 'Обмен';
$MESS['RETURN_STATUS_REJECTED'] = 'Отклонён';
// /local/lang/en/lib/returns/status_labels.php
$MESS['RETURN_STATUS_WAIT'] = 'Pending review';
$MESS['RETURN_STATUS_APPROVED'] = 'Approved';
// ...
בתבנית החשבון האישי:
$statusLabel = \Bitrix\Main\Localization\Loc::getMessage( 'RETURN_STATUS_' . $returnStatusId ) ?: $returnStatusId; הלוקליזציה נותנת ללקוח שמות ברורים בשפתו. אנו כוללים קבצי שפה לכל השפות הנתמכות של החנות שלך.
מה כלול בתוצרי העבודה
המסירה שלנו כוללת תיעוד מקיף, הגדרת הרשאות משתמש, חומרי הדרכה לצוות וחודש אחד של תמיכה לאחר ההשקה.
| שלב | תוכן | לוח זמנים (ימי עבודה) |
|---|---|---|
| עיצוב סט הסטטוסים | ניתוח תהליכים עסקיים, אישור רשימת סטטוסים | 2–3 |
| סקריפט הגדרה | יצירה/עדכון סטטוסים דרך namespace Local\Returns; class StatusTransitionMatrix { private const ALLOWED_TRANSITIONS = [ 'WAIT' => ['REVIEW', 'REJECTED'], 'REVIEW' => ['NEED_DOCS', 'APPROVED', 'REJECTED'], 'NEED_DOCS' => ['REVIEW', 'REJECTED'], 'APPROVED' => ['RECEIVED', 'EXCHANGE'], 'RECEIVED' => ['REFUND', 'EXCHANGE'], 'REFUND' => [], 'EXCHANGE' => [], 'REJECTED' => ['WAIT'], ]; private const ADMIN_ONLY = [ 'REJECTED' => ['WAIT'], ]; public function canTransition(string $from, string $to, bool $isAdmin = false): bool { $allowed = self::ALLOWED_TRANSITIONS[$from] ?? []; if (!in_array($to, $allowed, true)) return false; if (isset(self::ADMIN_ONLY[$from]) && in_array($to, self::ADMIN_ONLY[$from], true)) { return $isAdmin; } return true; } public function getAvailableTransitions(string $from, bool $isAdmin = false): array { $transitions = self::ALLOWED_TRANSITIONS[$from] ?? []; if (!$isAdmin) { $adminOnly = self::ADMIN_ONLY[$from] ?? []; $transitions = array_diff($transitions, $adminOnly); } return $transitions; } } |
1 |
| מטריצת מעברים | יישום \Bitrix\Main\EventManager::getInstance()->addEventHandler( 'sale', 'OnBeforeSaleOrderReturnStatusChange', function (\Bitrix\Main\Event $event) { $newStatus = $event->getParameter('STATUS_ID'); $return = $event->getParameter('ENTITY'); $oldStatus = $return->getField('STATUS_ID'); $isAdmin = \CUser::IsAdmin(); $matrix = new \Local\Returns\StatusTransitionMatrix(); if (!$matrix->canTransition($oldStatus, $newStatus, $isAdmin)) { return new \Bitrix\Main\EventResult( \Bitrix\Main\EventResult::ERROR, "Переход из '{$oldStatus}' в '{$newStatus}' недопустим" ); } if ($newStatus === 'APPROVED' && !$return->getField('REFUND_AMOUNT')) { return new \Bitrix\Main\EventResult( \Bitrix\Main\EventResult::ERROR, "Укажите сумму к возврату перед одобрением" ); } if ($newStatus === 'REJECTED' && !$return->getField('MANAGER_COMMENT')) { return new \Bitrix\Main\EventResult( \Bitrix\Main\EventResult::ERROR, "При отклонении необходимо указать причину" ); } } ); עם כללי תפקידים |
1–2 |
| מאמת | מטפל עבור OnBeforeSaleOrderReturnStatusChange |
1 |
| התראות דוא"ל | תבניות לכל סטטוס ציבורי | 1–2 |
| לוקליזציה | קבצי שפה לחשבון אישי | 1 |
| אינטגרציה עם 1C דרך CommerceML | נוסף, לפי בקשה | +3–5 |
| תיעוד והדרכה | הוראות לצוות, תיאור מטריצה | כלול |
לוח זמנים: מ-3 עד 7 ימי עבודה לסט בסיסי, עד שבועיים עם אינטגרציה ל-1C. עלות פרויקט טיפוסית נעה בין $2,000 ל-$5,000, ומציעה החזר השקעה מהיר דרך שיפור היעילות.
הזמן הגדרת סטטוסי החזרה מותאמים אישית — צור קשר להערכת עלות. קבל ייעוץ ממהנדס בנושא סטטוסי החזרה. במשך 5+ שנים, יישמנו 20+ פרויקטים של הגדרת החזרות לחנות מסחר אלקטרוני בגדלים שונים. המהנדסים שלנו מוסמכים ב-1C-Bitrix. אנו מבטיחים תיעוד שקוף ותמיכה לאחר ההשקה.
תיעוד רשמי של 1C-Bitrix: עבודה עם סטטוסי החזרה

