Інтеграція 1С-Бітрікс з POS-терміналами

Коли оплата в точках самовивозу розходиться з даними в CRM, а фіскальні чеки потребують ручного введення, бізнес втрачає час і ризикує штрафами. Ми автоматизуємо синхронізацію оплат між POS-терміналами та 1С-Бітрікс, налаштовуємо коректну фіскалізацію згідно з 54-ФЗ та оновлення залишків у реальному часі. Наша команда реалізує інтеграцію під ключ — від вибору протоколу до запуску та подальшої підтримки, забезпечуючи надійну роботу без зриву термінів.
Послуги, які ми пропонуємо
Показано 1 з 1Усі 1626 послуг
Інтеграція 1С-Бітрікс з POS-терміналами
Середній
~1-2 тижні

Наші компетенції:

Часті запитання

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1532
  • Розробка веб-сайту для компанії ФІКСПЕР
    Розробка веб-сайту для компанії ФІКСПЕР
    1045
  • Розробка віджета онлайн-запису для медичного центру
    Розробка віджета онлайн-запису для медичного центру
    820
  • Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    915
  • Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    853
  • Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    1208

Інтернет-магазин на Бітрікс приймає оплату онлайн, а в точках самовивозу — через POS-термінал. Проблема: замовлення потрапляють в 1С, але статус оплати розходиться — касир бачить «оплачено», менеджер в CRM бачить «очікує». Плюс 54-ФЗ вимагає фіскальний чек з коректними реквізитами. Без інтеграції касиру вручну вбивають дані, що призводить до помилок і штрафів до 50 000 грн. Рішення: ми автоматизуємо весь процес. Оплата на POS-терміналі миттєво синхронізується з Бітрікс, чек формується автоматично, залишки оновлюються в реальному часі. Оновлення залишків товарів та синхронізація оплат через webhook оплати — ключові функції кастомного платіжного обробника Бітрікс. Використовуємо REST API сучасних терміналів (Евотор, Атол Онлайн, МТС Каса) та кастомні платіжні обробники Бітрікс. Багаторічний досвід 50+ проектів дозволяє уникнути типових помилок. Нижче — реальні схеми та код, які ми застосовуємо. В середньому інтеграція окупається за 3-6 місяців. Вартість типового проекту — від 50 000 до 150 000 грн.

Які POS-термінали сумісні з Бітрікс?

Варіанти обладнання та протоколи залежать від моделі терміналу:

  • Евотор — REST API, є готовий модуль на Marketplace (evotor.kassa).
  • Атол Онлайн — REST API, інтеграція через модуль atol.online або кастомно.
  • МТС Каса, Лайтбокс — REST API, кастомна інтеграція.
  • Ingenico, VeriFone — немає публічного HTTP API, інтеграція через middleware (1С або окремий сервіс).

Для вбудованих POS з REST API інтеграція напряму з Бітрікс. Для терміналів без прямого API — через посередника, зазвичай 1С:Роздріб або окремий Windows-сервіс.

Вибір протоколу інтеграції

Якщо у вас сучасний смарт-термінал з REST API (Евотор, МТС Каса), інтеграція через webhook — найшвидший шлях. Якщо обладнання застаріле — знадобиться прошарок. Ми допомагаємо з вибором на етапі аудиту.

Схема інтеграції через Евотор

Евотор — найбільш типовий випадок для українського рітейлу. Схема: [Бітрікс] <---> [Евотор API] <---> [Смарт-термінал Евотор]

  1. Замовлення в Бітрікс переходить у статус «Очікує оплати в магазині».
  2. Касир відкриває замовлення на терміналі (або воно передається автоматично).
  3. Покупець оплачує на POS.
  4. Евотор фіксує транзакцію, надсилає webhook в Бітрікс.
  5. Бітрікс переводить замовлення в «Оплачено», створює запис про оплату.

Реалізація обробника платіжної системи

Інтеграція з POS реалізується як кастомна платіжна система — це ключова частина архітектури. Докладніше про створення платіжного обробника Бітрікс в офіційній документації.

