Хабрахабр

Что спрятано внутри онлайн-касс: разработка фискального регистратора

На самом деле это хорошо отлаженный механизм не только с технической точки зрения, но и с точки зрения законодательства. Мало кто задумывается, делая покупки в магазине, как работает техника кассира. Все знают, что главное получить чек, а вот почему чек является фискальным документом, подтверждающим покупку — в основном знают только сами предприниматели.

В этой статье мы поделимся опытом разработки кассового аппарата и расскажем, как там всё устроено изнутри.

Старинный кассовый аппарат

1. Система: железо + софт у кассира

Весь программно-аппаратный комплекс, который установлен на рабочем месте кассира, может называться POS-системой или POS-терминалом, от английского Point of sale — место продажи.

Так как принципиальное отличие системы от терминала — это расположение фискальной памяти (ФП) или фискального накопителя (ФН): у POS-системы она встроена в печатающее устройство, а у POS-терминала находится в компьютерном блоке. Рассмотрим, как работает POS-система.

POS-система российской компании «ШТРИХ-М»
Типовой кассовый аппарат.

Обычно состоит из POS-компьютера, монитора и клавиатуры, чекового принтера, фискального регистратора, дисплея покупателя, денежного ящика и считывателя банковских карт. POS-система – программно-аппаратный комплекс, который работает на базе фискального регистратора. Типичный набор кассовых функций: учет и отпуск товара, прием и выдача денег, аннулирование покупки.

Самая интересная часть POS-системы — фискальный регистратор — это сердце системы и один из классов контрольно-кассовых машин (ККМ).

Он получает информацию по каналу связи, обрабатывает её и выводит на печать. В роли фискального регистратора выступает чековый принтер с встроенной фискальной памятью. Данные о кассовых операциях могут храниться в фискальной памяти сколь угодно долго, пока не понадобится их обнулить.

Для прямой передачи данных фискального регистратора в налоговую службу используется сервер оператора фискальных данных — ОФД — специального юрлица, которое отвечает за прием, обработку, хранение и передачу фискальных данных в налоговую службу.

В прошлом году российские предприниматели активно обсуждали переход на онлайн-кассы и отправку чеков в налоговую через ОФД в связи с принятием закона 54-ФЗ «О применении контрольно-кассовой техники».

Схема из статьи о 54-ФЗ и переходе на онлайн-кассы
Роль ОФД.

В Казахстане эту функцию выполняет Комитет государственных доходов Министерства финансов. ФНС — это Федеральная налоговая служба Российской Федерации. А в Беларуси – Министерство по налогам и сборам.

В РФ работает несколько ОФД, а в Казахстане – всего один, АО «Казахтелеком».

2. Законодательство: мировой онлайн-контроль касс

Онлайн-контроль за работой розничной торговли уже работает во многих странах: Южная Корея (2005 г.), Швеция (2008 г.), Канада (2010 г.), Польша (2011 г.), Хорватия (2013 г.). В 2015 году такой подход начал внедряться в Казахстане. А в Беларуси крайний срок подключения касс к системе дистанционного контроля выручки перенесли на 1 июля 2018 года (такой же срок намечен в России).

С 2015 года передачу чеков в налоговую по интернету начали продавцы топлива и алкоголя. Применение онлайн-касс в Казахстане регулируется главой 90 Налогового кодекса. Предусмотрен третий этап проекта. На втором этапе – с 2016 года – к системе подключили тех, кто занимается оптовой торговлей различными материалами и оборудованием; розничной продажей мебели, ПО и электроники; владельцев гостиниц, ресторанов, парикмахерских и кинотеатров.

задания для инженеров-разработчиков. Мы ссылаемся на законы не просто так, в них описаны обязательные технические требования к программно-аппаратным системам для сбора и отправки данных в налоговую, которые ложатся в основу тех. Так, например, в приказе министра финансов Республики Казахстан был опубликован список требований к контрольно-кассовой машине для передачи сведений о денежных расчетах, который нам очень пригодился для разработки фискального регистратора.

3. Устройство и бизнес-логика фискального регистратора

Наше базовое устройство для разработки – термальный принтер для печати чеков. Сборочная система – Buildroot. Программирование — на Qt.

В рамках проекта требовалось разработать:

1) техническое задание;
2) протокол обмена с POS-компьютером, условно назовем его протокол POS-C;
3) приложение-демон, управляющее устройством:

  • модуль обмена данными с сервером ОФД по протоколу ККТ (контрольно-кассовая техника);
  • модуль обмена данными с POS-компьютером по протоколу POS-C;
  • модуль управления печатью;
  • модуль управления интерфейсами связи;
  • модуль взаимодействия с базой данных;
  • веб-сервер.

1) Модуль обмена данными с сервером ОФД

Обмен устройства с сервером осуществляется по TCP/IP-протоколу. При этом взаимодействии устройство является клиентом, а ОФД – сервером. В качестве основы для кодирования и декодирования информации, передаваемой по протоколу ККТ, используется Protocol Buffers.

