ККМ http web-сервер печати чеков / этикеток через JSON запрос по HTTP протоколу (54-ФЗ)

Опубликовал Дмитрий Гарбуз (audim) в раздел Оборудование - ККМ

Программа предназначена для печати и регистрации фискальных/не фискальных чеков на Контрольно-кассовых машинах оборудованных фискальным регистратором (далее ККМ). Программа является маленьким HTTP web-сервером и имеет встроенные драйвера ККМ. Позволяет печатать/регистрировать чеки с мобильных устройств / планшетов или с настольного ПК из 1с одновременно. Позволяет печатать/регистрировать чеки на KKM подключенных к другим ПК. Есть возможность печати этикеток с штрих-кодами на принтерах этикеток. Так-же возможно использовать ККМ в качестве принтера этикеток. Технология использования - HTTP(Ajax/REST) запрос, данные передаются через JSON; Возможности: Печать/регистрация чеков из браузера IE/Chrome и т.п.; Протокол передачи данных: Печать/регистрация чеков по HTTP протоколу; У 1с сейчас начинает появляется похожий функционал, но у 1с всегда должна установлена и запущена платформа 1с что требует как минимум лицензии на 1 продукт 1с или сетевую лицензию. Эта-же программа позволяет работать без лицензии 1с, например: В магазине чеки регистрируются с мобильной платформы (планшет) оффлайн и для складских операций используется тонкий клиент для удаленной базы через интернет. Такая схема позволяет магазину быть безопасной от наличия интернета.

Возможности:

  • Logo1Данные для печати чеков принимаются через HTTP запрос в формате JSON. Возможен запуск программы как windows-сервис.
  • Печатать различных штрих-кодов (в начале чека, в конце, на товар) даже если это не умеет делать ККМ.
  • Типы печатаемых ШК: EAN13, CODE39, CODE128, PDF417, QR .
  • Объединение нескольких ККМ в один пул который будет выглядеть для пользователя как 1 ККМ.
       При печати на пул чек будет регистрироваться на различных ККМ входящих в пул по очереди.
       При возникновении ошибки на одной ККМ она может автоматически блокироваться в пуле.
  • Переадресация чека на другой "ККМ web-сервер" для удалённой регистрации чека.
  • Печать чека на принтер-чеках и ККМ без фискального регистратора.
  • Печать чека на дисплее для отладки.
  • Излечение (на некоторых ККМ) фискальной подписи чека (КПК) и возвращение его клиенту.
  • Снятие Х и Z отчетов.
  • Фискализация (Регистрация) ККТ.
  • Внесение и изъятие денежных средств из кассы.
  • Открытие денежного ящика.
  • Запрос количества наличных средств в ККМ (по учету в ККМ).
  • Логин пароль для пользователей и отдельно для администратора.
  • Защищенное HTTPS соединение по вашему сертификату.
  • Задание любого IP порта для сервера (По умолчанию 5893).
  • Синхронная / Асинхронная работа. При асинхронной работе сервер сразу вернет управление. Результат выполнения операции можно запросить отдельно позже.
  • Поддержка кросс-доменных вызовов для браузеров.

Новая версия (поддержка 54-ФЗ):

  • Добавлен новый функционал по поддержке ККТ по 54фз с ФН и передачей информации в ОФД:
  • Передача адреса (Email или телефон) в данные чека.
  • Получение Web-ссылки на зарегистрированный чек в ОФД.
  • Передача произволных полей в чек, являющихся неотемлемой частью договора купли/продажи оформляемой чеком.
  • Передача данных по оператору/банковского агента/банковского субагента перевода денежных средств
  • Возможность не печати чека на ленту.
  • Возможность работы по нескольким системам налогообложения: возможность указать в чеке применяемую СНО.
  • Печать не фискальных строк 4 шрифтами.
  • Регистрация и передача в ОФД наименования товаров и Штрих-Код EAN13
  • Новый отчет "Состояние расчетов и состояние связи с ОФД"
  • Новый тип чека - строно (коррекция). теперь можно отсторнировать продажу в любое время! (не злоупотреблять - налоговая не спит!)
  • Регистрация ККТ в ОФД.
  • Открытие закрытие ФН.
  • Изменение регистрационных данных.
  • Передача данных в ОФД через COM порт по протоколу PPP Ethernet over USB
  • Подключение ККТ по Ethernet протоколу.
  • Получение списка ККМ.
  • Поиск сетевых и локальных ККТ.
  • API полностью совместим с новой версией UnitServer и KkmFactory.
  • Интеграция с ЕГАИС - при регистрации чека возможно отправление данных в ЕГАИС чрез систему "Универсальный транспортный модуль ЕГАИС (УТМ)"

