ККМ web-сервер

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

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






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

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

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

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