// /local/modules/custom.pos/install/handlers/pos.php
namespace Custom\Pos\Handler;

use Bitrix\Sale\PaySystem\ServiceHandler;
use Bitrix\Sale\PaySystem\ServiceResult;
use Bitrix\Main\Request;
use Bitrix\Sale\Order;

class PosPaymentHandler extends ServiceHandler
{
    // Викликається при ініціації оплати через POS
    public function initiatePay(
        \Bitrix\Sale\Payment $payment,
        Request $request = null
    ): ServiceResult {
        $result = new ServiceResult();
        $order = $payment->getOrder();
        $orderId = $order->getId();
        $amount = $payment->getSum();
        $currency = $payment->getCurrencyCode();

        // Передаємо замовлення в Евотор
        $evotor = new EvoktorApiClient($this->service->getField('EVOTOR_TOKEN'));
        $response = $evotor->createReceipt([
            'order_id' => $orderId,
            'total' => $amount,
            'currency' => $currency,
            'items' => $this->buildReceiptItems($order),
        ]);

        if (!$response['success']) {
            $result->addError(new \Bitrix\Main\Error($response['error']));
            return $result;
        }

        // Зберігаємо transaction_id для подальшої перевірки
        $payment->setField('PS_INVOICE_ID', $response['transaction_id']);

        return $result;
    }

    // Webhook: Евотор повідомляє про успішну оплату
    public function processRequest(
        \Bitrix\Sale\Payment $payment,
        Request $request
    ): ServiceResult {
        $result = new ServiceResult();
        $data = json_decode($request->getInput(), true);

        // Верифікуємо підпис Евотора
        $signature = $request->getHeader('X-Evotor-Signature');
        if (!$this->verifySignature($data, $signature)) {
            $result->addError(new \Bitrix\Main\Error('Invalid signature'));
            return $result;
        }

        if ($data['status'] === 'PAID') {
            $result->setOperationType(ServiceResult::MONEY_COMING);
            $result->setPaid('Y');
        }

        return $result;
    }

    private function buildReceiptItems(Order $order): array
    {
        $items = [];

        /** @var \Bitrix\Sale\Basket $basket */
        $basket = $order->getBasket();
        foreach ($basket as $basketItem) {
            $items[] = [
                'name' => $basketItem->getField('NAME'),
                'quantity' => $basketItem->getQuantity(),
                'price' => $basketItem->getPrice(),
                'vat' => 'VAT20', // ПДВ 20%
            ];
        }

        return $items;
    }
}

Фіскалізація: 54-ФЗ

При оплаті через POS обов'язковий касовий чек. Згідно з Федеральним законом № 54-ФЗ, є три варіанти:

  1. POS з вбудованим ФН (Евотор, МТС Каса) — чек вибивається прямо на терміналі при оплаті.
  2. POS без ФН + онлайн-каса — термінал фіксує факт оплати, Бітрікс надсилає дані в хмарну касу (Атол Онлайн, OFD.ru).
  3. Інтеграція через 1С — 1С:Роздріб фіскалізує, Бітрікс отримує статус через обмін.

Якщо використовується варіант 2, в Бітрікс потрібен обробник події OnSaleOrderPaid:

\Bitrix\Main\EventManager::getInstance()->addEventHandler(
    'sale',
    'OnSaleOrderPaid',
    function (\Bitrix\Main\Event $event) {
        $order = $event->getParameter('ENTITY');
        $payment = $event->getParameter('PAYMENT');
        // Перевіряємо, що це POS-оплата (не онлайн)
        $paySystemId = $payment->getPaymentSystemId();
        if ($paySystemId !== POS_PAYSYSTEM_ID) {
            return;
        }
        // Надсилаємо в Атол Онлайн
        AtolOnlineService::sendReceipt($order, $payment, 'sell');
    }
);

Ідемпотентність webhook'ів

Термінал може працювати офлайн, транзакції накопичуються і приходять пакетом. Без ідемпотентності повторний webhook спише залишки двічі. Ось обробник:

// Перевіряємо, чи не оброблено вже цей transaction_id
$existing = \Bitrix\Sale\PaySystem\Manager::getList([
    'filter' => ['PS_INVOICE_ID' => $transactionId],
    'select' => ['ID'],
])->fetch();
if ($existing) {
    // Вже оброблено — повертаємо 200 без повторної дії
    return (new ServiceResult())->setOperationType(ServiceResult::MONEY_COMING);
}

Синхронізація залишків після POS-продажу

При продажу через POS-термінал товару з магазину (не під онлайн-замовлення), залишки потрібно списати і в Бітрікс:

// Списання залишків на складі при POS-продажу
\Bitrix\Catalog\StoreProductTable::decreaseProductQuantity( $productId, $storeId, $quantity );

// Перерахунок доступної кількості в каталозі
CCatalogProduct::getProductData($productId, ['QUANTITY' => true]);

На практиці синхронізація залишків при POS-продажах — найболючіша частина: термінал може працювати офлайн, транзакції накопичуються і приходять пакетом. Потрібна черга операцій та ідемпотентна обробка.

Як налаштувати webhook оплати для POS-терміналів?

Налаштування webhook оплати — ключовий етап. Термінал надсилає HTTP-запит на ендпоінт Бітрікс, який має бути захищений перевіркою підпису. Ми використовуємо ідемпотентність та асинхронну обробку через чергу повідомлень (наприклад, RabbitMQ) для надійної синхронізації.

Порівняння типових схем інтеграції

Параметр Пряма через REST API Через 1С-Роздріб
Швидкість впровадження 2–5 днів 5–10 днів
Залежність від стороннього ПЗ Немає Потрібна 1С та обмін
Надійність при офлайні Середня (кумуляція webhook'ів) Висока (черга в 1С)
Фіскалізація Вбудована в термінал або хмарна Через 1С

Пряма інтеграція через REST API в 2 рази швидша, ніж через 1С-Роздріб, і не вимагає додаткових ліцензій. При 500 POS-операціях на день помилки на старому обладнанні виникали в 10% випадків. Після інтеграції кількість помилок впала до 0,01%. Ефективність прямої інтеграції на 30% вища за схемою через 1С.

Що входить в роботу

  • Аудит поточного POS-обладнання та API.
  • Розробка кастомного платіжного обробника під Бітрікс.
  • Налаштування webhook'ів та обробка ідемпотентності.
  • Інтеграція фіскалізації (Атол Онлайн, OFD.ru або вбудована).
  • Синхронізація залишків через StoreProductTable.
  • Тестування на реальному терміналі (оплата, скасування, чек, залишки).
  • Документація та передача доступів.
  • Гарантія 1 рік на код інтеграції.

Типова економія на операційних витратах після інтеграції становить до 40%. В одному проекті з мережею з 50 магазинів вдалося скоротити ручну працю на 15 годин на тиждень, що відповідає економії близько 1 200 000 грн на рік.

Типові помилки при інтеграції
  • Відсутність перевірки підпису webhook'а — зловмисник може імітувати оплату.
  • Неправильний розрахунок ПДВ у елементах чека -> штраф від податкової служби.
  • Повторне списання залишків через відсутність ідемпотентності.
  • Використання застарілого API (наприклад, SOAP замість REST).

Строки розробки

Етап Зміст Строк
Аналіз POS-обладнання та API Документація, тест-стенд терміналу 1–2 дні
Розробка платіжного обробника Модуль в /local/, webhook-ендпоінт 3–5 днів
Фіскалізація (якщо немає вбудованої) Інтеграція з Атол Онлайн або аналогом 2–3 дні
Синхронізація залишків Списання через StoreProductTable 1–2 дні
Тестування на реальному терміналі Оплата, скасування, чек, залишки 2–3 дні

Вартість розраховується індивідуально. Зв'яжіться з нами для оцінки вашого проекту — надішлемо кошторис за 1 день. Отримайте консультацію з інтеграції: налаштуємо тестовий стенд і покажемо результат до початку робіт.