אוטומציה של ניהול אלכוהול: שילוב 1C-Bitrix ו-EGAIS

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

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

שאלות נפוצות

שילוב 1C-Bitrix עם EGAIS: הגדרה, מקרים ולוחות זמנים

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

EGAIS היא המערכת הפדרלית לניהול חשבונות אלכוהול. חנות מקוונת המוכרת אלכוהול מרחוק חייבת לרשום כל מכירה. 1C-Bitrix חייבת לתקשר עם EGAIS דרך מודול ההובלה האוניברסלי (UTM)—תוכנה מקומית שמצפינה וחותמת על בקשות ל-EGAIS.

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

מה זה UTM ולמה אתם צריכים אותו?

UTM—מודול ההובלה האוניברסלי, שפותח על ידי Rosalkogolregulirovanie. זהו יישום מקומי של Windows או Linux שמקבל בקשות XML מהאתר, מצפין אותן עם מפתח קריפטוגרפי JaCarta, ושולח אותן ל-EGAIS. UTM מקבל תשובות בצורה אסינכרונית ומציב אותן בתור לאחזור. ללא UTM, שילוב ישיר עם EGAIS בלתי אפשרי.

ארכיטקטורת השילוב

EGAIS אינו מספק REST API בענן. האינטראקציה היא רק דרך UTM המותקן על שרת מקומי. UTM מקבל בקשות XML על פורט 8080 ומחזיר תשובות דרך תור.

1С-Битрикс → XML-запрос → УТМ (localhost:8080) ↓
ЕГАИС (Росалкогольрегулирование) ↓
УТМ формирует ответ → Битрикс polling очереди ответов

התכנית היא אסינכרונית: הבקשה נשלחת—התשובה מגיעה תוך שניות או דקות.

מבנה XML לבקשת מחיקה

<!-- TTNQuery — запрос на списание при реализации -->
<?xml version="1.0" encoding="utf-8"?>
<ns:Documents xmlns:ns="urn:TNInformF2Reg:Documents" xmlns:oref="urn:TNInformF2:OrgInfo" version="2">
  <ns:Document>
    <ns:TTNInformF2Reg>
      <ns:Header>
        <ns:IsSSMark>0</ns:IsSSMark>
      </ns:Header>
      <ns:Content>
        <ns:Position>
          <ns:Identity>1</ns:Identity>
          <ns:ProductCode>0366700000002375890</ns:ProductCode>
          <ns:Quantity>1.000</ns:Quantity>
          <ns:InformF1RegId>TEST-TTN123456</ns:InformF1RegId>
          <ns:InformF2RegId>TEST-F2-123456</ns:InformF2RegId>
        </ns:Position>
      </ns:Content>
    </ns:TTNInformF2Reg>
  </ns:Document>
</ns:Documents>

לקוח PHP לאינטראקציה עם UTM

class EgaisUtmClient {
    private string $utmUrl;
    private string $orgRarId; // идентификатор организации в ЕГАИС

    public function __construct(string $utmUrl, string $orgRarId) {
        $this->utmUrl = $utmUrl; // http://localhost:8080
        $this->orgRarId = $orgRarId;
    }

    public function sendDocument(string $xmlDocument): string {
        $response = file_get_contents(
            $this->utmUrl . '/opt/in/TTNInformF2Reg',
            false,
            stream_context_create([
                'http' => [
                    'method' => 'POST',
                    'header' => 'Content-Type: application/xml',
                    'content' => $xmlDocument,
                ]
            ])
        );
        $replyXml = simplexml_load_string($response);
        return (string)$replyXml->ReplyId;
    }

    public function getReplyQueue(): array {
        $response = file_get_contents($this->utmUrl . '/opt/out');
        return $this->parseQueue($response);
    }

    public function getReply(string $replyId): ?array {
        $response = file_get_contents(
            $this->utmUrl . "/opt/out/TTNInformF2Reg/{$replyId}"
        );
        if (!$response) return null;
        $xml = simplexml_load_string($response);
        return [
            'result' => (string)$xml->Result->Conclusion,
            'comment' => (string)$xml->Result->ConclusionDate,
            'egais_id' => (string)$xml->Result->AccisesHeader->EGAISQuntId,
        ];
    }
}