Поддерживаемые устройства (ККМ):

  • Протокол АТОЛ:
    АТОЛ-22Ф/FPrint-22ПТК, АТОЛ-25Ф, АТОЛ-90Ф, АТОЛ-55Ф/FPrint-55ПТК,
    АТОЛ-11Ф/FPrint-11ПТК, АТОЛ-77Ф/FPrint-77ПТК, АТОЛ-30Ф, FPrint-190АК .
  • Протокол ШТРИХ-М:
    ШТРИХ-М-01Ф, ШТРИХ-ON-LINE, ШТРИХ-ЛАЙТ-01Ф, ШТРИХ-ЛАЙТ-02Ф, ШТРИХ-М-02-Ф,
    ШТРИХ-МИНИ-02Ф, ШТРИХ-ФР-02Ф, ШТРИХ-МИНИ-01Ф, РИТЕЙЛ-01Ф, ШТРИХ-ФР-01Ф
  • Протокол Сервис-Плюс (только старые ККМ, новые ККТ пока не поддерживаются): 
    СП-101 (СП-101 К, СП-101 ФР-К), СП-402 (СП-402 К, СП-402 ФР-К),
    СП-412, СП-413, СП-601 (СП-601 К, СП-601 ФР-К)
  • ESC/POS принтеры чеков:
    Принтеры этикеток, принтеры чеков (без фискального регистратора)
    работающие по протоколу ESC/POS (COM, LTP порты, windos спулер печати)

    Windows принтер:
    Принтеры этикеток, Принтеры чеков (без фискального регистратора)
    работающие через windos спулер печати

Требование к системе:

  • Никакие другие сторонние драйвера ККМ не нужны! В программу включены собственные драйвера ККМ!
  • Сторонний Web-сервер (apache, iis) не нужен! Программа сама является маленьким HTTP сервером!
  • Операционная система- Windows 7, Windows 8, Windows 10.
  • Требуется установить .NET Framework 4.5.1 (Наверняка у Вас уже установлено).
  • Прочие требования предъявляемые ККМ к системе.

Пример кода на JavaScript для печати фискального чека:

//**************************************************************************************
// Вызов команды на KkmServer
//**************************************************************************************
function ExecuteCommand(
    Async,          // false - сервер вернет ответ только после выполнения команды. Если true то сразу после постановки команды в очередь
    Data,           // Данные команды
    FunSuccess,     // Функция выполняемая при успешном соединении
    FunError,       // Функция выполняемая при ошибке соединения
    timeout) {
   
    if (FunSuccess === undefined) {
        FunSuccess = ExecuteSuccess;
    }
    if (timeout === undefined) {
        timeout = 60000; //Минута - некоторые драйверы при работе выполняют интерактивные действия с пользователем - тогда увеличте тайм-аут.
    }
    var JSon = $.toJSON(Data);
    $.support.cors = true;
    var jqXHRvar = $.ajax({
        type: 'POST',
        async: true,
        timeout: timeout,
        url: UrlServer + ((UrlServer == "") ? window.location.protocol + "//" + window.location.host + "/" : "/") + 'Execute/' + ((Async) ? "async" : "sync"),
        crossDomain: true,
        dataType: 'json',
        contentType: 'application/json; charset=UTF-8',
        processData: false,
        data: JSon,
        headers: (User != "" || Password != "") ? { "Authorization": "Basic " + btoa(User + ":" + Password) } : "",
        success: FunSuccess,
        error: FunError
    });
}

//**************************************************************************************
// Печать тестового чека продажи 
//**************************************************************************************

function RegisterCheck(NumDevice, TypeCheck, IsBarCode, Print) {
    // Подготовка данных команды
    var Data = {
        // Команда серверу
        Command: "RegisterCheck",
                 
        //***********************************************************************************************************
        // ПОЛЯ ПОИСКА УСТРОЙСТВА
        //***********************************************************************************************************
        // Номер устройства. Если 0 то первое не блокированное на сервере
        NumDevice: NumDevice,
        // ИНН ККМ для поиска. Если "" то ККМ ищется только по NumDevice,
        // Если NumDevice = 0 а InnKkm заполнено то ККМ ищется только по InnKkm
        InnKkm: "",
        //---------------------------------------------
        // Заводской номер ККМ для поиска. Если "" то ККМ ищется только по NumDevice,
        KktNumber: "",
        // **********************************************************************************************************
        // Время (сек) ожидания выполнения команды.
        //Если За это время команда не выполнилась в статусе вернется результат "NotRun" или "Run"
        //Проверить результат еще не выполненной команды можно командой "GetRezult"
        //Если не указано или 0 - то значение по умолчанию 60 сек.
        // Поле не обязательно. Это поле можно указвать во всех командах
        Timeout: 30,
        // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды
        // По этому идентификатору можно запросить результат выполнения команды
        // Поле не обязательно
        IdCommand: guid(),
        // Это фискальный или не фискальный чек
        IsFiscalCheck: true,
        // Тип чека;
        // 0 – продажа;                             10 – покупка;
        // 1 – возврат продажи;                     11 - возврат покупки;
        // 8 - продажа только по ЕГАИС (обычный чек ККМ не печатается) 
        // 9 - возврат продажи только по ЕГАИС (обычный чек ККМ не печатается)
        TypeCheck: TypeCheck,
        // Аннулировать открытый чек если ранее чек не был  завершен до конца
        CancelOpenedCheck: true,
        // Не печатать чек на бумагу
        NotPrint: (Print == true) ? false : true, //true,
        // Продавец, тег ОФД 1021
        CashierName: "Kазакова Н.А.",
        // Телефон или е-Майл покупателя, тег ОФД 1008
        // Если чек не печатается (NotPrint = true) то указывать обязательно
        ClientAddress: "client@server.ru",
        // Система налогообложения (СНО) применяемая для чека
        // Если не указанно - система СНО настроенная в ККМ по умолчанию
        // 0: Общая ОСН
        // 1: Упрощенная УСН (Доход)
        // 2: Упрощенная УСН (Доход минус Расход)
        // 3: Единый налог на вмененный доход ЕНВД
        // 4: Единый сельскохозяйственный налог ЕСН
        // 5: Патентная система налогообложения
        // Комбинация разных СНО не возможна
        // Надо указывать если ККМ настроена на несколько систем СНО
        TaxVariant: "",
        // Дополниельные реквизиты чека (не обязательно):
        //1005 Адрес оператора по переводу денежных средств (Строка 100)
        //1016 ИНН оператора по переводу денежных средств (Строка 12)
        //1026 Наименование оператора по переводу денежных средств (Строка 64)
        //1044 Операция банковского агента (Строка 24)
        //1045 Операция банковского субагента (Строка 24)
        //1073 Телефон банковского агента (Строка 19)
        //1074 Телефон платежного агента (Строка 19)
        //1075 Телефона оператора по переводу денежных средств (Строка 19)
        //1082 Телефон банковского субагента (Строка 19)
        //1083 Телефон платежного субагента (Строка 19)
        //1119 Телефон оператора по приему платежей (Строка 19)
        CheckProps: [
            { Print: true, PrintInHeader: true, Teg: 1005, Prop: "Москва, ул. Трехгорка д.13" },
            { Print: true, PrintInHeader: true, Teg: 1010, Prop: 10.25 },
            { Print: true, PrintInHeader: true, Teg: 1073, Prop: "8(985)775-44-61" },
        ],
        // Дополнительные произвольные реквизиты (не обязательно) пока только 1 строка
        AdditionalProps: [
            //{ Print: true, PrintInHeader: false, NameProp: "Номер транзакции", Prop: "234/154" },
            { Print: true, PrintInHeader: false, NameProp: "Дата транзакции", Prop: "10.11.2016 10:30" },
        ],
        // Это только для тестов:
        ClientId: "23FG4GV4D2956",
        // КПП организации, нужно только для ЕГАИС
        KPP: "782543005",
        // Строки чека
        CheckStrings: [
            // Строка с печатью штрих-кода
            {
                BarCode: {
                    // Тип штрих-кода: "EAN13", "CODE39", "CODE128","QR", "PDF417".
                    BarcodeType: "PDF417",
                    // Значение штрих-кода
                    Barcode: "12345DFG Proba pera, Print barcode 1234567890",
                },
            },
            //При вставке в текст символов ">#10#<" строка при печати выровнеется по центру, где 10 - это на сколько меньше станет строка ККТ
            {
                PrintText: {
                    Text: ">#2#<ООО "Рога и копыта",
                    Font: 1,
                },
            },
            // При вставке в текст в середину строки символов "<#10#>" Левая часть строки будет выравнена по левому краю, правая по правому, где 10 - это на сколько меньше станет строка ККТ
            // При вставке в текст в середину строки символов "<#10#>>" Левая часть строки будет выравнена по правому краю, правая по правому, где 10 - отступ от правого клая
            { PrintText: { Text: "Пример №1 печати поля:<#16#>154,41" }, },
            // Строка с печатью текста определенным шрифтом
            {
                PrintText: {
                    Text: "Шрифт № 1",
                    Font: 1, // 1-4, 0 - по настройкам ККМ
                    Intensity: 15, // 1-15, 0 - по настройкам ККМ
                },
            },
            // Строка с печатью фискальной строки
            {
                Register: {
                    // Наименование товара 64 символа
                    Name: "Сапоги женские DF-3099",
                    // Количество товара
                    Quantity: 3,
                    // Цена за шт. без скидки
                    Price: 100,
                    // Конечная сумма строки с учетом всех скидок/наценок;
                    Amount: 0.01,
                    // Отдел, по которому ведется продажа
                    Department: 0,
                    // НДС в процентах или ТЕГ НДС: 0 (НДС 0%), 10 (НДС 10%), 18 (НДС 18%), -1 (НДС не облагается)
                    Tax: 18,
                    //Штрих-код EAN13 для передачи в ОФД (не печатется)
                    EAN13: "1254789547853",
                    // Данные для ЕГАИС системы, можно не указывать
                    EGAIS: {
                        Barcode: "22N0000154NUCPRZ3R8381461004001003499NKAQ0ZBUVDNV62JQAR69PEV878RO93V",
                        Ean: "3423290167937",
                        Volume: 0.7500,
                    },
                },
                BarCode: {
                    // Тип штрих-кода: "EAN13", "CODE39", "CODE128","QR", "PDF417".
                    BarcodeType: "EAN13",
                    // Значение штрих-кода
                    Barcode: "1254789547853",
                },
            },
        ],
        // Наличная оплата
        Cash: 800,
        // Безналичная оплата типа 1 (по умолчанию - Оплата картой)
        CashLessType1: 0.01,
        // Безналичная оплата типа 2 (по умолчанию - Оплата кредитом)
        CashLessType2: 0,
        // Безналичная оплата типа 3 (по умолчанию - Оплата сертификатом)
        CashLessType3: 0,
    };

    // Вызов команды
    ExecuteCommand(false, Data);

    // Возвращается JSON:
    //{
    //    "CheckNumber": 1,    // Номер документа
    //    "SessionNumber": 23, // Номер смены
    //    "LineLength": -1,
    //    "URL": "t=20170115T154700&s=0.01&fn=99078900002287&i=118&fp=549164494&n=1", 
    // URL проверки чека, где: t-дата-время, s-сумма документа, fn-номер ФН, i-номер документа, fp-фискальная подпись, n-тип документа
    //    "Info": null,
    //    "Command": "RegisterCheck",
    //    "Error": "",  
    // Текст ошибки если была - обязательно показать пользователю - по содержанию ошибки можно в 90% случаях понять как ее устранять
    //    "Status": 0   // Ok = 0, Run(Запущено на выполнение) = 1, Error = 2, NotFound(устройство не найдено) = 3, NotRun = 4
    //}
}
//**************************************************************************************

Тестовый режим:


Для цели тестирования, разработки, обучения оплата не требуется.
При этом на чеках иногда будет отображаться информация о том, что программа не лицензирована.
Также иногда сумма чека будет не совпадать с указанной.
Для цели печати этикеток со штрих-кодом на принтерах этикеток лицензия и оплата не требуется.

 Срок действия бесплатной техподдержки: не ограничен. 

Работа с 1С предприятием:

Для печати чеков из конфигураций 1С есть драйвер для 1с.
В 

Гарантия возврата денег

Гарантия возврата денег

ООО "Инфостарт" гарантирует Вам 100% возврат оплаты, если программа не соответствует заявленному функционалу из описания. Деньги можно вернуть в полном объеме, если вы заявите об этом течение 14-ти дней со дня поступления денег на наш счет.

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

Для возврата оплаты просто свяжитесь с нами.

Все

Наименование Файл Версия Размер
Дистрибутив сервера ККМ
.msi 19,74Mb
29.07.16
39
.msi 2.0.17.04 19,74Mb 39 Бесплатно
Драйвер для 1с
.zip 526,05Kb
17.03.17
6
.zip 2.0.16.02 526,05Kb 6 Бесплатно
ККМ http web-сервер печати чеков / этикеток через JSON запрос по HTTP протоколу: Продление техподдержки на 1 год
17.03.2017
500 руб.

Лицензии

Наименование Файл Версия Размер
ККМ http web-сервер печати чеков / этикеток через JSON запрос по HTTP протоколу: Лицензия на KkmServer + Техподдержка
17.03.2017
1.1.3.6 3000 руб.

Моментальная
доставка

См. также

Комментарии
1. Олег Дмитров (baracuda) 2 01.03.16 15:16 Сейчас в теме
Где это может понадобиться?
2. Дмитрий Гарбуз (audim) 7 01.03.16 17:37 Сейчас в теме
Когда надо напечатать/зарегистрировать чек из браузера.
В случаях когда ККМ находится на другой машине.
Для печати/регистрации чека из нескольких терминальных сессий на 1 ККМ.
Для печати/регистрации чека с мобильного устройства.
И еще в одном щепетильном случае.
3. Головаченко Дима (Smaylukk) 512 16.03.16 18:05 Сейчас в теме
Подскажите, если это реализовано, каким образом можно произвольную строку или набор строк?
Это касается принтера этикеток.
4. Дмитрий Гарбуз (audim) 7 16.03.16 22:19 Сейчас в теме
Вот пример печати этикеток:
var Check =
{
IsFiscalCheck: false, // true - фискальный чек, false - не фискальный
TypeCheck: 10, // Тип чека: 0 – продажа; 1 – покупка; 2 – возврат продажи; 3 – возврат покупки; 10 - Этикетка
CheckStrings: [ // Строки чека
{ // ПЕРВАЯ ЭТИКЕТКА
BarCode: {
BarcodeType: "EAN13", // Тип штрихкода: "EAN13", "CODE39", "CODE128", "PDF417", "CODEQR" (Не обязательно)
Barcode: "1254789547853", // Значение штрихкода (Не обязательно)
}
},
{
LeftString: "", // Строка печатаемая слева чека (Не обязательно)
CenterString: "Ботинки женские", // Строка печатаемая по центру чека (Не обязательно)
RightString: "", // Строка печатаемая слева справа чека (Не обязательно)
DoubleWidth: true, // Двойная высота и ширина строки
EndPage: false, // Начать новую этикетку
},
{
LeftString: "", // Строка печатаемая слева чека (Не обязательно)
CenterString: "DFX-345/40 Размер-36", // Строка печатаемая по центру чека (Не обязательно)
RightString: "", // Строка печатаемая слева справа чека (Не обязательно)
DoubleWidth: false, // Двойная высота и ширина строки
EndPage: true, // конец этикетки
},
{ // ВТОРАЯ ЭТИКЕТКА
BarCode: {
BarcodeType: "EAN13", // Тип штрихкода: "EAN13", "CODE39", "CODE128", "PDF417", "CODEQR" (Не обязательно)
Barcode: "1254789547853", // Значение штрихкода (Не обязательно)
}
},
{
LeftString: "", // Строка печатаемая слева чека (Не обязательно)
CenterString: "Сапоги мужские", // Строка печатаемая по центру чека (Не обязательно)
RightString: "", // Строка печатаемая слева справа чека (Не обязательно)
DoubleWidth: true, // Двойная высота и ширина строки
EndPage: false, // Начать новую этикетку
},
{
LeftString: "", // Строка печатаемая слева чека (Не обязательно)
CenterString: "VCL-4455 Размер-41", // Строка печатаемая по центру чека (Не обязательно)
RightString: "", // Строка печатаемая слева справа чека (Не обязательно)
DoubleWidth: false, // Двойная высота и ширина строки
EndPage: true, // конец этикетки
}
]
};
$.support.cors = true;
$.ajax({
type: 'POST',
async: false,
url: 'http://YourUrlServer:5893/Check/sync/1',
crossDomain: true,
dataType: 'json',
contentType: 'application/json; charset=UTF-8',
processData: false,
data: $.toJSON(Check),
headers: { "Authorization": "Basic " + btoa("User:Password") },
success: function (data, textStatus, jqXHR){
// Здесь обрабатываем ответ от сервера
}
});
5. nitrios 24.03.16 05:53 Сейчас в теме
Программа поддерживает одновременное подключение более одного ФР к одному серверу?
6. Дмитрий Гарбуз (audim) 7 24.03.16 18:28 Сейчас в теме
8 ККМ.
И может одновременно принимать на 1 один ФР сразу несколько заданий выстраивая их в очередь.
7. Дмитрий Гарбуз (audim) 7 24.03.16 18:30 Сейчас в теме
На 1 и том-же ККМ задания выполняются последовательно,
На разных ККМ - параллельно.
8. Головаченко Дима (Smaylukk) 512 30.03.16 15:30 Сейчас в теме
В 1С при настройке ФР Атол есть возможность указать не COM-порт, а UDP/IP адрес.
В вашем продукте есть такая возможность?
9. Дмитрий Гарбуз (audim) 7 30.03.16 15:34 Сейчас в теме
(8) Smaylukk,
Такая возможность есть но закрыта :)
А если серьезно то там все элементарно, код я написал, но мне просто не на чем протестировать - нет такой ККМ :(.
10. Алексей Лустин (lustin) 799 11.05.16 21:16 Сейчас в теме
3 вопроса:

* работает ли под Mono ? и не под Windows ?
* есть ли возможность добавить к серверу плагины с возможностью подписки на событие ?
* что значит лицензия, каков порядок лицензирования ?
11. Дмитрий Гарбуз (audim) 7 11.05.16 22:31 Сейчас в теме
(10) lustin,
1. Нет. Будет версия под NetCore когда он выйдет, вот она будет работать под линуксами
2. Такой возможности нет. А на какие события Вы хотели подписаться? Прям теряюсь в догадках...
3. Лучше посмотреть на сайте сервера.
12. Yuri Basov (byun) 25 01.03.17 23:57 Сейчас в теме
Здравствуйте! Публикация еще жива? Если да, то какой драйвер ФР использовать для подключения к 1с? Также будет ли развите под онлайн кассы?
13. Sergey (manserg) 102 16.03.17 11:00 Сейчас в теме
Здравствуйте, Дмитрий!
Главный вопрос - на сколько ваше ПО соответствует 54-ФЗ?
1. Поддержка современных версий протокола ККТ
2. Состав чека согласно требованиям ФЗ
3. Обмен с ОФД
14. Дмитрий Гарбуз (audim) 7 17.03.17 13:12 Сейчас в теме
Новая версия (на сайте) поддерживает 54-фз
1. По Атолу и Штриху новые протоколы поддерживаются.
2. Посмотрите на сайте примеры
3. Обмен с ОФД производит ККТ.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа