Интеграция 1С-Битрикс с системой ЕГАИС

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Интеграция 1С-Битрикс с системой ЕГАИС
Средняя
~1-2 недели
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1181
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    813
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    747
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Интеграция 1С-Битрикс с системой ЕГАИС

ЕГАИС (Единая государственная автоматизированная информационная система) — федеральная система учёта производства и оборота алкоголя. Интернет-магазин, продающий алкоголь дистанционно, с 2021 года обязан фиксировать каждую продажу в ЕГАИС. Это означает: при создании заказа — списание товара с остатков ЕГАИС, при возврате — обратное зачисление. 1С-Битрикс должен взаимодействовать с ЕГАИС через УТМ (универсальный транспортный модуль) — локальное ПО, которое шифрует и подписывает обращения к ЕГАИС.

Архитектура интеграции

ЕГАИС не предоставляет облачный REST API. Взаимодействие только через УТМ, установленный на локальном сервере предприятия. УТМ принимает XML-запросы на порту 8080 (входящие) и отдаёт ответы на порту 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-клиент для взаимодействия с УТМ

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,
                ]
            ])
        );

        // УТМ возвращает ReplyId — идентификатор для отслеживания ответа
        $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\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(),
        ]);
    }
);

Кейс: интернет-магазин алкоголя

Онлайн-магазин вино-водочных изделий, ~300 заказов/день. Ежедневная задача: списание каждой реализованной единицы алкоголя с остатков ЕГАИС. При ошибке списания — заказ нельзя считать закрытым с точки зрения законодательства.

Проблемы проекта:

  1. УТМ установлен на офисном Windows-компьютере, сайт — на хостинге. Прямого сетевого доступа нет.

  2. Иногда УТМ не отвечал (перезагрузки, обновления), и документы терялись.

  3. ЕГАИС возвращает AlcoCode — уникальный код каждой бутылки (для маркированного алкоголя), нужно хранить соответствие AlcoCode ↔ позиция заказа.

Решения:

  1. VPN-туннель между хостингом и офисным сервером + Middleware на офисном сервере, который принимает запросы из Битрикс и передаёт в УТМ. Middleware на Node.js, работает как Windows-служба.

  2. Очередь задач на стороне Битрикс: неподтверждённые документы переотправляются через 10 минут (до 5 попыток). При исчерпании попыток — уведомление администратору.

  3. При получении подтверждения от ЕГАИС — сохраняем EGAISQuntId в таблице local_egais_alcocodes, связь с позицией заказа Битрикс.

Показатель До После
Ручные операции в ЕГАИС ~2 часа/день 0 (только мониторинг)
Задержка списания от факта отгрузки 1–3 часа < 15 минут
Пропущенные списания 3–5%/мес < 0.1%

Возвраты в ЕГАИС

При возврате алкоголя — обратная операция: постановка на баланс через документ WayBillAct. Триггер — событие возврата в Битрикс (OnSaleRefund).

Остатки ЕГАИС в Битрикс

Для синхронизации остатков на складе с данными ЕГАИС — периодический запрос к УТМ (RestBal) и сравнение с остатками в каталоге Битрикс. Расхождения — в лог для ревизии.

Состав работ

  • Настройка УТМ, получение ключей ЕГАИС (через РОСАЛКОГОЛЬРЕГУЛИРОВАНИЕ)
  • Сетевая связка: VPN или Middleware-сервис
  • PHP-клиент для УТМ: отправка документов, polling ответов
  • Генерация XML для актов списания, возвратов
  • Обработчики событий Битрикс: отгрузка, возврат
  • Очередь с ретраями, мониторинг ошибок
  • Таблица истории ЕГАИС-документов в Битрикс

Сроки: при наличии настроенного УТМ и сетевого доступа — 4–6 недель. При необходимости настройки инфраструктуры — 8–12 недель.