פיתוח מודול ייבוא נתונים מותאם אישית ל-1C-Bitrix
לקוח הביא קובץ Excel עם 15,000 שורות של מאפייני מוצר ייחודיים. ה-CommerceML המובנה לא יכול היה להתמודד עם הפורמט המותאם אישית — היינו צריכים לעדכן פריטים קיימים מבלי לגעת במחירים או במלאי. הזנה ידנית הייתה אורכת חודש. בנינו מודול ייבוא מותאם אישית ב-13 ימי עבודה. עם ניסיון של למעלה מ-10 שנים בפיתוח Bitrix ויותר מ-50 פרויקטי אינטגרציה שהושלמו, אנו מבטיחים ביצועים יציבים תחת עומס. אתה מקבל פתרון שחוסך פי 10 מהזמן בהשוואה להעלאה ידנית.
המודול הסטנדרטי catalog תומך בייבוא דרך CSaleImport ו-CDataExchangeXML עבור CommerceML 2.x. הוא עובד היטב עבור קטלוגים פשוטים. בעיות מתעוררות עם פורמטים שרירותיים (Excel, JSON, XML עם סכמות לא סטנדרטיות), ייבוא מרובה-אינפובלוקים, עדכון רשומות קיימות עם לוגיקת מיזוג, ייבוא משתמשים, הזמנות, ישויות CRM, וקבצים גדולים (10,000+ שורות) ללא פסקי זמן. מודול מותאם אישית פותר את אלה באמצעות עיבוד זורם ומיפוי ניתן להגדרה.
המודול vendor.importer בנוי על שלוש הפשטות: Reader (קורא מקור), Transformer (הופך נתונים), ו-Writer (כותב לתוך Bitrix). ארכיטקטורה זו מאפשרת חיבור כל מקור ויעד ללא שינוי בליבה. מידע נוסף על הפלטפורמה ניתן למצוא בויקיפדיה.
איך המודול עובד
המודול vendor.importer סובב סביב Reader, Transformer ו-Writer.
SourceFile → Reader → RawRow[] → Transformer → MappedRow[] → Writer → Bitrix entities ReaderInterface:
interface ReaderInterface {
public function open(string $filePath): void;
public function readNext(): ?array; // null = конец файла
public function getHeaders(): array;
public function close(): void;
}מימושים: SourceFile → Reader → RawRow[] → Transformer → MappedRow[] → Writer → Bitrix entities , interface ReaderInterface { public function open(string $filePath): void; public function readNext(): ?array; // null = конец файла public function getHeaders(): array; public function close(): void; } (דרך CsvReader), XlsxReader (דרך PhpSpreadsheet לעיבוד זורם של קבצים גדולים), XmlReader.
מיפוי שדות — פיתוח מודול ייבוא
תצורת המיפוי מאוחסנת ב-XMLReader:
{
"source": "csv",
"target": "catalog_product",
"iblock_id": 5,
"fields": {
"article": "PROPERTY_ARTICLE",
"name": "NAME",
"price": "CATALOG_PRICE_1",
"stock": "CATALOG_STORE_PRODUCT_AMOUNT"
},
"key_field": "article",
"update_strategy": "merge"
}JsonReader מגדיר את השדה לזיהוי רשומות קיימות. b_vendor_importer_mapping:
-
{ "source": "csv", "target": "catalog_product", "iblock_id": 5, "fields": { "article": "PROPERTY_ARTICLE", "name": "NAME", "price": "CATALOG_PRICE_1", "stock": "CATALOG_STORE_PRODUCT_AMOUNT" }, "key_field": "article", "update_strategy": "merge" }— מעדכן רק שדות ממופים; -
key_field— החלפה מלאה; -
update_strategy— דילוג על קיימות.
איך מטפלים בקבצים גדולים
ייבוא של 50,000 שורות בבקשת HTTP אחת אינו אפשרי. אנו משתמשים בסוכנים:
// Шаг 1: загрузка файла, задание
$job = ImportJobTable::add([
'FILE_PATH' => $uploadedPath,
'MAPPING_ID' => $mappingId,
'STATUS' => 'pending',
'TOTAL' => 0,
'PROCESSED' => 0,
]);
// Шаг 2: агент обрабатывает порциями
public static function processChunk(int $jobId, int $offset, int $limit = 100): string
{
$job = ImportJobTable::getById($jobId)->fetch();
$reader = ReaderFactory::create($job['FILE_PATH']);
$reader->open($job['FILE_PATH']);
// пропускаем offset строк, читаем limit строк
// записываем, обновляем PROCESSED
return "\\Bitrix\\Main\\Agent::executeImporter($jobId, $newOffset);";
}הסוכן רץ כל דקה; ההתקדמות נראית בלוח הניהול בזמן אמת. עיבוד זורם מהיר פי 10 מייבוא בבקשה אחת.
Writer: כתיבה לאינפובלוק
class IblockElementWriter implements WriterInterface {
public function write(MappedRow $row): WriteResult {
$existing = $this->findByKey($row->getKeyValue());
if ($existing) {
$result = \CIBlockElement::Update($existing['ID'], $row->toIblockArray());
} else {
$element = new \CIBlockElement();
$result = $element->Add($row->toIblockArray());
}
return new WriteResult($result !== false, $existing ? 'updated' : 'created');
}
}Writers דומים: merge, replace, skip.
אימות נתונים וטיפול בשגיאות
לפני הכתיבה, כל שורה מאומתת. הכללים מוגדרים בתצורה:
| שדה | כללים |
|---|---|
// Шаг 1: загрузка файла, задание $job = ImportJobTable::add([ 'FILE_PATH' => $uploadedPath, 'MAPPING_ID' => $mappingId, 'STATUS' => 'pending', 'TOTAL' => 0, 'PROCESSED' => 0, ]); // Шаг 2: агент обрабатывает порциями public static function processChunk(int $jobId, int $offset, int $limit = 100): string { $job = ImportJobTable::getById($jobId)->fetch(); $reader = ReaderFactory::create($job['FILE_PATH']); $reader->open($job['FILE_PATH']); // пропускаем offset строк, читаем limit строк // записываем, обновляем PROCESSED return "\\Bitrix\\Main\\Agent::executeImporter($jobId, $newOffset);"; } |
חובה, אימייל |
class IblockElementWriter implements WriterInterface { public function write(MappedRow $row): WriteResult { $existing = $this->findByKey($row->getKeyValue()); if ($existing) { $result = \CIBlockElement::Update($existing['ID'], $row->toIblockArray()); } else { $element = new \CIBlockElement(); $result = $element->Add($row->toIblockArray()); } return new WriteResult($result !== false, $existing ? 'updated' : 'created'); } } |
חובה, מספרי, מינימום:0 |
CrmLeadWriter |
חובה, מקסימום:255 |
SaleOrderWriter |
בין:active,inactive,pending |
שורות עם שגיאות מתועדות ב-UserWriter. לאחר הייבוא, דוח ו-CSV עם שורות בעייתיות זמינים.
שגיאות ייבוא נפוצות
- אי-התאמה בקידוד הקובץ ל-UTF-8 (נפתר על ידי תצורת Reader).
- שדות מפתח כפולים (מטופל על ידי הגדרת אסטרטגיה).
- חריגה ממגבלת זיכרון עם קריאות לא זורמות (אנו משתמשים ב-Readers זורמים).
התראות ורישום לוגים
לאחר השלמה, המודול שולח אימייל ליזם דרך EMAIL: סך שורות, נוצרו/עודכנו/שגיאות, קישור ללוג.
תהליך הפיתוח
- ניתוח פורמט ומיפוי — אנו לומדים את מקורות הנתונים שלך, מסכימים על שדות.
- עיצוב ארכיטקטורה — מגדירים Reader, Transformer, Writer.
- פיתוח Reader — מיישמים מפענחים זורמים לפורמטים שלך.
- תצורת מיפוי — מגדירים התאמות שדות.
- מימוש Writer — כותבים לאינפובלוקים, CRM, הזמנות.
- עיבוד זורם וסוכנים — מגדירים ייבוא ברקע.
- אימות ורישום לוגים — מגדירים כללי בדיקה ולוג שגיאות.
- ממשק ניהולי — יוצרים דף להפעלה וניטור.
- בדיקות ובדיקות עומס — מריצים על נתונים אמיתיים.
- תיעוד והדרכה — מעבירים לצוות.
למה להזמין מודול מותאם אישית?
אנו מומחי 1C-Bitrix מוסמכים עם ניסיון של 10+ שנים. כל מודול עובר בדיקות עומס. אתה מקבל אחריות לפעולה יציבה ותמיכה לאחר ההטמעה. לפי התיעוד הרשמי של 1C-Bitrix, הכלים הסטנדרטיים אינם מכסים פורמטים מותאמים אישית ולוגיקת עדכון מורכבת. המודול שלנו מספק חיסכון משמעותי בהשוואה לעיבוד ידני. לייעוץ והערכה מקדימה, צור איתנו קשר — נכין הצעה מותאמת לצרכים שלך.
לוח זמנים לפיתוח
| שלב | זמן |
|---|---|
| ארכיטקטורה, ממשקים, מתקין | יום אחד |
| Readers: CSV, XLSX, XML, JSON | יומיים |
| מיפוי, Transformer, מגדיר | יומיים |
| Writers לישויות Bitrix ספציפיות | 3 ימים |
| עיבוד זורם, סוכנים | יומיים |
| אימות, רישום לוגים, דוח שגיאות | יום אחד |
| ממשק ניהולי, בדיקות | יומיים |
סה"כ: מ-13 ימי עבודה. פורמטים או טרנספורמציות מורכבים — מוערכים בנפרד. קבל ייעוץ והערכה מקדימה לפרויקט שלך, כתוב לנו. הזמן מודול שפותר את הבעיה שלך.