עיבוד הזמנות ב-Bitrix

// Обработчик события смены статуса заказа
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
    'sale',
    'OnSaleStatusOrderChange',
    function (\Bitrix\Main\Event $event) {
        $order = $event->getParameter('ENTITY');
        $statusId = $event->getParameter('VALUE');
        if ($statusId !== 'shipped') return; // отправка только при статусе «Отгружен»
        $egaisItems = $this->getAlcoholItemsFromOrder($order);
        if (empty($egaisItems)) return;
        $client = new EgaisUtmClient(EGAIS_UTM_URL, EGAIS_ORG_RAR_ID);
        $xml = $this->buildActWriteOff($order, $egaisItems);
        $replyId = $client->sendDocument($xml);
        // Сохраняем replyId для отслеживания
        EgaisDocumentTable::add([
            'ORDER_ID' => $order->getId(),
            'REPLY_ID' => $replyId,
            'STATUS' => 'pending',
            'SENT_AT' => new \Bitrix\Main\Type\DateTime(),
        ]);
    }
);

איך להימנע משגיאות בחילופי EGAIS? מקרה מהניסיון שלנו

מהניסיון שלנו: חנות אלכוהול מקוונת, כ-300 הזמנות ביום. משימה יומית—למחוק כל יחידת אלכוהול שנמכרה ב-EGAIS. אם מחיקה נכשלת, ההזמנה לא יכולה להיחשב סגורה מבחינה חוקית.

אתגרי הפרויקט:

  1. UTM הותקן על מחשב Windows משרדי; האתר היה על אחסון. לא הייתה גישה ישירה לרשת.

  2. לפעמים UTM לא הגיב (אתחולים, עדכונים), מסמכים אבדו.

  3. EGAIS מחזיר AlcoCode—קוד ייחודי לכל בקבוק (לאלכוהול מסומן); היינו צריכים לשמור את ההתאמה AlcoCode ↔ פריט הזמנה.

פתרונות:

  1. מנהרת VPN בין האחסון לשרת המשרדי + תוכנת ביניים על השרת המשרדי שמקבלת בקשות מ-Bitrix ומעבירה ל-UTM. תוכנת הביניים ב-Node.js, רצה כשירות Windows.

  2. תור משימות בצד Bitrix: מסמכים שלא אושרו נשלחים שוב אחרי 10 דקות (עד 5 ניסיונות). אם נגמרו הניסיונות, מנהל מקבל הודעה.

  3. בקבלת אישור מ-EGAIS, אנו שומרים את EGAISQuntId בטבלה 1С-Битрикс → XML-запрос → УТМ (localhost:8080) ↓ ЕГАИС (Росалкогольрегулирование) ↓ УТМ формирует ответ → Битрикс polling очереди ответов , מקושרת לפריט ההזמנה ב-Bitrix.

מדד לפני השילוב אחרי
פעולות ידניות ב-EGAIS כ-2 שעות ביום 0 (רק ניטור)
עיכוב מחיקה מהמשלוח 1–3 שעות < 15 דקות
מחיקות שהוחמצו 3–5% בחודש < 0.1%

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

החזרות ב-EGAIS

