ККМ web-сервер

Новая версия:
Добавлен новый функционал по поддержке ККТ по 54фз с ФН и передачей информации в ОФД:• Передача адреса (Email или телефон) в данные чека.
• Получение Web-ссылки на зарегистрированный чек в ОФД.
• Передача произвольных полей в чек, являющихся неотъемлемой частью договора купли/продажи оформляемой чеком.
• Передача данных по оператору/банковского агента/банковского субагента перевода денежных средств
• Возможность не печати чека на ленту.
• Возможность работы по нескольким системам налогообложения: возможность указать в чеке применяемую СНО.
• Печать не фискальных строк 4 шрифтами.
• Регистрация и передача в ОФД наименования товаров и Штрих-Код EAN13
• Новый отчет "Состояние расчетов и состояние связи с ОФД"
• Новый тип чека - сторно (коррекция). теперь можно отсторнировать продажу в любое время!
• Регистрация ККТ в ОФД.
• Открытие закрытие ФН.
• Изменение регистрационных данных.
• Передача данных в ОФД через COM порт по протоколу PPP Ethernet over USB
• Подключение ККТ по Ethernet протоколу.
• Получение списка ККТ.
• Поиск сетевых и локальных ККТ.
• Маршрутизация команд на другой kkmserver.
• Эмуляция фискального чека на принтере чеков со всеми фискальными атрибутами, полученными при маршрутизации команды.
• API полностью совместим с новой версией UnitServer и KkmFactory.
• Интеграция с ЕГАИС - при регистрации чека возможно отправление данных в ЕГАИС чрез систему "Универсальный транспортный модуль ЕГАИС (УТМ)"
• Поддержка маркировки товаров: КИЗ (контрольный идентификационный знак) товарной номенклатуры, Тег ОФД 1162, (честный знак)"
Назначение:
Программа предназначена для печати и регистрации фискальных/не фискальных чеков на Контрольно-кассовой технике оборудованной фискальным накопителем (далее ККТ).Программа является маленьким HTTP web-сервером и имеет встроенные драйвера ККТ (кроме драйверов Usb-Com).
Позволяет печатать/регистрировать чеки с мобильных устройств / планшетов или с настольного ПК из 1с одновременно.
Позволяет печатать/регистрировать чеки на KKM подключенных к другим ПК.
Есть возможность печати этикеток с штрих-кодами на принтерах этикеток.
Так же возможно использовать ККТ в качестве принтера этикеток.
Технология использования - HTTP(Ajax/REST) запрос, данные передаются через JSON;
Возможности: Печать/регистрация чеков из браузера IE/Chrome и т.п.;
Протокол передачи данных: Печать/регистрация чеков по HTTP протоколу;
У 1с сейчас начинает появляется похожий функционал, но у 1с всегда должна установлена и запущена платформа 1с что требует как минимум лицензии на 1 продукт 1с или сетевую лицензию. Эта же программа позволяет работать без лицензии 1с, например: В магазине чеки регистрируются с мобильной платформы (планшет) оффлайн и для складских операций используется тонкий клиент для удаленной базы через интернет. Такая схема позволяет магазину быть безопасной от наличия интернета.
![]() |
Возможности:

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






Расширение для браузеров :

Назначение:
Расширение предназначено для расширения возможностей kkmserver.Позволяет регистрировать чеки с HTML страниц в браузере - т.е. позволяет сайтам работать с ККТ.
Расширение встраивается в браузер Chrome, Firefox, Yandex, Opera, Chromium (скоро и Edge).
В расширении можно настроить значения оборудования по умолчанию.
Расширение имеет встроенные драйвера ККТ (кроме драйверов Usb-Com).
Есть возможность печати этикеток с штрих-кодами на принтерах этикеток.
Так же возможно использовать ККТ в качестве простого принтера этикеток.
В расширении есть возможность работы со сканером штрих-кодов в режиме событий.

Пример работы с расширением JS :
Пример регистрации чека JavaScript через расширение: function RegisterCheck() { // Подготовка данных команды, параметры (TypeCheck = 0, NumDevice = 0, InnKkm = "", CashierName = "") var Data = KkmServer.GetDataCheck(0, 0, "4257896515", "Kазакова Н.А.", "430601071197"); KkmServer_AddTextString(Data, "ООО Рога и копыта", 1); KkmServer_AddRegisterString(Data, "Сапоги женские DF-3099-1", 3, 100, 0.01, 0, 18, "1254789547853"); KkmServer_AddBarcodeString(Data, "EAN13", "1254789547853"); Data.Cash=800; // Вызов команды KkmServer_Execute(Data, ExecuteSuccess, ErrorSuccess); } Все!!!!!!!!!!!!
ПО KkmFactory - назначение:
KkmFactory - это тот-же kkmserver только для большого количества ККТ.Позволяет подключить к одному серверу до 600 ККТ.
API точно такой-же как и kkmserver.
Улучшеный сбор статистики.
Поддерживаемые устройства (ККТ):
Протокол АТОЛ:
АТОЛ-11Ф, АТОЛ-15Ф, АТОЛ-20Ф, АТОЛ-22Ф/FPrint-22ПТК, АТОЛ-25Ф,
АТОЛ-27Ф, АТОЛ-30Ф, АТОЛ-50Ф, Атол-52Ф, АТОЛ-55Ф, АТОЛ-77Ф, FPrint-190АК
Протокол АТОЛ (Платформа 5):
АТОЛ-1Ф, и аппараты из раздела выше, и для которых вышли прошивки на Платформу 5
Для Windows - нужны ДТО Атол x32, Для Linux - нужны ДТО Атол x64
Протокол ШТРИХ-М:
ШТРИХ-М-01Ф, ШТРИХ-ON-LINE, ШТРИХ-ЛАЙТ-01Ф, ШТРИХ-ЛАЙТ-02Ф, ШТРИХ-М-02-Ф,
ШТРИХ-МИНИ-02Ф, ШТРИХ-ФР-02Ф, ШТРИХ-МИНИ-01Ф, РИТЕЙЛ-01Ф, РИТЕЙЛ-02Ф, ШТРИХ-ФР-01Ф
Протокол Эвотор:
Эвотор-5, Эвотор-5i, Эвотор-7.2, Эвотор-7.3, Эвотор-10 - Бета версия!
Особенности работы ККТ Эвотор
Протокол СтарРус:
РП-Система 1ФА, РП-Система 1ФС, Кассир 57Ф, Кассир 80Ф
Протокол RR-Electro:
РР-01Ф, РР-02Ф, РР-03Ф, РР-04Ф
Протокол Paykiosk.ru:
PayOnline-01-ФА, Pay VKP-80К-ФА
Протокол Dreamkas (Viki Print):
Viki-Print-57Ф, Viki-Print-57+Ф, Viki-Print-80+Ф
Протокол Crystals (Pirit):
Pirit-1Ф, Pirit-2Ф, Pirit-2СФ
Протокол Искра (Прим) (новые ККТ):
ПРИМ 06-Ф, ПРИМ 08-Ф, ПРИМ 88-Ф, ПРИМ 07-Ф - Бета версия
Протокол Micro-Pay (microteh.ru) (новые ККТ):
MicroPay-ФС
Протокол КИТ (КАСБИ) (новые ККТ):
КИТ Онлайн-Ф, Терминал-ФА
ESC/POS принтеры чеков:
Принтеры этикеток, принтеры чеков (без фискального регистратора)
работающие по протоколу ESC/POS (COM, LTP порты, windos спулер печати)
Windows принтер:
Принтеры этикеток, Принтеры чеков (без фискального регистратора)
работающие через windows спулер печати
Поддерживаемые устройства (Эквайринговые терминалы):
Протокол СБРФ: Эквайринговые терминалы:
Все эквайринговые терминалы которые поддерживает Сбербанк-РФ
Протокол INPAS: Эквайринговые терминалы:
Эквайринговые терминалы INPAS (Verifone, IRAS, PAX)
Протокол UCS: Эквайринговые терминалы:
Эквайринговые терминалы UCS (United Card Services)
Протокол ARCUS-2: Эквайринговые терминалы:
Эквайринговые терминалы ARCUS-2 (Ingenico)
Поддерживаемые устройства (Электронные весы):
Масса-К: электронные весы:
Все весы МАССА-К (http://www.massa.ru) которые поддерживают протоколы: Протокол №2, Протокол STANDART, Протокол 1c
Системные требования:
• Никакие другие сторонние драйвера ККТ не нужны! В программу включены собственные драйвера ККТ!• Сторонний Web-сервер (apache, iis) не нужен! Программа сама является маленьким HTTP сервером!
• Операционные системы:
--- Windows 8,10
--- Linux deb-based: Ubuntu, Debian, Mint ....
--- Linux rpm-based: CentOS, Fedora, Red Hat ...
--- Apple OsX: High Sierra (10.13+)
• Требуется установить .NET Framework 4.8 и выше (Наверняка у Вас уже установлено).
• Прочие требования предъявляемые ККТ к системе.
Документация по API и примеры на js:
Общая функция вызова сервера// Общая функция вызова API Unit-server-а // Будет использоватся во всех примерах var UrlServer = ""; // HTTP адрес сервера торгового оборудования, если пусто то локальный вызов var User = ""; // Пользователь доступа к серверу торгового оборудования var Password = ""; // Пароль доступа к серверу торгового оборудования function ExecuteCommand( Data, // Данные команды FunSuccess, // Функция выполняемая при успешном соединении FunError, // Функция выполняемая при ошибке соединения timeout) { // Проверка стоит ли расширение, и если стоит то отправка через расширение // Для активации скрипта расширения ваша страница должна содержать в теге "head" строку: // <script>var KkmServerAddIn = {};</script> try { if (KkmServer != undefined) { // Если данные - строка JSON конвентируем в объект if (typeof (Data) == "string") Data = JSON.parse(Data); // Выполняем команду через расширение KkmServer.Execute(ExecuteSuccess, Data); //Возврат - вызов по Http не нужен return; }; } catch { }; // Если нет расширения - далее отправляем команду по http // Если не указана функция обработки ответа - назначаем функцию по умолчанию if (FunSuccess === undefined) { FunSuccess = ExecuteSuccess; } if (timeout === undefined) { timeout = 60000; //Минута - некоторые драйверы при работе выполняют интерактивные действия с пользователем - тогда увеличте тайм-аут. } // Отправляем данные по HTTP протоколу 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', 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 ExecuteSuccess(Rezult, textStatus, jqXHR) { //---------------------------------------------------------------------- // ОБЩЕЕ //---------------------------------------------------------------------- if (Rezult.Status == 0) { MessageStatus = "Ok"; } else if (Rezult.Status == 1) { MessageStatus = "Выполняется"; } else if (Rezult.Status == 2) { MessageStatus = "Ошибка!"; } else if (Rezult.Status == 3) { MessageStatus = "Данные не найдены!"; }; // Текст ошибки MessageError = Rezult.Error; //---------------------------------------------------------------------- // Фискальные регистраторы //---------------------------------------------------------------------- // Номер чека var MessageCheckNumber = Rezult.CheckNumber; // Номер смены var MessageSessionNumber = Rezult.SessionNumber; // Количество символов в строке var MessageLineLength = Rezult.LineLength; // Сумма наличных в ККМ var MessageAmount = Rezult.Amount; } // Герерация GUID function guid() { function S4() { return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1); } return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4()); } Требуется jquery.
// Печать чека 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, // Тип чека, Тег 1054; // 0 – продажа; 10 – покупка; // 1 – возврат продажи; 11 - возврат покупки; // 8 - продажа только по ЕГАИС (обычный чек ККМ не печатается) // 9 - возврат продажи только по ЕГАИС (обычный чек ККМ не печатается) TypeCheck: TypeCheck, // Не печатать чек на бумагу NotPrint: false, //true, // Количество копий документа NumberCopies: 0, // Продавец, Тег ОФД 1021 CashierName: "Kазакова Н.А.", // ИНН продавца Тег ОФД 1203 CashierVATIN: "430601071197", // Телефон или е-Майл покупателя, Тег ОФД 1008 // Если чек не печатается (NotPrint = true) то указывать обязательно // Формат: Телефон +{Ц} или Email {С}@{C} ClientAddress: "sochi@papa.com", // Покупатель (клиент) - наименование организации или фамилия, имя, отчество (при наличии), серия и номер паспорта покупателя(клиента). Тег 1227 // Только с использованием наличных / электронных денежных средств и при выплате выигрыша, получении страховой премии или при страховой выплате. ClientInfo: "Везучий В.В. РЕ-125486", // ИНН Организации или покупателя(клиента). Тег 1228 // Только с использованием наличных / электронных денежных средств и при выплате выигрыша, получении страховой премии или при страховой выплате. ClientINN: "502906602876", // Aдрес электронной почты отправителя чека, Тег ОФД 1117 (если задан при регистрации можно не указывать) // Формат: Email {С}@{C} SenderEmail: "sochi@mama.com", // Место расчетов, Тег ОФД 1187 (если не задано - берется из регистрационных данных ККТ) PlaceMarket: "kkmserver.ru", // Система налогообложения (СНО) применяемая для чека, Тег 1055 // Если не указанно - система СНО настроенная в ККМ по умолчанию // 0: Общая ОСН // 1: Упрощенная УСН (Доход) // 2: Упрощенная УСН (Доход минус Расход) // 3: Единый налог на вмененный доход ЕНВД // 4: Единый сельскохозяйственный налог ЕСН // 5: Патентная система налогообложения // Комбинация разных СНО не возможна // Надо указывать если ККМ настроена на несколько систем СНО TaxVariant: "", //ClientId: "557582273e4edc1c6f315efe", // Это только для тестов: Получение ключа суб-лицензии : ВНИМАНИЕ: ключ суб-лицензии вы должны генерить у себя на сервере!!!! //KeySubLicensing: GetKeySubLicensing("sochi@papa.com", "12qw12"), // КПП организации, нужно только для ЕГАИС //KPP: "782543005", // Если надо одновременно автоматически провести транзакцию через эквайринг // Эквайринг будет задействован если: 1. чек фискальный, 2. оплата по "ElectronicPayment" не равна 0, 3. PayByProcessing = true // Использовать эквайринг: Null - из настроек на сервере, false - не будет, true - будет PayByProcessing: false, //В тестовом чеке автоматический эквайринг выключен // Номер устройства для эквайринга - Null - из настроек на сервере, 0 - любое, число - номер конкретного устройства NumDeviceByProcessing : null, // Номер чека для эквайринга ReceiptNumber: "TEST-01", // Печатать Слип-чек после чека (а не в чеке) PrintSlipAfterCheck: false, // Печатать Слип-чек дополнительно для кассира (основной слип-чек уже будет печататся в составе чека) PrintSlipForCashier: true, //Если это чек возврата то возможны два поля для отмены транзакции (если не указано то по эквайрингу будет не отмена а возврат оплаты) RRNCode: "", // RRNCode из операции эквайринга. Только для отмены оплаты! Для Оплаты или возврата оплаты не заполнять! AuthorizationCode: "", // AuthorizationCode из операции эквайринга. Только для отмены оплаты! Для Оплаты или возврата оплаты не заполнять! // Признак агента. Тег ОФД 1057. Поле не обязательное. Можно вообще не указывать. // 0: "Банковский платежный агент:" Оказание услуг пользователем, являющимся банковским платежным агентом // 1: "Банковский платежный субагент:" Оказание услуг пользователем, являющимся банковским платежным субагентом // 2: "Платежный агент:" Оказание услуг пользователем, являющимся платежным агентом // 3: "Платежный субагент:" Оказание услуг пользователем, являющимся платежным субагентом // 4: "Поверенный:" Оказание услуг пользователем, являющимся поверенным // 5: "Комиссионер:" Оказание услуг пользователем, являющимся комиссионером // 6: "Агент:" Оказание услуг пользователем, являющимся агентом и не являющимся банковским платежным агентом (субагентом), платежным агентом (субагентом), поверенным, комиссионером AgentSign: 2, // Данные агента. Тег ОД 1223. // Поле не обязательное. Обязательно если установлено поле "AgentSign" // Можно вообще не указывать. AgentData: { // Операция платежного агента, Тег ОФД 1044 PayingAgentOperation: "95315", // Телефон платежного агента, Тег ОФД 1073 PayingAgentPhone: "+79995554422", // Телефон оператора по приему платежей, Тег ОФД 1074 ReceivePaymentsOperatorPhone: "", //"+72223334455", // Телефон оператора перевода, Тег ОФД 1075 MoneyTransferOperatorPhone: "+74447776655", // Наименование оператора перевода, Тег ОФД 1026 MoneyTransferOperatorName: "ООО Тестовая организация", // Адрес оператора перевода, Тег ОФД 1005 MoneyTransferOperatorAddress: "Москва, зубовский бульвар 44", // ИНН оператора перевода, Тег ОФД 1016 MoneyTransferOperatorVATIN: "430601071197" }, // Данные поставщика платежного агента. // Поле не обязательное. PurveyorData: { // Телефон поставщика тег ОД 1171 PurveyorPhone: "+76662229955" }, // Дополнительный реквизит пользователя тег ОФД 1084 UserAttribute: { // Наименование дополнительного реквизита пользователя тег ОД 1085 Name: "Поле-тест", // Значение дополнительного реквизита пользователя тег ОФД 1086 Value: "Тестовое значение" }, // Дополнительный реквизит чека тег 1192 AdditionalAttribute: "Тест", // Строки чека CheckStrings: [ // Строка с печатью картинки { PrintImage: { //Картинка в Base64. Картинка будет преобразована в 2-х цветное изображение- поэтому лучше посылать 2-х цветный bmp Image: "Qk3+EwAAAAAAAD4AAAAoAAAA5AAAAJ4AAAABAAEAAAAAAMATAACHHQAAhx0AAAAAAAAAAAAAAAAAAP///wD/////////////////////////////////////8AAAAP/////////////////////////////////////wAAAA//////////////////////////////////////AAAAD/////////////////////////////////////8AAAAP/////////////////////////////////////wAAAA//////////////////////////////////////AAAAD/////////////////////////////////////8AAAAP////+f//////////+P///////////////////wAAAA/////5///////////4////////////////////AAAAD/////n///////////H///////////////////8AAAAP////+f//////////8f///////////////////wAAAA/////5///////////x////////////////////AAAAD/////j//////////+P///////////////////8AAAAP////+PwAj///////w////////////////////wAAAA/////48PgP///////H////////////////////AAAAD/////zH/B///////4f///////////////////8AAAAP/////J/8H///////j////////////////////wAAAA/////+P/4///////8P////////////////////AAAAD///gAx//z///////h////////////////////8AAAAP//4fgP//P//////+P////////////////////wAAAA///H/z//8B//////x///////gP////////////AAAAD//5/8f//gD/////+P//////4AH///////////8AAAAP//P/3//8/B/////x///////AAMf///////+A/wAAAA//8/////H+H////+H//////4/+AH///////AB/AAAAD//n////5/w/8f//yP//////n/w4P//////4fP8AAAAP/+////+f+D/8AH/8f/////8/+f+P/////+H8/wAAAA//7////z//P//g//x//////3/3/+f/////j/5/AAAAD//P///+//8//////H/////8f///8////wB//n8AAAAP/8////z//j/////8/////wB////5//+AH//8PwAAAA//z///+v/+f/P///D////wAH////z/8A////0fAAAAD//P///7//w/+AA/4f///8Aef////n+A////+R8AAAAP/9//////4ID+Tv/7////A/5//8//vA/////znwAAAA//3/P////H4f7Of/v///4//n//n//Q/////8efAAAAD//f+P///x/B/Mc/+f///H//P/+f/+P/////Dz8AAAAP/9/8f//+P4P9x7/5///5//8//wA/z////4A/PwAAAA//3/Mf//z/+/nD3/n///P//z//GAAf////P/8PAAAAD/+f/A//+f/7+evP/f//8///H/8f/x////9//g8AAAAP/5//A//y//Pz6ef8///n//+f/x//P////3/+HwAAAA//n/+Q//7/8/Ps8/z//+///5//n/9///////yfAAAAD/+YABx////n4+z7/v//z///z/+P/n//////8Z8AAAAP/4B/gh///8/n5n3+//+f///P/8/+f/////8DvwAAAA/+D//xh///n+fnfP5//7///+f/z/5///9/+A+/AAAAD/h///jh//4/x+c+f3//P///4//n/n///v/z/z8AAAAP8P///Hg/+H/P578/f/AD///z//f+f//+//f/fwAAAA/D///+fAAB/8/nn58/wfD/wAH/8/9///n/9/7/AAAAD4f///5+AA//z/ffz7+P/n/4AP/5////8////P8AAAAPn////z5///+f9+/nnz//P/j8f/z////H///x/wAAAA8/////Pz///5/z5/uef/++Af4/vD///4///8f/AAAADn////8/P///n/P3/N7/B58//x/eD//8P//8D/8AAAAOf////D8f//+f8/v+QP553n//h88D/4D///B//wAAAAz////+P5///x/7+f8E/P3c///j54D/////h///AAAADf////8fj///P/v9/x35/dz///Dz4h////8P//8AAAAN/////5/P//8/+fj/PfL8Gf///BH57////H///wAAAA3/////z8f//z/58n5993wT////AH/v///4////AAAACf///z/Px///P/nmfn3nPMP////AP+f//+P///8AAAAN///gB+/n//8/+f8+f+e99/////8P5///z////wAAAA3//wAD7+P//3/9/w5/57z3/////4PH//8/////AAAADd/8H+Hv8///f/z/Hn/APAf/////8AP//n////8AAAAMv/D/z8/x//9//PxPf8/8T///////8//+/////wAAAA6/4//P3/n//3/8/+c/z/0f///////5//7/////AAAADj+P/8+f+P/+f/7/9z/P/D////////x//3////8AAAAPfx//zz/8//4//n/zn8/8P////////h//n////wAAAA9+X//Of/5//4f+f4Gf3/x/////////g//P////AAAADn6f/8z//n//4f5//cff/H/////////B/8////8AAAAOf5//yf//O//8fz/879+8A/////////D/5////wAAAA5/n//j//8H//8fP/5v3zw4////////+H/n////AAAADn+f/8H//4///8c//y/fPH8////////8f/f///8AAAAOf5//AH//H///4x//r988f4///h////5/9////wAAAA9/n/58P/8wH/+Hn//P37x/5//4B////n/n////AAAAD3+f//8/8AD//B+f/+/fvD/7//vj///+f+f///8AAAAPP5///AAA///x/4//79+8P+Af8/n///9/x////wAAAA+Pn/////////v/z//vz7weAAH7/P///z+P////AAAAD8AP////////+f/H/+/Pvfg/4Dn/P///Pw////8AAAAP+I/////////9/+f9788B4//+Df+A//+IH////wAAAA//z/////////z/5/zvz3OP///A/AQ//4D/////AAAAD//P/////////v/j/k/O/x////CA/x//h/////8AAAAP/8/////////+f/P/D85+P////g//n//f/////wAAAA//5/////////8/8f8Px3z/////wf/P////////AAAAD//n/////////5/5/4/gef///////8////////8AAAAP/+f/////////n/n/L+Az////////z////////wAAAA//9//////////P/P9v4Cf//h/////P////////AAAAD//z/////////+f8/v/gD//+7////5////////8AAAAP//P/////////4/58//Af//53////z////////wAAAA//+f/////////z/33/8D///zP////H////////AAAAD//5//////////n/Pf/wP///x////+P///////8AAAAP//j//////////P+Z/3B/////////8f///////wAAAA///P/////////+fpr/uP/////////4////////AAAAD//+f/////////48yP+I//////////x///////8AAAAP//8P//////A//xzp/8H//5///////j///////wAAAA///4AAAAAAAH//iPH/8P//N//////+P///////AAAAD////AAAAAf8P/gA4f////93//////8f//////8AAAAP////4AA///4PAADh/////7v//////4///////wAAAA///////////4AAAMH/////x///////z///////AAAAD///////////+AAAwP///f/////////H//////8AAAAP////////////wADA9//7/////////+f//////wAAAA/////////////gAABn//A/////////5///////AAAAD//////////8AHAAAAf/wf///x/////j//////8AAAAP//////////8AAAAAB/8P///+b/////P//////wAAAA///////////8AAAAAH/Bf/9/73////8///////AAAAD///////////8AAAAAAAE//z/3f////z//////8AAAAP///////////8AAAAAAAJ//n/h//v//P//////wAAAA//////////8AAAAAAD4Az//P///8D/8///////AAAAD//////////AAAAAAAPADAAAf///gD/z//////8AAAAP//////////AAAAAAA/gGAAAf//+AD/P//////wAAAA///////////gAAAAAB+AYDn8///wAH9///////AAAAD///////////gAAAAAH4BwHf4///AAPn//////8AAAAP///////////gAAAAAfgHAd/w//8AAc///////wAAAA////////////gAAAAA/AcBz/w//wAAn///////AAAAD////////////AAAAAD8h5Hv/w//AAA///////8AAAAP///////////+AAAAAPzHke//wf8AAD///////wAAAA///////////+AAAAAA7A+D7//4HwAAP///////AAAAD///////////AAAAAAD0H5/n//8AAAAf//////8AAAAP//////////4AAAAAAPb/n+f///AAAB///////wAAAA//////////+AAAAAAA9v+f5////4AAD///////AAAAD//////////wAAAAAAB2/5/3////wAAP//////8AAAAP////////////AAAAAHN/j/f//7/gDg///////wAAAA/////////////4AAAA+3+P5///P/AfH///////AAAAD/////////////wAAAD9v5fn//x/+A8f//////8AAAAP////////////+OAAAP+ft+//8H/8AB///////wAAAA/////////////54AAA/884j//A//8AP///////AAAAD/////////////nuAAD/AHwD/4H//4D///////8AAAAP////////////+8/AAH9P/4v8Af///////////wAAAA/////////////7n/gAP3P/GfAD////////////AAAAD/////////////Of/AAPPP55wAf///////////8AAAAP////////////+z/8wAGffvAAD/z//////////wAAAA/////////////7P/ngAAc+wAAf4f//////////AAAAD/////////////t/8fAAADwAAD8D//////////8AAAAP////////////+H/z+AAAAAAAeAf//////////wAAAA/////////////4f+f8AAAAAADAD///////////AAAAD/////////////z/x/4AAAAAAAAf//////////8AAAAP/////////////P/P/wAAAAAAAD/+/////////wAAAA/////////////8/5/+AAAAAAAA//H/////////AAAAD/////////////3/n/wgAAAAAAH/g/////////8AAAAP/////////////f8/8PAAAAAAB/gH/////////wAAAA/////////////9/3/h+AAAAAAfgB//////////AAAAD/////////////3+f8P+AAAAAAAAP/////////8AAAAP/////////////f7/j/8AAAAAAAD//////////wAAAA/////////////9/P8f/4AAAAAAA///////////AAAAD/////////////n9/j//4AAAAAAf//////////8AAAAP////////////+fn8f//4AAAAAP///////////wAAAA/////////////5+fj//vwAAAAH/4//////////AAAAD/////////////n78f//PwAAAB/AH/////////8AAAAP////////////+fPg///PwAAAAAB//////////wAAAA/////////////598A///HwAAAAAf//////////AAAAD/////////////3nzgf//H4AAAAP//////////8AAAAP/////////////eefgD/wAAAAAD///////////wAAAA/////////////97z+kAAfAcAAH////////////AAAAD/////////////3OP7f///////////////////8AAAAP/////////////Mx/s////////////////////wAAAA/////////////83P+Z////////////////////AAAAD/////////////zZ/4H///////////////////8AAAAP/////////////tH//////////////////////wAAAA/////////////+c///////////////////////AAAAD/////////////4n//////////////////////8AAAAP/////////////w///////////////////////wAAAA//////////////H///////////////////////AAAAD/////////////////////////////////////8AAAAP/////////////////////////////////////wAAAA", }, }, // Строка с печатью простого текста { PrintText: { //При вставке в текст символов ">#10#<" строка при печати выровнеется по центру, где 10 - это на сколько меньше станет строка ККТ Text: ">#2#<ООО \"Рога и копыта\"", Font: 1, }, }, // При вставке в текст в середину строки символов "<#10#>" Левая часть строки будет выравнена по левому краю, правая по правому, где 10 - это на сколько меньше станет строка ККТ // При вставке в текст в середину строки символов "<#10#>>" Левая часть строки будет выравнена по правому краю, правая по правому, где 10 - отступ от правого клая { PrintText: { Text: "<<->>" }, }, { PrintText: { Text: "Пример №1:<#10#>154,41" }, }, { PrintText: { Text: "2-рое поле:<#10#>4,00" }, }, { PrintText: { Text: "<<->>" }, }, { PrintText: { Text: "Пример №2:<#8#>>4,00" }, }, { PrintText: { Text: "2-рое поле:<#8#>>1544,00" }, }, // Строка с печатью текста определенным шрифтом { PrintText: { Text: "<<->>" }, }, { PrintText: { Text: "Шрифт № 1" , Font: 1, // 1-4, 0 - по настройкам ККМ Intensity: 15, // 1-15, 0 - по настройкам ККМ }, }, { PrintText: { Text: "Шрифт № 2" , Font: 2, // 1-4, 0 - по настройкам ККМ Intensity: 10, // 1-15, 0 - по настройкам ККМ }, }, { PrintText: { Text: "Шрифт № 3" , //Text: "Это мега крутой товар. Продается во всех магазинах страны. Покупайте только у нас" , Font: 3, // 1-4, 0 - по настройкам ККМ Intensity: 5, // 1-15, 0 - по настройкам ККМ }, }, { PrintText: { Text: "Шрифт № 4" , Font: 4, // 1-4, 0 - по настройкам ККМ Intensity: 0, // 1-15, 0 - по настройкам ККМ }, }, { PrintText: { Text: "<<*>>" }, }, // Строка с печатью фискальной строки { Register: { // Наименование товара 64 символа, Тег 1059 Name: "Сапоги женские DF-3099-1" , // Количество товара (3 знака после запятой), Тег 1023 Quantity: 3, // Цена за шт. без скидки (2 знака после запятой) Price: 100, // Конечная сумма строки с учетом всех скидок /наценок; (2 знака после запятой), Из нее расчет тега 1079 Amount: 0.01, // Отдел, по которому ведется продажа Department: 0, // НДС в процентах или ТЕГ НДС: 0 (НДС 0%), 10 (НДС 10%), 20 (НДС 20%), -1 (НДС не облагается), 120 (НДС 20 /120), 110 (НДС 10 /110), Тег 1043, Из нее расчет тега 1079 Tax: 20, //Штрих-код EAN13 для передачи в ОФД (не печатется) EAN13: "1254789547853" , // Признак способа расчета. Тег ОФД 1214. Для ФФД.1.05 и выше обязательное поле // 1: "ПРЕДОПЛАТА 100% (Полная предварительная оплата до момента передачи предмета расчета)" // 2: "ПРЕДОПЛАТА (Частичная предварительная оплата до момента передачи предмета расчета)" // 3: "АВАНС" // 4: "ПОЛНЫЙ РАСЧЕТ (Полная оплата, в том числе с учетом аванса в момент передачи предмета расчета)" // 5: "ЧАСТИЧНЫЙ РАСЧЕТ И КРЕДИТ (Частичная оплата предмета расчета в момент его передачи с последующей оплатой в кредит )" // 6: "ПЕРЕДАЧА В КРЕДИТ (Передача предмета расчета без его оплаты в момент его передачи с последующей оплатой в кредит)" // 7: "ОПЛАТА КРЕДИТА (Оплата предмета расчета после его передачи с оплатой в кредит )" SignMethodCalculation: 4, // Признак предмета расчета. Тег ОФД 1212. Для ФФД.1.05 и выше обязательное поле // 1: "ТОВАР (наименование и иные сведения, описывающие товар)" // 2: "ПОДАКЦИЗНЫЙ ТОВАР (наименование и иные сведения, описывающие товар)" // 3: "РАБОТА (наименование и иные сведения, описывающие работу)" // 4: "УСЛУГА (наименование и иные сведения, описывающие услугу)" // 5: "СТАВКА АЗАРТНОЙ ИГРЫ (при осуществлении деятельности по проведению азартных игр)" // 6: "ВЫИГРЫШ АЗАРТНОЙ ИГРЫ (при осуществлении деятельности по проведению азартных игр)" // 7: "ЛОТЕРЕЙНЫЙ БИЛЕТ (при осуществлении деятельности по проведению лотерей)" // 8: "ВЫИГРЫШ ЛОТЕРЕИ (при осуществлении деятельности по проведению лотерей)" // 9: "ПРЕДОСТАВЛЕНИЕ РИД (предоставлении прав на использование результатов интеллектуальной деятельности или средств индивидуализации)" // 10: "ПЛАТЕЖ (аванс, задаток, предоплата, кредит, взнос в счет оплаты, пени, штраф, вознаграждение, бонус и иной аналогичный предмет расчета)" // 11: "АГЕНТСКОЕ ВОЗНАГРАЖДЕНИЕ (вознаграждение (банковского)платежного агента/субагента, комиссионера, поверенного или иным агентом)" // 12: "СОСТАВНОЙ ПРЕДМЕТ РАСЧЕТА (предмет расчета, состоящем из предметов, каждому из которых может быть присвоено вышестоящее значение" // 13: "ИНОЙ ПРЕДМЕТ РАСЧЕТА (предмет расчета, не относящемуся к предметам расчета, которым может быть присвоено вышестоящее значение" // 14: "ИМУЩЕСТВЕННОЕ ПРАВО" (передача имущественных прав) // 15: "ВНЕРЕАЛИЗАЦИОННЫЙ ДОХОД" // 16: "СТРАХОВЫЕ ВЗНОСЫ" (суммы расходов, уменьшающих сумму налога (авансовых платежей) в соответствии с пунктом 3.1 статьи 346.21 Налогового кодекса Российской Федерации) // 17: "ТОРГОВЫЙ СБОР" (суммы уплаченного торгового сбора) // 18: "КУРОРТНЫЙ СБОР" // 19: "ЗАЛОГ" SignCalculationObject: 1, // Единица измерения предмета расчета. Можно не указывать, Тег 1197 MeasurementUnit: "пара" , // Цифровой код страны происхождения товара в соответствии с Общероссийским классификатором стран мира 3 симв. Тег 1230 CountryOfOrigin: "156" , // Регистрационный номер таможенной декларации 32 симв. Тег 1231 CustomsDeclaration: "54180656/1345865/3435625/23" , // Сумма акциза с учетом копеек, включенная в стоимость предмета расчета Тег 1229 ExciseAmount: 0.01, // КИЗ (контрольный идентификационный знак) товарной номенклатуры, Тег ОФД 1162 (честный знак), можно не указывать //Описание применимых ШК GoodCodeData: { // штрих-код маркировки товара со сканера (нужно настроить сканер так чтобы не проглатывал управляющие символы) // Поддерживаются ШК: // Без идентификатора экземпляра товара: EAN8, EAN13, ITF14 // С идентификатором экземпляра товара: GS1, ШК шуб, ШК табачной продукции., ЕГАИС-2, ЕГАИС-3 BarCode: "0104300943734342212413195240818240640291ffd092MDEwNDMwMDk0MzczNDM", // Проверять содержит ли ШК кода маркировки идентификатор экземпляра товара (если вообше не указать - true) // Для некоторых товаров нужно передавать ШК EAN-13, тогда это поле устанавливайте в 'false' ContainsSerialNumber: true }, // Признак агента. Тег ОФД 1222. Поле не обязательное. Можно вообще не указывать. // 0: "Банковский платежный агент:" Оказание услуг пользователем, являющимся банковским платежным агентом // 1: "Банковский платежный субагент:" Оказание услуг пользователем, являющимся банковским платежным субагентом // 2: "Платежный агент:" Оказание услуг пользователем, являющимся платежным агентом // 3: "Платежный субагент:" Оказание услуг пользователем, являющимся платежным субагентом // 4: "Поверенный:" Оказание услуг пользователем, являющимся поверенным // 5: "Комиссионер:" Оказание услуг пользователем, являющимся комиссионером // 6: "Агент:" Оказание услуг пользователем, являющимся агентом и не являющимся банковским платежным агентом (субагентом), платежным агентом (субагентом), поверенным, комиссионером AgentSign: 2, // Данные агента. Тег ОД 1223. // Поле не обязательное. Обязательно если установлено поле "AgentSign" // Можно вообще не указывать. AgentData: { // Операция платежного агента. Тег ОФД 1044 PayingAgentOperation: "95315" , // Телефон платежного агента. Тег ОФД 1073 PayingAgentPhone: "+79995554422" , // Телефон оператора по приему платежей. Тег ОФД 1074 ReceivePaymentsOperatorPhone: "+72223334455" , // Телефон оператора перевода. Тег ОФД 1075 MoneyTransferOperatorPhone: "+74447776655" , // Наименование оператора перевода. Тег ОФД 1026 MoneyTransferOperatorName: "ООО Рога и копыта" , // Адрес оператора перевода. Тег ОФД 1005 MoneyTransferOperatorAddress: "Москва, зубовский бульвар 44" , // ИНН оператора перевода. Тег ОФД 1016 MoneyTransferOperatorVATIN: "430601071197" }, // Данные поставщика платежного агента. Тег ОФД 1224 // Поле не обязательное. Обязательно если установлено поле "AgentSign" // Можно вообще не указывать. PurveyorData: { // Телефон поставщика. Тег ОД 1171 PurveyorPhone: "+76662229955" , // Наименование поставщика. Тег ОФД 1225 PurveyorName: "ООО 'Гаражик в деревне'" , // ИНН поставщика. Тег ОФД 1226 PurveyorVATIN: "430601071197" }, // Дополнительный реквизит предмета расчета тег 1191, Только для ФФД 1.1 ! AdditionalAttribute: "Тест-доп.реквизит" , // Данные для ЕГАИС системы, можно не указывать EGAIS: { Barcode: "22N0000154NUCPRZ3R8381461004001003499NKAQ0ZBUVDNV62JQAR69PEV878RO93V" , Ean: "3423290167937" , Volume: 0.7500, }, }, BarCode: { // Тип штрих-кода: "EAN13" , "CODE39" , "CODE128" , "QR" , "PDF417" . BarcodeType: "EAN13" , // Значение штрих-кода Barcode: "1254789547853" , }, }, { PrintText: { Text: "<<->>" }, }, // Полная строка: И текст и регистрация и бар-код { PrintText: { Text: "Это мега крутой товар. Продается во всех магазинах страны. Покупайте только у нас" , Font: 4, // 1-4, 0 - по настройкам ККМ Intensity: 0, // 1-15, 0 - по настройкам ККМ }, Register: { // Наименование товара 64 символа Name: "Шаровары мужские красные: НИМБУС-2000" , // Количество товара (3 знака после запятой) Quantity: 3, // Цена за шт. без скидки (2 знака после запятой) Price: 100, // Конечная сумма строки с учетом всех скидок /наценок; (2 знака после запятой) Amount: 0.00, // Отдел, по которому ведется продажа (2 знака после запятой) Department: 1, // НДС в процентах или ТЕГ НДС: 0 (НДС 0%), 10 (НДС 10%), 20 (НДС 20%), -1 (НДС не облагается), 120 (НДС 20 /120), 110 (НДС 10 /110) Tax: -1, //Штрих-код EAN13 для передачи в ОФД (не печатется) EAN13: "1254789547853" , // Признак способа расчета. тег ОФД 1214. Для ФФД.1.05 и выше обязательное поле SignMethodCalculation: 1, // Признак предмета расчета. тег ОФД 1212. Для ФФД.1.05 и выше обязательное поле SignCalculationObject: 1, // Единица измерения предмета расчета. Можно не указывать MeasurementUnit: "шт" , // КИЗ (контрольный идентификационный знак) товарной номенклатуры Тег ОФД 1162 (честный знак), можно не указывать // В данном случае GoodCodeData неприменим т.к. количество <> 0 GoodCodeData: { // штрих-код маркировки товара со сканера (нужно настроить сканер так чтобы не проглатывал управляющие символы) // Поддерживаются ШК: // Без идентификатора экземпляра товара: EAN8, EAN13, ITF14 // С идентификатором экземпляра товара: GS1, ШК шуб, ШК табачной продукции., ЕГАИС-2, ЕГАИС-3 BarCode: "RU-430301-ABCDEF1234", // Проверять содержит ли ШК кода маркировки идентификатор экземпляра товара (если вообше не указать - true) // Для некоторых товаров нужно передавать ШК EAN-13, тогда это поле устанавливайте в 'false' ContainsSerialNumber: true }, }, BarCode: { // Тип штрих-кода: "EAN13" , "CODE39" , "CODE128" , "QR" , "PDF417" . BarcodeType: "QR" , // Значение штрих-кода Barcode: "12345DFG Proba pera, Print barcode 1234567890." , //Barcode: "12345DFG Proba pera, Print barcode 1234567890. 12345DFG Proba pera, Print barcode 1234567890, Print barcode 1, Print barcode 2, Print barcod" + // "12345DFG Proba pera, Print barcode 1234567890." , }, }, { BarCode: { // Тип штрих-кода: "EAN13" , "CODE39" , "CODE128" , "QR" , "PDF417" . BarcodeType: "PDF417" , // Значение штрих-кода Barcode: "12345DFG Proba pera, Print barcode 1234567890." , }, }, ], // Наличная оплата (2 знака после запятой), Тег 1031 Cash: 800, // Сумма электронной оплаты (2 знака после запятой), Тег 1081 ElectronicPayment: 0.01, // Сумма из предоплаты (зачетом аванса) (2 знака после запятой), Тег 1215 AdvancePayment: 0, // Сумма постоплатой(в кредит) (2 знака после запятой), Тег 1216 Credit: 0, // Сумма оплаты встречным предоставлением (сертификаты, др. мат.ценности) (2 знака после запятой), Тег 1217 CashProvision: 0, }; //Если чек без ШК то удаляем строку с ШК if (IsBarCode= =false) { //Data.Cash =100; for (var i=0; i < Data.CheckStrings.length; i++) { if (Data.CheckStrings[i] != undefined && Data.CheckStrings[i].BarCode != undefined) { Data.CheckStrings[i].BarCode = null; }; if (Data.CheckStrings[i] != undefined && Data.CheckStrings[i].PrintImage != undefined) { Data.CheckStrings[i].PrintImage = null; }; }; }; // Скидываем данные об агенте - т.к.у Вас невярнека ККТ не зарегистрирована как Агент. Data.AgentSign = null; Data.AgentData = null; Data.PurveyorData = null; for (var i = 0; i < Data.CheckStrings.length; i++) { if (Data.CheckStrings[i] != undefined && Data.CheckStrings[i].Register != undefined) { Data.CheckStrings[i].Register.AgentSign = null; Data.CheckStrings[i].Register.AgentData = null; Data.CheckStrings[i].Register.PurveyorData = null; }; }; // Вызов команды ExecuteCommand(Data); // Возвращается JSON: //{ // "CheckNumber": 3, // Номер документа // "SessionNumber": 1, // Номер смены // "SessionCheckNumber": 1, // Номер чека в смене // "URL": "https://ofd-ya.ru/getFiscalDoc?kktRegId=0000000000061716&fiscalSign=839499349", // "QRCode": "t=20190101T195300&s=0.03&fn=9999078900002838&i=3&fp=839499349&n=1", // "Command": "RegisterCheck", // "Cash": 0, // Оплачено наличными // "ElectronicPayment": 3.02, // Оплачено электронноо // "AdvancePayment": 0, // Оплачено предоплатой (зачетом аванса) // "Credit": 0, // постоплатой(в кредит) // "CashProvision": 0, // встречным предоставлением (сертификаты, др. мат.ценности) // "Error": "", // Текст ошибки если была - обязательно показать пользователю - по содержанию ошибки можно в 90% случаях понять как ее устранять // "Message": "", // Сообщение пользователю - Если строка не пустая - ее нужно отобразить пользователю // "Status": 0, // Ok = 0, Run(Запущено на выполнение) = 1, Error = 2, NotFound(устройство не найдено) = 3, NotRun = 4 // "IdCommand": "dd261969-4190-1125-26cd-aaf5c213c0e3", // "NumDevice": 2 //} }
// Сторно чека function RegisterCorrectionCheck(NumDevice, TypeCheck, IsBarCode, Print) { // Подготовка данных команды var Data = { // Команда серверу Command: "RegisterCheck", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // ИНН ККМ. Если "" то ККМ ищется только по NumDevice, // Если NumDevice = 0 а InnKkm заполнено то ККМ ищется только по InnKkm InnKkm: "", // Время (сек) ожидания выполнения команды. //Если За это время команда не выполнилась в статусе вернется результат "NotRun" или "Run" //Проверить результат еще не выполненной команды можно командой "GetRezult" //Если не указано или 0 - то значение по умолчанию 60 сек. // Поле не обязательно. Это поле можно указывать во всех командах Timeout: 30, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: guid(), // Это фискальный или не фискальный чек IsFiscalCheck: true, // Тип чека, Тег 1054; // Для новых ККМ: // 2 – корректировка приход; // 12 – корректировка расход; TypeCheck: TypeCheck, //Тип коррекции 0 - самостоятельно 1 - по предписанию, Тег 1173 CorrectionType: 1, // Продавец, Тег ОФД 1021 CashierName: "Иванов И.И.", // ИНН продавца, Тег ОФД 1203 CashierVATIN: "430601071197", // Телефон или е-Майл покупателя, Тег ОФД 1008 // Если чек не печатается (NotPrint = true) то указывать обязательно // Формат: Телефон +{Ц} или Email {С}@{C} ClientAddress: "sochi@papa.com", // Покупатель (клиент) - наименование организации или фамилия, имя, отчество (при наличии), серия и номер паспорта покупателя(клиента). Тег 1227 // Только с использованием наличных / электронных денежных средств и при выплате выигрыша, получении страховой премии или при страховой выплате. ClientInfo: "Везучий В.В. РЕ-125486", // ИНН Организации или покупателя(клиента). Тег 1228 // Только с использованием наличных / электронных денежных средств и при выплате выигрыша, получении страховой премии или при страховой выплате. ClientINN: "502906602876", // Aдрес электронной почты отправителя чека, Тег ОФД 1117 (если задан при регистрации можно не указывать) // Формат: Email {С}@{C} SenderEmail: "sochi@mama.com", // Не печатать чек на бумагу NotPrint: false, // Количество копий документа NumberCopies: 0, // Система налогообложения (СНО) применяемая для чека, Тег 1055 // Если не указанно - система СНО настроенная в ККМ по умолчанию // 0: Общая ОСН // 1: Упрощенная УСН (Доход) // 2: Упрощенная УСН (Доход минус Расход) // 3: Единый налог на вмененный доход ЕНВД // 4: Единый сельскохозяйственный налог ЕСН // 5: Патентная система налогообложения // Комбинация разных СНО не возможна // Надо указывать если ККМ настроена на несколько систем СНО TaxVariant: "", // Наименование основания для коррекции, Тег ОФД 1177 CorrectionBaseName: "Предписание налоговой", // Дата документа основания для коррекции, Тег ОФД 1178 CorrectionBaseDate: '2017-06-21T15:30:45', // Номер документа основания для коррекции, Тег ОФД 1179 CorrectionBaseNumber: "MOS-4516", // Строки чека CheckStrings: [ // В сторно только не фискальные строки и ШК!!!!!!!!!!!!!!!!!!!!! { PrintText: { Text: "Это чек корректровки. Делается только по предписанию налоговой или глав.буха.", Font: 2, // 1-4, 0 - по настройкам ККМ Intensity: 0, // 1-15, 0 - по настройкам ККМ }, }, ], // Сумма расчета, игнорируется для ККТ ФФД 1.0, Тег 1020 Amount: 1.21, // Сумма коррекции Наличной оплаты (2 знака после запятой), Тег 1031 Cash: 1.11, // Сумма коррекции электронной оплаты (2 знака после запятой), Тег 1081 ElectronicPayment: 0.01, // Сумма коррекции предоплаты (зачетом аванса) (2 знака после запятой), Тег 1215 AdvancePayment: 0.02, // Сумма коррекции постоплатой(в кредит) (2 знака после запятой), Тег 1216 Credit: 0.03, // Сумма коррекции встречным предоставлением (2 знака после запятой), Тег 1217 CashProvision: 0.04, // Сумма коррекции НДС чека по ставке Без НДС, игнорируется для ККТ ФФД 1.0 (2 знака после запятой), Тег 1105 SumTaxNone: 0.01, // Сумма коррекции НДС чека по ставке 20%, игнорируется для ККТ ФФД 1.0 (2 знака после запятой), Тег 1102 SumTax20: 0.02, // Сумма коррекции НДС чека по ставке 10%, игнорируется для ККТ ФФД 1.0 (2 знака после запятой), Тег 1103 SumTax10: 0.03, // Сумма коррекции НДС чека по ставке 0%, игнорируется для ККТ ФФД 1.0 (2 знака после запятой), Тег 1104 SumTax0: 0.04, // Сумма коррекции НДС чека по ставке 20/120%, игнорируется для ККТ ФФД 1.0 (2 знака после запятой), Тег 1106 SumTax120: 0.05, // Сумма коррекции НДС чека по ставке 10/110%, игнорируется для ККТ ФФД 1.0 (2 знака после запятой), Тег 1107 SumTax110: 0.06, }; // Вызов команды ExecuteCommand(Data); // Возвращается JSON: //{ // "CheckNumber": 1, // Номер документа // "SessionNumber": 23, // Номер смены // "SessionCheckNumber": 1, // Номер чека в смене // "QRCode": "t=20170115T155100&s=0.01&fn=99078900002287&i=120&fp=2216493490&n=2", // URL проверки чека, где: t-дата-время, s-сумма документа, fn-номер ФН, i-номер документа, fp-фискальная подпись, n-тип документа // "Command": "RegisterCheck", // "Error": "", // Текст ошибки если была - обязательно показать пользователю - по содержанию ошибки можно в 90% случаях понять как ее устранять // "Status": 0 // Ok = 0, Run(Запущено на выполнение) = 1, Error = 2, NotFound(устройство не найдено) = 3, NotRun(Ждет очереди) = 4, AlreadyDone(Выполнено ранее) = 5, ErrorInEGAIS(Ошибка ЕГАИС) = 6 //} }
// Пример печати произвольного текста (Слип-чека) function PrintSlip(NumDevice, IsBarCode) { // Подготовка данных команды var Data = { Command: "RegisterCheck", NumDevice: NumDevice, IsFiscalCheck: false, NotPrint: false, IdCommand: guid(), // Строки чека CheckStrings: [ // Строка с печатью штрих-кода { BarCode: { // Тип штрих-кода: "EAN13", "CODE39", "CODE128","QR", "PDF417". BarcodeType: "EAN13", // Значение штрих-кода Barcode: "1254789547853", }, }, //При вставке в текст символов ">#10#<" строка при печати выровнеется по центру, где 10 - это на сколько меньше станет строка ККТ { PrintText: { Text: ">#2#<ООО 'Рога и копыта' " , Font: 1, }, }, // При вставке в текст в середину строки символов "<#10#>" Левая часть строки будет выравнена по левому краю, правая по правому, где 10 - это на сколько меньше станет строка ККТ // При вставке в текст в середину строки символов "<#10#>>" Левая часть строки будет выравнена по правому краю, правая по правому, где 10 - отступ от правого клая { PrintText: { Text: "Пример №1 печати поля:<#16#>154,41" }, }, { PrintText: { Text: "2-рое поле:<#16#>4,00" }, }, { PrintText: { Text: "Пример №2 печати поля:<#8#>>4,00" }, }, { PrintText: { Text: "2-рое поле:<#8#>>1544,00" }, }, // Строка с печатью текста определенным шрифтом { PrintText: { Text: "Шрифт № 1", Font: 1, // 1-4, 0 - по настройкам ККМ Intensity: 15, // 1-15, 0 - по настройкам ККМ }, }, { PrintText: { Text: "Шрифт № 2", Font: 2, // 1-4, 0 - по настройкам ККМ Intensity: 10, // 1-15, 0 - по настройкам ККМ }, }, { PrintText: { Text: "Шрифт № 3", //Text: "Это мега крутой товар. Продается во всех магазинах страны. Покупайте только у нас", Font: 3, // 1-4, 0 - по настройкам ККМ Intensity: 5, // 1-15, 0 - по настройкам ККМ }, }, { PrintText: { Text: "Шрифт № 4", Font: 4, // 1-4, 0 - по настройкам ККМ Intensity: 0, // 1-15, 0 - по настройкам ККМ }, }, { BarCode: { // Тип штрих-кода: "EAN13", "CODE39", "CODE128","QR", "PDF417". BarcodeType: "QR", // Значение штрих-кода Barcode: "12345DFG", }, }, ], }; //Если чек без ШК то удаляем строку с ШК if (IsBarCode == false) { //Data.Cash = 100; for (var i = 0; i < Data.CheckStrings.length; i++) { if (Data.CheckStrings[i] != undefined && Data.CheckStrings[i].BarCode != undefined) { Data.CheckStrings[i].BarCode = null; } } } // Вызов команды ExecuteCommand(Data); }
function OpenShift(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу Command: "OpenShift", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // Id устройства. Строка. Если = "" то первое не блокированное на сервере IdDevice: "", // Продавец, тег ОФД 1021 CashierName: "Kазакова Н.А.", // ИНН продавца тег ОФД 1203 CashierVATIN: "430601071197", // Не печатать чек на бумагу NotPrint: false, // Уникальный идентификатор команды. Любая строока из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды IdCommand: guid(), }; // Вызов команды ExecuteCommand(Data); // Возвращается JSON: //{ // "CheckNumber": 1, // Номер документа // "SessionNumber": 23, // Номер смены // "QRCode": "t=20170904T141100&fn=9999078900002287&i=108&fp=605445600", // "Command": "OpenShift", // "Error": "", // Текст ошибки если была - обязательно показать пользователю - по содержанию ошибки можно в 90% случаях понять как ее устранять // "Status": 0 // Ok = 0, Run(Запущено на выполнение) = 1, Error = 2, NotFound(устройство не найдено) = 3, NotRun = 4 //} }
function CloseShift(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу Command: "CloseShift", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // Продавец, тег ОФД 1021 CashierName: "Иванов И.И.", // ИНН продавца тег ОФД 1203 CashierVATIN: "430601071197", // Не печатать чек на бумагу NotPrint: false, // Id устройства. Строка. Если = "" то первое не блокированное на сервере IdDevice: "", // Уникальный идентификатор команды. Любая строока из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды IdCommand: guid(), }; // Вызов команды ExecuteCommand(Data); // Возвращается JSON: //{ // "CheckNumber": 1, // Номер документа // "SessionNumber": 23, // Номер смены // "QRCode": "t=20170904T141100&fn=9999078900002287&i=108&fp=605445600", // "Command": "CloseShift", // "Error": "", // Текст ошибки если была - обязательно показать пользователю - по содержанию ошибки можно в 90% случаях понять как ее устранять // "Status": 0 // Ok = 0, Run(Запущено на выполнение) = 1, Error = 2, NotFound(устройство не найдено) = 3, NotRun = 4 //} }
// Печать X отчета function XReport(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу "ZReport" ИЛИ "XReport" Command: "XReport", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: guid() }; // Вызов команды ExecuteCommand(Data); // Возвращается JSON: //{ // "CheckNumber": 1, // Номер документа // "SessionNumber": 23, // Номер смены // "Command": "ZReport", // "Error": "", // Текст ошибки если была - обязательно показать пользователю - по содержанию ошибки можно в 90% случаях понять как ее устранять // "Status": 0 // Ok = 0, Run(Запущено на выполнение) = 1, Error = 2, NotFound(устройство не найдено) = 3, NotRun = 4 //} }
// Печать чека внесения/изъятия function DepositingCash(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу "DepositingCash" или "PaymentCash" Command: "DepositingCash", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // Продавец, тег ОФД 1021 CashierName: "Kазакова Н.А.", // ИНН продавца тег ОФД 1203 CashierVATIN: "430601071197", // Сумма внесения наличных // Сумма внесения наличных Amount: 0.01, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: guid() }; // Вызов команды ExecuteCommand(Data); }
// Открыть денежный ящик function OpenCashDrawer(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу Command: "OpenCashDrawer", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: guid() }; // Вызов команды ExecuteCommand(Data); }
// Получить ширину строки чека в символах function GetLineLength(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу Command: "GetLineLength", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: guid() }; // Вызов команды ExecuteCommand(Data); }
// Получить данные чека из ФН по номеру чека. function GetDataCheck(NumDevice, FiscalNumber = 0, NumberCopies = 0) { // Подготовка данных команды var Data = { // Команда серверу Command: "GetDataCheck", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: guid(), // Фискальный номер (ФД) чека. Если 0 - то последний чек FiscalNumber: FiscalNumber, // Количество копий документа (копии печатаются на ленте) NumberCopies: NumberCopies }; // Вызов команды ExecuteCommand(Data); }
// Получить текущее состояние ККТ. function GetDataKKT(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу Command: "GetDataKKT", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: guid() }; // Вызов команды ExecuteCommand(Data); // Возвращается JSON: //{ // "CheckNumber": 8, // Номер последнего документа // "SessionNumber": 24, // Номер текущей смены // "LineLength": 48, // Ширина строки // "URL": "", // "Info": { // "UrlServerOfd": "connect.ofd-ya.ru", // "PortServerOfd": "7790", // "NameOFD": "ООО \"Ярус\" (\"ОФД-Я\")", // "UrlOfd": "", // "InnOfd": "504404744207", // "NameOrganization": "ООО \"Рога и Копыта\"", // "TaxVariant": "0,3,5", // Описание смотри в команде KkmRegOfd // "AddressSettle": "109097, Москва, ул. Ильинка, 9", // Адрес установки // "EncryptionMode": false, // "OfflineMode": true, // "AutomaticMode": false, // "InternetMode": false, // "BSOMode": false, // "ServiceMode": true, // "InnOrganization": "504404744207", // "KktNumber": "0149060006000651", // Заводской номер // "FnNumber": "99078900002287", // Номер ФН // "RegNumber": "0149060006035849", // Регистрационный номер ККТ (из налоговой) // "Command": "", // "FN_IsFiscal": true, // "OFD_Error": "", // "OFD_NumErrorDoc": 32, // "OFD_DateErrorDoc": "2017-01-13T14:56:00", // "FN_DateEnd": "2018-02-01T00:00:00", // "SessionState": 2 // Статус сессии 1-Закрыта, 2-Открыта, 3-Открыта, но закончилась (3 статус на старых ККМ может быть не опознан) // }, // "Command": "GetDataKKT", // "Error": "", // Текст ошибки если была - обязательно показать пользователю - по содержанию ошибки можно в 90% случаях понять как ее устранять // "Status": 0 // Ok = 0, Run(Запущено на выполнение) = 1, Error = 2, NotFound(устройство не найдено) = 3, NotRun = 4 //} }
Команда предназначена для проверки корректности сканировани ШК кода маркировки товар (он-же КИЗ он-же честный знак) Сканер нужно настроить так чтобы он при сканировании не проглатывал управляющие символы Поддерживаются ШК: Без идентификатора экземпляра товара: EAN8, EAN13, EAN14 С идентификатором экземпляра товара: GS1, ШК шуб, ШК табачной продукции., ЕГАИС-2, ЕГАИС-3 Примеры ШК коды которые поддерживаются: EAN-8: "46120441" EAN-13: "2900001462105" ITF14: "02900001462105" GS1, в качестве разделителей полей символы '(' и ')' "(01)12345678901231(253)1234567890123(8003)1234567890123456(10)12345678901234567890(21)12345678" GS1 (обувь), в качестве разделителей полей символ '\x1d' (в виде байта) "0104300943734342212413195240818240640291ffd092MDEwNDMwMDk0MzczNDM" GS1, в качестве разделителей полей строка "\u001d" "010460043993125621JgXJ5.T\u001d8005112000\u001d930001\u001d923zbrLA ==\u001d24014276281" GS1, в качестве разделителей полей строка "\\u001d" (с символом экранизации \) "010460043993125621JgXJ5.T\\u001d8005112000\\u001d930001\\u001d923zbrLA ==\\u001d24014276281" GS1, в качестве разделителей полей строка "\x1d" "010460406000600021N4N57RSCBUZTQ\x1d2403004002910161218\x1d1724010191ffd0\x1d92tIAF/YVoU4roQS3M/m4" GS1, в качестве разделителей полей строка "\x1d" (с символом экранизации \) "010460406000600021N4N57RSCBUZTQ\\x1d2403004002910161218\\x1d1724010191ffd0\\x1d92tIAF/YVoU4roQS3M/m4" GS1, в качестве разделителей полей строка "\x001d" "010460406000600021N4N57RSCBUZTQ\x001d2403004002910161218\x001d1724010191ffd0\x001d92tIAF/YVoU4roQS3M/m4" GS1, в качестве разделителей полей строка "\x001d" (с символом экранизации \) "010460406000600021N4N57RSCBUZTQ\\x001d2403004002910161218\\x001d1724010191ffd0\\x001d92tIAF/YVoU4roQS3M/m4" GS1 (лекарство), в качестве разделителей полей строка "<FNC1>" "<FNC1>0108691234567890211323424679<FNC1>1707011910AX785910BC" GS1, в качестве разделителей полей строка "<GS> " (с пробелом!!!!!!!) "0183525492885520210000000859314<GS> 91ee05<GS> 92r7fLjLdSQBRRL8KgReiJ0mgdFWhlR9gsfe1QS3ibhck=" GS, 1 в качестве разделителей полей строка "<GS> " "0183525492885520210000000859314<GS>91ee05<GS>92r7fLjLdSQBRRL8KgReiJ0mgdFWhlR9gsfe1QS3ibhck=" GS1, в качестве разделителей полей символ '\x1d' (поле 21 фиксированной длины (13) - без символа разделителя в конце - есть и такое!!) "010460620309891021MCEb6/r890123800511700093EBBm240FA068592.14" Шубы (20 знаков) "RU-430301-ABCDEF1234" Табак (29 знаков) "00000046186195Xp4k=xyAQDPtFEa" Табак (25 знаков) "00000046186195Xp4k=xyAQDP" ЕГАИС 2.0 (68 знаков) "22N00002NU5DBKYDOT17ID980726019019608CW1A4XR5EJ7JKFX50FHHGV92ZR2GZRZ" ЕГАИС 3.0 (150 знаков) "136222000058810918QWERDFEWT5123456YGHFDSWERT56YUIJHGFDSAERTYUIOKJ8HGFVCXZSDLKJHGFDSAOIPLMNBGHJYTRDFGHJKIREWSDFGHJIOIUTDWQASDFRETYUIUYGTREDFGHUYTREWQWE" function GetLineLength(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу Command: "GetGoodCodeData", //штрих-код маркировки товара со сканера (нужно настроить сканер так чтобы не проглатывал управляющие символы) BarCode: BarCode // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: guid() }; // Вызов команды ExecuteCommand(Data); // Возвращается JSON: //{ // "DataProductCode": { // // Исходный ШК // "BarCode": "0108691234567890211323424679 1707011910AX785910BC", // // ШК прошел проверку // "isParsed": true, // "RepresentationBarCode": "(01)08691234567890(21)1323424679(17)070119(10)AX785910BC", // "EAN": "8691234567890", // "GTIN": "08691234567890", // "SerialNumber": "1323424679", // // ШК идентифицирует экземпляр товара // "ContainsSerialNumber": true, // "MarkingCodeBase64": "RE0H55Xy9tIxMzIzNDI0Njc5", // // Состав полей ШК // "DataBarCode": { // "10": "AX785910BC", // "17": "070119", // "21": "1323424679", // "01": "08691234567890" // }, // // Тип ШК: 'NotParse', 'EAN8', 'EAN13', 'ITF14', 'GS1', 'Fur', 'EGAIS2', 'EGAIS3' // "ProductCodeType": "GS1", // "Errors": "" // }, // "Command": "GetGoodCodeData", // "Error": "", // "Warning": "", // "Message": "", // "Status": 0, // "IdCommand": "" //} }
// Регистрация и фискализация ККМ function KkmRegOfd(NumDevice) { // АХТУНГ!!!! // Внимание - некоторые команды регистрации необратимы!!!!! // Важно понимать что делаете!!!!! // Подготовка данных команды var Data = { // Команда серверу Command: "KkmRegOfd", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // Не печатать отчет NotPrint: false, // Сотрудник регистрирующий ККТ , тег ОФД 1021 CashierName: "Иванов И.И.", // ИНН продавца тег ОФД 1203 CashierVATIN: "430601071197", // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: guid(), // Данные регистрации RegKkmOfd: { // Команда регистрации // "Open" - первичная регистрация ККМ // "ChangeFN" - Замена ФН // "ChangeOFD" - Смена ОФД // "ChangeOrganization" - Смена реквизитов организации // "ChangeKkm" - смена реквизитов ККМ // "Close" - закрытие архива ФН Command: "Open", // Версия ФФД // 1 - ФФД ver 1.0 // 2 - ФФД ver 1.05 SetFfdVersion: 1, // URL или IP сервера ОФД (При командах "Open" и "ChangeOFD") UrlServerOfd: "ofd.com", // IP-порт сервера ОФД (При командах "Open" и "ChangeOFD") PortServerOfd: "9999", // Наименование ОФД (При командах "Open" и "ChangeOFD") NameOFD: "Лучший ОФД", // префикс URL ОФД для поиска чека (При командах "Open" и "ChangeOFD") UrlOfd: "ofd.com/reg", // ИНН ОФД (При командах "Open" и "ChangeOFD") InnOfd: "1234567890", // Наименование организации (При командах "Open" и "ChangeOrganization") NameOrganization: "ООО Рога и Копыта", // ИНН организации (При командах "Open") InnOrganization: "1234567890", // Регистрационный номер ККМ (При командах "Open") RegNumber: "0000521455048286", // Адрес установки ККМ (При командах "Open" и "ChangeOrganization") AddressSettle: "Сарайчик в деревне у бабушки", // Место установки (Для ФФД 1.05 и выше) PlaceSettle: "Подвал контрабандный", // Email магазина (Для ФФД 1.05 и выше) SenderEmail: "odessa@mama.ru", // Система налогообложения, может быть установлено сразу несколько СНО // (При командах "Open" и "ChangeOrganization") // 0: Общая ОСН // 1: Упрощенная УСН (Доход) // 2: Упрощенная УСН (Доход минус Расход) // 3: Единый налог на вмененный доход ЕНВД // 4: Единый сельскохозяйственный налог ЕСН // 5: Патентная система налогообложения // При нескольких СНО их нужно указать через запятую, например: "0,3,5" TaxVariant: "0,3,5", // Шифрование (При командах "Open" и "ChangeKkm") EncryptionMode: false, // Автономный режим (При командах "Open" и "ChangeKkm") OfflineMode: false, // Автоматический режим (При командах "Open") AutomaticMode: false, // Расчеты в Интернете (При командах "Open") InternetMode: false, // Бланки строгой отчетности (При командах "Open") BSOMode: false, // Применение в сфере услуг (При командах "Open") ServiceMode: false, // Признак установки принтера в автомате (Для ФФД 1.05 и выше) PrinterAutomatic: false, // Номер автомата AutomaticNumber: "", // Продажа подакцизного товара (Для ФФД 1.1 и выше) SaleExcisableGoods: false, // признак проведения азартных игр (Для ФФД 1.1 и выше) SignOfGambling: false, // признак проведения лотереи (Для ФФД 1.1 и выше) SignOfLottery: false, // Коды признаков агента через разделитель ",". (Для ФФД 1.1 и выше) SignOfAgent: "", }, }; // Вызов команды ExecuteCommand(Data); }
// Оплатить платежной картой function PayByPaymentCard(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу Command: "PayByPaymentCard", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // Номер Карты / Данные карты - если карта считывается устройством то не заполняется CardNumber: "", // Сумма оплаты Amount: 0.01, // Номер чека ReceiptNumber: "TEST-01", // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: guid() }; // Вызов команды ExecuteCommand(Data); } // Вернуть платеж по платежной карте function ReturnPaymentByPaymentCard(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу Command: "ReturnPaymentByPaymentCard", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // Номер Карты / Данные карты - если карта считывается устройством то не заполняется CardNumber: "", // Сумма оплаты Amount: 0.01, // Номер чека ReceiptNumber: "TEST-01", // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: guid() }; // Вызов команды ExecuteCommand(Data); } // Отменить платеж по платежной карте function CancelPaymentByPaymentCard(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу Command: "CancelPaymentByPaymentCard", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // Номер Карты / Данные карты - если карта считывается устройством то не заполняется CardNumber: Old_CardNumber, // Сумма оплаты Amount: 0.01, // Номер чека ReceiptNumber: "TEST-01", // Уникальный код транзакции RRN который был получен при оплате картой RRNCode: Old_RRNCode, // Код авторизации транзакции который был получен при оплате картой AuthorizationCode: Old_AuthorizationCode, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: guid() }; // Вызов команды ExecuteCommand(Data); } // Блокировка суммы на счете карты function AuthorisationByPaymentCard(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу Command: "AuthorisationByPaymentCard", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // Сумма оплаты Amount: 0.01, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: guid() }; // Вызов команды ExecuteCommand(Data); } // Списать блокированную сумму со счета карты function AuthConfirmationByPaymentCard(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу Command: "AuthConfirmationByPaymentCard", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // Номер Карты / Данные карты - если карта считывается устройством то не заполняется CardNumber: Old_CardNumber, // Сумма оплаты Amount: 0.01, // Номер чека ReceiptNumber: "TEST-01", // Уникальный код транзакции RRN который был получен при блокировки суммы на счете карты RRNCode: Old_RRNCode, // Код авторизации транзакции который был получен при блокировки суммы на счете карты AuthorizationCode: Old_AuthorizationCode, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: guid() }; // Вызов команды ExecuteCommand(Data); } // Разблокировать сумму на счете карты function CancelAuthorisationByPaymentCard(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу Command: "CancelAuthorisationByPaymentCard", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // Номер Карты / Данные карты - если карта считывается устройством то не заполняется CardNumber: Old_CardNumber, // Сумма оплаты Amount: 0.01, // Номер чека ReceiptNumber: "TEST-01", // Уникальный код транзакции RRN который был получен при блокировки суммы на счете карты RRNCode: Old_RRNCode, // Код авторизации транзакции который был получен при блокировки суммы на счете карты AuthorizationCode: Old_AuthorizationCode, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: guid() }; // Вызов команды ExecuteCommand(Data); } // Аварийная отмена операции (Метод отменяет последнюю транзакцию) function EmergencyReversal(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу Command: "EmergencyReversal", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: guid() }; // Вызов команды ExecuteCommand(Data); } // Закрыть смену по картам function Settlement(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу Command: "Settlement", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: guid() }; // Вызов команды ExecuteCommand(Data); } // Получить итоги дня по картам function TerminalReport(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу Command: "TerminalReport", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // Краткий (false) или полный (true) отчет Detailed: Detailed, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: guid() }; // Вызов команды ExecuteCommand(Data); } // Получить копию слип-чека function TransactionDetails(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу Command: "TransactionDetails", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // Номер Карты / Данные карты - если карта считывается устройством то не заполняется CardNumber: Old_CardNumber, // Сумма оплаты Amount: 0.01, // Номер чека ReceiptNumber: "TEST-01", // Уникальный код транзакции RRN который был получен при блокировки суммы на счете карты RRNCode: Old_RRNCode, // Код авторизации транзакции который был получен при блокировки суммы на счете карты AuthorizationCode: Old_AuthorizationCode, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: guid() }; // Вызов команды ExecuteCommand(Data); } // Есть ли печать квитанций на терминале? function PrintSlipOnTerminal(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу Command: "PrintSlipOnTerminal", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: guid() }; // Вызов команды ExecuteCommand(Data); } //---------------------------------------------------------------------------------------- // Пример асинхронного запроса для интерактивного ввода данных на сервере // Рекомендуется как основной способ работы с эквайринговыми терминалами (или с другим оборудованием с интерактивным вводом данных) var CounGetRezult; // Оплатить платежной картой function PayByPaymentCardAsync(NumDevice) { CounGetRezult = 0; // Генерация уникального идентификатора команды IdCommand = guid(); // Подготовка данных команды var Data = { // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды IdCommand: IdCommand, // Команда серверу Command: "PayByPaymentCard", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // Номер Карты / Данные карты - если карта считывается устройством то не заполняется CardNumber: "", // Сумма оплаты Amount: 0.01, // Номер чека ReceiptNumber: "TEST-01", // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: guid(), // Время (сек) ожидания выполнения команды. //Если За это время команда не выполнилась в статусе вернется результат "NotRun" или "Run" //Проверить результат еще не выполненной команды можно командой "GetRezult" //Если не указано или 0 - то значение по умолчанию 60 сек. // Поле не обязательно. Это поле можно указывать во всех командах Timeout: 1 //Асинхронный вызов без ожидания выполнения }; // Вызов команды // первый параметр true! это значит что серевр не будет ожидать завершения выполнения команды и сразу отдаст поток со страусом 1 - Run ExecuteCommand(Data, SetRezult); } // Асинхронная проверка выполнения команды!! function SetRezult(Rezult, textStatus, jqX) { // Эта функция вызывается при успешном запросе // Rezult.Status - Статус выполнения команды // Ok = 0, - выполнено без ошибок // Run = 1, - команда запущена на выполнение но еще не выполнена // Error = 2, - команда выполнена, есть ошибка // NotFound = 3, - не найдена ранее запущенная команда команда (для асинхронного режима при выполнении команды GetRezult) // NotRun = 4 - команда еще не запущена на выполнение (ожидание готовности устройства) if (Rezult.Status == 1 || Rezult.Status == 4) { // значит команда еще выполняется или еще не запустилась //Вывод данных что результат еще не выполнен CounGetRezult = CounGetRezult + 1; $("#MessageStatus").text("Выполняется: Запрос №:" + CounGetRezult); // Заново запрашиваем результат выполнения команды var Data = { // Команда серверу - запрос выволнеия команды Command: "GetRezult", // Уникальный идентификатор ранее поданной команды IdCommand: IdCommand, }; // Вызываем запрос на получение результата с задержкой 2 секунды setTimeout(function () { ExecuteCommand(Data, SetRezult, null, null, false) }, 1000); } else { // Rezult.Status <> 1 - значит команда уже выполнена // Вывод результата выполнения команды ExecuteSuccess(Rezult, textStatus, null); } };
// Печать чеков function PrintDocument(NumDevice, IsBarCode) { // Подготовка данных команды var Data = { // Команда серверу Command: "PrintDocument", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: guid(), // Строки чека 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: "2-рое поле:<#16#>4,00" }, }, { PrintText: { Text: "Пример №2 печати поля:<#8#>>4,00" }, }, { PrintText: { Text: "2-рое поле:<#8#>>1544,00" }, }, // Строка с печатью текста определенным шрифтом { PrintText: { Text: "Шрифт № 1", Font: 1, // 1-4, 0 - по настройкам ККМ Intensity: 15, // 1-15, 0 - по настройкам ККМ }, }, { PrintText: { Text: "Шрифт № 2", Font: 2, // 1-4, 0 - по настройкам ККМ Intensity: 10, // 1-15, 0 - по настройкам ККМ }, }, { PrintText: { Text: "Шрифт № 3", //Text: "Это мега крутой товар. Продается во всех магазинах страны. Покупайте только у нас", Font: 3, // 1-4, 0 - по настройкам ККМ Intensity: 5, // 1-15, 0 - по настройкам ККМ }, }, { PrintText: { Text: "Шрифт № 4", Font: 4, // 1-4, 0 - по настройкам ККМ Intensity: 0, // 1-15, 0 - по настройкам ККМ }, }, { BarCode: { // Тип штрих-кода: "EAN13", "CODE39", "CODE128","QR", "PDF417". BarcodeType: "EAN13", // Значение штрих-кода Barcode: "1254789547853", }, }, // Полная строка: И текст и регистрация и бар-код { PrintText: { Text: "Это мега крутой товар. Продается во всех магазинах страны. Покупайте только у нас", Font: 3, // 1-4, 0 - по настройкам ККМ Intensity: 0, // 1-15, 0 - по настройкам ККМ }, BarCode: { // Тип штрих-кода: "EAN13", "CODE39", "CODE128","QR", "PDF417". BarcodeType: "QR", // Значение штрих-кода Barcode: "12345DFG", }, }, ], }; //Если чек без ШК то удаляем строку с ШК if (IsBarCode == false) { //Data.Cash = 100; for (var i = 0; i < Data.CheckStrings.length; i++) { if (Data.CheckStrings[i] != undefined && Data.CheckStrings[i].BarCode != undefined) { Data.CheckStrings[i].BarCode = null; } } } // Вызов команды ExecuteCommand(Data); } // Открыть денежный ящик function PrintOpenCashDrawer(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу Command: "PrintOpenCashDrawer", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // Уникальный идентификатор команды. Любая строока из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: guid() }; // Вызов команды ExecuteCommand(Data); } // Получить ширину строки чека в символах function PrintLineLength(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу Command: "PrintLineLength", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // Уникальный идентификатор команды. Любая строока из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: guid() }; // Вызов команды ExecuteCommand(Data); }
// Откалибровать весы function Calibrate(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу Command: "Calibrate", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // Установка веса тары на весах. Если 0 то берется текущее значение веса на весах. TareWeight: 0 }; // Вызов команды ExecuteCommand(Data); } // Получить вес function GetWeight(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу Command: "GetWeight", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice }; // Вызов команды ExecuteCommand(Data); }
// Получение списка устройств function List() { // Подготовка данных команды var Data = { // Команда серверу Command: "List", // Отбор по номеру устройства. Число. Если 0 или не указано то с любым номером NumDevice: 0, // Отбор по ИНН. Строка. Если "" или не указано то первое не блокированное на сервере InnKkm: "", // Отбор активных. Булево. Если null или не указано то активные и не активные Active: true, // Отбор выключенных-включенных OnOff: true, // Отбор наличию ошибок ОФВ. Булево. Если null или не указано то с ошибками и без OFD_Error: false, // Все у которых дата не переданного док. в ОФД меньше указанной. Дата-время. Если null или не указано то любое OFD_DateErrorDoc: '2100-01-01T00:00:00', // Все у которых дата окончания работы ФН меньше указанной. Дата-время. Если null или не указано то любое FN_DateEnd: '2100-01-01T00:00:00', // Все у которых заканчивается память ФН; Булево. Если null или не указано то все FN_MemOverflowl: false, // Фискализованные или нет ФН; Булево. Если null или не указано то все FN_IsFiscal: true, }; // Вызов команды ExecuteCommand(Data); // Возвращается JSON массив из объектов: //{ // "ListUnit": [ // { // "NumDevice": 2, // "IdDevice": "6a6151a5-b352-485c-8f01-45da05d3df18", // "OnOf": true, // "Active": false, // "TypeDevice": "Фискальный регистратор", // "IdTypeDevice": "KkmStrihM", // "IP": "192.168.137.111", // "NameDevice": "<Не определено>", // "KktNumber": "", // "INN": "<Не определено>", // "TaxVariant": "", // Описание смотри в команде KkmRegOfd // "AddDate": "2017-01-13T14:55:16", // "OFD_Error": "", // "OFD_NumErrorDoc": 0, // "OFD_DateErrorDoc": "0001-01-01T00:00:00", // "FN_DateEnd": "0001-01-01T00:00:00", // "FN_MemOverflowl": false, // "FN_IsFiscal": false, // "PaperOver": false // }, // ], // "Command": "List", // "Error": "", // Текст ошибки если была - обязательно показать пользователю - по содержанию ошибки можно в 90% случаях понять как ее устранять // "Status": 0 // Ok = 0, Run(Запущено на выполнение) = 1, Error = 2, NotFound(устройство не найдено) = 3, NotRun = 4 //} }
// Проверка статуса ранее отданной команды function GetRezult(IdCommand) { // Эта функцию надо вызывать тогда, когда ответ на команду равен Rezult.Status = 1 или 4 // Статусы выполнения команды // Ok = 0, - выполнено без ошибок // Run = 1, - команда запущена на выполнение но еще не выполнена // Error = 2, - команда выполнена, есть ошибка // NotFound = 3, - не найдена ранее запущенная команда команда (для асинхронного режима при выполнении команды GetRezult) // NotRun = 4 - команда еще не запущена на выполнение (ожидание готовности устройства) // Заново запрашиваем результат выполнения команды var Data = { // Команда серверу - запрос выволнеия команды Command: "GetRezult", // Уникальный идентификатор ранее поданной команды IdCommand: IdCommand, }; // Вызываем запрос на получение результата с задержкой 2 секунды ExecuteCommand(Data, GetRezult, null, null, false); };
Расчет ключа для получения суб-лицензии Если Вам надо предоставить свою лицензию во временное пользование вашему клиенту (суб-лицензирование) вы должны сделать следующее: 1. Сгенерить ключ суб лиценции (пример описан ниже) 2. Вставить в данные команды поле "KeySubLicensing" с эти ключом, пример: KeySubLicensing: "client@gmail.com/750B3EE783DC3C66BBB2F5B4DF3F4EA0" Суб-лицензия выделяется из Ваших свободных сроком на 1 месяц. ВНИМАНИЕ! Расчет ключа для получения суб-лицензии должен происходить на Вашем сервере (а не у чужого клиента-суб-лицензиата) НЕ передавайте свой пароль клиенту-суб-лицензиата Данный пример только для понимания как генерировать ключ на Вашем сервере!! // Пример расчета ключа: // Email - ваш Email на который выделенны лицензии // Password - пароль от лицензии function GetKeySubLicensing(Email, Password) { //хеш пароля var Hash1 = md5(Password).toUpperCase(); // солим var Hash2 = md5(Hash1 + "Qwerty").toUpperCase(); // формируем дату в формате "YYYYMMDD" var now = new Date(); //Текущая дата var formated_date = "" + now.getFullYear() + ((now.getMonth()+1) < 10 ? "0" : "") + (now.getMonth()+1) + (now.getDate() < 10 ? "0" : "") + now.getDate(); //now.getMonth()+1 потому что getMonth() возвращает 0..11 а не 1..12 //добавляем данные лицензии var Hash3 = md5(Hash2 + formated_date).toUpperCase(); // Имя машины или имя клиента max 100 символов // Указывать не обязательно // Позволяет быстрее найти серийный номер в личном кабинете var Name = "Клиент-1"; // формируем ключ if (Name == "") { var Key = Email + "/" + Hash3; } else { var Key = Name + ":" + Email + "/" + Hash3; }; return Key; } Ключ должен расчитываться каждый день новый!!!! С версии 2.0.23.XX
Бывают ситуации когда облачное приложение не может само отправить команды на регистрацию чеков. Например когда KkmServer установлен в офисе, а у офиса нет постоянного IP и облачный сервер не сможет его увидеть по IP протоколу. В этом случае нужно настроить "Обратный вызов". "Обратный вызов" - это когда KkmServer сам по расписанию делает запрос к облачному серверу за данными для регистрации чеков. На странице настроек сервера, в меню "настройки сервера" внизу есть группа: "Настройка обратного вызова". Укажите список URL который сервер будет вызывать, Тип вызова, логин, пароль, и интервал вызова. Тип вызова: WebSockets: После установления соединения kkmserver передаст строку аутентификации: Basic=Токен:Логин:Пароль или Basic=Логин:Пароль Ваш сервер должен проверить данные, и если они не правильные - разорвать соединение. Далее kkmserver ждет сообщения от Вашего сервера Передача идет текстовыми сообщениями, Каждое водящее от Вас сообщение - это JSON команда, которая ставится в очередь на выполнение JSON формируется по общим правилам команд API Каждое исходящее к Вам сообщение - JSON ответ на поставленную команду. Ответы могут приходить в отличном от постановки порядке. Тип вызова: HTTP: KkmServer будет делать http/put запрос (по указанным URL) с таким json в теле: { "Command": "GetCommand", "Token": "", "ListRezult": [] } Где: "GetCommand" - Это значит что KkmServer запрашивает данные "Token" - токен(имя клиента) для облачного сервера "ListRezult" - массив результатов выполнения предыдущих команд. В данном случае пустой. Облачный сервер возвращает в теле JSON массив команд, например: { "ListCommand": [{ "Command": "List", "IdCommand": "6FA28ECE-0766-4479-BB37-F1343EA9CDBF" }, { "Command": "GetDataKKT", "NumDevice": 1, "IdCommand": "3B985644-7CF5-47B6-BA18-B54A634B67F3" }] } Где: "ListCommand" - массив команд. Формат команд точно такой-же как и при обычном вызове KkmServer. Допустимы все команды доступные при обычном вызове KkmServer-а. В данном примере 2 команды: 1-вая - получает список устройств, 2-рая получает данные по 1 устройству. KkmServer выполнит команды и через заданные в настройках интервал сделает очередной http/put запрос, пример: { "Command": "GetCommand", "Token": "", "ListRezult": [{ "ListUnit": [{ "NumDevice": 1, "IdDevice": "7fcfc44a-3741-486b-b8a0-a6f695e06301", "OnOff": true, ....................................... "FN_IsFiscal": false, "PaperOver": false }], "Command": "List", "Error": "", "Status": 0, "IdCommand": "6FA28ECE-0766-4479-BB37-F1343EA9CDBF" }, { "URL": "", "Command": "GetDataKKT", "Error": "", "Status": 1, ....................................... "IdCommand": "3B985644-7CF5-47B6-BA18-B54A634B67F3", "NumDevice": 1 }] } Где: "GetCommand" - Сервер опять запрашивает данные "Token" - токен(имя клиента) для облачного сервера "ListRezult" - массив результатов выполнения предыдущих команд. В данном случае в результах ответы на команды "List" и "GetDataKKT" Сопоставить отправленные команды с их результатами надо выполнять по полю "IdCommand" В Команде и в результате это поле будет одинаковое.
Файл html с примерами для браузера
Документация по API Расширения и примеры на js:
Совместимость с kkmserver/unitserverДля активации скрипта расширения ваша страница должна содержать в теге "head" строку: <script>var KkmServerAddIn = {};</script> По этой строке расширение поймет что надо в страницу внедрять скрипт расширения. Пример html странички с подключением расширения: <html> <head> <script>var KkmServerAddIn = {};</script> </head> <body/> </html> Расширение полностью совместимо по данным команд с kkmserver/unitserver Если у Вас написан код под kkmserver/unitserver то для работы с расширением надо сделать следующее: После подготовки данных команды отправить на исполнение в расширение так: //Проверка стоит ли расширение, и если стоит то отправка через расширение try { if (KkmServer != undefined) { // Если данные - строка JSON конвентируем в объект if (typeof (Data) == "string") Data = JSON.parse(Data); // Выполняем команду через расширение KkmServer.Execute(ExecuteSuccess, Data); //Возврат - вызов по Http не нужен return; }; } catch { }; // Если нет расширения - далее отправляем команду по http Где: -KkmServer.Execute() - функция которая будет доступна на http страницы в браузере -ExecuteSuccess - функция, которая будет вызвана после обработки команды.Пример: -Data - Ваши данные команды // Функция обработки результата команд function ExecuteSuccess(Rezult) { // Значения Rezult смотрите в описаниях команд } Так же можно установить некоторые значения по умолчанию: // Заполняем данные по умолчаниюпосле загрузки всего документа window.addEventListener("DOMContentLoaded", function () { // Функция вызываемая при выполнении команды. Подсталяется в команды если не указанно в функции "Execute()" перым параметром KkmServer.DefaultSettings.funCallBack = ExecuteSuccess; // Таймаут выполнения команды по умолчанию в сек. // Если 0 - то берется по дефолту 30 сек. // Если 1 - произойдет возврат сразу после постановки команды на выполнение. Проверить результат можно командой "GetRezult" KkmServer.DefaultSettings.Timeout = 30; // ФИО и ИНН продавца. Подставляется в команды если в них не задано явно KkmServer.DefaultSettings.CashierName = "Иванов И.И."; KkmServer.DefaultSettings.CashierVATIN = "430601071197"; // Email отправителя чеков KkmServer.DefaultSettings.SenderEmail = "sochi@mama.com"; // Установка ключа суб-лицензии по умолчанию: ВНИМАНИЕ: ключ суб-лицензии вы должны генерить у себя на сервере!!!! KkmServer.DefaultSettings.KeySubLicensing = ""; });
// Печать чека function RegisterCheck(NumDevice, TypeCheck, IsBarCode, Print) { // Подготовка данных команды, параметры (TypeCheck = 0, NumDevice = 0, InnKkm = "", CashierName = "") var Data = KkmServer.GetDataCheck(TypeCheck, NumDevice, "", "Kазакова Н.А.", "430601071197"); //*********************************************************************************************************** // ПОЛЯ ПОИСКА УСТРОЙСТВА //*********************************************************************************************************** // Номер устройства. Если 0 то первое не блокированное на сервере Data.NumDevice = NumDevice; // ИНН ККМ для поиска. Если "" то ККМ ищется только по NumDevice, // Если NumDevice = 0 а InnKkm заполнено то ККМ ищется только по InnKkm Data.InnKkm = ""; //--------------------------------------------- // Заводской номер ККМ для поиска. Если "" то ККМ ищется только по NumDevice, Data.KktNumber = ""; // ********************************************************************************************************** // Время (сек) ожидания выполнения команды. //Если За это время команда не выполнилась в статусе вернется результат "NotRun" или "Run" //Проверить результат еще не выполненной команды можно командой "GetRezult" //Если не указано или 0 - то значение по умолчанию 60 сек. // Поле не обязательно. Это поле можно указывать во всех командах Data.Timeout = 30; // Это фискальный или не фискальный чек Data.IsFiscalCheck = true; // Тип чека; // 0 – продажа; 10 – покупка; // 1 – возврат продажи; 11 - возврат покупки; // 8 - продажа только по ЕГАИС (обычный чек ККМ не печатается) // 9 - возврат продажи только по ЕГАИС (обычный чек ККМ не печатается) Data.TypeCheck = TypeCheck; // Не печатать чек на бумагу Data.NotPrint = false; //true, // Количество копий документа Data.NumberCopies = 0; // Продавец, тег ОФД 1021 Data.CashierName = "Kазакова Н.А."; // ИНН продавца тег ОФД 1203 Data.CashierVATIN = "430601071197"; // Телефон или е-Майл покупателя, тег ОФД 1008 // Если чек не печатается (NotPrint = true) то указывать обязательно // Формат: Телефон +{Ц} Email {С}@{C} Data.ClientAddress = "sochi@papa.com"; // Покупатель (клиент) - наименование организации или фамилия, имя, отчество (при наличии), серия и номер паспорта покупателя(клиента). Тег 1227 // Только с использованием наличных / электронных денежных средств и при выплате выигрыша, получении страховой премии или при страховой выплате. Data.ClientInfo = "Везучий В.В. РЕ-125486"; // ИНН Организации или покупателя(клиента). Тег 1228 // Только с использованием наличных / электронных денежных средств и при выплате выигрыша, получении страховой премии или при страховой выплате. Data.ClientINN = "502906602876"; // Aдрес электронной почты отправителя чека тег ОФД 1117 (если задан при регистрации можно не указывать) // Формат: Email {С}@{C} Data.SenderEmail = "sochi@mama.com"; // Место расчетов, Тег ОФД 1187 (если не задано - берется из регистрационных данных ККТ) Data.PlaceMarket = "kkmserver.ru"; // Система налогообложения (СНО) применяемая для чека // Если не указанно - система СНО настроенная в ККМ по умолчанию // 0: Общая ОСН // 1: Упрощенная УСН (Доход) // 2: Упрощенная УСН (Доход минус Расход) // 3: Единый налог на вмененный доход ЕНВД // 4: Единый сельскохозяйственный налог ЕСН // 5: Патентная система налогообложения // Комбинация разных СНО не возможна // Надо указывать если ККМ настроена на несколько систем СНО Data.TaxVariant = ""; // Дополнительный реквизит пользователя тег ОФД 1084 Data.UserAttribute = { // Наименование дополнительного реквизита пользователя тег ОД 1085 Name: "Поле-тест", // Значение дополнительного реквизита пользователя тег ОФД 1086 Value: "Тестовое значение" }; // Дополнительный реквизит чека тег 1192 Data.AdditionalAttribute = "Тест"; // Это только для тестов: //Data.ClientId = "e1e0c5dbb395acecda9e3ed86a798755b21a53de"; //"541a9db930c2e90670898943", // Это только для тестов: Получение ключа суб-лицензии : ВНИМАНИЕ: ключ суб-лицензии вы должны генерить у себя на сервере!!!! //Data.KeySubLicensing = ""; // КПП организации, нужно только для ЕГАИС Data.KPP = "782543005"; // Если надо одновременно автоматически провести транзакцию через эквайринг // Эквайринг будет задействован если: 1. чек фискальный, 2. оплата по "ElectronicPayment" не равна 0, 3. PayByProcessing = true // Использовать эквайринг: Null - из настроек на сервере, false - не будет, true - будет Data.PayByProcessing = false; //В тестовом чеке автоматический эквайринг выключен // Номер устройства для эквайринга - Null - из настроек на сервере, 0 - любое, число - номер конкретного устройства Data.NumDeviceByProcessing = null; // Номер чека для эквайринга Data.ReceiptNumber = "TEST-1"; // Печатать Слип-чек после чека (а не в чеке) PrintSlipAfterCheck = false; // Печатать Слип-чек дополнительно для кассира (основной слип-чек уже будет печататся в составе чека) Data.PrintSlipForCashier = true; //Если это чек возврата то возможны два поля для отмены транзакции (если не указано то по эквайрингу будет не отмена а возврат оплаты) Data.RRNCode = ""; // RRNCode из операции эквайринга. Только для отмены оплаты! Для Оплаты или возврата оплаты не заполнять! Data.AuthorizationCode = ""; // AuthorizationCode из операции эквайринга. Только для отмены оплаты! Для Оплаты или возврата оплаты не заполнять! // Добавление признаков агенте и поставщика Data.AddDataAgent( // Признак агента (не обязательно), Тег 1057 // 0: "Банковский платежный агент:" Оказание услуг пользователем, являющимся банковским платежным агентом // 1: "Банковский платежный субагент:" Оказание услуг пользователем, являющимся банковским платежным субагентом // 2: "Платежный агент:" Оказание услуг пользователем, являющимся платежным агентом // 3: "Платежный субагент:" Оказание услуг пользователем, являющимся платежным субагентом // 4: "Поверенный:" Оказание услуг пользователем, являющимся поверенным // 5: "Комиссионер:" Оказание услуг пользователем, являющимся комиссионером // 6: "Агент:" Оказание услуг пользователем, являющимся агентом и не являющимся банковским платежным агентом (субагентом), платежным агентом (субагентом), поверенным, комиссионером 2, // Операция платежного агента тег 1044 "95315", // Телефон платежного агента тег 1073 "+79995554422", // Телефон оператора по приему платежей тег 1074 "+72223334455", // Телефон оператора перевода тег 1075 "+74447776655", // Наименование оператора перевода тег 1026 "ООО Тестовая организация", // Адрес оператора перевода тег 1005 "Москва, зубовский бульвар 44", // ИНН оператора перевода тег 1016 "430601071197", // Телефон поставщика тег 1171 "+76662229955" ); // Добавление печати картинки Data.AddImageString("Qk3+EwAAAAAAAD4AAAAoAAAA5AAAAJ4AAAABAAEAAAAAAMATAACHHQAAhx0AAAAAAAAAAAAAAAAAAP///wD/////////////////////////////////////8AAAAP/////////////////////////////////////wAAAA//////////////////////////////////////AAAAD/////////////////////////////////////8AAAAP/////////////////////////////////////wAAAA//////////////////////////////////////AAAAD/////////////////////////////////////8AAAAP////+f//////////+P///////////////////wAAAA/////5///////////4////////////////////AAAAD/////n///////////H///////////////////8AAAAP////+f//////////8f///////////////////wAAAA/////5///////////x////////////////////AAAAD/////j//////////+P///////////////////8AAAAP////+PwAj///////w////////////////////wAAAA/////48PgP///////H////////////////////AAAAD/////zH/B///////4f///////////////////8AAAAP/////J/8H///////j////////////////////wAAAA/////+P/4///////8P////////////////////AAAAD///gAx//z///////h////////////////////8AAAAP//4fgP//P//////+P////////////////////wAAAA///H/z//8B//////x///////gP////////////AAAAD//5/8f//gD/////+P//////4AH///////////8AAAAP//P/3//8/B/////x///////AAMf///////+A/wAAAA//8/////H+H////+H//////4/+AH///////AB/AAAAD//n////5/w/8f//yP//////n/w4P//////4fP8AAAAP/+////+f+D/8AH/8f/////8/+f+P/////+H8/wAAAA//7////z//P//g//x//////3/3/+f/////j/5/AAAAD//P///+//8//////H/////8f///8////wB//n8AAAAP/8////z//j/////8/////wB////5//+AH//8PwAAAA//z///+v/+f/P///D////wAH////z/8A////0fAAAAD//P///7//w/+AA/4f///8Aef////n+A////+R8AAAAP/9//////4ID+Tv/7////A/5//8//vA/////znwAAAA//3/P////H4f7Of/v///4//n//n//Q/////8efAAAAD//f+P///x/B/Mc/+f///H//P/+f/+P/////Dz8AAAAP/9/8f//+P4P9x7/5///5//8//wA/z////4A/PwAAAA//3/Mf//z/+/nD3/n///P//z//GAAf////P/8PAAAAD/+f/A//+f/7+evP/f//8///H/8f/x////9//g8AAAAP/5//A//y//Pz6ef8///n//+f/x//P////3/+HwAAAA//n/+Q//7/8/Ps8/z//+///5//n/9///////yfAAAAD/+YABx////n4+z7/v//z///z/+P/n//////8Z8AAAAP/4B/gh///8/n5n3+//+f///P/8/+f/////8DvwAAAA/+D//xh///n+fnfP5//7///+f/z/5///9/+A+/AAAAD/h///jh//4/x+c+f3//P///4//n/n///v/z/z8AAAAP8P///Hg/+H/P578/f/AD///z//f+f//+//f/fwAAAA/D///+fAAB/8/nn58/wfD/wAH/8/9///n/9/7/AAAAD4f///5+AA//z/ffz7+P/n/4AP/5////8////P8AAAAPn////z5///+f9+/nnz//P/j8f/z////H///x/wAAAA8/////Pz///5/z5/uef/++Af4/vD///4///8f/AAAADn////8/P///n/P3/N7/B58//x/eD//8P//8D/8AAAAOf////D8f//+f8/v+QP553n//h88D/4D///B//wAAAAz////+P5///x/7+f8E/P3c///j54D/////h///AAAADf////8fj///P/v9/x35/dz///Dz4h////8P//8AAAAN/////5/P//8/+fj/PfL8Gf///BH57////H///wAAAA3/////z8f//z/58n5993wT////AH/v///4////AAAACf///z/Px///P/nmfn3nPMP////AP+f//+P///8AAAAN///gB+/n//8/+f8+f+e99/////8P5///z////wAAAA3//wAD7+P//3/9/w5/57z3/////4PH//8/////AAAADd/8H+Hv8///f/z/Hn/APAf/////8AP//n////8AAAAMv/D/z8/x//9//PxPf8/8T///////8//+/////wAAAA6/4//P3/n//3/8/+c/z/0f///////5//7/////AAAADj+P/8+f+P/+f/7/9z/P/D////////x//3////8AAAAPfx//zz/8//4//n/zn8/8P////////h//n////wAAAA9+X//Of/5//4f+f4Gf3/x/////////g//P////AAAADn6f/8z//n//4f5//cff/H/////////B/8////8AAAAOf5//yf//O//8fz/879+8A/////////D/5////wAAAA5/n//j//8H//8fP/5v3zw4////////+H/n////AAAADn+f/8H//4///8c//y/fPH8////////8f/f///8AAAAOf5//AH//H///4x//r988f4///h////5/9////wAAAA9/n/58P/8wH/+Hn//P37x/5//4B////n/n////AAAAD3+f//8/8AD//B+f/+/fvD/7//vj///+f+f///8AAAAPP5///AAA///x/4//79+8P+Af8/n///9/x////wAAAA+Pn/////////v/z//vz7weAAH7/P///z+P////AAAAD8AP////////+f/H/+/Pvfg/4Dn/P///Pw////8AAAAP+I/////////9/+f9788B4//+Df+A//+IH////wAAAA//z/////////z/5/zvz3OP///A/AQ//4D/////AAAAD//P/////////v/j/k/O/x////CA/x//h/////8AAAAP/8/////////+f/P/D85+P////g//n//f/////wAAAA//5/////////8/8f8Px3z/////wf/P////////AAAAD//n/////////5/5/4/gef///////8////////8AAAAP/+f/////////n/n/L+Az////////z////////wAAAA//9//////////P/P9v4Cf//h/////P////////AAAAD//z/////////+f8/v/gD//+7////5////////8AAAAP//P/////////4/58//Af//53////z////////wAAAA//+f/////////z/33/8D///zP////H////////AAAAD//5//////////n/Pf/wP///x////+P///////8AAAAP//j//////////P+Z/3B/////////8f///////wAAAA///P/////////+fpr/uP/////////4////////AAAAD//+f/////////48yP+I//////////x///////8AAAAP//8P//////A//xzp/8H//5///////j///////wAAAA///4AAAAAAAH//iPH/8P//N//////+P///////AAAAD////AAAAAf8P/gA4f////93//////8f//////8AAAAP////4AA///4PAADh/////7v//////4///////wAAAA///////////4AAAMH/////x///////z///////AAAAD///////////+AAAwP///f/////////H//////8AAAAP////////////wADA9//7/////////+f//////wAAAA/////////////gAABn//A/////////5///////AAAAD//////////8AHAAAAf/wf///x/////j//////8AAAAP//////////8AAAAAB/8P///+b/////P//////wAAAA///////////8AAAAAH/Bf/9/73////8///////AAAAD///////////8AAAAAAAE//z/3f////z//////8AAAAP///////////8AAAAAAAJ//n/h//v//P//////wAAAA//////////8AAAAAAD4Az//P///8D/8///////AAAAD//////////AAAAAAAPADAAAf///gD/z//////8AAAAP//////////AAAAAAA/gGAAAf//+AD/P//////wAAAA///////////gAAAAAB+AYDn8///wAH9///////AAAAD///////////gAAAAAH4BwHf4///AAPn//////8AAAAP///////////gAAAAAfgHAd/w//8AAc///////wAAAA////////////gAAAAA/AcBz/w//wAAn///////AAAAD////////////AAAAAD8h5Hv/w//AAA///////8AAAAP///////////+AAAAAPzHke//wf8AAD///////wAAAA///////////+AAAAAA7A+D7//4HwAAP///////AAAAD///////////AAAAAAD0H5/n//8AAAAf//////8AAAAP//////////4AAAAAAPb/n+f///AAAB///////wAAAA//////////+AAAAAAA9v+f5////4AAD///////AAAAD//////////wAAAAAAB2/5/3////wAAP//////8AAAAP////////////AAAAAHN/j/f//7/gDg///////wAAAA/////////////4AAAA+3+P5///P/AfH///////AAAAD/////////////wAAAD9v5fn//x/+A8f//////8AAAAP////////////+OAAAP+ft+//8H/8AB///////wAAAA/////////////54AAA/884j//A//8AP///////AAAAD/////////////nuAAD/AHwD/4H//4D///////8AAAAP////////////+8/AAH9P/4v8Af///////////wAAAA/////////////7n/gAP3P/GfAD////////////AAAAD/////////////Of/AAPPP55wAf///////////8AAAAP////////////+z/8wAGffvAAD/z//////////wAAAA/////////////7P/ngAAc+wAAf4f//////////AAAAD/////////////t/8fAAADwAAD8D//////////8AAAAP////////////+H/z+AAAAAAAeAf//////////wAAAA/////////////4f+f8AAAAAADAD///////////AAAAD/////////////z/x/4AAAAAAAAf//////////8AAAAP/////////////P/P/wAAAAAAAD/+/////////wAAAA/////////////8/5/+AAAAAAAA//H/////////AAAAD/////////////3/n/wgAAAAAAH/g/////////8AAAAP/////////////f8/8PAAAAAAB/gH/////////wAAAA/////////////9/3/h+AAAAAAfgB//////////AAAAD/////////////3+f8P+AAAAAAAAP/////////8AAAAP/////////////f7/j/8AAAAAAAD//////////wAAAA/////////////9/P8f/4AAAAAAA///////////AAAAD/////////////n9/j//4AAAAAAf//////////8AAAAP////////////+fn8f//4AAAAAP///////////wAAAA/////////////5+fj//vwAAAAH/4//////////AAAAD/////////////n78f//PwAAAB/AH/////////8AAAAP////////////+fPg///PwAAAAAB//////////wAAAA/////////////598A///HwAAAAAf//////////AAAAD/////////////3nzgf//H4AAAAP//////////8AAAAP/////////////eefgD/wAAAAAD///////////wAAAA/////////////97z+kAAfAcAAH////////////AAAAD/////////////3OP7f///////////////////8AAAAP/////////////Mx/s////////////////////wAAAA/////////////83P+Z////////////////////AAAAD/////////////zZ/4H///////////////////8AAAAP/////////////tH//////////////////////wAAAA/////////////+c///////////////////////AAAAD/////////////4n//////////////////////8AAAAP/////////////w///////////////////////wAAAA//////////////H///////////////////////AAAAD/////////////////////////////////////8AAAAP/////////////////////////////////////wAAAA"); // Добавление печати текста по полям //При вставке в текст символов ">#10#<" строка при печати выровнеется по центру, где 10 - это на сколько меньше станет строка ККТ Data.AddTextString(">#2#<ООО \"Рога и копыта\"", 1); // При вставке в текст в середину строки символов "<#10#>" Левая часть строки будет выравнена по левому краю, правая по правому, где 10 - это на сколько меньше станет строка ККТ // При вставке в текст в середину строки символов "<#10#>>" Левая часть строки будет выравнена по правому краю, правая по правому, где 10 - отступ от правого клая Data.AddTextString("<<->>"); Data.AddTextString("Пример №1:<#10#>154,41"); Data.AddTextString("2-рое поле:<#10#>4,00"); Data.AddTextString("<<->>"); Data.AddTextString("Пример №2:<#8#>>4,00"); Data.AddTextString("2-рое поле:<#8#>>1544,00"); // Добавление печати текста шрифтом и интенсивностью // Data.AddTextString(Data, Текст, Font(1-4, 0 - по настройкам ККМ), Intensity(1-15, 0 - по настройкам ККМ); Data.AddTextString("<<->>"); Data.AddTextString("Шрифт № 1", 1, 15); Data.AddTextString("Шрифт № 2", 2, 10); Data.AddTextString("Шрифт № 3", 3, 5); Data.AddTextString("Шрифт № 4", 4, 15); Data.AddTextString("<<-> >"); // Добавление печати фискальной строки var DataStr = Data.AddRegisterString( // НаименованиеТовара(64 символа) "Сапоги женские DF-3099-1", // Количество (3 знака после запятой) 3, // ЦенаБезСкидки (2 знака после запятой) 100, // СуммаСтроки (2 знака после запятой) 0.01, // СтавкаНДС(0(НДС 0%), 10(НДС 10%), 20(НДС 20%), -1(НДС не облагается), 120 (НДС 20/120), 110 (НДС 10/110)) -1, // Отдел 0, // Код товара EAN13 - не обязательно "1254789547853", // Признак способа расчета. тег ОФД 1214. Для ФФД.1.05 и выше обязательное поле // 1: "ПРЕДОПЛАТА 100% (Полная предварительная оплата до момента передачи предмета расчета)" // 2: "ПРЕДОПЛАТА (Частичная предварительная оплата до момента передачи предмета расчета)" // 3: "АВАНС" // 4: "ПОЛНЫЙ РАСЧЕТ (Полная оплата, в том числе с учетом аванса в момент передачи предмета расчета)" // 5: "ЧАСТИЧНЫЙ РАСЧЕТ И КРЕДИТ (Частичная оплата предмета расчета в момент его передачи с последующей оплатой в кредит )" // 6: "ПЕРЕДАЧА В КРЕДИТ (Передача предмета расчета без его оплаты в момент его передачи с последующей оплатой в кредит)" // 7: "ОПЛАТА КРЕДИТА (Оплата предмета расчета после его передачи с оплатой в кредит )" 4, // Признак предмета расчета. тег ОФД 1212. Для ФФД.1.05 и выше обязательное поле // 1: "ТОВАР (наименование и иные сведения, описывающие товар)" // 2: "ПОДАКЦИЗНЫЙ ТОВАР (наименование и иные сведения, описывающие товар)" // 3: "РАБОТА (наименование и иные сведения, описывающие работу)" // 4: "УСЛУГА (наименование и иные сведения, описывающие услугу)" // 5: "СТАВКА АЗАРТНОЙ ИГРЫ (при осуществлении деятельности по проведению азартных игр)" // 6: "ВЫИГРЫШ АЗАРТНОЙ ИГРЫ (при осуществлении деятельности по проведению азартных игр)" // 7: "ЛОТЕРЕЙНЫЙ БИЛЕТ (при осуществлении деятельности по проведению лотерей)" // 8: "ВЫИГРЫШ ЛОТЕРЕИ (при осуществлении деятельности по проведению лотерей)" // 9: "ПРЕДОСТАВЛЕНИЕ РИД (предоставлении прав на использование результатов интеллектуальной деятельности или средств индивидуализации)" // 10: "ПЛАТЕЖ (аванс, задаток, предоплата, кредит, взнос в счет оплаты, пени, штраф, вознаграждение, бонус и иной аналогичный предмет расчета)" // 11: "АГЕНТСКОЕ ВОЗНАГРАЖДЕНИЕ (вознаграждение (банковского)платежного агента/субагента, комиссионера, поверенного или иным агентом)" // 12: "СОСТАВНОЙ ПРЕДМЕТ РАСЧЕТА (предмет расчета, состоящем из предметов, каждому из которых может быть присвоено вышестоящее значение" // 13: "ИНОЙ ПРЕДМЕТ РАСЧЕТА (предмет расчета, не относящемуся к предметам расчета, которым может быть присвоено вышестоящее значение" // 14: "ИМУЩЕСТВЕННОЕ ПРАВО" (передача имущественных прав) // 15: "ВНЕРЕАЛИЗАЦИОННЫЙ ДОХОД" // 16: "СТРАХОВЫЕ ВЗНОСЫ" (суммы расходов, уменьшающих сумму налога (авансовых платежей) в соответствии с пунктом 3.1 статьи 346.21 Налогового кодекса Российской Федерации) // 17: "ТОРГОВЫЙ СБОР" (суммы уплаченного торгового сбора) // 18: "КУРОРТНЫЙ СБОР" // 19: "ЗАЛОГ" 1, //штрих - код маркировки товара со сканера(нужно настроить сканер так чтобы не проглатывал управляющие символы) //КИЗ(контрольный идентификационный знак) товарной номенклатуры Тег ОФД 1162(честный знак), можно не указывать // Поддерживаются ШК: // Без идентификатора экземпляра товара: EAN8, EAN13, ITF14 // С идентификатором экземпляра товара: GS1, ШК шуб, ШК табачной продукции., ЕГАИС-2, ЕГАИС-3 //Описание применимых ШК "0104300943734342212413195240818240640291ffd092MDEwNDMwMDk0MzczNDM", // Единица измерения предмета расчета. Можно не указывать "пара", // Цифровой код страны происхождения товара (CountryOfOrigin) в соответствии с Общероссийским классификатором стран мира 3 симв. Тег 1230 "156", // Регистрационный номер таможенной декларации (CustomsDeclaration) 32 симв. Тег 1231 "54180656/1345865/3435625/23", // Сумма акциза (ExciseAmount) с учетом копеек, включенная в стоимость предмета расчета Тег 1229 0.01, // Дополнительный реквизит предмета расчета тег 1191, Только для ФФД 1.1 ! "Тест-доп.реквизит" ); // Добавляет в последнею строку Код товарной номенклатуры // КИЗ (контрольный идентификационный знак) товарной номенклатуры Тег ОФД 1162 (честный знак), можно не указывать // !!!!Команда нужна если в команде Data.AddRegisterString не добавили КИЗ //Data.MarkingCode( // // штрих-код маркировки товара со сканера (нужно настроить сканер так чтобы не проглатывал управляющие символы) // // Поддерживаются ШК: // // Без идентификатора экземпляра товара: EAN8, EAN13, ITF14 // // С идентификатором экземпляра товара: GS1, ШК шуб, ШК табачной продукции., ЕГАИС-2, ЕГАИС-3 // "0104300943734342212413195240818240640291ffd092MDEwNDMwMDk0MzczNDM", // // Проверять содержит ли ШК кода маркировки идентификатор экземпляра товара (если вообше не указать - true) // // Для некоторых товаров нужно передавать ШК EAN-13, тогда это поле устанавливайте в 'false' // true //); DataStr.EGAIS = { Barcode: "22N0000154NUCPRZ3R8381461004001003499NKAQ0ZBUVDNV62JQAR69PEV878RO93V", Ean: "3423290167937", Volume: 0.7500, }; // Добавляет в последнею строку признак агента (не обязательно), Тег 1222. // Поле не обязательное. Можно вообще не указывать. // 0: "Банковский платежный агент:" Оказание услуг пользователем, являющимся банковским платежным агентом // 1: "Банковский платежный субагент:" Оказание услуг пользователем, являющимся банковским платежным субагентом // 2: "Платежный агент:" Оказание услуг пользователем, являющимся платежным агентом // 3: "Платежный субагент:" Оказание услуг пользователем, являющимся платежным субагентом // 4: "Поверенный:" Оказание услуг пользователем, являющимся поверенным // 5: "Комиссионер:" Оказание услуг пользователем, являющимся комиссионером // 6: "Агент:" Оказание услуг пользователем, являющимся агентом и не являющимся банковским платежным агентом (субагентом), платежным агентом (субагентом), поверенным, комиссионером Data.AddAgentSign(2); // Добавляет в последнею строку данные агента (не обязательно) Data.AddAgentData( // Операция платежного агента тег 1044 "95315", // Телефон платежного агента тег 1073 "+79995554422", // Телефон оператора по приему платежей тег 1074 "+72223334455", // Телефон оператора перевода тег 1075 "+74447776655", // Наименование оператора перевода тег 1026 "ООО Рога и копыта", // Адрес оператора перевода тег 1005 "Москва, зубовский бульвар 44", // ИНН оператора перевода тег 1016 "430601071197" ); // Добавляет в последнею строку данные поставщика (не обязательно) Data.AddPurveyorData( // Телефон поставщика тег 1171 "+76662229955", // Наименование поставщика ОФД 1225 "ООО 'Гаражик в деревне'", // ИНН поставщика тег 1226 "430601071197" ); // Добавление печати штрихкода // Data.AddBarcodeString(ТипШтрихКода ("EAN13", "CODE39", "CODE128", "QR", "PDF417", "1254789547853"), ШтрихКод); Data.AddBarcodeString("EAN13", "1254789547853"); Data.AddTextString("<<->>"); Data.AddTextString("Это мега крутой товар. Продается во всех магазинах страны. Покупайте только у нас", 4, 0); // Добавление печати еще одной фискальной строки Data.AddRegisterString("Шаровары мужские красные: НИМБУС-2000", 1, 1500, 0.01, 18, 1, "1254789547853", 1, 1); // Добавляет в последнею строку Код товарной номенклатуры Data.AddGoodCodeData("02", "04630037591316", "sgEdK2y5"); // Добавление печати штрихкода // Data.AddBarcodeString(ТипШтрихКода ("EAN13", "CODE39", "CODE128", "QR", "PDF417", "1254789547853"), ШтрихКод); Data.AddBarcodeString("QR", "12345DFG Proba pera, Print barcode 1234567890."); Data.AddBarcodeString("PDF417", "12345DFG Proba pera, Print barcode 1234567890."); // Наличная оплата (2 знака после запятой) Data.Cash = 800; // Сумма электронной оплаты (2 знака после запятой) Data.ElectronicPayment = 0.01; // Сумма из предоплаты (зачетом аванса) (2 знака после запятой) Data.AdvancePayment = 0; // Сумма постоплатой(в кредит) (2 знака после запятой) Data.Credit = 0; // Сумма оплаты встречным предоставлением (сертификаты, др. мат.ценности) (2 знака после запятой) Data.CashProvision = 0; //#if Relese // Скидываем данные об агенте - т.к.у Вас неверняка ККТ не зарегистрирована как Агент. Data.AgentSign = null; Data.AgentData = null; Data.PurveyorData = null; //#endif for (var i = 0; i < Data.CheckStrings.length; i++) { if (Data.CheckStrings[i] != undefined && Data.CheckStrings[i].Register != undefined) { Data.CheckStrings[i].Register.AgentSign = null; Data.CheckStrings[i].Register.AgentData = null; Data.CheckStrings[i].Register.PurveyorData = null; }; }; // Вызов команды OldIdCommand = Data.Execute(ExecuteSuccess).IdCommand; // Возвращается JSON: //{ // "CheckNumber": 3, // Номер документа // "SessionNumber": 1, // Номер смены // "SessionCheckNumber": 1, // Номер чека в смене // "URL": "https://ofd-ya.ru/getFiscalDoc?kktRegId=0000000000061716&fiscalSign=839499349", // "QRCode": "t=20190101T195300&s=0.03&fn=9999078900002838&i=3&fp=839499349&n=1", // "Command": "RegisterCheck", // "Cash": 0, // Оплачено наличными // "ElectronicPayment": 3.02, // Оплачено электронноо // "AdvancePayment": 0, // Оплачено предоплатой (зачетом аванса) // "Credit": 0, // постоплатой(в кредит) // "CashProvision": 0, // встречным предоставлением (сертификаты, др. мат.ценности) // "Error": "", // Текст ошибки если была - обязательно показать пользователю - по содержанию ошибки можно в 90% случаях понять как ее устранять // "Message": "", // Сообщение пользователю - Если строка не пустая - ее нужно отобразить пользователю // "Status": 0, // Ok = 0, Run(Запущено на выполнение) = 1, Error = 2, NotFound(устройство не найдено) = 3, NotRun = 4 // "IdCommand": "dd261969-4190-1125-26cd-aaf5c213c0e3", // "NumDevice": 2 //} }
// Чек корекции function RegisterCorrectionCheck(NumDevice, TypeCheck) { // Подготовка данных команды, параметры (TypeCheck = 0, NumDevice = 0, InnKkm = "", CashierName = "") var Data = KkmServer.GetDataCheck(TypeCheck, NumDevice, "", "Kазакова Н.А.", "430601071197"); //*********************************************************************************************************** // ПОЛЯ ПОИСКА УСТРОЙСТВА //*********************************************************************************************************** // Номер устройства. Если 0 то первое не блокированное на сервере Data.NumDevice = NumDevice; // ИНН ККМ для поиска. Если "" то ККМ ищется только по NumDevice, // Если NumDevice = 0 а InnKkm заполнено то ККМ ищется только по InnKkm Data.InnKkm = ""; //--------------------------------------------- // Заводской номер ККМ для поиска. Если "" то ККМ ищется только по NumDevice, Data.KktNumber = ""; // ********************************************************************************************************** // Время (сек) ожидания выполнения команды. //Если За это время команда не выполнилась в статусе вернется результат "NotRun" или "Run" //Проверить результат еще не выполненной команды можно командой "GetRezult" //Если не указано или 0 - то значение по умолчанию 60 сек. // Поле не обязательно. Это поле можно указывать во всех командах Data.Timeout = 30; // Это фискальный или не фискальный чек Data.IsFiscalCheck = true; // Тип чека; // Для новых ККМ: // 2 – корректировка приход; // 12 – корректировка расход; Data.TypeCheck = TypeCheck; // Не печатать чек на бумагу Data.NotPrint = false; //true, // Количество копий документа Data.NumberCopies = 0; // Продавец, тег ОФД 1021 Data.CashierName = "Kазакова Н.А."; // ИНН продавца тег ОФД 1203 Data.CashierVATIN = "430601071197"; // Система налогообложения (СНО) применяемая для чека // Если не указанно - система СНО настроенная в ККМ по умолчанию // 0: Общая ОСН // 1: Упрощенная УСН (Доход) // 2: Упрощенная УСН (Доход минус Расход) // 3: Единый налог на вмененный доход ЕНВД // 4: Единый сельскохозяйственный налог ЕСН // 5: Патентная система налогообложения // Комбинация разных СНО не возможна // Надо указывать если ККМ настроена на несколько систем СНО Data.TaxVariant = ""; // Это только для тестов: //Data.ClientId = "e1e0c5dbb395acecda9e3ed86a798755b21a53de"; //"541a9db930c2e90670898943", // Это только для тестов: Получение ключа суб-лицензии : ВНИМАНИЕ: ключ суб-лицензии вы должны генерить у себя на сервере!!!! //Data.KeySubLicensing = ""; //При вставке в текст символов >#10#< строка при печати выровнеется по центру, где 10 - это на сколько меньше станет строка ККТ Data.AddTextString("Это чек корректровки. Делается только по предписанию налоговой или глав.буха.", 2); Data.AddCorrectionDataCheck( // Наименование основания для коррекции Тег ОФД 1177 "Предписание налоговой", // Дата документа основания для коррекции Тег ОФД 1178 '2017-06-21T15:30:45', // Номер документа основания для коррекции Тег ОФД 1179 "MOS-4516", // Сумма коррекции расчета, игнорируется для ККТ ФФД 1.0 1.21, // Сумма коррекции НДС чека по ставке Без НДС, игнорируется для ККТ ФФД 1.0 (2 знака после запятой) 0.01, // Сумма коррекции НДС чека по ставке 20%, игнорируется для ККТ ФФД 1.0 (2 знака после запятой) 0.02, // Сумма коррекции НДС чека по ставке 10%, игнорируется для ККТ ФФД 1.0 (2 знака после запятой) 0.03, // Сумма коррекции НДС чека по ставке 0%, игнорируется для ККТ ФФД 1.0 (2 знака после запятой) 0.04, // Сумма коррекции НДС чека по ставке 20/120%, игнорируется для ККТ ФФД 1.0 (2 знака после запятой) 0.05, // Сумма коррекции НДС чека по ставке 10/110%, игнорируется для ККТ ФФД 1.0 (2 знака после запятой) 0.06, ); // Сумма коррекции Наличной оплаты (2 знака после запятой) Data.Cash = 1.11; // Сумма коррекции электронной оплаты (2 знака после запятой) Data.ElectronicPayment = 0.01; // Сумма коррекции постоплатой(в кредит) (2 знака после запятой) Data.AdvancePayment = 0.02; // Сумма коррекции постоплатой(в кредит) (2 знака после запятой) Data.Credit = 0.03; // Сумма коррекции встречным предоставлением (2 знака после запятой) Data.CashProvision = 0.04; // Вызов команды OldIdCommand = Data.Execute(ExecuteSuccess).IdCommand; // Возвращается JSON: //{ // "CheckNumber": 1, // Номер документа // "SessionNumber": 23, // Номер смены // "SessionCheckNumber": 1, // Номер чека в смене // "QRCode": "t=20170115T155100&s=0.01&fn=99078900002287&i=120&fp=2216493490&n=2", // URL проверки чека, где: t-дата-время, s-сумма документа, fn-номер ФН, i-номер документа, fp-фискальная подпись, n-тип документа // "Command": "RegisterCheck", // "Error": "", // Текст ошибки если была - обязательно показать пользователю - по содержанию ошибки можно в 90% случаях понять как ее устранять // "Status": 0 // Ok = 0, Run(Запущено на выполнение) = 1, Error = 2, NotFound(устройство не найдено) = 3, NotRun(Ждет очереди) = 4, AlreadyDone(Выполнено ранее) = 5, ErrorInEGAIS(Ошибка ЕГАИС) = 6 //}
// Пример печати произвольного текста (Слип-чека) function PrintSlip(NumDevice) { // Подготовка данных команды var Data = KkmServer.GetDataCheck_1_0(0, NumDevice); Data.IsFiscalCheck = false; Data.AddImageString("Qk3+EwAAAAAAAD4AAAAoAAAA5AAAAJ4AAAABAAEAAAAAAMATAACHHQAAhx0AAAAAAAAAAAAAAAAAAP///wD/////////////////////////////////////8AAAAP/////////////////////////////////////wAAAA//////////////////////////////////////AAAAD/////////////////////////////////////8AAAAP/////////////////////////////////////wAAAA//////////////////////////////////////AAAAD/////////////////////////////////////8AAAAP////+f//////////+P///////////////////wAAAA/////5///////////4////////////////////AAAAD/////n///////////H///////////////////8AAAAP////+f//////////8f///////////////////wAAAA/////5///////////x////////////////////AAAAD/////j//////////+P///////////////////8AAAAP////+PwAj///////w////////////////////wAAAA/////48PgP///////H////////////////////AAAAD/////zH/B///////4f///////////////////8AAAAP/////J/8H///////j////////////////////wAAAA/////+P/4///////8P////////////////////AAAAD///gAx//z///////h////////////////////8AAAAP//4fgP//P//////+P////////////////////wAAAA///H/z//8B//////x///////gP////////////AAAAD//5/8f//gD/////+P//////4AH///////////8AAAAP//P/3//8/B/////x///////AAMf///////+A/wAAAA//8/////H+H////+H//////4/+AH///////AB/AAAAD//n////5/w/8f//yP//////n/w4P//////4fP8AAAAP/+////+f+D/8AH/8f/////8/+f+P/////+H8/wAAAA//7////z//P//g//x//////3/3/+f/////j/5/AAAAD//P///+//8//////H/////8f///8////wB//n8AAAAP/8////z//j/////8/////wB////5//+AH//8PwAAAA//z///+v/+f/P///D////wAH////z/8A////0fAAAAD//P///7//w/+AA/4f///8Aef////n+A////+R8AAAAP/9//////4ID+Tv/7////A/5//8//vA/////znwAAAA//3/P////H4f7Of/v///4//n//n//Q/////8efAAAAD//f+P///x/B/Mc/+f///H//P/+f/+P/////Dz8AAAAP/9/8f//+P4P9x7/5///5//8//wA/z////4A/PwAAAA//3/Mf//z/+/nD3/n///P//z//GAAf////P/8PAAAAD/+f/A//+f/7+evP/f//8///H/8f/x////9//g8AAAAP/5//A//y//Pz6ef8///n//+f/x//P////3/+HwAAAA//n/+Q//7/8/Ps8/z//+///5//n/9///////yfAAAAD/+YABx////n4+z7/v//z///z/+P/n//////8Z8AAAAP/4B/gh///8/n5n3+//+f///P/8/+f/////8DvwAAAA/+D//xh///n+fnfP5//7///+f/z/5///9/+A+/AAAAD/h///jh//4/x+c+f3//P///4//n/n///v/z/z8AAAAP8P///Hg/+H/P578/f/AD///z//f+f//+//f/fwAAAA/D///+fAAB/8/nn58/wfD/wAH/8/9///n/9/7/AAAAD4f///5+AA//z/ffz7+P/n/4AP/5////8////P8AAAAPn////z5///+f9+/nnz//P/j8f/z////H///x/wAAAA8/////Pz///5/z5/uef/++Af4/vD///4///8f/AAAADn////8/P///n/P3/N7/B58//x/eD//8P//8D/8AAAAOf////D8f//+f8/v+QP553n//h88D/4D///B//wAAAAz////+P5///x/7+f8E/P3c///j54D/////h///AAAADf////8fj///P/v9/x35/dz///Dz4h////8P//8AAAAN/////5/P//8/+fj/PfL8Gf///BH57////H///wAAAA3/////z8f//z/58n5993wT////AH/v///4////AAAACf///z/Px///P/nmfn3nPMP////AP+f//+P///8AAAAN///gB+/n//8/+f8+f+e99/////8P5///z////wAAAA3//wAD7+P//3/9/w5/57z3/////4PH//8/////AAAADd/8H+Hv8///f/z/Hn/APAf/////8AP//n////8AAAAMv/D/z8/x//9//PxPf8/8T///////8//+/////wAAAA6/4//P3/n//3/8/+c/z/0f///////5//7/////AAAADj+P/8+f+P/+f/7/9z/P/D////////x//3////8AAAAPfx//zz/8//4//n/zn8/8P////////h//n////wAAAA9+X//Of/5//4f+f4Gf3/x/////////g//P////AAAADn6f/8z//n//4f5//cff/H/////////B/8////8AAAAOf5//yf//O//8fz/879+8A/////////D/5////wAAAA5/n//j//8H//8fP/5v3zw4////////+H/n////AAAADn+f/8H//4///8c//y/fPH8////////8f/f///8AAAAOf5//AH//H///4x//r988f4///h////5/9////wAAAA9/n/58P/8wH/+Hn//P37x/5//4B////n/n////AAAAD3+f//8/8AD//B+f/+/fvD/7//vj///+f+f///8AAAAPP5///AAA///x/4//79+8P+Af8/n///9/x////wAAAA+Pn/////////v/z//vz7weAAH7/P///z+P////AAAAD8AP////////+f/H/+/Pvfg/4Dn/P///Pw////8AAAAP+I/////////9/+f9788B4//+Df+A//+IH////wAAAA//z/////////z/5/zvz3OP///A/AQ//4D/////AAAAD//P/////////v/j/k/O/x////CA/x//h/////8AAAAP/8/////////+f/P/D85+P////g//n//f/////wAAAA//5/////////8/8f8Px3z/////wf/P////////AAAAD//n/////////5/5/4/gef///////8////////8AAAAP/+f/////////n/n/L+Az////////z////////wAAAA//9//////////P/P9v4Cf//h/////P////////AAAAD//z/////////+f8/v/gD//+7////5////////8AAAAP//P/////////4/58//Af//53////z////////wAAAA//+f/////////z/33/8D///zP////H////////AAAAD//5//////////n/Pf/wP///x////+P///////8AAAAP//j//////////P+Z/3B/////////8f///////wAAAA///P/////////+fpr/uP/////////4////////AAAAD//+f/////////48yP+I//////////x///////8AAAAP//8P//////A//xzp/8H//5///////j///////wAAAA///4AAAAAAAH//iPH/8P//N//////+P///////AAAAD////AAAAAf8P/gA4f////93//////8f//////8AAAAP////4AA///4PAADh/////7v//////4///////wAAAA///////////4AAAMH/////x///////z///////AAAAD///////////+AAAwP///f/////////H//////8AAAAP////////////wADA9//7/////////+f//////wAAAA/////////////gAABn//A/////////5///////AAAAD//////////8AHAAAAf/wf///x/////j//////8AAAAP//////////8AAAAAB/8P///+b/////P//////wAAAA///////////8AAAAAH/Bf/9/73////8///////AAAAD///////////8AAAAAAAE//z/3f////z//////8AAAAP///////////8AAAAAAAJ//n/h//v//P//////wAAAA//////////8AAAAAAD4Az//P///8D/8///////AAAAD//////////AAAAAAAPADAAAf///gD/z//////8AAAAP//////////AAAAAAA/gGAAAf//+AD/P//////wAAAA///////////gAAAAAB+AYDn8///wAH9///////AAAAD///////////gAAAAAH4BwHf4///AAPn//////8AAAAP///////////gAAAAAfgHAd/w//8AAc///////wAAAA////////////gAAAAA/AcBz/w//wAAn///////AAAAD////////////AAAAAD8h5Hv/w//AAA///////8AAAAP///////////+AAAAAPzHke//wf8AAD///////wAAAA///////////+AAAAAA7A+D7//4HwAAP///////AAAAD///////////AAAAAAD0H5/n//8AAAAf//////8AAAAP//////////4AAAAAAPb/n+f///AAAB///////wAAAA//////////+AAAAAAA9v+f5////4AAD///////AAAAD//////////wAAAAAAB2/5/3////wAAP//////8AAAAP////////////AAAAAHN/j/f//7/gDg///////wAAAA/////////////4AAAA+3+P5///P/AfH///////AAAAD/////////////wAAAD9v5fn//x/+A8f//////8AAAAP////////////+OAAAP+ft+//8H/8AB///////wAAAA/////////////54AAA/884j//A//8AP///////AAAAD/////////////nuAAD/AHwD/4H//4D///////8AAAAP////////////+8/AAH9P/4v8Af///////////wAAAA/////////////7n/gAP3P/GfAD////////////AAAAD/////////////Of/AAPPP55wAf///////////8AAAAP////////////+z/8wAGffvAAD/z//////////wAAAA/////////////7P/ngAAc+wAAf4f//////////AAAAD/////////////t/8fAAADwAAD8D//////////8AAAAP////////////+H/z+AAAAAAAeAf//////////wAAAA/////////////4f+f8AAAAAADAD///////////AAAAD/////////////z/x/4AAAAAAAAf//////////8AAAAP/////////////P/P/wAAAAAAAD/+/////////wAAAA/////////////8/5/+AAAAAAAA//H/////////AAAAD/////////////3/n/wgAAAAAAH/g/////////8AAAAP/////////////f8/8PAAAAAAB/gH/////////wAAAA/////////////9/3/h+AAAAAAfgB//////////AAAAD/////////////3+f8P+AAAAAAAAP/////////8AAAAP/////////////f7/j/8AAAAAAAD//////////wAAAA/////////////9/P8f/4AAAAAAA///////////AAAAD/////////////n9/j//4AAAAAAf//////////8AAAAP////////////+fn8f//4AAAAAP///////////wAAAA/////////////5+fj//vwAAAAH/4//////////AAAAD/////////////n78f//PwAAAB/AH/////////8AAAAP////////////+fPg///PwAAAAAB//////////wAAAA/////////////598A///HwAAAAAf//////////AAAAD/////////////3nzgf//H4AAAAP//////////8AAAAP/////////////eefgD/wAAAAAD///////////wAAAA/////////////97z+kAAfAcAAH////////////AAAAD/////////////3OP7f///////////////////8AAAAP/////////////Mx/s////////////////////wAAAA/////////////83P+Z////////////////////AAAAD/////////////zZ/4H///////////////////8AAAAP/////////////tH//////////////////////wAAAA/////////////+c///////////////////////AAAAD/////////////4n//////////////////////8AAAAP/////////////w///////////////////////wAAAA//////////////H///////////////////////AAAAD/////////////////////////////////////8AAAAP/////////////////////////////////////wAAAA"); // Добавление печати текста по полям //При вставке в текст символов ">#10#<" строка при печати выровнеется по центру, где 10 - это на сколько меньше станет строка ККТ Data.AddTextString(">#2#<ООО \"Рога и копыта\"", 1); // При вставке в текст в середину строки символов "<#10#>" Левая часть строки будет выравнена по левому краю, правая по правому, где 10 - это на сколько меньше станет строка ККТ // При вставке в текст в середину строки символов "<#10#>>" Левая часть строки будет выравнена по правому краю, правая по правому, где 10 - отступ от правого клая Data.AddTextString("Пример №1:<#10#>154,41"); Data.AddTextString("2-рое поле:<#10#>4,00"); Data.AddTextString("Пример №2:<#8#>>4,00"); Data.AddTextString("2-рое поле:<#8#>>1544,00"); // Добавление печати текста шрифтом и интенсивностью // Data.AddTextString(Data, Текст, Font(1-4, 0 - по настройкам ККМ), Intensity(1-15, 0 - по настройкам ККМ); Data.AddTextString("Шрифт № 1", 1, 15); Data.AddTextString("Шрифт № 2", 2, 10); Data.AddTextString("Шрифт № 3", 3, 5); Data.AddTextString("Шрифт № 4", 4, 15); Data.AddBarcodeString("EAN13", "1254789547853"); Data.AddBarcodeString("QR", "12345DFG Proba pera, Print barcode 1234567890."); Data.AddBarcodeString("PDF417", "12345DFG Proba pera, Print barcode 1234567890."); //Если чек без ШК то удаляес строку с ШК if (IsBarCode == false) { //Data.Cash = 100; for (var i = 0; i < Data.CheckStrings.length; i++) { if (Data.CheckStrings[i] != undefined && Data.CheckStrings[i].BarCode != undefined) { Data.CheckStrings[i].BarCode = null; } } } // Вызов команды OldIdCommand = Data.Execute(ExecuteSuccess).IdCommand; }
// Открыть смену function OpenShift(NumDevice) { OldIdCommand = KkmServer.OpenShift(NumDevice, 'Открывальщик О.О.', '430601071197').Execute(ExecuteSuccess).IdCommand; // Возвращается JSON: //{ // "CheckNumber": 1, // Номер документа // "SessionNumber": 23, // Номер смены // "QRCode": "t=20170904T141100&fn=9999078900002287&i=108&fp=605445600", // "Command": "OpenShift", // "Error": "", // Текст ошибки если была - обязательно показать пользователю - по содержанию ошибки можно в 90% случаях понять как ее устранять // "Status": 0 // Ok = 0, Run(Запущено на выполнение) = 1, Error = 2, NotFound(устройство не найдено) = 3, NotRun = 4 //} }
// Открыть смену function CloseShift(NumDevice) { OldIdCommand = KkmServer.CloseShift(NumDevice, 'Открывальщик О.О.', '430601071197').Execute(ExecuteSuccess).IdCommand; // Возвращается JSON: //{ // "CheckNumber": 1, // Номер документа // "SessionNumber": 23, // Номер смены // "QRCode": "t=20170904T141100&fn=9999078900002287&i=108&fp=605445600", // "Command": "CloseShift", // "Error": "", // Текст ошибки если была - обязательно показать пользователю - по содержанию ошибки можно в 90% случаях понять как ее устранять // "Status": 0 // Ok = 0, Run(Запущено на выполнение) = 1, Error = 2, NotFound(устройство не найдено) = 3, NotRun = 4 //} }
// Печать X отчета function XReport(NumDevice) { OldIdCommand = KkmServer.XReport(NumDevice).Execute(ExecuteSuccess).IdCommand; // Возвращается JSON: //{ // "CheckNumber": 1, // Номер документа // "SessionNumber": 23, // Номер смены // "Command": "XReport", // "Error": "", // Текст ошибки если была - обязательно показать пользователю - по содержанию ошибки можно в 90% случаях понять как ее устранять // "Status": 0 // Ok = 0, Run(Запущено на выполнение) = 1, Error = 2, NotFound(устройство не найдено) = 3, NotRun = 4 //} }
// Печать чека внесения/изъятия function DepositingCash(NumDevice) { OldIdCommand = KkmServer.DepositingCash(NumDevice, 0.01, 'Мезантроп М.М.', '430601071197').Execute(ExecuteSuccess).IdCommand; OldIdCommand = KkmServer.PaymentCash(NumDevice, 0.01, 'Инкасатор И.И.', '430601071197').Execute(ExecuteSuccess).IdCommand; }
// Открыть денежный ящик function OpenCashDrawer(NumDevice) { OldIdCommand = KkmServer.OpenCashDrawer(NumDevice).Execute(ExecuteSuccess).IdCommand; }
// Получить ширину строки чека в символах function GetLineLength(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу Command: "GetLineLength", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: guid() }; // Вызов команды KkmServer.Execute(ExecuteSuccess, Data); }
// Получить данные чека из ФН по номеру чека. function GetDataForCheck(NumDevice, FiscalNumber = 0, NumberCopies = 0) { OldIdCommand = KkmServer.GetDataForCheck(NumDevice, FiscalNumber, NumberCopies).Execute(ExecuteSuccess).IdCommand; }
// Получить текущее состояние ККТ. function GetDataKKT(NumDevice) { OldIdCommand = KkmServer.GetDataKKT(NumDevice).Execute(ExecuteSuccess).IdCommand; // Возвращается JSON: //{ // "CheckNumber": 8, // Номер последнего документа // "SessionNumber": 24, // Номер текущей смены // "LineLength": 48, // Ширина строки // "URL": "", // "Info": { // "UrlServerOfd": "connect.ofd-ya.ru", // "PortServerOfd": "7790", // "NameOFD": "ООО \"Ярус\" (\"ОФД-Я\")", // "UrlOfd": "", // "InnOfd": "504404744207", // "NameOrganization": "ООО \"Рога и Копыта\"", // "TaxVariant": "0,3,5", // Описание смотри в команде KkmRegOfd // "AddressSettle": "109097, Москва, ул. Ильинка, 9", // Адрес установки // "EncryptionMode": false, // "OfflineMode": true, // "AutomaticMode": false, // "InternetMode": false, // "BSOMode": false, // "ServiceMode": true, // "InnOrganization": "504404744207", // "KktNumber": "0149060006000651", // Заводской номер // "FnNumber": "99078900002287", // Номер ФН // "RegNumber": "0149060006035849", // Регистрационный номер ККТ (из налоговой) // "Command": "", // "FN_IsFiscal": true, // "OFD_Error": "", // "OFD_NumErrorDoc": 32, // "OFD_DateErrorDoc": "2017-01-13T14:56:00", // "FN_DateEnd": "2018-02-01T00:00:00", // "SessionState": 2 // Статус сессии 1-Закрыта, 2-Открыта, 3-Открыта, но закончилась (3 статус на старых ККМ может быть не опознан) // }, // "Command": "GetDataKKT", // "Error": "", // Текст ошибки если была - обязательно показать пользователю - по содержанию ошибки можно в 90% случаях понять как ее устранять // "Status": 0 // Ok = 0, Run(Запущено на выполнение) = 1, Error = 2, NotFound(устройство не найдено) = 3, NotRun = 4 //} }
Команда предназначена для проверки корректности сканировани ШК кода маркировки товар (он-же КИЗ он-же честный знак) Сканер нужно настроить так чтобы он при сканировании не проглатывал управляющие символы Поддерживаются ШК: Без идентификатора экземпляра товара: EAN8, EAN13, EAN14 С идентификатором экземпляра товара: GS1, ШК шуб, ШК табачной продукции., ЕГАИС-2, ЕГАИС-3 Примеры ШК коды которые поддерживаются: EAN-8: "46120441" EAN-13: "2900001462105" ITF14: "02900001462105" GS1, в качестве разделителей полей символы '(' и ')' "(01)12345678901231(253)1234567890123(8003)1234567890123456(10)12345678901234567890(21)12345678" GS1 (обувь), в качестве разделителей полей символ '\x1d' (в виде байта) "0104300943734342212413195240818240640291ffd092MDEwNDMwMDk0MzczNDM" GS1, в качестве разделителей полей строка "\u001d" "010460043993125621JgXJ5.T\u001d8005112000\u001d930001\u001d923zbrLA ==\u001d24014276281" GS1, в качестве разделителей полей строка "\\u001d" (с символом экранизации \) "010460043993125621JgXJ5.T\\u001d8005112000\\u001d930001\\u001d923zbrLA ==\\u001d24014276281" GS1, в качестве разделителей полей строка "\x1d" "010460406000600021N4N57RSCBUZTQ\x1d2403004002910161218\x1d1724010191ffd0\x1d92tIAF/YVoU4roQS3M/m4" GS1, в качестве разделителей полей строка "\x1d" (с символом экранизации \) "010460406000600021N4N57RSCBUZTQ\\x1d2403004002910161218\\x1d1724010191ffd0\\x1d92tIAF/YVoU4roQS3M/m4" GS1, в качестве разделителей полей строка "\x001d" "010460406000600021N4N57RSCBUZTQ\x001d2403004002910161218\x001d1724010191ffd0\x001d92tIAF/YVoU4roQS3M/m4" GS1, в качестве разделителей полей строка "\x001d" (с символом экранизации \) "010460406000600021N4N57RSCBUZTQ\\x001d2403004002910161218\\x001d1724010191ffd0\\x001d92tIAF/YVoU4roQS3M/m4" GS1 (лекарство), в качестве разделителей полей строка "<FNC1>" "<FNC1>0108691234567890211323424679<FNC1>1707011910AX785910BC" GS1, в качестве разделителей полей строка "<GS> " (с пробелом!!!!!!!) "0183525492885520210000000859314<GS> 91ee05<GS> 92r7fLjLdSQBRRL8KgReiJ0mgdFWhlR9gsfe1QS3ibhck=" GS, 1 в качестве разделителей полей строка "<GS> " "0183525492885520210000000859314<GS>91ee05<GS>92r7fLjLdSQBRRL8KgReiJ0mgdFWhlR9gsfe1QS3ibhck=" GS1, в качестве разделителей полей символ '\x1d' (поле 21 фиксированной длины (13) - без символа разделителя в конце - есть и такое!!) "010460620309891021MCEb6/r890123800511700093EBBm240FA068592.14" Шубы (20 знаков) "RU-430301-ABCDEF1234" Табак (29 знаков) "00000046186195Xp4k=xyAQDPtFEa" Табак (25 знаков) "00000046186195Xp4k=xyAQDP" ЕГАИС 2.0 (68 знаков) "22N00002NU5DBKYDOT17ID980726019019608CW1A4XR5EJ7JKFX50FHHGV92ZR2GZRZ" ЕГАИС 3.0 (150 знаков) "136222000058810918QWERDFEWT5123456YGHFDSWERT56YUIJHGFDSAERTYUIOKJ8HGFVCXZSDLKJHGFDSAOIPLMNBGHJYTRDFGHJKIREWSDFGHJIOIUTDWQASDFRETYUIUYGTREDFGHUYTREWQWE" function GetLineLength(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу Command: "GetGoodCodeData", //штрих-код маркировки товара со сканера (нужно настроить сканер так чтобы не проглатывал управляющие символы) BarCode: BarCode // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: guid() }; // Вызов команды KkmServer.Execute(ExecuteSuccess, Data); // Возвращается JSON: //{ // "DataProductCode": { // // Исходный ШК // "BarCode": "0108691234567890211323424679 1707011910AX785910BC", // // ШК прошел проверку // "isParsed": true, // "RepresentationBarCode": "(01)08691234567890(21)1323424679(17)070119(10)AX785910BC", // "EAN": "8691234567890", // "GTIN": "08691234567890", // "SerialNumber": "1323424679", // // ШК идентифицирует экземпляр товара // "ContainsSerialNumber": true, // "MarkingCodeBase64": "RE0H55Xy9tIxMzIzNDI0Njc5", // // Состав полей ШК // "DataBarCode": { // "10": "AX785910BC", // "17": "070119", // "21": "1323424679", // "01": "08691234567890" // }, // // Тип ШК: 'NotParse', 'EAN8', 'EAN13', 'ITF14', 'GS1', 'Fur', 'EGAIS2', 'EGAIS3' // "ProductCodeType": "GS1", // "Errors": "" // }, // "Command": "GetGoodCodeData", // "Error": "", // "Warning": "", // "Message": "", // "Status": 0, // "IdCommand": "" //} }
// Регистрация и фискализация ККМ function KkmRegOfd(NumDevice) { // АХТУНГ!!!! // Внимание - некоторые команды регистрации необратимы!!!!! // Важно понимать что делаете!!!!! // Подготовка данных команды var Data = { // Команда серверу Command: "KkmRegOfd", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // Не печатать отчет NotPrint: false, // Сотрудник регистрирующий ККТ , тег ОФД 1021 CashierName: "Иванов И.И.", // Данные регистрации // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: guid(), RegKkmOfd: { // Команда регистрации // "Open" - первичная регистрация ККМ // "ChangeFN" - Замена ФН // "ChangeOFD" - Смена ОФД // "ChangeOrganization" - Смена реквизитов организации // "ChangeKkm" - смена реквизитов ККМ // "Close" - закрытие архива ФН Command: "Open", // URL или IP сервера ОФД (При командах "Open" и "ChangeOFD") UrlServerOfd: "ofd.com", // IP-порт сервера ОФД (При командах "Open" и "ChangeOFD") PortServerOfd: "9999", // Наименование ОФД (При командах "Open" и "ChangeOFD") NameOFD: "Лучший ОФД", // префикс URL ОФД для поиска чека (При командах "Open" и "ChangeOFD") UrlOfd: "ofd.com/reg", // ИНН ОФД (При командах "Open" и "ChangeOFD") InnOfd: "1234567890", // Наименование организации (При командах "Open" и "ChangeOrganization") NameOrganization: "ООО Рога и Копыта", // Адрес установки ККМ (При командах "Open" и "ChangeOrganization") AddressSettle: "Сарайчик в деревне у бабушки", // Система налогообложения, может быть установлено сразу несколько СНО // (При командах "Open" и "ChangeOrganization") // 0: Общая ОСН // 1: Упрощенная УСН (Доход) // 2: Упрощенная УСН (Доход минус Расход) // 3: Единый налог на вмененный доход ЕНВД // 4: Единый сельскохозяйственный налог ЕСН // 5: Патентная система налогообложения // Комбинация разных СНО не возможна // Надо указывать если ККМ настроена на несколько систем СНО TaxVariant: "0,3,5", // Шифрование (При командах "Open" и "ChangeKkm") EncryptionMode: false, // Автономный режим (При командах "Open" и "ChangeKkm") OfflineMode: false, // Автоматический режим (При командах "Open") AutomaticMode: false, // Расчеты в Интернете (При командах "Open") InternetMode: false, // Бланки строгой отчетности (При командах "Open") BSOMode: false, // Применение в сфере услуг (При командах "Open") ServiceMode: false, // ИНН организации (При командах "Open") InnOrganization: "1234567890", // "Регистрационный номер ККМ (При командах "Open") RegNumber: "0000521455048286", }, }; // Вызов команды KkmServer.Execute(ExecuteSuccess, Data); }
// Оплатить платежной картой ----------------------------------------------------------------------------- //Параметры: // NumDevice: номер устройства, 0 - любое настроенное, активное // Amount: сумма оплаты // ReceiptNumber: Номер чека IdCommand = KkmServer.PayByPaymentCard(Device, 0.01, 'TEST-01').Execute(ExecuteSuccess).IdCommand; // Вернуть платеж по платежной карте --------------------------------------------------------------------- //Параметры: // NumDevice: номер устройства, 0 - любое настроенное, активное // Amount: сумма оплаты // ReceiptNumber: Номер чека IdCommand = KkmServer.ReturnPaymentByPaymentCard(Device, 0.01, 'TEST-01').Execute(ExecuteSuccess).IdCommand; // Отменить платеж по платежной карте -------------------------------------------------------------------- //Параметры: // NumDevice: номер устройства, 0 - любое настроенное, активное // Amount: сумма оплаты // RRNCode: Уникальный код транзакции RRN который был получен при оплате картой // AuthorizationCode: Код авторизации транзакции который был получен при оплате картой // CardNumber: Идентификатор карты транзакции который был получен при оплате картой IdCommand = KkmServer.CancelPaymentByPaymentCard(Device, 0.01, Old_RRNCode, Old_AuthorizationCode, Old_CardNumber).Execute(ExecuteSuccess).IdCommand; // Аварийная отмена операции (Метод отменяет последнюю транзакцию) --------------------------------------- //Параметры: // NumDevice: номер устройства, 0 - любое настроенное, активное IdCommand = KkmServer.EmergencyReversal(Device).Execute(ExecuteSuccess).IdCommand; // Закрыть смену по картам -------------------------------------------------------------------------- //Параметры: // NumDevice: номер устройства, 0 - любое настроенное, активное IdCommand = KkmServer.Settlement(Device).Execute(ExecuteSuccess).IdCommand; // Получить отчет по итогам дня по картам -------------------------------------------------------------------------- //Параметры: // NumDevice: номер устройства, 0 - любое настроенное, активное // Detailed: Краткий (false) или полный (true) отчет IdCommand = KkmServer.TerminalReport(Device, Detailed).Execute(ExecuteSuccess).IdCommand; // Получить копию слип-чека -------------------------------------------------------------------- //Параметры: // NumDevice: номер устройства, 0 - любое настроенное, активное // Amount: сумма оплаты // RRNCode: Уникальный код транзакции RRN который был получен при оплате картой // AuthorizationCode: Код авторизации транзакции который был получен при оплате картой // CardNumber: Идентификатор карты транзакции который был получен при оплате картой IdCommand = KkmServer.TransactionDetails(Device, 0.01, Old_RRNCode, Old_AuthorizationCode, Old_CardNumber).Execute(ExecuteSuccess).IdCommand;
// Откалибровать весы function Calibrate(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу Command: "Calibrate", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // Установка веса тары на весах. Если 0 то берется текущее значение веса на весах. TareWeight: 0 }; // Вызов команды // где "ExecuteSuccess" - функция, которая будет вызвана после обработки команды: function ExecuteSuccess(Rezult) {} KkmServer.Execute(ExecuteSuccess, Data); } // Получить вес function GetWeight(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу Command: "GetWeight", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice }; // Вызов команды // где "ExecuteSuccess" - функция, которая будет вызвана после обработки команды: function ExecuteSuccess(Rezult) {} KkmServer.Execute(ExecuteSuccess, Data); }
// Получение списка устройств function List() { // Подготовка данных команды var Data = KkmServer.List(); // Отбор по номеру устройства. Число. Если 0 или не указано то с любым номером Data.NumDevice = NumDevice; // Отбор по ИНН. Строка. Если "" или не указано то первое не блокированное на сервере Data.InnKkm = ""; // Отбор активных. Булево. Если null или не указано то активные и не активные Data.Active = true; // Отбор выключенны-включенных Data.OnOff = true; // Отбор наличию ошибок ОФВ. Булево. Если null или не указано то с ошибками и без Data.OFD_Error = false; // Все у которых дата не переданного док. в ОФД меньше указанной. Дата-время. Если null или не указано то любое Data.OFD_DateErrorDoc = '2100-01-01T00:00:00'; // Все у которых дата окончания работы ФН меньше указанной. Дата-время. Если null или не указано то любое Data.FN_DateEnd = '2100-01-01T00:00:00'; // Все у которых заканчивается память ФН; Булево. Если null или не указано то все Data.FN_MemOverflowl = false; // Фискализированные или нет ФН; Булево. Если null или не указано то все Data.FN_IsFiscal = true; // Вызов команды OldIdCommand = Data.Execute(ExecuteSuccess).IdCommand; // Возвращается JSON: //{ // "ListUnit": [ // { // "NumDevice": 2, // "IdDevice": "6a6151a5-b352-485c-8f01-45da05d3df18", // "OnOf": true, // "Active": false, // "TypeDevice": "Фискальный регистратор", // "IdTypeDevice": "KkmStrihM", // "IP": "192.168.137.111", // "NameDevice": "<Не определено>", // "KktNumber": "", // "INN": "<Не определено>", // "TaxVariant": "", // Описание смотри в команде KkmRegOfd // "AddDate": "2017-01-13T14:55:16.9796533+03:00", // "OFD_Error": "", // "OFD_NumErrorDoc": 0, // "OFD_DateErrorDoc": "0001-01-01T00:00:00", // "FN_DateEnd": "0001-01-01T00:00:00", // "FN_MemOverflowl": false, // "FN_IsFiscal": false, // "PaperOver": false // }, // ], // "Command": "List", // "Error": "", // Текст ошибки если была - обязательно показать пользователю - по содержанию ошибки можно в 90% случаях понять как ее устранять // "Status": 0 // Ok = 0, Run(Запущено на выполнение) = 1, Error = 2, NotFound(устройство не найдено) = 3, NotRun = 4 //} }
В расширении есть возможность работы со сканером штрих-кодов в режиме событий Поддерживаются сканеры работающие через COM или USB/COM порты. Для включения режима надо сделать следующее: 1. Добавить в настройках расширения сканер ШК и настроить его. 2. На своей HTTP странице надо создать функцию обработчик событий сканера, пример: // Функция обработчик событий сканера function EventBarCode(Data) { // Считанный штрихкод TextBarcode = Data.BarCode; // Номер устройства - сканера NumDevice = Data.NumDevice; // Пользовательское имя сканера UnitName = Data.UnitName; // Если обработчиков много то сообщаем что Штрихкод обработан и следующие обработчики не вызывать Data.AlreadyProcessed = true; } 3. Подписываем обработчик на события сканера, пример: // Подписываемся на события сканера штрих-кода после загрузки страницы window.addEventListener("load", function (event) { KkmServer.addEventBarcodeListener(EventBarCode); } );
// Проверка статуса ранее отданной команды function GetRezult(IdCommand) { KkmServer.GetRezult(IdCommand).Execute(ExecuteSuccess); };
Расчет ключа для получения суб-лицензии Если Вам надо предоставить свою лицензию во временное пользование вашему клиенту (суб-лицензирование) вы должны сделать следующее: 1. Сгенерить ключ суб лиценции (пример описан ниже) 2. Вставить в данные команды поле "KeySubLicensing" с эти ключом, пример: KeySubLicensing: "client@gmail.com/750B3EE783DC3C66BBB2F5B4DF3F4EA0" Суб-лицензия выделяется из Ваших свободных сроком на 1 месяц. ВНИМАНИЕ! Расчет ключа для получения суб-лицензии должен происходить на Вашем сервере (а не у чужого клиента-суб-лицензиата) НЕ передавайте свой пароль клиенту-суб-лицензиата Данный пример только для понимания как генерировать ключ на Вашем сервере!! // Пример расчета ключа: // Email - ваш Email на который выделенны лицензии // Password - пароль от лицензии function GetKeySubLicensing(Email, Password) { //хеш пароля var Hash1 = md5(Password).toUpperCase(); // солим var Hash2 = md5(Hash1 + "Qwerty").toUpperCase(); // формируем дату в формате "YYYYMMDD" var now = new Date(); //Текущая дата var formated_date = "" + now.getFullYear() + ((now.getMonth()+1) < 10 ? "0" : "") + (now.getMonth()+1) + (now.getDate() < 10 ? "0" : "") + now.getDate(); //now.getMonth()+1 потому что getMonth() возвращает 0..11 а не 1..12 //добавляем данные лицензии var Hash3 = md5(Hash2 + formated_date).toUpperCase(); // Имя машины или имя клиента max 100 символов // Указывать не обязательно // Позволяет быстрее найти серийный номер в личном кабинете var Name = "Клиент-1"; // формируем ключ if (Name == "") { var Key = Email + "/" + Hash3; } else { var Key = Name + ":" + Email + "/" + Hash3; }; return Key; } Ключ должен расчитываться каждый день новый!!!! С версии 2.0.23.XX
Для работы с kkmserver/unitserver требовалось в клиентском приложении сохранять следующие настройки: -Адрес и порт сервера -Логин и пароль для входа -Номер устройства ККТ -Наименование кассира При этом если клиент заходил в облачное приложение с другой машины могли потребоваться другие настройки. При работе с расширением всего этого можно избежать: -Адрес и порт сервера настраиваются в окошке расширения. И расширение само пошлет команду или на встроенную компоненту или на внешний kkmserver/unitserver -Логин и пароль для входа так же настраиваются в окошке расширения. -Номер устройства ККТ: посылайте команду на номер устройства = 0. В Расширении можно быстро настроить устройство по умолчанию. Все команды с Номером устройства = 0 будут перенаправлены на устройство по умолчанию. Все команды с Номером устройства <> 0 НЕ будут перенаправлены, а напечатаны на указанном в команде устройстве. -Наименование кассира: Если в команде наименование кассира не задано то будет подсталятся кассир настроенный по умолчанию в расширении. Если в команде наименование кассира задано то кассир меняться НЕ будет. И на каждом ПК эти настройки индивидуальны.
Файл html с примерами расширения для браузера
Использование из мобильных приложений:
Сервер очень легко использовать для удаленной печати чеков из мобильных приложений.Все технологии разработки мобильных приложений имеют средства работы с JSON сериализацией а так же инструменты для работы с HTTP протоколом.
Так что внедрение печати чека через ККМ сервер не представляет ни какой сложности.
Лицензия на программу: Условно-бесплатная
Стоимость лицензии на 1 ПК для коммерческого использования - 3000 руб. без временных ограничений.Стоимость лицензии на 1 ПК для коммерческого использования - 1500 руб. на 1 год.
Продление лицензии для коммерческого использования- 1000 руб. на 1 год.
Для цели тестирования, разработки, обучения оплата не требуется.
При этом на чеках иногда будет отображается информация о том что программа не лицензирована.
Также иногда сумма чека будет не совпадать с указанным.
Для цели печати этикеток с штрих-кодом на принтерах этикеток лицензия и оплата не требуется.
Лицензии от KkmServer подходят для UnitServer и обратно.
Оплата:

Укажите Email на который будет привязана лицензия: | |||
Укажите количество лицензий (без ограничений по времени): | 0.00 руб | ||
Укажите количество лицензий сроком на 1 год: | 0.00 руб | ||
Укажите количество продлений лицензии: | 0.00 руб | ||
Техническая поддержка сроком на 1 год: | 0.00 руб | ||
Произвольная сумма: | (Только при оплате по спец.условиям) | ||
Итого: 0.00 руб |
Внимание! Для 'Эвоторов' лицезия бесплатна. Оплачивать нужно приложение на сайте Эвотора!
Если Вам нужна безналичная форма оплаты:
Пришлите на kkmserver@gmail.com карточку предприятия и укажите какая лицензия нужна и на какой Email её зарегистрировать.Мы Выставим Вам счет и пришлем обратно по почте.
После оплаты лицензия будет заведена на указанный Вами Email.
Условия предоставления технической поддержки:
Оказываемые услуги по технической поддержке:Проверка работы устройств.
Настройка устройств (ККТ) в том объеме, который необходим для работы ПО kkmserver/unitserver/расширение браузера.
Проверка сопряжения kkmserver/unitserver/расширение браузера с Вашим учетным ПО.
Проверка функционирования оборудования.
Базовая проверка/настройка канала связи ККТ - ОФД.
(кроме случаев когда проблема на стороне ОФД или ККТ. В этих случаях Вам необходимо обращаться или в ОФД или в сервисную компанию обслуживающую Вашу ККТ)
Консультация по выбору устройств.
Консультация по разработке сопряжения учетных систем с ПО kkmserver/unitserver/расширение браузера.
Стоимость и необходимые условия приобретения технической поддержки :
Далее:
- до 5 лицензий - 800 р. за все лицензии на 1 год
- от 6 до 20 лицензий - 300 р. - 1 лицензия на 1 год
- от 21 лицензий - 200 р. - 1 лицензия на 1 год
Скачать программу:
По умолчанию логин: "Admin", пароль не заданДистрибутив Kkm-Server - Windows 8,10 (ver 2.1.40.53 от 05.03.2021)
Дистрибутив Kkm-Factory - Windows 8,10 (ver 2.1.40.53 от 05.03.2021)
Инструкция: По установке дистрибутива в Windows
Установочный пакет Kkm-Server - Linux x64 deb-based: Ubuntu, Debian, Mint ... (ver 2.1.40.53 от 05.03.2021)
Установочный пакет Kkm-Server - Linux Arm deb-based: Ubuntu, Debian, Mint ... (ver 2.1.40.53 от 05.03.2021) (Beta)
Установочный пакет Kkm-Server - Linux x64 rpm-based: CentOS, Fedora, Red Hat ... (ver 2.1.40.53 от 05.03.2021)
Инструкция: По установке дистрибутива в Linux
Установочный пакет Kkm-Server - MacOs (ver 2.1.40.53 от 05.03.2021) (Beta)
Инструкция: По установке дистрибутива в MacOs
Мультисистемный драйвер для 1с (для конфигураций не старее 04.07.2019):
Процессоры: Intel x32/x64, Arm x32/x64
Клиенты: Толстый/Тонкий клиент 1с, веб-клиенты: Chrome, Opera, Firefox, Edge, Yandex
Инструкция: По установке мульти-драйвера в 1с конфигурации
Драйвер (Ревизия 3.3) для тонкого клиента и Web-клиента 1С(ver 20.1.38.20 от 08.09.2020)
Драйвер (Ревизия 2.4) для тонкого клиента и Web-клиента 1С(ver 2.1.37.18 от 21.07.2020)
Инструкция: По установке драйвера в 1с конфигурации
Инструкция: По установке расширений в браузеры
Скачать расширение: "Kkm-Server" для браузера Crome (ver 2.1.40.20 от 02.10.2020)
Скачать расширение: "Kkm-Server" для браузера Microsoft Edge (ver 2.1.40.20 от 02.10.2020)
Скачать расширение: "Kkm-Server" для браузера Firefox (ver 2.1.40.20 от 02.10.2020)
Скачать расширение: "Kkm-Server" для браузера Opera (ver 2.1.40.20 от 02.10.2020)
Скачать расширение: "Kkm-Server" для браузера Yandex (ver 2.1.40.20 от 02.10.2020)
Установка платформы .NET Framework 4.5, 4.5.1 и 4.5.2