כל פרויקט חדש עם 1C מביא איתו הפתעה: מבנה ה-XML שונה מהתצורה הקודמת. השדה Наименование עשוי להיות חובה, בעוד Артикул עשוי להיעדר. קבוצות מוצרים מקוננות בצורה לא אחידה, ותמונות מאוחסנות בארכיון ZIP עם נתיבים בלתי צפויים. אין מפענח אוניברסלי — נדרש מנגנון שמתאים את עצמו לייצוא ספציפי. התמחותנו באינטגרציות 1C נמשכת למעלה מ-8 שנים, והשלמנו יותר מ-100 פרויקטים. הניסיון שלנו מאפשר לנו לצפות אזורים בעייתיים לפני תחילת הפיתוח ולהבטיח החלפה יציבה גם אם התצורה משתנה. אם אתם זקוקים לייבוא מוצרים אמין מ-1C, צרו קשר — ננתח את הייצוא שלכם תוך יום אחד.
CommerceML הוא תקן החלפת נתונים המומלץ על ידי 1C להעברת קטלוגים והזמנות בין מערכות. להלן נפרק מה זה.
מדוע ייבוא CommerceML דורש התאמה אישית?
אפילו עם ייצוא סטנדרטי, ייתכנו סטיות: GUID חסר, שמות מאפיינים לא תקניים, קינון קבוצות ביותר מ-3 רמות. ללא מיפוי שדות, האתר יאבד חלק מהנתונים או יקרוס עם שגיאה. אנו מגדירים את ההתאמה בין שדות ה-XML למודלים של האתר שלכם בשלב הניתוח.
תקן CommerceML
1C מייצאת נתונים בארכיוני ZIP עם מספר סוגים של קבצי XML:
import.zip
├── import.xml — каталог товаров, категории, свойства
├── offers.xml — склады, цены, остатки
└── import0.xml — продолжение каталога (при разбивке на файлы)מבנה של import.zip ├── import.xml — каталог товаров, категории, свойства ├── offers.xml — склады, цены, остатки └── import0.xml — продолжение каталога (при разбивке на файлы) :
<?xml version="1.0" encoding="UTF-8"?>
<КоммерческаяИнформация ВерсияСхемы="2.10">
<Каталог>
<Группы>
<Группа>
<Ид>f47ac10b-58cc-4372-a567-0e02b2c3d479</Ид>
<Наименование>Электроника</Наименование>
<Группы>
<Группа>
<Ид>6ba7b810-9dad-11d1-80b4-00c04fd430c8</Ид>
<Наименование>Смартфоны</Наименование>
</Группа>
</Группы>
</Группа>
</Группы>
<Товары>
<Товар>
<Ид>550e8400-e29b-41d4-a716-446655440000</Ид>
<Артикул>IPH-15-PRO-256</Артикул>
<Наименование>iPhone 15 Pro 256GB Natural Titanium</Наименование>
<ЗначенияСвойств>
<ЗначениеСвойства>
<Ид>color-property-id</Ид>
<Значение>Natural Titanium</Значение>
</ЗначениеСвойства>
</ЗначенияСвойств>
<Картинка>images/iphone15pro.jpg</Картинка>
</Товар>
</Товары>
</Каталог>
</КоммерческаяИнформация> כיצד מאורגן פרוטוקול ההחלפה?
1C יוזמת החלפה באמצעות בקשות HTTP לאתר. האתר מיישם handler בכתובות URL ספציפיות:
GET /1c-exchange/?type=catalog&mode=checkauth
GET /1c-exchange/?type=catalog&mode=init
POST /1c-exchange/?type=catalog&mode=file&filename=import.zip
GET /1c-exchange/?type=catalog&mode=import&filename=import.xmlרצף:
-
import.xml— 1C בודקת אימות -
<?xml version="1.0" encoding="UTF-8"?> <КоммерческаяИнформация ВерсияСхемы="2.10"> <Каталог> <Группы> <Группа> <Ид>f47ac10b-58cc-4372-a567-0e02b2c3d479</Ид> <Наименование>Электроника</Наименование> <Группы> <Группа> <Ид>6ba7b810-9dad-11d1-80b4-00c04fd430c8</Ид> <Наименование>Смартфоны</Наименование> </Группа> </Группы> </Группа> </Группы> <Товары> <Товар> <Ид>550e8400-e29b-41d4-a716-446655440000</Ид> <Артикул>IPH-15-PRO-256</Артикул> <Наименование>iPhone 15 Pro 256GB Natural Titanium</Наименование> <ЗначенияСвойств> <ЗначениеСвойства> <Ид>color-property-id</Ид> <Значение>Natural Titanium</Значение> </ЗначениеСвойства> </ЗначенияСвойств> <Картинка>images/iphone15pro.jpg</Картинка> </Товар> </Товары> </Каталог> </КоммерческаяИнформация>— מקבלת מגבלות (גודל קובץ מקסימלי, zip או לא) -
GET /1c-exchange/?type=catalog&mode=checkauth GET /1c-exchange/?type=catalog&mode=init POST /1c-exchange/?type=catalog&mode=file&filename=import.zip GET /1c-exchange/?type=catalog&mode=import&filename=import.xml— מעלה קבצי XML -
checkauth— מבקשת ייבוא של קובץ ספציפי
מימוש handler (PHP/Laravel)
class OnecExchangeController extends Controller
{
public function handle(Request $request)
{
$mode = $request->query('mode');
return match($mode) {
'checkauth' => $this->checkAuth($request),
'init' => $this->init(),
'file' => $this->uploadFile($request),
'import' => $this->importFile($request),
default => response('failure', 400),
};
}
private function checkAuth(Request $request): Response
{
// 1С отправляет логин/пароль в Basic Auth
if (!$this->validateCredentials($request)) {
return response("failure\nНеверный логин или пароль");
}
$cookie = Str::random(32);
Cache::put("1c_session_{$cookie}", true, 600);
return response("success\nCOOKIE\n1c_session={$cookie}");
}
private function init(): Response
{
return response(implode("\n", [
'zip=yes',
'file_limit=' . (32 * 1024 * 1024), // 32MB
]));
}
private function uploadFile(Request $request): Response
{
$filename = $request->query('filename');
$request->file('file')->storeAs('1c-exchange', $filename);
return response('success');
}
private function importFile(Request $request): Response
{
$filename = $request->query('filename');
ImportFrom1cJob::dispatch($filename);
return response('success');
}
} ניתוח XML
XML של 1C משתמש בתגיות קיריליות ב-namespace. ניתוח באמצעות SimpleXML/DOMDocument הוא פשוט:
class CommerceMLParser {
public function parseImport(string $xmlPath): void
{
$xml = simplexml_load_file($xmlPath, 'SimpleXMLElement', LIBXML_NOCDATA);
$catalog = $xml->Каталог;
// Рекурсивно обрабатываем дерево категорий
$this->processGroups($catalog->Группы->Группа);
// Товары
foreach ($catalog->Товары->Товар as $item) {
$this->processProduct($item);
}
}
private function processProduct(SimpleXMLElement $item): void
{
$guid = (string) $item->Ид;
$sku = (string) $item->Артикул;
$name = (string) $item->Наименование;
// Свойства товара
$attributes = [];
foreach ($item->ЗначенияСвойств->ЗначениеСвойства as $prop) {
$attributes[(string)$prop->Ид] = (string)$prop->Значение;
}
Product::updateOrCreate(
['onec_guid' => $guid],
['sku' => $sku, 'name' => $name, 'attributes' => $attributes]
);
}
}עיבוד הקובץ init (מחירים, מלאי) דומה. לאחר ניתוח המאפיינים, רשומות מסד הנתונים מתעדכנות:
public function parseOffers(string $xmlPath): void
{
$xml = simplexml_load_file($xmlPath);
$packageOffers = $xml->ПакетПредложений;
foreach ($packageOffers->Предложения->Предложение as $offer) {
$guid = (string) $offer->Ид;
$price = (float) $offer->Цены->Цена->ЦенаЗаЕдиницу;
$stock = (int) $offer->Количество;
Product::where('onec_guid', $guid)->update([
'price' => $price,
'stock' => $stock,
]);
}
} ייבוא אסינכרוני
קטלוגים גדולים (10,000+ פריטים) לא ניתנים לעיבוד סינכרוני — 1C מצפה לתגובה תוך שניות. פתרון:
- הקובץ נשמר מיד (
file) -
importמחזירclass OnecExchangeController extends Controller { public function handle(Request $request) { $mode = $request->query('mode'); return match($mode) { 'checkauth' => $this->checkAuth($request), 'init' => $this->init(), 'file' => $this->uploadFile($request), 'import' => $this->importFile($request), default => response('failure', 400), }; } private function checkAuth(Request $request): Response { // 1С отправляет логин/пароль в Basic Auth if (!$this->validateCredentials($request)) { return response("failure\nНеверный логин или пароль"); } $cookie = Str::random(32); Cache::put("1c_session_{$cookie}", true, 600); return response("success\nCOOKIE\n1c_session={$cookie}"); } private function init(): Response { return response(implode("\n", [ 'zip=yes', 'file_limit=' . (32 * 1024 * 1024), // 32MB ])); } private function uploadFile(Request $request): Response { $filename = $request->query('filename'); $request->file('file')->storeAs('1c-exchange', $filename); return response('success'); } private function importFile(Request $request): Response { $filename = $request->query('filename'); ImportFrom1cJob::dispatch($filename); return response('success'); } }מיד - העיבוד רץ ברקע באמצעות Laravel Queue / Celery
- ההתקדמות זמינה דרך endpoint נפרד או ממשק ניהול
כיצד מטפלים בתמונות במהלך הייבוא?
1C מייצאת נתיבי תמונות יחסית לארכיון. עיבוד:
- פתיחת הארכיון לתיקייה זמנית
- עיבוד תמונות (שינוי גודל, המרה ל-WebP)
- העלאה ל-CDN/S3
- עדכון רשומות מסד הנתונים
דוגמה לעיבוד תמונות
$image = Image::make(storage_path("tmp/{$path}"));
$image->fit(800, 800);
$image->encode('webp', 80);
$s3->put("products/{$guid}.webp", $image->encoded);
Product::where('onec_guid', $guid)->update(['image' => "products/{$guid}.webp"]); כיצד לטפל בקטלוגים >10,000 פריטים?
עבור קטלוגים גדולים, אנו משתמשים בניתוח streaming באמצעות class CommerceMLParser { public function parseImport(string $xmlPath): void { $xml = simplexml_load_file($xmlPath, 'SimpleXMLElement', LIBXML_NOCDATA); $catalog = $xml->Каталог; // Рекурсивно обрабатываем дерево категорий $this->processGroups($catalog->Группы->Группа); // Товары foreach ($catalog->Товары->Товар as $item) { $this->processProduct($item); } } private function processProduct(SimpleXMLElement $item): void { $guid = (string) $item->Ид; $sku = (string) $item->Артикул; $name = (string) $item->Наименование; // Свойства товара $attributes = []; foreach ($item->ЗначенияСвойств->ЗначениеСвойства as $prop) { $attributes[(string)$prop->Ид] = (string)$prop->Значение; } Product::updateOrCreate( ['onec_guid' => $guid], ['sku' => $sku, 'name' => $name, 'attributes' => $attributes] ); } } . זה מאפשר עיבוד קבצי XML עד 500 MB ללא גלישת זיכרון. תורי רקע (RabbitMQ, Redis) מבטיחים שהייבוא לא חוסם את האתר. אינטגרציה מותאמת אישית מפחיתה שגיאות החלפה פי 3 בהשוואה למודולים סטנדרטיים.
לוח זמנים ועלות
ייבוא מוצרים מתצורת 1C אחת (קטלוג + מחירים + מלאי): 8–12 ימי עסקים. כולל בדיקות על נתוני לקוח אמיתיים וניפוי מקרי קצה של תצורת 1C הספציפית. העלות מחושבת באופן אישי; החיסכון במילוי קטלוג ידני מקזז את ההשקעה בחודשים הראשונים.
מה כלול בעבודה
| שלב | תוצאה |
|---|---|
| ניתוח ייצוא 1C | תיאור מבנה XML, מיפוי שדות |
| פיתוח handler | Controller עם routes, מפענחים |
| הגדרת תורים | ייבוא רקע באמצעות Laravel Queue |
| עיבוד תמונות | שינוי גודל, WebP, העלאה ל-S3 |
| בדיקות | ייבוא קטלוג אמיתי, אימות מקרי קצה |
| תיעוד | מדריך מנהל להפעלת החלפה |
| הדרכה | הדגמת תהליך ייבוא, שאלות ותשובות |
| תמיכה לאחר השקה | 30 ימי ניטור ותיקון באגים |
השוואת גישות: מודולים מוכנים מול פיתוח מותאם אישית
| קריטריון | מודול מוכן (למשל, "1C-Bitrix: החלפת נתונים") | אינטגרציה מותאמת אישית |
|---|---|---|
| התאמה לתצורת 1C | מוגבל לתקן, אי-התאמות תכופות | שליטה מלאה במיפוי |
| ביצועים | תלוי במימוש המודול | מותאם לקטלוג שלכם |
| תמיכה בשדות לא תקניים | רק מאפיינים סטנדרטיים | כל שדה, טרנספורמציות נוספות |
| עלות | חינם או זול | השקעה, מוחזרת ביציבות |
| זמן יישום | מיום אחד | 8–12 ימים |
פיתוח מותאם אישית לרוב יוצא זול יותר בטווח הארוך — במיוחד לחברות עם נומנקלטורה מורכבת (1000+ פריטים, מאפיינים רבים). אנו מבטיחים החלפה יציבה גם אם תצורת 1C משתנה בתוך תקופת האחריות.
ללוח זמנים מדויק והערכת תקציב, צרו קשר עם המהנדסים שלנו. קבלו ייעוץ דרך הטופס באתר או בטלפון. ננתח את הייצוא שלכם ונציע פתרון אופטימלי.







