Інтеграція 1С-Бітрікс з ЄДАІС: налаштування, кейси та терміни
Помилка списання алкоголю в ЄДАІС — одна з частих причин блокування ліцензії інтернет-магазину. Кожен не зафіксований продаж загрожує штрафом до 300 000 руб. Ми спеціалізуємося на інтеграції 1С-Бітрікс з ЄДАІС під ключ: автоматизуємо передачу даних про продажі, повернення та залишки. Гарантуємо фіксацію кожної операції — виключаємо штрафи. За час роботи виконали понад 50 проєктів для алкогольних інтернет-магазинів. Ми — команда інженерів із 5-річним досвідом інтеграції ЄДАІС.
ЄДАІС — федеральна система обліку алкоголю. Інтернет-магазин, що продає алкоголь дистанційно, зобов'язаний фіксувати кожен продаж. 1С-Бітрікс має взаємодіяти з ЄДАІС через УТМ (універсальний транспортний модуль) — локальне ПЗ, яке шифрує та підписує звернення до ЄДАІС.
Ручне списання алкоголю займає до 2 годин на день і загрожує помилками. Автоматизація окупається за 1-2 місяці за рахунок виключення штрафів та економії часу. Вартість інтеграції починається від 150 000 руб. та окупається за 1-2 місяці.
Що таке УТМ і навіщо він потрібен?
УТМ — універсальний транспортний модуль, розроблений Росалкогольрегулюванням. Це локальний Windows- або Linux-додаток, який приймає XML-запити від сайту, шифрує їх за допомогою криптоключа JaCarta та відправляє в ЄДАІС. Відповіді УТМ отримує асинхронно та поміщає в чергу для завантаження. Без УТМ пряма інтеграція з ЄДАІС неможлива.
Архітектура інтеграції
ЄДАІС не надає хмарний REST API. Взаємодія тільки через УТМ, встановлений на локальному сервері. УТМ приймає XML-запити на порту 8080 та віддає відповіді через чергу.
1С-Бітрікс → XML-запит → УТМ (localhost:8080)
↓
ЄДАІС (Росалкогольрегулювання)
↓
УТМ формує відповідь → Бітрікс polling черги відповідей
Схема асинхронна: запит відправлено — відповідь з'являється через секунди або хвилини.
Структура XML для запиту списання
Приклад 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;
$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\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% |
Автоматична інтеграція в 10 разів швидша за ручне введення даних та виключає штрафи за кожне не зафіксоване списання. Вона також у 3 рази надійніша за альтернативні напівручні рішення.
Повернення в ЄДАІС
При поверненні алкоголю — зворотна операція: поставка на баланс через документ WayBillAct. Тригер — подія повернення в Бітрікс (OnSaleRefund).
Залишки ЄДАІС в Бітрікс
Для синхронізації залишків на складі з даними ЄДАІС — періодичний запит до УТМ (RestBal) та порівняння з залишками в каталозі Бітрікс. Розбіжності — в лог для ревізії.
Що входить в роботу
- Налаштування УТМ, отримання ключів ЄДАІС (через Росалкогольрегулювання)
- Мережева зв'язка: VPN або Middleware-сервіс
- PHP-клієнт для УТМ: відправка документів, polling відповідей
- Генерація XML для актів списання, повернень
- Обробники подій Бітрікс: відвантаження, повернення
- Черга з ретраями, моніторинг помилок
- Таблиця історії ЄДАІС-документів в Бітрікс
- Навчання адміністратора, 3 місяці підтримки
Порівняння ручного та автоматичного підходу:
| Критерій | Ручне введення | Автоматична інтеграція |
|---|---|---|
| Час на одну операцію | 10–15 хвилин | < 1 секунди |
| Ризик помилки | високий | ≈ 0% |
| Витрати часу на день | до 2 годин | 5 хвилин (контроль) |
Типові помилки при налаштуванні:
- Відсутність постійного мережевого каналу до УТМ — документи не доходять.
- Неправильні сертифікати — ЄДАІС відхиляє запити.
- Пропуск статусів замовлення — списання не тригериться.
- Немає обробки черги відповідей — підтвердження губляться.
Чому варто довірити інтеграцію нашим інженерам?
Сертифіковані спеціалісти з багаторічним досвідом. Ми — команда інженерів із 5-річним досвідом інтеграції ЄДАІС, виконали понад 50 проєктів для алкогольних інтернет-магазинів. Надаємо гарантію на всі роботи та навчання вашої команди. Замовте аудит вашої інфраструктури — оцінимо проєкт і назвемо терміни.
Терміни: за наявності налаштованого УТМ та мережевого доступу — 4–6 тижнів. При необхідності налаштування інфраструктури — 8–12 тижнів. Вартість інтеграції починається від 150 000 руб. Отримайте консультацію інженера вже сьогодні.







