Как подключить онлайн-кассу к веб-сайту или CRM-системе для автоматической печати чеков?

Программист Управленческий учет IT и автоматизация бизнеса
← На главную

Развитие веб-технологий привело к тому, что многие компании переносят свои CRM и учетные системы в браузер. Однако при этом возникает серьезная техническая задача: как связать веб-страницу, запущенную в браузере, с физическим торговым оборудованием, в частности с контрольно-кассовой машиной (ККМ)?

Особенно остро этот вопрос встал после введения требований по обязательному указанию в чеке реквизитов покупателя (наименование юридического лица и его ИНН) при расчетах между организациями и ИП. Вбивать эти данные вручную на кнопочной клавиатуре автономной кассы — это гарантированный способ получить массу ошибок и замедлить работу. В этой статье мы подробно разберем, как организовать автоматическую печать чеков со всеми необходимыми реквизитами напрямую из вашей веб-CRM.

Вариант 1. Перевод автономной кассы в режим фискального регистратора (на примере «Меркурий»)

Если у вас на рабочем месте установлена автономная кнопочная касса (например, популярные модели «Меркурий 115Ф», «130Ф», «185Ф»), она по умолчанию работает в автономном режиме и отправляет данные в ОФД через собственную SIM-карту. В таком режиме управлять ею с компьютера невозможно. Нам необходимо перевести её в режим фискального регистратора (ФР).

Разберем этот процесс по шагам:

  1. Обновление прошивки: Убедимся, что на кассе установлена актуальная версия программного обеспечения, поддерживающая работу в режиме ФР и новые форматы фискальных документов (ФФД 1.2).
  2. Изменение настроек кассы: В опциях кассового аппарата необходимо переключить режим работы. Например, для касс «Меркурий» в настройках опции №1 устанавливается значение 4 (режим ФР), а интерфейсный порт (USB или RS-232) настраивается на обмен данными с ПК.
  3. Установка службы INECRMAN: Производитель касс «Меркурий» предоставляет специальную службу-драйвер Incotex ECR Manager (INECRMAN). Мы устанавливаем её на локальный компьютер кассира, к которому по USB подключена касса.

Эта служба работает в фоновом режиме как локальный веб-сервер и по умолчанию принимает команды на адрес http://localhost:50010. Теперь наша веб-CRM может отправлять стандартные HTTP POST-запросы с JSON-пакетами прямо на локальный порт компьютера кассира, а служба будет транслировать их в кассу.

Проанализируем пример JSON-запроса для печати чека с реквизитами покупателя через INECRMAN:


{
  "command": "PrintReceipt",
  "receiptType": 1, 
  "rows": [
    {
      "name": "Продукция компании (Код товара 102)",
      "price": 1500.00,
      "quantity": 1,
      "tax": 20
    }
  ],
  "customerName": "ООО ТД Ромашка",
  "customerINN": "7712345678"
}

Вариант 2. Использование универсального ПО (KKMServer)

Если вы не хотите привязываться к конкретному производителю касс и писать уникальный код под каждый драйвер, отличным решением станет использование специализированного промежуточного ПО, такого как KKMServer. Это проверенный инструмент, который умеет общаться практически со всеми популярными моделями касс (АТЛ, Штрих-М, Меркурий и др.) и предоставляет единый API для веб-разработчиков.

Схема работы выглядит следующим образом:

  1. На компьютер кассира устанавливается программа KKMServer.
  2. Касса подключается к компьютеру по USB или сетевому интерфейсу.
  3. В интерфейсе KKMServer настраивается подключение к кассе. Программа запускает локальный веб-сервер (обычно на порту 5893).
  4. Ваша веб-CRM отправляет AJAX-запросы на http://localhost:5893 с командами на печать чека.

Рассмотрим пример JavaScript-кода для формирования и отправки чека на KKMServer:


const receiptData = {
    Command: "RegisterCheck",
    NumDevice: 0,
    InnKkm: "",
    TypeCheck: 0, // 0 - Приход
    IsCloud: false,
    ClientAddress: "client@email.ru",
    CustomerName: "ООО Вектор",
    CustomerINN: "7701020304",
    CheckStrings: [
        {
            Register: {
                Name: "Информационные услуги по договору №15",
                Quantity: 1,
                Price: 5000.00,
                Amount: 5000.00,
                Department: 1,
                Tax: 20
            }
        }
    ],
    CashierName: "Иванова А.А."
};

fetch('http://localhost:5893/Execute', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json'
    },
    body: JSON.stringify(receiptData)
})
.then(response => response.json())
.then(data => {
    if (data.Status === 0) {
        console.log("Чек успешно напечатан. Фискальный признак:", data.Sign);
    } else {
        console.error("Ошибка печати чека:", data.Error);
    }
})
.catch(error => console.error("Ошибка сети:", error));

Вариант 3. Обход проблемы Смешанного контента (Mixed Content)

