Онлайн касса Хочу поделиться опытом разработки ПО для бюджетной онлайн-кассы VikiPrint 57. В связи с вступлением в силу закона ФЗ-54, это может быть актуально и полезно техническим специалистам, которые впервые в жизни выполняют задачу по интеграции ПО или сайта с физическим оборудованием. Особенно с этих онлайн-касс «бзднут» вебмастеры, разрабатывающие на WordPress магазины и по-другому понимающие термин «онлайн».

Да, судя по всему, когда вы что-то заказываете в Интернет-магазине, в каком-то бутике в ТЦ сам по себе будет «вылазить» чек из кассы. Иначе владельца магазина оштрафуют. Если, конечно, ничего не изменится в головах тех людей, кто это придумал. Просто чудо как оно есть!

Тезисы для тех, кто не понимает о чем речь:

  • Через месяц федеральный закон 54 обязует перейти весь бизнес со старых ККМ на новые, с приставкой онлайн;
  • Через год, в 2018 году, онлайн-кассу обязуют купить даже тех, чей тип налогооблажения позволяет сейчас не использовать ККМ совсем (например — ЕНВД). Это самый важный аспект, который добавит много работы разработчикам и еще больше проблем для малого бизнеса;
  • Стоимость онлайн кассы — от 20 тыс. рублей; Из них 7 тысяч рублей — это, собственно, инновации в виде встроенной флешки и шифрующего устройства;
  • Онлайн-кассы шлют данные о каждой продаже операторам фискальных данных (ОФД) — это посредники между налоговым органом и бизнесом, стоимость столь нужной услуги — от 3 тыс. рублей в год;
  • В целом, новые онлайн кассы — это старые кассы в новом корпусе и с новым видом фискального накопителя. Просто все упаковано маркетологами в «продукт». Нередко в «продукт» к онлайн-кассе упаковывается китайский планшет, который служит интерфейсом взаимодействия с кассой.

Устройство онлайн-кассы


Итак, изменилось лишь устройство хранения информации внутри кассы, формат корпуса и названия юрлиц, которые производят и продают эти кассы (сами организации физически не поменялись). Теперь устройство умеет получать, шифровать и отдавать данные. Онлайн онлайном, а данные о покупках все равно хранятся внутри устройства. Черный ящик с данными стоимостью 7 тыс. рублей нужно менять раз в 13-36 месяцев. Теперь в нем хранятся еще наименования продуктов и артикул, наценка, скидка, тип налога и т.д. До 2021 года точные данные не обязательны, можно продавать товары вида «LOL — 10 рублей.», все пока по-игрушечному.

Подключение онлайн-кассы к компьютеру


Касса подключается к POS-терминалу или компьютеру через COM-порт. Никто из производителей не хочет дорабатывать все, что внутри корпуса, поэтому нормальных касс для компьютера с USB интерфейсов нет, все ориентировано на старые POS-терминалы. Если COM-порта в вашем компьютере нет, на сайте производителя можно скачать костыль, эмулятор COM-порта для USB, большинство касс продаются с USB проводом в комплекте.

Если работаете с USB VikiPrint, обязательно прочитайте про танцы с бубном чуть ниже. Как взаимодействует с ОФД АТОЛ и Штрих-М — пока не могу сказать.

После подключения, с кассой можно взаимодействовать напрямую через команды, переданные на виртуальный COM порт (они должны быть описаны в документации). На сайте производителя можно скачать высокоуровневый драйвер для вашей ОС, — с ним, конечно, будет повеселее.

Как формируется чек


Принцип работы, в целом, одинаков для всех касс (и онлайн и не онлайн). Чтобы пробить чек, нужно вызвать следующие методы:

  1. Открыть документ определенного типа (сервисный, регистрация продажи, отмена покупки и т.д.);
  2. Занести в документ позиции: артикул, наименование, цена, количество;
  3. Внести деньги в кассу;
  4. Внести скидку в кассу, если это необходимо. Есть два вида скидки: процент и фиксированная сумма;
  5. Вывести итог;
  6. Закрыть документ.


Есть еще интересный атавизм — открытие и закрытие смены раз в 24 часа. Метода «Закрыть смену» в драйвере как правило не существует, это называется «Вывести Z-отчет». Если смена длится более 24 часов, касса будет выдавать ошибку.