כשאלכוהול מוחזר, הפעולה ההפוכה—הוספה למלאי—מבוצעת דרך מסמך <!-- TTNQuery — запрос на списание при реализации --> <?xml version="1.0" encoding="utf-8"?> <ns:Documents xmlns:ns="urn:TNInformF2Reg:Documents" xmlns:oref="urn:TNInformF2:OrgInfo" version="2"> <ns:Document> <ns:TTNInformF2Reg> <ns:Header> <ns:IsSSMark>0</ns:IsSSMark> </ns:Header> <ns:Content> <ns:Position> <ns:Identity>1</ns:Identity> <ns:ProductCode>0366700000002375890</ns:ProductCode> <ns:Quantity>1.000</ns:Quantity> <ns:InformF1RegId>TEST-TTN123456</ns:InformF1RegId> <ns:InformF2RegId>TEST-F2-123456</ns:InformF2RegId> </ns:Position> </ns:Content> </ns:TTNInformF2Reg> </ns:Document> </ns:Documents> . מופעל על ידי אירוע ההחזרה ב-Bitrix (class EgaisUtmClient { private string $utmUrl; private string $orgRarId; // идентификатор организации в ЕГАИС public function __construct(string $utmUrl, string $orgRarId) { $this->utmUrl = $utmUrl; // http://localhost:8080 $this->orgRarId = $orgRarId; } public function sendDocument(string $xmlDocument): string { $response = file_get_contents( $this->utmUrl . '/opt/in/TTNInformF2Reg', false, stream_context_create([ 'http' => [ 'method' => 'POST', 'header' => 'Content-Type: application/xml', 'content' => $xmlDocument, ] ]) ); $replyXml = simplexml_load_string($response); return (string)$replyXml->ReplyId; } public function getReplyQueue(): array { $response = file_get_contents($this->utmUrl . '/opt/out'); return $this->parseQueue($response); } public function getReply(string $replyId): ?array { $response = file_get_contents( $this->utmUrl . "/opt/out/TTNInformF2Reg/{$replyId}" ); if (!$response) return null; $xml = simplexml_load_string($response); return [ 'result' => (string)$xml->Result->Conclusion, 'comment' => (string)$xml->Result->ConclusionDate, 'egais_id' => (string)$xml->Result->AccisesHeader->EGAISQuntId, ]; } } ).

מלאי EGAIS ב-Bitrix

לסנכרון מלאי המחסן עם נתוני EGAIS, אנו שואלים את UTM מעת לעת (// Обработчик события смены статуса заказа \Bitrix\Main\EventManager::getInstance()->addEventHandler( 'sale', 'OnSaleStatusOrderChange', function (\Bitrix\Main\Event $event) { $order = $event->getParameter('ENTITY'); $statusId = $event->getParameter('VALUE'); if ($statusId !== 'shipped') return; // отправка только при статусе «Отгружен» $egaisItems = $this->getAlcoholItemsFromOrder($order); if (empty($egaisItems)) return; $client = new EgaisUtmClient(EGAIS_UTM_URL, EGAIS_ORG_RAR_ID); $xml = $this->buildActWriteOff($order, $egaisItems); $replyId = $client->sendDocument($xml); // Сохраняем replyId для отслеживания EgaisDocumentTable::add([ 'ORDER_ID' => $order->getId(), 'REPLY_ID' => $replyId, 'STATUS' => 'pending', 'SENT_AT' => new \Bitrix\Main\Type\DateTime(), ]); } ); ) ומשווים למלאי בקטלוג Bitrix. אי-התאמות מתועדות לבדיקה.

מה כלול בעבודה

  • הגדרת UTM, רכישת מפתח EGAIS (דרך Rosalkogolregulirovanie)
  • חיבור רשת: VPN או שירות תוכנת ביניים
  • לקוח PHP ל-UTM: שליחת מסמכים, בדיקת תשובות
  • יצירת XML למסמכי מחיקה והחזרה
  • מטפלי אירועים ב-Bitrix: משלוח, החזרה
  • תור עם ניסיונות חוזרים, ניטור שגיאות
  • טבלת היסטוריית מסמכי EGAIS ב-Bitrix
  • הדרכת מנהלים, 3 חודשי תמיכה

השוואה בין גישה ידנית לאוטומטית:

קריטריון הזנה ידנית שילוב אוטומטי
זמן לכל פעולה 10–15 דקות < שנייה אחת
סיכון לשגיאות גבוה ≈ 0%
זמן יומי שהושקע עד שעתיים 5 דקות (ניטור)

שגיאות הגדרה נפוצות:

  • אין חיבור רשת קבוע ל-UTM—מסמכים אף פעם לא מגיעים ל-EGAIS.
  • אישורים שגויים—EGAIS דוחה בקשות.
  • חסרים טריגרים של סטטוס הזמנה—מחיקה לא מתחילה.
  • אין עיבוד תור תשובות—אישורים אובדים.

למה להפקיד את השילוב בידי המהנדסים שלנו?

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

לוחות זמנים: עם UTM מוכן וגישה לרשת—4–6 שבועות. אם נדרשת הגדרת תשתית—8–12 שבועות. העלות נקבעת באופן אישי. קבלו ייעוץ עם מהנדס עוד היום.