Описание программы - Unit web-сервер :
20.12.2017 : | Добавлен сбор статистики |
26.10.2017 : | Добавил поддержку ККТ :Viki-Print-57Ф, Viki-Print-57+Ф, Viki-Print-80+Ф, Pirit-1Ф, Pirit-2Ф, Pirit-2СФ - пока в статусе бета версии |
14.08.2017 : | Большое обновление под ФФД 1.05: http://forum.kkmserver.ru/viewtopic.php?f=2&t=224 |
19.06.2017 : | Добавлены ставки НДС 18/118 и 10/110 - применяются при учете авансов |
01.06.2017 : | Новый установщик: Теперь не надо удалять старую версию перед обновлением |

Новая версия!
Программа является маленьким HTTP web-сервером.Технология использования - HTTP(Ajax/REST) запрос, данные передаются в формате JSON по HTTP протоколу; Очень удобное использование из JavaScript
Принцип работы:
- Сервер принимает данные JSON от клиента по HTTP протоколу;- JSON данные транслируется в систему команд определенного драйвера торгового оборудования;
- После выполнения драйвером команд сервер принимает от него данные;
- Данные полученные от драйвера преобразуются в JSON и возвращаются клиенту по HTTP протоколу
Преимущества:
Единообразный API при работе с оборудованием различных фирм- один и тот-же код Вашего приложения будет работать с оборудованием различных производителей;
Очень удобное использование торгового оборудования из браузеров:
- ни каких дополнительных модулей в браузеры встраивать не надо.
- код использования оборудования представляет собой несколько строк кода на javascript.
Ваше приложение сможет работать с оборудованием установленным локально так и по сети (даже если само оборудование не сетевое).
Интеграция с ЕГАИС - при регистрации чека возможно отправление данных в ЕГАИС через систему "Универсальный транспортный модуль ЕГАИС (УТМ)"
Программа предназначена обеспечения работы с широким спектром торгового оборудования:
- Сканеры штрих-кодов;- Считыватели магнитных карт;
- Фискальные регистраторы;
- Принтеры чеков;
- Принтеры этикеток;
- Дисплеи покупателя;
- Терминалы сбора данных;
- Эквайринговые терминалы;
- Электронные весы;
- Весы с печатью этикеток;
![]() |
Возможности консоли настройки сервера:
• Настройка работы сервера• Добавление и удаление драйвера оборудования
• Настройка драйвера оборудования
• Тестирование оборудования
Возможности API сервера:
• Прием события сканирования ШК сканером. Пример на JavaScript• Печать фискальных/не фискальных чеков на ККМ. Пример на JavaScript
• Печать Z или X отчетов на ККМ. Пример на JavaScript
• Печать чеков внесения/выемки ДС на ККМ. Пример на JavaScript
• Печать набора этикеток на принтере этикетов. Пример на JavaScript
• Калибровка весов. Пример на JavaScript
• Получение веса. Пример на JavaScript
• Выгрузка списка товаров в весы. Пример на JavaScript
• Вывод информации на дисплей покупателя. Пример на JavaScript
• Регистрация оплаты платежной картой. Пример на JavaScript
• Возврат платежа по платежной карте. Пример на JavaScript
• Отмена платежа по платежной карте. Пример на JavaScript
• Получение итогов дня по картам. Пример на JavaScript
• Выгрузка списка товаров в ТСД. Пример на JavaScript
• Загрузка списка товаров в ТСД. Пример на JavaScript
• Маршрутизация команд на другой kkmserver в облаке что позволяет иметь на рабочих местах только принтеры чеков и один ККТ в облаке.
При регистрации чека по такой схеме чек регистрируется на ККТ в облаке, оттуда возвращаются фискальные данные чека и уже локально на принтере чеков печатается чек со всеми фискальными атрибутами.
• API полностью совместим с новой версией KkmServer и KkmFactory.
Сриншоты панели управления:






Поддерживаемое оборудование:
Сканеры штрихкода и Считыватели магнитных карт:Практически всё оборудование
Фискальные регистраторы:
АТОЛ, Штрих-М, СтарРус, RR-Electro, КИТ (КАСБИ), Micro-Pay (microteh.ru), Viki-Print и пр.
Атол - Только платформа 2.5, Платформа 5 пока не поддерживается!
Протокол АТОЛ (Платформа 5):
АТОЛ-1Ф - Бета версия
Для Windows - нужны ДТО Атол x32, Для Linux - нужны ДТО Атол x64
Принтеры этикеток:
Zebra, Proton, Toshiba-TEC, Datamax-O neil, TSC, Godex
Дисплеи покупателя:
АТОЛ, Штрих-М, VikiVision и прочие...
Терминалы сбора данных:
АТОЛ MobileLogistics, Гексагон Goods, Клеверенс, Сканкод CipherLAB
Эквайринговые терминалы:
TRPOS, UCS-EFTPOS, ГАЗПРОМБАНК, ИНПАС, СБРФ, ARCUS2
Электронные весы:
CAS, АТОЛ, Масса-К
Системные требования:
• Операционная система- Windows 7, Windows 8, Windows 10.• Требуется установить .NET Framework 4.5.1 (Наверняка у Вас уже установлено).
• Сторонний Web-сервер (apache, iis) не нужен! Программа сама является маленьким HTTP сервером!
• Для некоторого оборудования необходимо установка ПО производителя оборудования.
• Прочие требования предъявляемые производителем оборудования к системе.
Документация по API Unit-server:
Общая функция вызова сервера// Общая функция вызова 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 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); };
// Флаг включения сканирования ШК var RunScanerBarcode = false; // Здесь зпоминаем устройство var NumDeviceBarcode = 0; // Сюда пишем отсканированные ШК var Barcode = ""; // Начать сканирование ШК function GetBarcode(NumDevice, Command) { // Так как HTTP сервер не может инициировать соединение с клиентом (только клиент с сервером) // нам нужно сэмулировать событие // Открываем соединение с тайм-аутом 15 сек. // Сервер держит каждое соединение 10 сек. и если небыло сканирования ШК - отпускает его без события. // Если было событие сканирования ШК то сервер сразу отпускает соединения с событием // Для лучшей отзывчивости возможно сразу установить несколько соединений с сервером. // Если было событие сканирования ШК то сервер отпустит одно соединение с событием ШК. // А остальные соединения останутся дожидатся либо 20 сек либо следующего события сканирования ШК RunScanerBarcode = Command; if (Command == true) { // Подготовка данных команды var Data = { // Команда серверу Command: "GetBarcode", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice }; // Устанавливаем соединение ExecuteCommand(Data, // Обработка события сканирования ШК function (Rezult, textStatus, jqX) { // Эта функция вызывается как при успешном запросе // Вывод общих данных ExecuteSuccess(Rezult, textStatus, jqX); // Чтения события сканирования ШК если оно было. if (Rezult.Event !== null) { Barcode = Barcode + Rezult.Event.Data + " : " + Rezult.Event.Source + " : " + Rezult.Event.Message + "\r\n"; } $("#MessageBarCode").text(Barcode); // Открытие нового соединения взамен старого GetBarcode(NumDeviceBarcode, RunScanerBarcode); }, // Обработка ошибки соединения function (jqXHR, textStatus, errorThrown) { // Открытие нового соединения взамен старого GetBarcode(NumDeviceBarcode, RunScanerBarcode); }, 15000 //Тайм-аут 15 сек. (сервер держит 10 сек.) ); } }
// Печать чека 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 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 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 //} }
// Печать чеков 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 InitializePrinter(NumDevice, IsBarCode) { // Подготовка данных команды var Data = { // Команда серверу Command: "InitializePrinter", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, }; // Вызов команды ExecuteCommand(Data); } // Печать набора этикеток на принтере function PrintLabels(NumDevice, IsBarCode) { // Подготовка данных команды var Data = { // Команда серверу Command: "PrintLabels", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // Строка, определяющая статус пакета, имеет одно из значений: "first", "regular", "last". //PackageStatus: "first", PackageStatus: "last", // Секция описания форматирования шаблона этикетки. // Присутствует однократно и только в первом пакете. // Описывает поля (элементы "Text", "Barcode", "Image" и "UserData"), входящие в шаблон этикетки, и их форматирование. LabelFormattings: { // Ширина шаблона этикетки в миллиметрах. Width: 40, // Высота шаблона этикетки в миллиметрах. Height: 45, // Массив полей этикетки Fields: [ // Текстовое поле этикетки ------------------------------------------------- { // Тип поля - текст Type: "Text", // Уникальное имя поля в шаблоне этикетки. FieldName: "Наименование", // Позиция левой границы поля по оси X (в миллиметрах). Left: 1, // Позиция верхней границы поля по оси Y (в миллиметрах). Top: 1, // Ширина поля в миллиметрах. Width: 35, // Высота поля в миллиметрах. Height: 10, // Ориентация содержимого поля. Имеет одно из следующих значений 0, 90, 180, 270. По умолчанию 0. Можно не указывать Orientation: 0, // Имя шрифта (не имя файла-шрифта). По умолчанию предустановленный на принтере шрифт. Можно не указывать FontName: "Tahoma", // Размер шрифта в кеглях. FontSize: 8, // Стиль шрифта. Имеет одно или несколько значений через разделитель -пробел: "Bold", "Italic", "Underline" и "StrikeOut". По умолчанию "". Можно не указывать FontStyle: "Italic", // Строка, определяющая рамки поля. Имеет одно или несколько значений через разделитель - пробел: "Left", "Top", "Right" и "Bottom". По умолчанию "". Можно не указывать Border: "", // Толщина рамки в пикселах, по умолчанию 1. Можно не указывать BorderWidth: 0, // Стиль рамки. Имеет одно из значений: "Dotted", "Dashed", "Solid" или "Double". По умолчанию "Solid". Можно не указывать BorderStyle: "Solid", // Горизонтальное выравнивание текста. Имеет одно из значений: "Left", "Center" или "Right". По умолчанию = "Left". Можно не указывать Align: "Left", // Многострочность. По умолчанию "false". Можно не указывать Multiline: false, // Статичность (одинаковое значение для всех экземпляров этикетки). По умолчанию "false". Можно не указывать Static: false, // В случае когда Static = "true", выступает в роли общего значения. Можно не указывать Value: "" }, // Еще одно текстовое поле этикетки ---------------------------------------- { Type: "Text", FieldName: "Цена", Left: 1, Top: 11, Width: 35, Height: 5, Orientation: 0, FontName: "Tahoma", FontSize: 8, FontStyle: "Bold Italic", Border: "Left Top Right Bottom", }, // Поле шрих-кода этикетки ------------------------------------------------ { // Тип поля - текст Type: "Barcode", // Уникальное имя поля в шаблоне этикетки. FieldName: "Штрихкод", // Тип штрихкода. Имеет одно из значений: "EAN8","EAN13", "EAN128", "Code39", "Code128", "Code16k", "Code93", "PDF417", "DataMatrix" , "QRCode" или "ITF14". TypeBarCode: "EAN13", // Позиция левой границы поля по оси X (в миллиметрах). Left: 1, // Позиция верхней границы поля по оси Y (в миллиметрах). Top: 16, // Ширина поля в миллиметрах. Width: 35, // Высота поля в миллиметрах. Height: 10, // Ориентация содержимого поля. Имеет одно из следующих значений 0, 90, 180, 270. По умолчанию 0. Можно не указывать Orientation: 0, // Флаг наличия подписи в штрихкоде. По умолчанию "true". PrintHRI: true, // Размер шрифта в кеглях если PrintHRI = true. FontSize: 8, // Наличие контрольного символа для тех типов штрих кодов, для которых возможно управление его наличием. По умолчанию "true". CheckSymbol: true, // Статичность (одинаковое значение для всех экземпляров этикетки). По умолчанию "false". Можно не указывать Static: false, // В случае когда Static = "true", выступает в роли общего значения. Можно не указывать Value: "" }, //// Поле картинки этикетки -------------------------------------------------- //{ // // Тип поля - текст // Type: "Image", // // Уникальное имя поля в шаблоне этикетки. // FieldName: "Картинка", // // Позиция левой границы поля по оси X (в миллиметрах). // Left: 1, // // Позиция верхней границы поля по оси Y (в миллиметрах). // Top: 32, // // Ширина поля в миллиметрах. // Width: 35, // // Высота поля в миллиметрах. // Height: 10, // // Ориентация содержимого поля. Имеет одно из следующих значений 0, 90, 180, 270. По умолчанию 0. Можно не указывать // Orientation: 0, // // Строка, определяющая рамки поля. Имеет одно или несколько значений через разделитель - пробел: "Left", "Top", "Right" и "Bottom". По умолчанию "". Можно не указывать // Border: "", // // Толщина рамки в пикселах, по умолчанию 1. Можно не указывать // BorderWidth: 0, // // Стиль рамки. Имеет одно из значений: "Dotted", "Dashed", "Solid" или "Double". По умолчанию "Solid". Можно не указывать // BorderStyle: "Solid", // // Статичность (одинаковое значение для всех экземпляров этикетки). По умолчанию "false". Можно не указывать // Static: false, // // В случае когда Static = "true", выступает в роли общего значения. Можно не указывать // Value: "" //}, ] }, // Секция данных печатаемых этикеток Labels: [ // Данные 1 этикетки { // Указывает необходимое для этикетки количество копий для печати. По умолчанию 1. Quantity: 2, // Данные по полям этикетки Fields: [ { // Уникальное имя поля в шаблоне этикетки. FieldName: "Наименование", // Значение поля в шаблоне этикетки. Для элемента "Image" картинка кодируется текстом в кодировке Base64. Value: "Блокнот для заметок", }, { FieldName: "Цена", Value: "43,5" }, { FieldName: "Штрихкод", Value: "4008110271538" }, ] }, // Данные 2 этикетки { Quantity: 2, Fields: [ { FieldName: "Наименование", Value: "Яблоки антоновка в банке" }, { FieldName: "Цена", Value: "78,5" }, { FieldName: "Штрихкод", Value: "4008110271538" }, ] }, // Данные 3 этикетки { Quantity: 3, Fields: [ { FieldName: "Наименование", Value: "Туфли Лафоет" }, { FieldName: "Цена", Value: "2500" }, { FieldName: "Штрихкод", Value: "1254789547853" }, ] } ] }; //Если чек без ШК то удаляем строку с ШК if (IsBarCode == false) { //Data.Cash = 100; delete Data.CheckStrings[0]; } // Вызов команды 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 UploadGoods(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу Command: "UploadGoods", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // Строка, определяющая статус пакета, имеет одно из значений: "first", "regular", "last". Если пакет один, то статусу пакета присваивается "last". PackageStatus: "last", // Таблица товаров выгружаемая в ТСД UploadGoods: [ // Самый полный вариант строки товара: { // PLU товара (Индекс товара в весах) PLU: 1, // Код весового товара Code: 1003, // Флаг весового товара. По умолчанию true. Если false – то это штучный товар фасуемый на весах. IsWeightGoods: true, // Наименование товара Name: "Яблоки Антоновка", // Цена за килограмм Price: 95.50, // Текстовое описание товара (состав товара, список ингредиентов и пр.) Description: "Свежие!!", // Длительность хранения/срок годности товара, в днях ShelfLife: 500, }, { PLU: 2, Code: 1023, IsWeightGoods: true, Name: "Салат Болгарский", Price: 500, Description: "Состав: свекла, морковь, ветчина, мясо, сыр, яйцо, лук репчатый, майонез", ShelfLife: 5, }, ] }; // Вызов команды ExecuteCommand(Data); } // Удалить ранее загруженные товары в весах function ClearGoods(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу Command: "ClearGoods", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, }; // Вызов команды ExecuteCommand(Data); }
// Вывести тестовые строки function StringOutputOnCustomerDisplay(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу Command: "StringOutputOnCustomerDisplay", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // Выводимые на дисплей строки Strings: "Тестовая строка 1\n\rТестовая строка 2" }; // Вызов команды ExecuteCommand(Data); } // Очистить информацию на дисплее function ClearCustomerDisplay(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу Command: "ClearCustomerDisplay", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, }; // Вызов команды ExecuteCommand(Data); } // Получить информацию о дисплее function GetOutputOptions(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу Command: "GetOutputOptions", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, }; // Вызов команды 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 UploadTable(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу Command: "UploadTable", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // Признак выгрузки "Частичная/Полная". При полной выгрузке предполагается полная очистка товаров в терминале сбора данных. FullLoad: true, // Строка, определяющая статус пакета, имеет одно из значений: "first", "regular", "last". Если пакет один, то статусу пакета присваивается "last". PackageStatus: "last", // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: guid(), // Таблица товаров выгружаемая в ТСД GoodsTable: [ // Самый полный вариант строки товара: { // Штрихкод номенклатуры, Обязательный элемент BarCode: "1254789547853", // Наименование товара, Не обязательный элемент Name: "Товар №1", // Артикул товара, Не обязательный элемент Article: "SDF-1000", // Единица измерения номенклатуры, Не обязательный элемент UnitOfMeasurement: "шт", // Характеристика номенклатуры, Не обязательный элемент CharacteristicOfNomenclature: "красный", // Серия номенклатуры, Не обязательный элемент SeriesOfNomenclature: "102000025458", // Качество товара, Не обязательный элемент Quality: "Новый", // Цена товара, Не обязательный элемент Price: 1500.00, // Количество товара, Не обязательный элемент Quantity: 10, }, //Самый короткий вариант строки товара: { BarCode: "2150000000017", }, //Самый распространенный вариант строки товара: { BarCode: "4820000190534", // Наименование товара, Не обязательный элемент Name: "Товар №3", // Артикул товара, Не обязательный элемент Article: "SDF-2000", // Количество товара, Не обязательный элемент Quantity: 5, } ] }; // Вызов команды ExecuteCommand(Data); } // Загрузить таблицу товаров из ТСД function DownloadTable(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу Command: "DownloadTable", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: guid() }; // Вызов команды ExecuteCommand(Data); } // Очистить загруженную ранее таблицу товаров в ТСД function ClearTable(NumDevice) { // Подготовка данных команды var Data = { // Команда серверу Command: "ClearTable", // Номер устройства. Если 0 то первое не блокированное на сервере NumDevice: NumDevice, // Уникальный идентификатор команды. Любая строка из 40 символов - должна быть уникальна для каждой подаваемой команды // По этому идентификатору можно запросить результат выполнения команды // Поле не обязательно IdCommand: guid() }; // Вызов команды ExecuteCommand(Data); }
Расчет ключа для получения суб-лицензии Если Вам надо предоставить свою лицензию во временное пользование вашему клиенту (суб-лицензирование) вы должны сделать следующее: 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" В Команде и в результате это поле будет одинаковое.
Использование из мобильных приложений:
Сервер очень легко использовать из мобильных приложений.Все технологии разработки мобильных приложений имеют средства работы с JSON сериализацией а так же инструменты для работы с HTTP протоколом.
Так что внедрение работы со всем спектром оборудования не представляет ни какой сложности.
Лицензия на программу: Условно-бесплатная
Стоимость лицензии на 1 ПК для коммерческого использования - 3000 руб. без временных ограничений.Стоимость лицензии на 1 ПК для коммерческого использования - 1500 руб. на 1 год.
Продление лицензии для коммерческого использования- 1000 руб. на 1 год.
Для цели тестирования, разработки, обучения оплата не требуется.
При этом иногда будет печататся информация о том что программа не лицензирована .
Также иногда сумма или количество операции будет изменятся на случайное.
Оплата:
Укажите Email на который будет привязана лицензия: | |||
Количество лицензий (без ограничений по времени): | 0.00 руб | ||
Количество лицензий сроком на 1 год: | 0.00 руб | ||
Количество продлений лицензии: | 0.00 руб | ||
Техническая поддержка сроком на 1 год: | 0.00 руб | ||
Произвольная сумма: | (Только при оплате по спец.условиям) | ||
Итого: 0.00 руб |
Если Вам нужна безналичная форма оплаты:
Пришлите на kkmserver@gmail.com карточку предприятия и укажите какая лицензия нужна и на какой Email её зарегистрировать.Мы Выставим Вам счет и пришлем обратно по почте.
После оплаты лицензия будет заведена на указанный Вами Email.
Скачать программу:
Установка программы Unit-Server (ver 2.1.40.45 от 20.01.2021) (По умолчанию логин: "Admin", пароль не задан)Драйвер (ФФД 1.05/1.1) для конфигураций 1С для тонкого клиента и Web-клиента IE, Chrome и Firefox (ver 20.1.40.23 от 06.01.2021)
Драйвер (ФФД 1.0) для конфигураций 1С для тонкого клиента и Web-клиента IE, Chrome и Firefox (ver 20.0.26.06 от 17.03.2018)
Установка платформы .NET Framework 4.5, 4.5.1 и 4.5.2
(старая версия) Установка программы Unit-Server (ver 10.4.1.03 от 31.10.2016) (По умолчанию логин: "Admin", пароль не задан)
(старая версия) Драйвер для конфигураций 1С для тонкого клиента и Web-клиента IE, Chrome и Firefox (ver 10.4.1.03 от 31.10.2016)