Хабрахабр

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

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

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

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

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 предмет, напоминающий старый кассовый аппарат.

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

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

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

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

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