Так оно все работало и раньше, но теперь онлайн-кассы печатают также QR код при закрытии документа и появилась возможность указать E-mail покупателя. Валидный QR код может печатать только сертифицированное дорогое оборудование, которое имеет в себе устройство шифрования данных. Кассы, с которыми я работал, не умеют отправлять чек ни по СМС ни по почте. Пока что это задача кассира, программы или ОФД. Хотя, возможно, скоро появятся варианты со встроенной СИМ-картой.

На основании внесенных данных, касса формирует чек и печатает его на термопринтере (если оплата идет удаленно через ИМ, чек на бумаге не обязателен). Далее, касса отправляет электронный чек в ОФД, тот в свою очередь моментально редиректит данные в налоговый орган.

Интеграция ПО с онлайн кассой


Порядок действий таков:

  1. Скачать на сайте производителя нужный тип драйвера (для Windows, как правило, выпущен обычный dll);
  2. Скачать документацию на драйвер, ознакомиться с основными публичными интерфейсами. Реально все не очень сложно, быстро сможет разобраться даже веб-разработчик, далекий от физического оборудования;
  3. Импортировать dll в ЯП, на котором вы пишите. Это возможно даже в PHP, если производитель выпустил Active-X драйвер. Регистрируем компонент в системе (Regsvr32) и общаемся с ним через COM-расширение.
  4. Слать COM-порту через высокоуровневый драйвер нужные команды. Для некоторых ОС некоторые производители касс еще не выпустили драйверы, — в этом случае придется писать свой драйвер или ждать;
  5. Скачать сервисную утилиту (в случае с VikiPrint — Fito), через нее подключиться к кассе и задать в настройках ОФД нужные URL и порт. Все настройки можно найти на сайте ОФД.

При этом нужно иметь в виду, что:

  • В документации может быть одно, в примерах второе, а по факту вообще третье. В случае с VikiPrint, разработку я вел методом тыка. У АТОЛ сравнительно хорошие драйвера и документация почти всегда соответствует действительности. Кстати, Эвотор — это по факту Атол с упаковкой от маркетологов Сбербанка;
  • Мир драйверов выглядит так, как UI на скриншоте ниже. Любителям мира продуманных интерфейсов лучше держаться подальше от этого наркоманского района:


Пример интеграции с программой на C#


Далеко не всем магазинам нужны POS-терминалы. Тем людям, которые сейчас не используют кассовую технику (в том числе владельцы ИМ без офлайн точки совсем), придется таки купить кассовый аппарат до июня 2018 года, закон больнее всего ударит именно по таким предпринимателям. Также, скорее всего, придется почесать репу и нам, разработчикам, чтобы заинтегрировать онлайн-кассу в бизнес, которому чужда кассовая техника.

Опенсорс-часть компании, где я тружусь, решила поиграть в Win-Lose игре на стороне лузера и приступила к разработке бесплатной программы без лишнего функционала для тех, кому все это навязывают. Программа подойдет тем, у кого уже стоит компьютер в торговом зале для выполнения повседневных задач администратора — общение с клиентами в соц. сетях, использование программ подбора товара и т.д. Чуть позже добавим функционал взаимодействия с Интернет-магазином и пример модуля для какой-нибудь популярной CMS.

Программа называется Движ.Кассир, исходный код на C# открыт. Нас интересует папка drivers, в ней лежат классы, реализующие интерфейс взаимодействия с драйвером: Atol.cs и VikiPrint.cs. Первый использует высокоуровевый драйвер в виде Active-X компонента, все достаточно просто и соответствует документации на сайте производителя. Второй может оказаться более полезным для разработчиков, потому что работает со свеженаписанным драйвером, который опубликовали на сайте и закрыли там комментарии. И никто, видимо, не может теперь сказать им там, что инструкция к этому файлу не соответствует действительности. Тех. поддержка работает по скрипту и всех отшивает со словами «все заняты, мы вам перезвоним». Думаю, к 2018 году все будет работать более стабильно, понятно и надежно, а пока пришлось немного попотеть и применить возможности третьего глаза, чтобы импортировать эту dll в C# класс.

Примерно вот так DLL любого драйвера кассы импортируется в C#, см. PiritLib.cs:

//...
[DllImport("PiritLib.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int openPort(string fileName, int speed);

[DllImport("PiritLib.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int commandStart();

[DllImport("PiritLib.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int libAddDiscount(byte typeDiscount, string nameDiscount, int sum);
//...

Далее, с PiritLib можно удобно работать через более дружелюбный класс VikiPrint.cs, который наследует PiritLib и в конструкторе сам на автомате открывает порт.

    //Создаем объект драйвера, передавая имя COM порта и его скорость
    drivers.FiscalInterface driver = new VikiPrint("COM5", 57600);
    //Открываем документ типа регистрации покупки
    driver.OpenDocument(2); 
    //Регистрируем нужный товар (название, артикул, кол-во, цена, номер позиции)
    driver.RegisterProduct("Кроссовки", "33111", 1, 2099, 1);
    //Регистрируем скидку (тип, примечание и размер). Типы: 0 - процент, 1 - фикс
    driver.RegisterDiscount(1, "За то, что ты был хорошим поцом", 1);
    //Выводим итог
    driver.PrintTotal();
    //Регистрируем занесение в кассу денег (сумма, тип оплаты)
    driver.RegisterPayment(2099, 0);
    //Закрываем документ. При этом печатаетcя QR код
    driver.CloseDocument();

Теперь нужно собрать вашу программу и настроить взаимодействие с кассиром через GUI или с сайтом через REST. Обмен должен происходить раз в N минут\часов\недель, касса должна слать\печатать все чеки скопом. Формально чек должен отправиться в ОФД сразу, но, понятно, из-за отсутствия Интернета или по другим техническим причинам, это может произойти через какой-то промежуток времени. Никакой конкретики в законе пока нет, все очень сыро. Есть только такой нюанс — если в течение месяца касса не отправила ни одного чека, фискальная память блокируется (во всяком случае, так хотят законотворцы).

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

Танцы с бубном


Большинство бюджетных онлайн-касс — это старые кассы без возможности соединения с Интернетом напрямую (нет нужного порта). Поэтому существует костыль под названием ComProxy. Данная программа запускает сервис, который служит прокси для дополнительных виртуальных COM-портов, именно через эти порты касса получает Интернет с компьютера и отправляет свои данные в ОФД. Танцы с бубном описаны в этой статье.

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

Комментарии (31)


  1. degorov
    02.06.2017 18:55
    +2

    Последнюю неделю занимаюсь тем же. У «Штриха» нормальная документация и нормальный высокоуровневый драйвер. Примеры тоже есть.


    И что касается картинки — так там же написано «Тест» — там просто выведено по кнопке на каждую возможную команду, обычный вполне интерфейс для таких вещей, не знаю, к чему там комментарий про наркоманов…


    1. pistol
      02.06.2017 19:04

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


      1. d-stream
        02.06.2017 22:11

        Изящества там конечно мизер, но если попробовать придумать иные формы — они окажутся еще более монстрообразными…

        p/s/ с авансами-кредитами еще грабли не нарисовались на горизонте? -)


        1. pistol
          03.06.2017 09:52

          С кредитами-авансами пока бог миловал, не добрался)


          1. d-stream
            03.06.2017 12:52
            +2

            Но к этому стоит готовиться…


    1. Rupper
      03.06.2017 09:49

      Документация не то чтобы нормальная. А драйвер вызывает проблемы с anycpu. В итоге написали свой, были косяки в доке пришлось просто подбирать значения. Вообще могли бы уже и сделать драйвера на яве и .net


    1. ValeriyKr
      05.06.2017 08:39

      С kkmserver справитесь за пару дней.


    1. Ascott
      05.06.2017 10:33

      Работаю с «Штрихом» не первый год (ФР-К, Миник, ПТК, 02Ф). Не могу сказать, что с драйверами и документацией всё в порядке. Драйвер работает только в x86. Некоторые функции не работают так, как описано в доке. Некоторые методы описаны как перевод названия, без разъяснения того, что они делают и зачем нужны (даже не расшифрованы аббревиатуры). С выходом новой версии под «онлайн»-кассы всё стало еще хуже, а в прошивке фискала появились откровенные воспроизводимые баги.
      Сейчас посмотрел на интерфейс Атола и описание его драйвера — такое ощущение, что это клон штриха (ну или наоборот)


  1. Mogost
    03.06.2017 12:44

    Когда-то читал об этом законе уже, было интересно, как все эти штуки дружат с не Windows.


    1. d-stream
      03.06.2017 12:57

      У атол'а (один из крупняков производителей) есть 9 ветка — там win представлена в виде minigw, а так в базе android, java, pyton и сборки linux-arm, armhf, x64/32 и т.п.


    1. pistol
      03.06.2017 13:02

      VikiPrint (он же Пирит) пока никак. Для других ОС остается только прямое взаимодействие с COM портом (собственный драйвер).


      1. mishast
        05.06.2017 11:30

        У VikiPrint все хорошо, так же как и у штриха.
        Открываешь ком-порт и пишешь команды. Протокол легко реализовать.
        А драйвер для отправки в ОФД есть и под линукс тоже, не только под windows.


    1. golovanov_ov
      05.06.2017 05:42
      +1

      Есть драйвер на python для Штриха, правда пока только для версии 2.7.
      https://github.com/oleg-golovanov/pyshtrih


    1. Ascott
      05.06.2017 10:37

      По большому счету, там обычный com-порт и есть описанный протокол «общения». Так что написать свой «драйвер» можно (и я бы сказал нужно) под что угодно. Я знаю, что есть «взрослые» кассовые решения для ретейла крутящиеся на nix-ах.


  1. Hacksli
    03.06.2017 16:48

    Тоже пытаемся подружиться с фискальниками через http +orangepi


  1. jean
    03.06.2017 17:47
    +1

    Есть вот такой вот продукт — https://kkmserver.ru/. Позволяет получить единообразное HTTP API и не заморачиваться с зоопарком драйверов. Используем, пока правда только начали, но вроде бы полет нормальный.


    1. pistol
      03.06.2017 17:54

      Один из сотрудников попытался месяца 2 назад — не смог Атол за три дня завести в нужной среде, на том и плюнули. В понедельник подробности скажу.


    1. ValeriyKr
      05.06.2017 08:38

      На нем у нас 2 штриха и атол. все отлично, пишется всё за день-два к любой cms. Плюс может работать как сервер, принимая внешние команды на печать чеков от сайта при онлайн оплатах.


  1. TalasSet
    03.06.2017 21:10

    Как близка эта проблема а ко кого тем людям которые тратили кучу сил и денег на дописывания 1с теперь опять перепиливать или обновляться до типовой опять всю страну поставили…


    1. pistol
      03.06.2017 21:13
      -2

      1C — это маска поверх C++, обычный набор CRUD и маркетинг :) Скидывайте оковы и уходит в веб, — будете вспоминать прошлое как страшный сон :)


      1. TalasSet
        03.06.2017 21:57

        Спасибо)))


      1. Apatic
        04.06.2017 19:53
        +1

        1C — это маска поверх C++,

        С++ маска поверх двоичного кода же


    1. Apatic
      04.06.2017 19:53

      Если речь идет о старых версиях типа УТ 10.3, КА 1.1, Розница 1.0, то есть сторонние обработки, позволяющие «поженить» их с 54-ФЗ. Эта, например. Даже под 8.1 работает вроде


      1. TalasSet
        04.06.2017 20:11

        Спасибо огромное, но я решил уже все проблемы.


  1. playaer
    04.06.2017 05:29

    Смена продлилась больше 24 часов, касса заблокировалась, а как ее потом разблокировать?


    1. pistol
      04.06.2017 05:29

      Распечатать Z-отчет. И снова запустить смену.


  1. pistol
    04.06.2017 05:29

    Удалил дубль.


  1. drblez
    05.06.2017 10:58

    Касса РП-Система 1 ФА — http://starrys.ru/ — порт Ethetnet и JSON API.


    1. pistol
      05.06.2017 11:15

      Спасибо. Цена действительно 15 тыс. рублей? Кто-то уже получал живой образец или пока только «предзаказ»?


      1. drblez
        05.06.2017 14:18

        Про цену ничего не знаю. А что касается «живого образца», то, насколько я знаю, несколько тысяч касс уже отгружено.


      1. drblez
        05.06.2017 14:20

        Что касается API, то в нем есть одна команда, с помощью которой можно сформировать чек с автоматическим открытием/закрытием смен.