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

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

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

Часто задаваемые вопросы

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1534
  • Разработка веб-сайта для компании ФИКСПЕР
    Разработка веб-сайта для компании ФИКСПЕР
    1049
  • Разработка виджета онлайн-записи на прием для медицинского центра
    Разработка виджета онлайн-записи на прием для медицинского центра
    820
  • Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    920
  • Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    858
  • Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    1209

Интернет-магазин на Битрикс принимает оплату онлайн, а в точках самовывоза — через POS-терминал. Проблема: заказы попадают в 1С, но статус оплаты расходится — кассир видит «оплачен», менеджер в CRM видит «ожидает». Плюс 54-ФЗ требует фискальный чек с корректными реквизитами. Без интеграции кассиру вручную вбивают данные, что ведёт к ошибкам и штрафам до $450–650. Решение: мы автоматизируем весь процесс. Оплата на POS-терминале мгновенно синхронизируется с Битрикс, чек формируется автоматически, остатки обновляются в реальном времени. Используем REST API современных терминалов (Эвотор, Атол Онлайн, МТС Касса) и кастомные платёжные обработчики Битрикс. Многолетний опыт 50+ проектов позволяет избежать типовых ошибок. Ниже — реальные схемы и код, которые мы применяем. В среднем интеграция окупается за 3-6 месяцев.

Какие 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-продажах — наиболее болезненная часть: терминал может работать офлайн, транзакции накапливаются и приходят пакетом. Нужна очередь операций и идемпотентная обработка.

Сравнение типовых схем интеграции

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

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

Что входит в работу

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

Типичная экономия на операционных расходах после интеграции составляет до 40%. В одном проекте с сетью из 50 магазинов удалось сократить ручной труд на 15 часов в неделю, что соответствует экономии около $11k–16k в год.

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

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

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

Стоимость рассчитывается индивидуально. Свяжитесь с нами для оценки вашего проекта — пришлём смету за 1 день. Получите консультацию по интеграции: настроим тестовый стенд и покажем результат до начала работ.