Разработчики сообщают, что их Protocol Buffers проще, компактнее и быстрее, чем XML, поскольку передает бинарные данные, которые оптимизированы под минимальный размер сообщения. Protocol Buffers (Protobuf) – протокол сериализации (передачи) структурированных данных, предложенный Google в качестве эффективной бинарной альтернативы текстовому формату XML.

Эти декларации сохраняются в файл с расширением .proto и компилируются в исходные коды на выбранном языке с помощью компилятора protoc. Формат сообщений в Protobuf описывается на специальном декларативном языке, который в чём-то напоминает декларацию структур в языке C++.

Протокол ККТ позволяет:

  • получать служебную информацию, информацию о кассе, номенклатурные данные;
  • отправлять данные фискального чека и отменять его;
  • получать отчеты о проделанных операциях;
  • контролировать денежные средства в кассе (изъять или внести наличные) и состояние смены (открыть или закрыть смену);
  • авторизовать оператора-кассира.

2) Модуль обмена данными с POS-компьютером

Общение с POS-компьютером реализовано по протоколам TCP/IP или HTTP, в зависимости от настроек в веб-интерфейсе, через порт USB Type-B с использованием технологии USB over Ethernet. При этом взаимодействии устройство является сервером, а POS-компьютер – клиентом. В случае использования TCP-соединения данные представлены в формате XML. А в случае HTTP-соединения используется POST-запрос, телом которого являются те же данные, что и при TCP-соединении.

Протокол POS-C позволяет:

  • настроить и протестировать связь с сервером ОФД;
  • получить информацию о состоянии устройства;
  • управлять периферией устройства (печать текста, звуковой сигнал, открытие или закрытие денежного ящика);
  • распечатать фискальный чек;
  • распечатывать отчеты о проделанных операциях;
  • контролировать денежные средства в кассе (изъять или внести наличные) и состояние смены (открыть или закрыть смену).

3) Модуль управления печатью

Взаимодействие с печатающим механизмом, звукоизлучателем и портом управления денежным ящиком проводится через библиотеку Python-ESCPOS, которая реализует протокол ESC/POS.

ESC/POS — один из вариантов ESC/P, разработанный для использования в POS-оборудовании. ESC/P (Epson Standard Code for Printers) — язык команд, разработанный Epson, для управления принтерами.

Виды печатаемых документов:

  • тестовая печать;
  • тестовый фискальный чек;
  • фискальный чек;
  • отмененный фискальный чек;
  • отчеты (Х-отчет, Z-отчет, полная контрольная лента, сокращенная контрольная лента, отчет по кассира, отчет по секциям);
  • внесение или изъятие наличных;
  • открытие смены;
  • информирование о состоянии устройства;
  • результат тестирования устройства;
  • чек регистрации устройства.


Тестирование принтера. Примеры чеков

4) Модуль управления интерфейсами связи

На борту устройства имеется DHCP-сервер для USB-интерфейса для связи с POS-компьютером. А для соединения с сервером ОФД могут использоваться интерфейсы LAN, WiFi и GPRS, переключение между которыми реализует демон управления сетевыми соединениями ConnMan. Он позволяет настроить соединения по каждому интерфейсу, чтобы в случае обрыва связи по активному интерфейсу быстро переключиться на другое соединение с меньшим приоритетом. Такое решение стабилизирует соединение с сервером ОФД в точках продажи с плохим подключением к интернету.

5) Модуль взаимодействия с базой данных

Хранение данных реализовано с использованием компактной встраиваемой СУБД SQLite и организовано в виде следующих таблиц:

  • данные по произведенным операциям;
  • авторизационные данные;
  • настройки секций;
  • настройки налогов;
  • настройки клише и подвала чека;
  • информационные сообщения от сервера ОФД.

6) Веб-сервер

Для реализации веб-сервера была выбрана библиотека Wt, C++ WebToolkit в силу следующих преимуществ:

  1. это кроссплатформенная свободная библиотека с поддержкой C++;
  2. малый размер web-сервера на C++ и низкое потребление ресурсов;
  3. удобство интеграции с существующими настольными приложениями и библиотеками C++;
  4. нет нужды в использовании HTML, CSS, JavaScript и др. технологиях, т.к. можно программировать с использованием виджетов, наподобие Qt;
  5. безопасность и кросс-браузерность web-приложений.

Весьма полезным для быстрого старта оказался WtDesigner.

Предназначение веб-интерфейса:

  1. настройка параметров;
  2. просмотр состояния устройства;
  3. обновление ПО.


Веб-интерфейс

4. Заключение

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

🙂 И теперь кажется, что наша инженерная команда уже никогда не сможет просто так прийти в магазин и что-то купить, не думая обо всех этих внутренностях онлайн-касс, протоколах для передачи данных, требованиях законодательства и выводе всей этой кухни на печать:
— Возьмите чек, пожалуйста!
— Спасибо, не надо!

S. P. И напоследок минутка юмора: британские уфологи из команды ArtAlienTV обнаружили на снимках марсохода Curiosity предмет, напоминающий старый кассовый аппарат.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть