שילוב 1C-Bitrix עם צ'סטני זנאק: אוטומציה של סימון
חנויות מקוונות המוכרות מוצרים מסומנים עומדות בפני דרישות מחמירות: בעת מכירה, יש להוציא את קוד Data Matrix ממחזור. הזנה ידנית של קודים מובילה לשגיאות, קנסות ובזבוז זמן. הקנס על אי-הוצאת קוד ממחזור יכול להגיע ל-2.7–3.9 אלף דולר לגוף משפטי לפי סעיף 15.12 לחוק המנהלי, ולכן אוטומציה היא לא נוחות אלא הכרח. אנו מבצעים אוטומציה של תהליך זה—מקבלת סחורה במחסן ועד קבלה פיסקלית. הצוות שלנו ביצע למעלה מ-50 פרויקטים של שילוב עם צ'סטני זנאק על 1C-Bitrix, ולכן אנו מכירים את כל המלכודות. קבלו ייעוץ להערכת התקציב ולוח הזמנים של השילוב.
איך פועלת הוצאת קוד ממחזור דרך API?
העיקרון פשוט: בעת משלוח הזמנה, המערכת שולחת בקשה ל-API של צ'סטני זנאק, ומעבירה את קודי הסימון. אם יש לכם OFD מוגדר, ההוצאה ממחזור מתבצעת אוטומטית דרך הקבלה; אם לא, ישירות דרך POST /api/v3/lk/documents/create. בשני המקרים, הקודים מקבלים סטטוס sold ואינם ניתנים לשימוש חוזר.
class ChestnyZnakClient {
private string $baseUrl = 'https://ismp.crpt.ru/api/v3';
private string $token;
public function __construct(private string $inn, private string $certSerial) {
$this->token = $this->authenticate();
}
private function authenticate(): string {
// Шаг 1: получаем данные для подписи
$authData = $this->httpGet('/auth/cert/key');
$uuid = $authData['uuid'];
$data = $authData['data'];
// Шаг 2: подписываем данные КЭП
$signature = $this->signWithCert($data, $this->certSerial);
// Шаг 3: получаем токен
$tokenResponse = $this->httpPost('/auth/cert/', [
'uuid' => $uuid,
'data' => $data,
'signature' => base64_encode($signature),
]);
return $tokenResponse['token'];
}
public function withdrawCodes(array $codes, string $docType = 'SELL'): string {
$documents = [];
foreach ($codes as $code) {
$documents[] = [
'certificateDocument' => '',
'certificateDocumentDate' => '',
'certificateDocumentNumber' => '',
'tnvedCode' => '',
'uitCode' => $code,
'uituCode' => '',
];
}
$response = $this->httpPost('/lk/documents/create', [
'document_format' => 'MANUAL',
'product_document' => base64_encode(json_encode([
'participantInn' => $this->inn,
'documentFormat' => 'MANUAL',
'type' => $docType, // SELL, RETURN, LOSS
'transferDate' => date('Y-m-d'),
'products' => $documents,
])),
'signature' => $this->signPayload(...),
'type' => $docType,
]);
return $response['documentId'];
}
} למה חשוב לאחסן קודים ב-ORM של Bitrix?
טבלה פשוטה במסד הנתונים לא תספק את הביצועים הנדרשים. באמצעות class ChestnyZnakClient { private string $baseUrl = 'https://ismp.crpt.ru/api/v3'; private string $token; public function __construct(private string $inn, private string $certSerial) { $this->token = $this->authenticate(); } private function authenticate(): string { // Шаг 1: получаем данные для подписи $authData = $this->httpGet('/auth/cert/key'); $uuid = $authData['uuid']; $data = $authData['data']; // Шаг 2: подписываем данные КЭП $signature = $this->signWithCert($data, $this->certSerial); // Шаг 3: получаем токен $tokenResponse = $this->httpPost('/auth/cert/', [ 'uuid' => $uuid, 'data' => $data, 'signature' => base64_encode($signature), ]); return $tokenResponse['token']; } public function withdrawCodes(array $codes, string $docType = 'SELL'): string { $documents = []; foreach ($codes as $code) { $documents[] = [ 'certificateDocument' => '', 'certificateDocumentDate' => '', 'certificateDocumentNumber' => '', 'tnvedCode' => '', 'uitCode' => $code, 'uituCode' => '', ]; } $response = $this->httpPost('/lk/documents/create', [ 'document_format' => 'MANUAL', 'product_document' => base64_encode(json_encode([ 'participantInn' => $this->inn, 'documentFormat' => 'MANUAL', 'type' => $docType, // SELL, RETURN, LOSS 'transferDate' => date('Y-m-d'), 'products' => $documents, ])), 'signature' => $this->signPayload(...), 'type' => $docType, ]); return $response['documentId']; } } , אנו מקבלים אינדקסים, אירועים וקישור להזמנות. זה מאפשר לשמור קוד ספציפי בעת הוספת פריט לעגלה ולשחרר אותו בעת ביטול. גישה זו מהירה פי 2 בהשוואה לניהול ידני של סטטוסים באמצעות שאילתות SQL.
class MarkingCodeTable extends \Bitrix\Main\ORM\Data\DataManager
{
public static function getTableName(): string
{
return 'local_marking_codes';
}
public static function getMap(): array
{
return [
new \Bitrix\Main\ORM\Fields\IntegerField('ID', ['primary' => true, 'autocomplete' => true]),
new \Bitrix\Main\ORM\Fields\IntegerField('PRODUCT_ID'),
// ID товара в каталоге
new \Bitrix\Main\ORM\Fields\StringField('CODE'),
// Data Matrix код
new \Bitrix\Main\ORM\Fields\StringField('STATUS'),
// 'in_stock', 'in_order', 'sold'
new \Bitrix\Main\ORM\Fields\IntegerField('ORDER_ID'),
// null пока не в заказе
new \Bitrix\Main\ORM\Fields\IntegerField('BASKET_ITEM_ID'),
new \Bitrix\Main\ORM\Fields\DatetimeField('WITHDRAWAL_DATE'),
];
}
}כאשר פריט מתווסף להזמנה, קוד סימון ספציפי נשמר. בעת ביטול, הקוד חוזר לסטטוס DataManager.
הוצאת קוד ממחזור בעת משלוח
// Обработчик события отгрузки заказа
public function handleOrderShipped(\Bitrix\Sale\Order $order): void
{
$markedItems = $this->getMarkedItemsFromOrder($order);
if (empty($markedItems)) return;
$codes = array_column($markedItems, 'CODE');
$chestnyZnak = new ChestnyZnakClient(CZ_INN, CZ_CERT_SERIAL);
$documentId = $chestnyZnak->withdrawCodes($codes, 'SELL');
// Обновляем статус кодов
foreach ($markedItems as $item) {
MarkingCodeTable::update($item['ID'], [
'STATUS' => 'sold',
'ORDER_ID' => $order->getId(),
'WITHDRAWAL_DATE' => new \Bitrix\Main\Type\DateTime(),
'CZ_DOCUMENT_ID' => $documentId,
]);
}
} מקרה מבחן מהפרקטיקה שלנו: חנות בגדים
הלקוח שלנו הוא חנות מקוונת לבגדי נשים עם כ-1,500 הזמנות בחודש. המוצרים כפופים לסימון חובה. בעבר, הוצאת קוד ממחזור נעשתה ידנית דרך החשבון האישי של צ'סטני זנאק—זה לקח 1.5–2 שעות ביום, ושגיאות (קוד שגוי, החזרות שהוחמצו) היו כ-3%.
יישמנו אוטומציה: ייבוא קודים מ-Excel של הספק, שמירה בעת הזמנה, הוצאה אוטומטית ממחזור בעת משלוח, והחזרה בעת החזרה. תוצאה—חיסכון של 40% בזמן, שגיאות ירדו ל-0.3%. חיסכון בעלויות תפעוליות הסתכם בכ-1.6–2.3 אלף דולר בשנה.
| מדד | לפני | אחרי |
|---|---|---|
| הוצאת קוד ידנית ממחזור | 1.5–2 שעות/יום | אוטומטי |
| שגיאות הוצאה ממחזור (קוד שגוי) | ~3%/חודש | < 0.3% |
| החזרות לצ'סטני זנאק | הוחמצו | אוטומטי בעת עיבוד החזרה |
איך לבדוק את הקוד לפני מכירה?
לפני משלוח—בדקו את סטטוס הקוד בצ'סטני זנאק (האם הוא כבר הוצא ממחזור בדרך אחרת):
$codeInfo = $chestnyZnak->httpGet("/facade/identificationtools?uitCode={$code}");
if ($codeInfo['status'] !== 'IN_CIRCULATION') {
throw new \Exception("Код {$code} не находится в обороте: {$codeInfo['status']}");
}טעויות אינטגרציה נפוצות:
- חוסר טיפול בהחזרות: קודים נשארים בסטטוס
class MarkingCodeTable extends \Bitrix\Main\ORM\Data\DataManager { public static function getTableName(): string { return 'local_marking_codes'; } public static function getMap(): array { return [ new \Bitrix\Main\ORM\Fields\IntegerField('ID', ['primary' => true, 'autocomplete' => true]), new \Bitrix\Main\ORM\Fields\IntegerField('PRODUCT_ID'), // ID товара в каталоге new \Bitrix\Main\ORM\Fields\StringField('CODE'), // Data Matrix код new \Bitrix\Main\ORM\Fields\StringField('STATUS'), // 'in_stock', 'in_order', 'sold' new \Bitrix\Main\ORM\Fields\IntegerField('ORDER_ID'), // null пока не в заказе new \Bitrix\Main\ORM\Fields\IntegerField('BASKET_ITEM_ID'), new \Bitrix\Main\ORM\Fields\DatetimeField('WITHDRAWAL_DATE'), ]; } }ואובדים. - פורמט Data Matrix שגוי—ה-API של צ'סטני זנאק מחמיר לגבי מבנה.
- פגיית סשן של חתימה דיגיטלית: יש לרענן טוקנים באופן קבוע.
- חוסר ניטור: מסמכים עלולים להיתקע בסטטוס
in_stockללא התראה.
שילוב שלב אחר שלב
- רישום בצ'סטני זנאק, קבלת חתימה דיגיטלית, הגדרת אימות.
- פיתוח לקוח PHP לעבודה עם API (אימות, יצירת מסמכים).
- יצירת טבלת ORM לאחסון קודי סימון.
- ייבוא קודים מספקים (Excel, CSV, 1C).
- שילוב עם ניהול מלאי: שמירה ושחרור קודים.
- הוצאה אוטומטית ממחזור בעת משלוח וטיפול בהחזרות.
- ניטור סטטוסי מסמכים והתראות שגיאה.
- בדיקות והדרכת צוות.
| שלב | משך |
|---|---|
| שילוב בסיסי (הוצאה ממחזור, החזרה) | 4–6 שבועות |
| עם פונקציונליות מורחבת (ייבוא, מלאי, סריקה) | 10–16 שבועות |
מה כלול בעבודה?
- רישום בצ'סטני זנאק, קבלת חתימה דיגיטלית, חיבור API
- פיתוח לקוח PHP לאימות וניהול מסמכים
- יצירת טבלת ORM לאחסון קודי סימון
- ייבוא קודים מספקים (Excel, CSV, 1C)
- שילוב עם ניהול מלאי: שמירת קודים בעת הזמנה
- הוצאה אוטומטית ממחזור בעת משלוח והחזרה בעת החזרה
- ניטור סטטוסי מסמכים ושגיאות
- תיעוד והדרכת צוות
- תמיכה לאחר השקה ועדכונים בעת שינויי API של צ'סטני זנאק
למה לבחור בנו?
- 7+ שנות ניסיון בפיתוח 1C-Bitrix ושילובי צ'סטני זנאק
- מעל 50 פרויקטים מוצלחים לחנויות מקוונות בגדלים שונים
- גישה אישית: אנו לא משתמשים בפתרונות תבניתיים; אנו מתאימים את השילוב לתהליך העסקי שלכם
- דיווח שקוף: אתם רואים את הסטטוס של כל מסמך צ'סטני זנאק בזמן אמת
"לפי API של צ'סטני זנאק, אוטומציה מפחיתה את מספר שגיאות ההוצאה ממחזור פי 10." — תיעוד רשמי.
לוח זמנים ועלות
שילוב בסיסי (הוצאה ממחזור בעת מכירה, החזרה) — 4–6 שבועות. עם פונקציונליות מורחבת (ייבוא קודים, ניהול מלאי, סריקה ניידת) — 10–16 שבועות. העלות המדויקת נקבעת לאחר ביקורת של הפרויקט שלכם. בקשו ייעוץ—נכין הערכת עלות ומפת דרכים.
אוטומציה של סימון לא רק מבטלת קנסות אלא גם מאיצה את עיבוד ההזמנות. צרו קשר כדי ליישם את השילוב בחנות שלכם.

