- PVSM.RU - https://www.pvsm.ru -

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

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

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

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

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

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

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

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

Что спрятано внутри онлайн-касс: разработка фискального регистратора - 3
Типовой кассовый аппарат. POS-система российской компании «ШТРИХ-М»

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

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

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

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

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

Что спрятано внутри онлайн-касс: разработка фискального регистратора - 4
Роль ОФД. Схема из статьи о 54-ФЗ и переходе на онлайн-кассы [1]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Что спрятано внутри онлайн-касс: разработка фискального регистратора - 5
Тестирование принтера. Примеры чеков

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Автор: Команда компании Promwad

Источник [9]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/278900

Ссылки в тексте:

[1] из статьи о 54-ФЗ и переходе на онлайн-кассы: https://vc.ru/21624-new-trade-law

[2] главой 90 Налогового кодекса: https://online.zakon.kz/Document/?doc_id=30366217&doc_id2=30366217#pos=1039;5&pos2=22188;24

[3] в приказе министра финансов Республики Казахстан: http://adilet.zan.kz/rus/docs/V14E0009878

[4] Protocol Buffers: https://developers.google.com/protocol-buffers

[5] библиотеку Python-ESCPOS: https://github.com/python-escpos/python-escpos

[6] встраиваемой СУБД SQLite: http://sqlite.org/

[7] библиотека Wt, C++ WebToolkit: https://www.webtoolkit.eu/wt

[8] WtDesigner: https://github.com/juangburgos/WtDesigner

[9] Источник: https://habr.com/post/354442/?utm_source=habrahabr&utm_medium=rss&utm_campaign=354442