Интеграция 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 заказов/день. Ежедневная задача: списание каждой реализованной единицы алкоголя с остатков ЕГАИС. При ошибке списания — заказ нельзя считать закрытым с точки зрения законодательства.
Проблемы проекта:
-
УТМ установлен на офисном Windows-компьютере, сайт — на хостинге. Прямого сетевого доступа нет.
-
Иногда УТМ не отвечал (перезагрузки, обновления), и документы терялись.
-
ЕГАИС возвращает AlcoCode — уникальный код каждой бутылки (для маркированного алкоголя), нужно хранить соответствие AlcoCode ↔ позиция заказа.
Решения:
-
VPN-туннель между хостингом и офисным сервером + Middleware на офисном сервере, который принимает запросы из Битрикс и передаёт в УТМ. Middleware на Node.js, работает как Windows-служба.
-
Очередь задач на стороне Битрикс: неподтверждённые документы переотправляются через 10 минут (до 5 попыток). При исчерпании попыток — уведомление администратору.
-
При получении подтверждения от ЕГАИС — сохраняем 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 недель.