При прямой отправке запросов из браузера на локальный хост (localhost) разработчики неизбежно сталкиваются с проблемой безопасности современных браузеров. Если ваша веб-CRM работает по защищенному протоколу HTTPS (например, https://my-crm.ru), браузер заблокирует любые попытки отправить запросы (Fetch / XHR) на незащищенный протокол HTTP локального сервера (http://localhost:5893). Это называется Mixed Content (Смешанный контент).

Выясним, какими способами можно обойти это ограничение:

1. Использование браузерного расширения

Тот же KKMServer предоставляет готовое расширение для браузеров Google Chrome / Yandex Browser. Данное расширение устанавливается у пользователя и берет на себя роль посредника. Скрипт на странице CRM общается с расширением через API браузера, а расширение без проблем пересылает команды на локальный порт, так как на него правила Mixed Content не распространяются.

2. Локальный SSL-сертификат

Вы можете настроить локальный веб-сервер (службу драйвера кассы) на работу по протоколу HTTPS. Для этого разработчики регистрируют специальное доменное имя, которое указывает на IP-адрес 127.0.0.1 (например, localhost.mycompany.ru), и выпускают для него валидный SSL-сертификат. Запросы из CRM будут идти на https://localhost.mycompany.ru:5893, и браузер пропустит их как безопасные.

3. Архитектура «Очередь чеков» через сервер (Рекомендуемый способ)

Это самый надежный и отказоустойчивый архитектурный паттерн, который полностью решает проблему безопасности и исключает зависимость от стабильности браузера кассира.

Разберем этот паттерн по шагам:

  1. Когда менеджер в CRM нажимает кнопку «Пробить чек», система не пытается напрямую связаться с кассой. Вместо этого веб-CRM отправляет запрос на свой собственный бэкенд-сервер, который создает запись в таблице базы данных ОчередьЧеков со статусом «Ожидает отправки».
  2. На рабочем компьютере кассира в фоновом режиме запускается легкий скрипт-демон (написанный на Python, Go или Node.js).
  3. Этот скрипт с периодичностью раз в 1-2 секунды обращается по защищенному HTTPS-соединению к API вашей CRM и спрашивает: «Есть ли новые чеки для кассы №1?».
  4. Если в базе появляется новый чек, бэкенд CRM передает его структуру скрипту.
  5. Скрипт локально передает данные в кассу (через установленный локально драйвер АТОЛ, Штрих-М или Меркурий), ожидает успешной печати, получает параметры чека (номер ФД, ФПД) и отправляет на бэкенд CRM отчет: «Чек напечатан успешно». Статус в БД меняется на «Выполнен».

Такой подход гарантирует, что даже если у кассира на секунду зависнет браузер или закроется вкладка CRM, чек все равно будет корректно обработан и напечатан.

Вариант 4. Родные Web-серверы производителей (АТОЛ и Штрих-М)

Если вы используете современное оборудование ведущих брендов, вам могут не потребоваться сторонние утилиты. Крупные производители уже встроили веб-серверы в свое системное ПО.

Драйвер ККТ АТОЛ v.10 (ДТО 10): включает в себя встроенный веб-сервер. При его активации на компьютере запускается служба, которая принимает фискальные команды в формате JSON. Вам достаточно изучить официальное руководство по интеграции ДТО 10 и отправлять структурированные JSON-запросы на локальный порт службы.

Web-сервер Штрих-М: аналогичное решение от компании «Штрих-М». Утилита позволяет управлять кассой по HTTP/JSON, предоставляя веб-интерфейс для настройки и REST API для отправки чеков из вашей CRM.

Вариант 5. Облачная фискализация (Cloud-кассы)

Если специфика вашего бизнеса позволяет не выдавать клиенту физический бумажный чек прямо в руки (например, вы торгуете услугами, принимаете оплату онлайн или ваши курьеры отправляют электронные чеки на email/SMS), оптимальным решением будет переход на облачную кассу.

В этом случае физическое устройство в офисе вообще не нужно. Вы арендуете кассу в специализированном дата-центре (сервисы вроде Атол Онлайн, ЧекОнлайн, Orange Data). Ваша CRM интегрируется с их облачным API напрямую «сервер-сервер»:


[ Веб-CRM ]  -- HTTPS POST (JSON) -->  [ API Облачного сервиса ]
                                                 |
                                       [ Физическая касса в ДЦ ]
                                                 |
                                       [ Отправка чека в ОФД ]
                                                 |
                                  [ Email / SMS чек покупателю ]

Этот способ полностью избавляет вас от необходимости настраивать локальные компьютеры, следить за USB-кабелями, решать проблемы с драйверами и бороться со смешанным контентом в браузерах.

Резюме

Мы проанализировали различные варианты подключения кассовой техники к веб-ресурсам. Выбор конкретного пути зависит от ваших ресурсов и используемого оборудования:

← На главную