Мы предлагаем программу, которая позволяет подключить онлайн-кассу к локальной сети. Это позволит:
- Подключаться к одной онлайн-кассе сразу нескольким программам 1С
- Подключаться к онлайн-кассе при работе в 1С через удаленный рабочий стол (RDP)
- Подключаться к онлайн-кассе при работе в 1С в режиме WEB-клиента
- Подключаться к онлайн-кассе при работе в мобильной версии 1С («Мобильное приложение» и «Мобильный клиент»)
- Подключаться к онлайн-кассе при работе в старых конфигурациях (7.7, 8.0, 8.1, 8.2) используя самые свежие драйвера для 8.3
- Использовать онлайн-кассу для интернет-платежей на вашем сайте
- Использовать онлайн-кассу не только в 1С, но и в ваших собственных приложениях (примеры на языках VBA (Excel), Delphi7, C++, Python можно скачать в разделе "Файлы")
- Печатать чеки на основании данных из текстовых файлов
Причем все эти программы могут быть одновременно подключены к одной онлайн-кассе.
Поддерживаемые платформы 1С:
- 8.3 по технологии Native API
- 7.7, 8.0, 8.1, 8.2, 8.3 по технологии COM
Принцип работы
Программа «Сервер ККТ» умеет работать с драйверами ККТ точно так же, как это делает платформа 1С. Подключившись к кассовому аппарату, программа «Сервер ККТ» открывает доступ к нему по сетевому протоколу TCP.
В комплект поставки программы входят драйвера «Клиент ККТ», с помощью которых из 1С можно подключиться к «Серверу ККТ».
Настройка «Сервера ККТ» сводиться к трем шагам. На компьютер, непосредственно к которому подключается онлайн-касса:
- Устанавливаются драйвера из комплекта поставки онлайн-кассы.
- Устанавливается программа «Сервер ККТ» (в виде службы, работает по протоколу TCP).
- В программе «Сервер ККТ» указываются параметры подключения к онлайн-кассе (модель, COM-порт и т.д.).
На клиентских компьютерах в базе 1С устанавливается драйвер «Клиент ККТ». В настройках драйвера указывается имя компьютера (или ip-адрес) и порт «Сервера ККТ». Драйвера от производителя ККТ (из комплекта поставки) на клиентские компьютеры устанавливать не нужно.
Требования
- Онлайн-касса должна поставляться с драйверами для 1С в соответствии с «Требованиями к разработке драйверов подключаемого оборудования» не ниже версии 2.1. Драйвера от производителя могут быть выполнены по технологии Native API (например, драйвер АТОЛ 10.4.х) или по технологии COM (например, ШТРИХ-М 4.14.х).
- Базы 1С также должны поддерживать стандарт «Требования к разработке драйверов подключаемого оборудования» не ниже версии 2.1. Данный стандарт поддерживается в «1С:Библиотека подключаемого оборудования» начиная с версии 2.0.1.
- Программа «Сервер ККТ» должна устанавливаться на операционную систему Windows XP или более поздние версии (Windows 7, 8, 10)
- Драйвер «Клиент ККТ» по технологии Native API предназначен для платформы 1С версии 8.2.9.356 и выше (8.2, 8.3 любых версий) для ОС Windows (x86, x86_64), Linux(x86, x86_64) и Android (arm, arm64, x86, x86_64).
- Драйвер «Клиент ККТ» по технологии COM предназначен для платформы 1С версии 7.70.027, 8.0.3.15 и выше (8.0, 8.1, 8.2, 8.3 любых версий) для ОС Windows
- Все крупные производители онлайн-касс такие драйвера предоставляют, более того, типовые конфигурации 1С эти драйвера уже содержат.
- Дистрибутив содержит два комплекта драйверов «ККТ-клиент»:
- выполненные по технологии Native API - поддерживает win32, win64, Google Chrome, Filefox, Android. Предназначен для платформы 1С 8.2 и 8.3 любых версий
- выполненные по технологии COM - для старых версий платформ (7.7, 8.0, 8.1, 8.2). Предназначен для платформы 1С версии 7.7 и 8.х любых версий
Внимание
Может потребоваться адаптация типовых конфигураций 1С, если в них не предусмотрено использование одного устройства ККТ на нескольких рабочих местах.
В разделе "Файлы" можно скачать расширения (.cfe) для адаптации следующих конфигураций:
- Розница 2.2
- Розница 2.3
- Розница: Магазин автозапчастей 2.3
- Управление торговлей 11.4
- 1С:Комплексная автоматизация, редакция 2.4
- 1С:Бухгалтерия Предприятия 3.0
- Управление нашей фирмой 1.6
- Бухгалтерия государственного учреждения 2.0
Демо-версия
В разделе "Файлы" доступна для скачивания демо-версия программы. Демо-версия позволяет:
- Протестировать программу на вашем устройстве ККТ
- Протестировать драйвера 1С "Клиент-ККТ" на вашей конфигурации
- Использовать программу в качестве эмулятора ККТ
- Записывать в файл лога все обращения к драйверу ККТ (можно использовать для отладки и тестирования)
Ограничение демо-версии: не более 5 чеков после запуска службы (если перезапустить службу, то можно снова печатать 5 чеков)
Пробный период (30 дней)
Пробный период – это бесплатный период использования программы, в течение которого можно понять, насколько она вам подходит. По истечении пробного периода программа автоматически вернётся в демо-режим.
Для активации пробно периода нужно запустить программу KKT_Server_Setting.exe и нажать кнопку "Ещё" – "Регистрация" – "Пробный период".
В программу встроен эмулятор ККТ, который может работать в следующих режимах:
- В соответствии с «Требованиями к разработке драйверов подключаемого оборудования» версии 2.1
- В соответствии с «Требованиями к разработке драйверов подключаемого оборудования» версии 2.2
- В соответствии с «Требованиями к разработке драйверов подключаемого оборудования» версии 3.1
- В соответствии с «Требованиями к разработке драйверов подключаемого оборудования» версии 3.2
Для использования эмулятора достаточно демо-версии программы
В программе есть возможность включить запись логов: вся информация о вызовах методов драйвера ККТ будет записываться в текстовой файл:
21.08.2019 10:47:25 Start on port 52111
Server mode: Native InterfaceRevision: 2004 Dll: C:\Program Files\Modul\KKT\fptr10_1c_win32_10_4_2_0.dll
21.08.2019 10:50:02 ClientConnect 192.168.1.176
21.08.2019 10:50:02 Command Open
Параметр1=Неопределено
21.08.2019 10:50:03 Command completed
21.08.2019 10:50:03 Return
Параметр1="ATOL_KKT_1C83_V10#1"
Результат=Истина
21.08.2019 10:50:03 ClientDisconnect 192.168.1.176
21.08.2019 10:50:03 ClientConnect 192.168.1.176
21.08.2019 10:50:03 Command ProcessCheck
Параметр1="ATOL_KKT_1C83_V10#1"
Параметр2=Ложь
Параметр3="<?xml version="1.0" encoding="UTF-8"?>
<CheckPackage>
<Parameters CashierName="Иванов Иван Иванович" PaymentType="1" SenderEmail="" CustomerPhone=""/>
<Positions>
<FiscalString Name="63155 Пакет-майка" Quantity="1" PriceWithDiscount="5" SumWithDiscount="5" Tax="none" SignCalculationObject="1"/>
<Barcode BarcodeType="CODE39" Barcode="DA00-00032994210819"/>
</Positions>
<Payments Cash="5" ElectronicPayment="0" Credit="0" AdvancePayment="0" CashProvision="0"/>
</CheckPackage>"
Параметр4=0
Параметр5=0
Параметр6=""
Параметр7=""
21.08.2019 10:50:07 Command completed
Mode=work
21.08.2019 10:50:07 Return
Параметр1 без изменений
Параметр2 без изменений
Параметр3 без изменений
Параметр4=7435
Параметр5=97
Параметр6="4149700262"
Параметр7="www.nalog.ru"
Результат=Истина
21.08.2019 10:50:07 ClientDisconnect 192.168.1.176
21.08.2019 10:50:07 ClientConnect 192.168.1.176
21.08.2019 10:50:07 Command Close
Параметр1="ATOL_KKT_1C83_V10#1"
21.08.2019 10:50:07 Command completed
21.08.2019 10:50:07 Return
Параметр1 без изменений
Результат=Истина
21.08.2019 10:50:07 ClientDisconnect 192.168.1.176
Информация в файле лога ориентирована на программистов. В ней содержится:
- Имя вызываемого метода компоненты
- Входные параметры
- Выходные параметры (т.е. параметры после вызова метода)
- Признак успешности выполнения
- Возвращаемый результат
Для сбора логов с целью тестирования конфигурации достаточно демо-версии программы
Ограничения типовой конфигурации "1С:Управление Торговлей 10.3":
В документе "Кассовая смена" указывается экземпляр подключаемого устройства (реквизит "ФискальноеУстройство"). То есть нельзя получить информацию о кассовой смене на другом рабочем месте, т.к. на другом рабочем месте используется другой экземпляр подключаемого устройства.
Необходимые изменения:
- В модуле объекта документа "Кассовая смена" в событии "ПередЗаписью" очищать значение реквизита "ФискальноеУстройство".
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) Если ОбменДанными.Загрузка=Ложь Тогда ФискальноеУстройство = Неопределено; КонецЕсли; КонецПроцедуры
- Изменить процедуру "ОбщийМодуль.КассовыеСменыВызовСервера.ОписаниеПоследнейКассовойСмены" таким образом, чтобы получать статус последней смены не по "ФискальномуУстройству" а по "КассеККМ".
//Изменить запроc на: Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 | КассоваяСмена.Ссылка КАК КассоваяСмена, | КассоваяСмена.ФискальноеУстройство, | КассоваяСмена.НачалоКассовойСмены, | КассоваяСмена.ОкончаниеКассовойСмены, | ДОБАВИТЬКДАТЕ(КассоваяСмена.НачалоКассовойСмены, ДЕНЬ, 1) КАК ДатаИстеченияСрокаДействия, | КассоваяСмена.Организация, | КассоваяСмена.Статус, | КассоваяСмена.ДатаСменыККТ, | КассоваяСмена.НомерСменыККТ, | КассоваяСмена.КассаККМ |ИЗ | Документ.КассоваяСмена КАК КассоваяСмена | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ТорговоеОборудование КАК Рег | ПО КассоваяСмена.КассаККМ = Рег.КассаККМ | И (Рег.Идентификатор = &ФискальноеУстройство) | И (КассоваяСмена.Проведен) | |УПОРЯДОЧИТЬ ПО | КассоваяСмена.НачалоКассовойСмены УБЫВ";
- Изменить процедуру "Документ.КассовыеСмены.ФормаСписка.ЗакрытьКассовуюСмену" таким образом, чтобы получать ККТ не из документа, а из списка подключенных устройств.
&НаКлиенте Процедура ЗакрытьКассовуюСмену(Команда) Если Не КассовыеСменыВызовСервера.ЕстьПравоНаЗакрытиеСмены() Тогда Предупреждение("Нарушение прав доступа"); Возврат; КонецЕсли; ОчиститьСообщения(); ТекущиеДанныеСписка = Элементы.Список.ТекущиеДанные; Если ТекущиеДанныеСписка <> Неопределено Тогда СтатусСмены = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ТекущиеДанныеСписка.Ссылка, "Статус"); Если СтатусСмены = ПредопределенноеЗначение("Перечисление.СтатусыКассовойСмены.Закрыта") Тогда ОбщегоНазначения.СообщитьОбОшибке("Смена уже закрыта."); Возврат; КонецЕсли; Иначе ОбщегоНазначения.СообщитьИнформациюПользователю("Выберите смену, которую нужно закрыть."); Возврат; КонецЕсли; КассаККМ = ТекущиеДанныеСписка.КассаККМ; Если Не ЗначениеЗаполнено(КассаККМ) Тогда Возврат; КонецЕсли; МассивФУ = ПолучитьСерверТО().ПолучитьСписокУстройств(Перечисления.ВидыТорговогоОборудования.ККТ, КассаККМ); КоличествоФУ = МассивФУ.Количество(); Если КоличествоФУ = 0 Тогда Возврат; ИначеЕсли КоличествоФУ = 1 Тогда ККТ = МассивФУ[0]; Иначе СписокФУ = РаботаСТорговымОборудованием.ПолучитьСписокУстройствТОДляВыбора(МассивФУ); х = СписокФУ.ВыбратьЭлемент("Необходимо выбрать фискальное устройство"); Если х=Неопределено Тогда Возврат; Иначе ККТ = х.Значение; КонецЕсли; КонецЕсли; КассовыеСменыКлиент.ЗакрытьКассовуюСмену(ККТ, ТекущиеДанныеСписка.Ссылка); Элементы.Список.Обновить(); КонецПроцедуры
- В справочнике "Кассы ККМ" указывается экземпляр подключаемого устройства. Таким образом ККМ привязывается только к одному рабочему месту.
- В документе "Кассовая смена" указывается экземпляр подключаемого устройства (реквизит "ФискальноеУстройство"). То есть нельзя получить информацию о кассовой смене на другом рабочем месте, т.к. на другом рабочем месте используется другой экземпляр подключаемого устройства.
Необходимые изменения:
- В справочник "ПодключаемоеОборудование" добавить реквизит "Касса ККМ". Это позволить использовать одну ККМ на нескольких рабочих местах.
- В модуле объекта документа "Кассовая смена" в событии "ПередЗаписью" очищать значение реквизита "ФискальноеУстройство".
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) Если ОбменДанными.Загрузка=Ложь Тогда ФискальноеУстройство = Неопределено; КонецЕсли; КонецПроцедуры
- В справочник "КассыККМ" добавить табличную часть "ПараметрыРегистрации". Это позволить хранить параметры регисстрации ККТ без привязки к рабочему месту.
- Изменить процедуры общих модулей таким образом, чтобы получать данные "ФискальномуУстройству" а по "КассеККМ":
КассовыеСменыВызовСервера.ОписаниеПоследнейКассовойСмены
УстановитьПривилегированныйРежим(Истина); //++Было //Запрос = Новый Запрос(); //Запрос.Текст = //"ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 //| КассоваяСмена.Ссылка КАК КассоваяСмена, //| КассоваяСмена.ФискальноеУстройство КАК ФискальноеУстройство, //| КассоваяСмена.НачалоКассовойСмены КАК НачалоКассовойСмены, //| КассоваяСмена.ОкончаниеКассовойСмены КАК ОкончаниеКассовойСмены, //| ДОБАВИТЬКДАТЕ(КассоваяСмена.НачалоКассовойСмены, ДЕНЬ, 1) КАК ДатаИстеченияСрокаДействия, //| КассоваяСмена.Организация КАК Организация, //| КассоваяСмена.Статус КАК Статус //|ИЗ //| Документ.КассоваяСмена КАК КассоваяСмена //|ГДЕ //| КассоваяСмена.ФискальноеУстройство = &ФискальноеУстройство //| И КассоваяСмена.Проведен //| //|УПОРЯДОЧИТЬ ПО //| КассоваяСмена.НачалоКассовойСмены УБЫВ, //| КассоваяСмена.НомерСменыККТ УБЫВ"; //Запрос.УстановитьПараметр("ФискальноеУстройство", ФискальноеУстройство); //Результат = Запрос.Выполнить().Выгрузить(); //--Было //++Стало Запрос = Новый Запрос(); Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 | КассоваяСмена.Ссылка КАК КассоваяСмена, | КассоваяСмена.ФискальноеУстройство КАК ФискальноеУстройство, | КассоваяСмена.НачалоКассовойСмены КАК НачалоКассовойСмены, | КассоваяСмена.ОкончаниеКассовойСмены КАК ОкончаниеКассовойСмены, | ДОБАВИТЬКДАТЕ(КассоваяСмена.НачалоКассовойСмены, ДЕНЬ, 1) КАК ДатаИстеченияСрокаДействия, | КассоваяСмена.Организация КАК Организация, | КассоваяСмена.Статус КАК Статус |ИЗ | Документ.КассоваяСмена КАК КассоваяСмена |ГДЕ | КассоваяСмена.КассаККМ = &КассаККМ | И КассоваяСмена.Проведен | |УПОРЯДОЧИТЬ ПО | КассоваяСмена.НачалоКассовойСмены УБЫВ, | КассоваяСмена.НомерСменыККТ УБЫВ"; Запрос.УстановитьПараметр("КассаККМ", ФискальноеУстройство.СерверККТ_КассаККМ); Результат = Запрос.Выполнить().Выгрузить(); //--Стало Если Результат.Количество() = 0 Тогда Возврат Неопределено; Иначе СтруктураРезультат = Новый Структура(); Для Каждого КолонкаРезультата Из Результат.Колонки Цикл СтруктураРезультат.Вставить(КолонкаРезультата.Имя, Результат[0][КолонкаРезультата.Имя]); КонецЦикла; Возврат СтруктураРезультат; КонецЕсли;
УправлениеНебольшойФирмойПовтИсп.ПолучитьПараметрыКассыККМ
//++Было //Запрос = Новый Запрос; //Запрос.Текст = //"ВЫБРАТЬ РАЗРЕШЕННЫЕ //| ВЫБОР //| КОГДА КассыККМ.ТипКассы = ЗНАЧЕНИЕ(Перечисление.ТипыКассККМ.ФискальныйРегистратор) //| ТОГДА ИСТИНА //| ИНАЧЕ ЛОЖЬ //| КОНЕЦ КАК ЭтоФискальныйРегистратор, //| КассыККМ.Владелец КАК Организация, //| КассыККМ.СтруктурнаяЕдиница КАК СтруктурнаяЕдиница, //| КассыККМ.ПодключаемоеОборудование КАК ИдентификаторУстройства, //| КассыККМ.ИспользоватьБезПодключенияОборудования КАК ИспользоватьБезПодключенияОборудования, //| КассыККМ.ЭлектронныйЧекSMSПередаютсяПрограммой1С КАК ЭлектронныйЧекSMSПередаютсяПрограммой1С, //| КассыККМ.ЭлектронныйЧекEmailПередаютсяПрограммой1С КАК ЭлектронныйЧекEmailПередаютсяПрограммой1С, //| КассыККМ.СоздаватьВыемку КАК СоздаватьВыемку, //| КассыККМ.СоздаватьПоступлениеВКассу КАК СоздаватьПоступлениеВКассу, //| КассыККМ.КассаДляРозничнойВыручки КАК КассаДляРозничнойВыручки, //| КассыККМ.МинимальныйОстатокВКассеККМ КАК МинимальныйОстатокВКассеККМ //|ИЗ //| Справочник.КассыККМ КАК КассыККМ //|ГДЕ //| КассыККМ.Ссылка = &Ссылка"; // //Запрос.УстановитьПараметр("Ссылка", КассаККМ); //--Было //++Стало ИдентификаторУстройства = Справочники.ПодключаемоеОборудование.ПустаяСсылка(); Запрос = Новый Запрос( "ВЫБРАТЬ | Спр.Ссылка КАК Ссылка |ИЗ | Справочник.ПодключаемоеОборудование КАК Спр |ГДЕ | Спр.СерверККТ_КассаККМ = &КассаККМ И РабочееМесто=&РабочееМесто И УстройствоИспользуется=Истина И ПометкаУдаления=Ложь И ТипОборудования=Значение(Перечисление.ТипыПодключаемогоОборудования.ККТ)"); Запрос.УстановитьПараметр("КассаККМ",КассаККМ); Запрос.УстановитьПараметр("РабочееМесто",МенеджерОборудованияВызовСервера.ПолучитьРабочееМестоКлиента()); Табл = Запрос.Выполнить().Выгрузить(); Если Табл.Количество()=1 Тогда ИдентификаторУстройства = Табл[0].Ссылка; КонецЕсли; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ | ВЫБОР | КОГДА КассыККМ.ТипКассы = ЗНАЧЕНИЕ(Перечисление.ТипыКассККМ.ФискальныйРегистратор) | ТОГДА ИСТИНА | ИНАЧЕ ЛОЖЬ | КОНЕЦ КАК ЭтоФискальныйРегистратор, | КассыККМ.Владелец КАК Организация, | КассыККМ.СтруктурнаяЕдиница КАК СтруктурнаяЕдиница, | &ИдентификаторУстройства КАК ИдентификаторУстройства, | КассыККМ.ИспользоватьБезПодключенияОборудования КАК ИспользоватьБезПодключенияОборудования, | КассыККМ.ЭлектронныйЧекSMSПередаютсяПрограммой1С КАК ЭлектронныйЧекSMSПередаютсяПрограммой1С, | КассыККМ.ЭлектронныйЧекEmailПередаютсяПрограммой1С КАК ЭлектронныйЧекEmailПередаютсяПрограммой1С, | КассыККМ.СоздаватьВыемку КАК СоздаватьВыемку, | КассыККМ.СоздаватьПоступлениеВКассу КАК СоздаватьПоступлениеВКассу, | КассыККМ.КассаДляРозничнойВыручки КАК КассаДляРозничнойВыручки, | КассыККМ.МинимальныйОстатокВКассеККМ КАК МинимальныйОстатокВКассеККМ |ИЗ | Справочник.КассыККМ КАК КассыККМ |ГДЕ | КассыККМ.Ссылка = &Ссылка"; Запрос.УстановитьПараметр("Ссылка", КассаККМ); Запрос.УстановитьПараметр("ИдентификаторУстройства", ИдентификаторУстройства); //--Стало Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Если Выборка.Следующий() Тогда Возврат Новый Структура( "ИдентификаторУстройства, |ИспользоватьБезПодключенияОборудования, |ЭтоФискальныйРегистратор, |Организация, |СтруктурнаяЕдиница, |ЭлектронныйЧекSMSПередаютсяПрограммой1С, |ЭлектронныйЧекEmailПередаютсяПрограммой1С, |СоздаватьВыемку, |СоздаватьПоступлениеВКассу, |КассаДляРозничнойВыручки, |МинимальныйОстатокВКассеККМ", Выборка.ИдентификаторУстройства, Выборка.ИспользоватьБезПодключенияОборудования, Выборка.ЭтоФискальныйРегистратор, Выборка.Организация, Выборка.СтруктурнаяЕдиница, Выборка.ЭлектронныйЧекSMSПередаютсяПрограммой1С, Выборка.ЭлектронныйЧекEmailПередаютсяПрограммой1С, Выборка.СоздаватьВыемку, Выборка.СоздаватьПоступлениеВКассу, Выборка.КассаДляРозничнойВыручки, Выборка.МинимальныйОстатокВКассеККМ ); Иначе Возврат Новый Структура( "ИдентификаторУстройства, |ИспользоватьБезПодключенияОборудования, |ЭтоФискальныйРегистратор, |Организация, |СтруктурнаяЕдиница, |ЭлектронныйЧекSMSПередаютсяПрограммой1С, |ЭлектронныйЧекEmailПередаютсяПрограммой1С, |СоздаватьВыемку, |СоздаватьПоступлениеВКассу, |КассаДляРозничнойВыручки, |МинимальныйОстатокВКассеККМ", Справочники.ПодключаемоеОборудование.ПустаяСсылка(), Ложь, Ложь, Справочники.Организации.ПустаяСсылка(), Справочники.СтруктурныеЕдиницы.ПустаяСсылка(), Ложь, Ложь, Ложь, Ложь, Справочники.Кассы.ПустаяСсылка(), 0 ); КонецЕсли;
- В форме "Документ.ЧекККМ.ФормаДокумента_РМК" изменить процедуру ПолучитьСсылкиНаОборудование
ФискальныйРегистратор = Справочники.ПодключаемоеОборудование.ПустаяСсылка(); Если ИспользоватьПодключаемоеОборудование Тогда Запрос = Новый Запрос( "ВЫБРАТЬ | Спр.Ссылка КАК Ссылка |ИЗ | Справочник.ПодключаемоеОборудование КАК Спр |ГДЕ | Спр.СерверККТ_КассаККМ = &КассаККМ И РабочееМесто=&РабочееМесто И УстройствоИспользуется=Истина И ПометкаУдаления=Ложь И ТипОборудования=Значение(Перечисление.ТипыПодключаемогоОборудования.ККТ)"); Запрос.УстановитьПараметр("КассаККМ",Объект.КассаККМ); Запрос.УстановитьПараметр("РабочееМесто",МенеджерОборудованияВызовСервера.ПолучитьРабочееМестоКлиента()); Табл = Запрос.Выполнить().Выгрузить(); Если Табл.Количество()=1 Тогда ФискальныйРегистратор = Табл[0].Ссылка; КонецЕсли; КонецЕсли;
- Служба "Сервер ККТ" подключается к кассовому аппарату используя драйвера от производителя ККТ (например, драйвера выполненные по технологии Native API для 1С:8.3).
- Далее служба "Сервер ККТ" открывает TCP-порт прослушивания входящий соединений.
- Программа 1С:7.7 подключается к этому порту используя драйвер "Клиент-ККТ" (драйвер входит в дистрибутив "Сервера ККТ").
- Далее 1С:7.7 и "Сервер ККТ" обмениваются данными по своему внутреннему протоколу. При этом для 1С скрыто, какой кассовый аппарат и какой драйвер используется.
Перем Объект;
Перем Параметр_Сервер;
Перем Параметр_Порт;
Процедура ПриОткрытии()
Если ЗагрузитьВнешнююКомпоненту("v7plus.dll")<>1 Тогда
Форма.Параметр.Установить("Результат", 0);
Форма.Параметр.Установить("ОписаниеРезультата", "Компонента v7plus.dll не найдена!");
СтатусВозврата(0);
Возврат;
КонецЕсли;
Компонента = "KKT_Client_3001_77.dll";
Если ЗагрузитьВнешнююКомпоненту(Компонента)=0 Тогда
Сообщить("Не удалось загрузить внешнюю компоненту """ + Компонента + """");
СтатусВозврата(0);
Возврат;
Иначе
Попытка
Объект = СоздатьОбъект("AddIn.MKClient_3001_77");
Исключение
КонецПопытки;
Если ПустоеЗначение(Объект)=1 Тогда
Сообщить("Не удалось создать объект внешней компоненты");
СтатусВозврата(0);
Возврат;
КонецЕсли;
КонецЕсли;
Параметр_Сервер = "192.168.0.61";
Параметр_Порт = 52111;
КонецПроцедуры
Процедура Атрибут(хмлКорень,хмлЭлемент, ИмяАтрибута, ЗначениеАтрибута)
хмлАтрибут = хмлКорень.СоздатьУзел("attribute", ИмяАтрибута);
хмлАтрибут.Значение = ЗначениеАтрибута;
хмлЭлемент.ДобавитьПодчиненный(хмлАтрибут);
КонецПроцедуры
Функция Подключиться(Отказ,ОписаниеРезультата)
Если ПустоеЗначение(Объект)=1 Тогда
ОписаниеРезультата = "Объект внешней компоненты не создан";
Отказ = 1;
Возврат "";
КонецЕсли;
ф = Объект.УстановитьПараметр("Server", Параметр_Сервер);
Если ПустоеЗначение(ф)=1 Тогда
Объект.GetLastError(ОписаниеРезультата);
Отказ = 1;
Возврат "";
КонецЕсли;
ф = Объект.УстановитьПараметр("Port", Параметр_Порт);
Если ПустоеЗначение(ф)=1 Тогда
Объект.GetLastError(ОписаниеРезультата);
Отказ = 1;
Возврат "";
КонецЕсли;
ИДУстройства = "";
ф = Объект.Подключить(ИДУстройства);
Если ПустоеЗначение(ф)=1 Тогда
Объект.GetLastError(ОписаниеРезультата);
Отказ = 1;
Возврат "";
КонецЕсли;
Возврат ИДУстройства;
КонецФункции
Процедура ОткрытьСмену(ИДУстройства, Кассир, ИНН_Кассира, НомерСмены, Отказ, ОписаниеРезультата)
XMLАнализатор = СоздатьОбъект("AddIn.XMLParser");
// Создаем XML-файл
XML = XMLАнализатор.СоздатьДокумент();
XML.Кодировка = "UTF-8";
InputParameters = XML.СоздатьПодчиненныйЭлемент("InputParameters");
Parameters = InputParameters.СоздатьПодчиненныйЭлемент("Parameters");
Атрибут(XML, Parameters, "CashierName", Кассир);
Атрибут(XML, Parameters, "CashierVATIN", ИНН_Кассира);
XML.Записать(КаталогПользователя() + "Modul_OpenShift.xml");
// Читаем XML-файл в кодировке UTF-8
Поток = CreateObject("Adodb.Stream");
Поток.Charset = "utf-8";
Поток.Type = 2;
Поток.Mode= 3;
Поток.Open();
Поток.LoadFromFile(КаталогПользователя() + "Modul_OpenShift.xml");
ВходныеПараметры = Поток.ReadText();
Поток.Close();
НомерДокумента = "";
ВыходныеПараметры = "";
ф = Объект.ОткрытьСмену(ИДУстройства, ВходныеПараметры, ВыходныеПараметры);
Если ПустоеЗначение(ф)=1 Тогда
Объект.GetLastError(ОписаниеРезультата);
Отказ = 1;
Возврат;
КонецЕсли;
КонецПроцедуры
Процедура ЗакрытьСмену(ИДУстройства, Кассир, ИНН_Кассира, НомерСмены, Отказ, ОписаниеРезультата)
XMLАнализатор = СоздатьОбъект("AddIn.XMLParser");
XML = XMLАнализатор.СоздатьДокумент();
XML.Кодировка = "UTF-8";
InputParameters = XML.СоздатьПодчиненныйЭлемент("InputParameters");
Parameters = InputParameters.СоздатьПодчиненныйЭлемент("Parameters");
Атрибут(XML, Parameters, "CashierName", Кассир);
Атрибут(XML, Parameters, "CashierVATIN", ИНН_Кассира);
XML.Записать(КаталогПользователя() + "Modul_CloseShift.xml");
Поток = CreateObject("Adodb.Stream");
Поток.Charset = "utf-8";
Поток.Type = 2;
Поток.Mode= 3;
Поток.Open();
Поток.LoadFromFile(КаталогПользователя() + "Modul_CloseShift.xml");
ВходныеПараметры = Поток.ReadText();
Поток.Close();
НомерДокумента = "";
ВыходныеПараметры = "";
ф = Объект.ЗакрытьСмену(ИДУстройства, ВходныеПараметры, ВыходныеПараметры);
Если ПустоеЗначение(ф)=1 Тогда
Объект.GetLastError(ОписаниеРезультата);
Отказ = 1;
Возврат;
КонецЕсли;
КонецПроцедуры
Функция ПечататьЧек(ИДУстройства, Кассир, СписокТоваров, СуммаНал, СуммаБезнал, Отказ, ОписаниеРезультата)
XMLАнализатор = СоздатьОбъект("AddIn.XMLParser");
XML = XMLАнализатор.СоздатьДокумент();
XML.Кодировка = "UTF-8";
CheckPackage = XML.СоздатьПодчиненныйЭлемент("CheckPackage");
Parameters = CheckPackage.СоздатьПодчиненныйЭлемент("Parameters");
Атрибут(XML, Parameters, "OperationType", 1); //Приход денежных средств
Атрибут(XML, Parameters, "TaxationSystem", 3); //ЕНВД
Атрибут(XML, Parameters, "CashierName", Кассир);
Positions = CheckPackage.СоздатьПодчиненныйЭлемент("Positions");
СписокТоваров.ВыбратьСтроки();
Пока СписокТоваров.ПолучитьСтроку()=1 Цикл
FiscalString = Positions.СоздатьПодчиненныйЭлемент("FiscalString");
Атрибут(XML, FiscalString, "Name", СписокТоваров.Наименование);
Атрибут(XML, FiscalString, "Quantity", СписокТоваров.Количество);
Атрибут(XML, FiscalString, "PriceWithDiscount", СписокТоваров.Цена);
Атрибут(XML, FiscalString, "AmountWithDiscount", СписокТоваров.Сумма);
Атрибут(XML, FiscalString, "VATRate", СписокТоваров.СтавкаНДС);
КонецЦикла;
Payments = CheckPackage.СоздатьПодчиненныйЭлемент("Payments");
Атрибут(XML, Payments, "Cash", СуммаНал);
Атрибут(XML, Payments, "ElectronicPayment", СуммаБезнал);
XML.Записать(КаталогПользователя() + "Modul_ProcessCheck.xml");
Поток = CreateObject("Adodb.Stream");
Поток.Charset = "utf-8";
Поток.Type = 2;
Поток.Mode= 3;
Поток.Open();
Поток.LoadFromFile(КаталогПользователя() + "Modul_ProcessCheck.xml");
ВходныеПараметры = Поток.ReadText();
Поток.Close();
ВыходныеПараметры = "";
ф = Объект.СформироватьЧек(ИДУстройства, 0, ВходныеПараметры, ВыходныеПараметры);
Если ПустоеЗначение(ф)=1 Тогда
Объект.GetLastError(ОписаниеРезультата);
Отказ = 1;
КонецЕсли;
КонецФункции
Процедура Отключиться(ИДУстройства,Отказ,ОписаниеРезультата)
ф = Объект.Отключить(ИДУстройства);
Если ПустоеЗначение(ф)=1 Тогда
Объект.GetLastError(ОписаниеРезультата);
Отказ = 1;
Возврат;
КонецЕсли;
КонецПроцедуры
Процедура КнопкаОткрытьСмену()
Отказ = 0;
ОписаниеРезультата = "";
ИДУстройства = Подключиться(Отказ,ОписаниеРезультата);
Если Отказ=1 Тогда
Сообщить(ОписаниеРезультата);
Возврат;
КонецЕсли;
ОткрытьСмену(ИДУстройства,"ФИО кассира","ИНН кассира",1,Отказ,ОписаниеРезультата);
Если Отказ=1 Тогда
Сообщить(ОписаниеРезультата);
КонецЕсли;
Отказ = 0;
Отключиться(ИДУстройства,Отказ,ОписаниеРезультата);
Если Отказ=1 Тогда
Сообщить(ОписаниеРезультата);
Возврат;
КонецЕсли;
КонецПроцедуры
Процедура КнопкаЧек()
Отказ = 0;
ОписаниеРезультата = "";
ИДУстройства = Подключиться(Отказ,ОписаниеРезультата);
Если Отказ=1 Тогда
Сообщить(ОписаниеРезультата);
Возврат;
КонецЕсли;
//Пример табличной части
СписокТоваров = СоздатьОбъект("ТаблицаЗначений");
СписокТоваров.НоваяКолонка("Наименование","Строка");
СписокТоваров.НоваяКолонка("Количество","Число",10,3);
СписокТоваров.НоваяКолонка("Цена","Число",15,2);
СписокТоваров.НоваяКолонка("Сумма","Число",15,2);
СписокТоваров.НоваяКолонка("СтавкаНДС","Строка");
СписокТоваров.НоваяСтрока();
СписокТоваров.Наименование = "Булка сдобная";
СписокТоваров.Количество = 2;
СписокТоваров.Цена = 15;
СписокТоваров.Сумма = СписокТоваров.Количество*СписокТоваров.Цена;
СписокТоваров.СтавкаНДС = "none"; //Без НДС
ПечататьЧек(ИДУстройства,"ФИО кассира",СписокТоваров,СписокТоваров.Итог("Сумма"),0,Отказ,ОписаниеРезультата);
Если Отказ=1 Тогда
Сообщить(ОписаниеРезультата);
КонецЕсли;
Отказ = 0;
Отключиться(ИДУстройства,Отказ,ОписаниеРезультата);
Если Отказ=1 Тогда
Сообщить(ОписаниеРезультата);
Возврат;
КонецЕсли;
КонецПроцедуры
Процедура КнопкаЗакрытьСмену()
Отказ = 0;
ОписаниеРезультата = "";
ИДУстройства = Подключиться(Отказ,ОписаниеРезультата);
Если Отказ=1 Тогда
Сообщить(ОписаниеРезультата);
Возврат;
КонецЕсли;
ЗакрытьСмену(ИДУстройства,"ФИО кассира","ИНН кассира",1,Отказ,ОписаниеРезультата);
Если Отказ=1 Тогда
Сообщить(ОписаниеРезультата);
КонецЕсли;
Отказ = 0;
Отключиться(ИДУстройства,Отказ,ОписаниеРезультата);
Если Отказ=1 Тогда
Сообщить(ОписаниеРезультата);
Возврат;
КонецЕсли;
КонецПроцедуры
Скачать пример использования компоненты "ККТ-клиент" на 1С:7.7 можно в разделе "Файлы"
Для того, чтобы включить http-сервер, нужно установить галку «Использовать http-сервер» в настройках:
Для проверки http-сервера можно использовать GET-запрос /, например http://192.168.0.61:8080/
где 192.168.0.61 – адрес компьютера, на котором запущен «Сервер ККТ»
Для передачи команды на ККТ нужно использовать POST-запрос по адресу /addin
В качестве тела запроса нужно передать XML-пакет следующего образца:
<?xml version="1.0" encoding="UTF-8"?>
<Request xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Method="DeviceTest" Function="true">
<Parameter1 xsi:type="string"></Parameter1>
<Parameter2 xsi:type="string"></Parameter2>
</Request>
Здесь:
Атрибут Method указывет имя метода драйвера в соответствии со стандартом «Требования к разработке драйверов подключаемого оборудования».
Атрибут Function указывает, является ли метод функцией, и, соответственно, нужно ли возвращать значение.
Элементы Parameter1, Parameter2 и т.д. служат для передачи параметров в вызываемый метод. Допустимые типы: string, decimal, boolean, datetime, date, time. Если тип не указан, то параметр считается равным Неопределено. Количество и типы передаваемых параметров для каждого метода указаны в требованиях к разработке драйверов.
Если в качестве параметра нужно передать XML-пакет, то нужно использовать следующий алгоритм:
- XML-пакет преобразуется в строку с кодировкой UTF-8
- В этой строке символы & " ' < > должны быть соответственно заменены на & " ' < > (стандартное экранирование для XML)
- Полученную строку передать в виде параметра с типом string
В качестве ответа «Сервер ККТ» вернет XML-пакет следующего образца:
<?xml version="1.0" encoding="UTF-8"?>
<Response xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Parameter1 xsi:type="string"></Parameter1>
<Parameter2 xsi:type="string"></Parameter2>
<Result xsi:type="string"></Result>
</Response>
Элемент ParameterN может отсутствовать, если его значение не поменялось.
Элемент Result будет присутствовать только для функций.
Для проверки связи с «Сервером ККТ» можно использовать GET-запрос /ping или POST-запрос /ping. В ответ сервер должен вернуть строку «pong».
1. Нужно проверить доступность сервера с помощью post-запроса /ping. Если сервер вернет код состояния 200, значит можно продолжать дальше.
2. Нужно открыть устройство с помощью метода драйвера Open. Для этого выполняем post-запрос /addin, в качестве тела запроса передаем строку:
<?xml version="1.0" encoding="UTF-8"?>
<Request xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Method="Open" Function="true">
<Parameter1 xsi:type="string"></Parameter1>
</Request>
Параметр 1 заполнять не нужно, это выходной параметр. Сервер вернет в этом параметре так называемый «идентификатор подключенного экземпляра устройства», сокращенно ИДУстройства.
Ответ сервера:
<?xml version="1.0" encoding="UTF-8"?>
<Response xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Parameter1 xsi:type="string">KKT_3002#1</Parameter1>
<Result xsi:type="boolean">true</Result>
</Response>
Здесь нужно удостовериться, что Result= true, т.е. метод успешно выполнен. Если Result=false, значит устройство не было открыто, причину можно узнать с помощью вызова метода GetLastError (см. ниже).
В нашем случае устройство успешно открыто, ИДУстройства (параметр 1) равняется «KKT_3002#1». Это значение нужно запомнить для дальнейшего использования.
3. Далее проверяем состояние кассовой смены с помощью метода GetCurrentStatus. При вызове нужно передать три параметра:
Параметр 1: ИДУстройства – значение, полученное ранее методом Open
Параметр 2: XML-пакет, описывающий входные данные. Образец:
<?xml version="1.0" encoding="UTF-8"?>
<InputParameters>
<Parameters CashierName="Иванов И.П." CashierINN="324562345234"/>
</InputParameters>
Параметр 3: пустая строка, это выходной параметр.
Тело запроса для GetCurrentStatus:
<?xml version="1.0" encoding="UTF-8"?>
<Request xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Method="GetCurrentStatus" Function="true">
<Parameter1 xsi:type="string">KKT_3002#1</Parameter1>
<Parameter2 xsi:type="string"><?xml version="1.0" encoding="UTF-8"?><InputParameters><Parameters CashierName="Иванов И.П." CashierINN="324562345234"/></InputParameters></Parameter2>
<Parameter3 xsi:type="string"></Parameter3>
</Request>
Здесь Parameter2 – это экранированный XML-пакет с входными данными.
Ответ сервера:
<?xml version="1.0" encoding="UTF-8"?>
<Response xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Parameter3 xsi:type="string"><?xml version="1.0" encoding="UTF-8"?> <OutputParameters><Parameters ShiftNumber="5" CheckNumber="2" ShiftState="1" CashBalance="3242.00" BacklogDocumentsCounter="" BacklogDocumentFirstNumber="" BacklogDocumentFirstDateTime=""/></OutputParameters></Parameter3>
<Result xsi:type="boolean">true</Result>
</Response>
Из ответа следует, что метод выполнился успешно (Result=true). Параметр 1 и параметр 2 не изменились (отсутствуют в ответе), параметр 3 – это xml-пакет с выходными данными. После разэкранирования выходные данные выглядят так:
<?xml version="1.0" encoding="UTF-8"?>
<OutputParameters>
<Parameters ShiftNumber="5" CheckNumber="2" ShiftState="1" CashBalance="3242.00" BacklogDocumentsCounter="" BacklogDocumentFirstNumber="" BacklogDocumentFirstDateTime=""/>
</OutputParameters>
Здесь нас интересует ShiftState – состояние смены (1 – закрыта; 2 – открыта; 3 – истекла).
4. Если смена закрыта, то нужно открыть смену с помощью метода OpenShift. При вызове нужно передать три параметра, те же самые, что и для GetCurrentStatus.
Тело запроса для OpenShift:
<?xml version="1.0" encoding="UTF-8"?>
<Request xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Method="OpenShift" Function="true">
<Parameter1 xsi:type="string">KKT_3002#1</Parameter1>
<Parameter2 xsi:type="string"><?xml version="1.0" encoding="UTF-8"?><InputParameters><Parameters CashierName="Иванов И.П." CashierINN="324562345234"/></InputParameters></Parameter2>
<Parameter3 xsi:type="string"></Parameter3>
</Request>
Ответ сервера:
<?xml version="1.0" encoding="UTF-8"?>
<Response xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Parameter3 xsi:type="string"><?xml version="1.0" encoding="UTF-8"?> <OutputParameters><Parameters ShiftNumber="7" DateTime="2020-05-20T15:51:04" ShiftState="2" FNError="false" FNOverflow="false" FNFail="false"/></OutputParameters></Parameter3>
<Result xsi:type="boolean">true</Result>
</Response>
Из ответа следует, что метод выполнился успешно (Result=true). Выходные данные (параметр 3) после разэкранирования выглядят так:
<?xml version="1.0" encoding="UTF-8"?>
<OutputParameters>
<Parameters ShiftNumber="7" DateTime="2020-05-20T15:51:04" ShiftState="2" FNError="false" FNOverflow="false" FNFail="false"/>
</OutputParameters>
5. После открытия смены можно пробивать чеки. Делается это с помощью метода ProcessCheck. Параметры метода:
Параметр 1: ИДУстройства – значение, полученное ранее методом Open.
Параметр 2: Электронно (булево) – если true, то чек будет формироваться только в электронном виде, бумажного чека не будет.
Параметр 3: XML-пакет, содержащий данные чека.
Параметр 4: пустая строка, это выходной параметр.
XML-пакет с данными чека выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<CheckPackage>
<Parameters OperationType="1" TaxationSystem="2" CashierName="Иванов И.П. " />
<Positions>
<FiscalString Name="Товар 1" Quantity="2" PriceWithDiscount="5084.64" AmountWithDiscount="10169.28" DiscountAmount="0" ExciseAmount="0" VATRate="20" VATAmount="1694.88" PaymentMethod="4" CalculationSubject="1"/>
</Positions>
<Payments Cash="0" ElectronicPayment="10169.28"/>
</CheckPackage>
Подробное описание этого XML-пакета можно найти на сайте ИТС.
Тело запроса для ProcessCheck:
<?xml version="1.0" encoding="UTF-8"?>
<Request xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Method="ProcessCheck" Function="true">
<Parameter1 xsi:type="string">KKT_3002#1</Parameter1>
<Parameter2 xsi:type="boolean">true</Parameter2>
<Parameter3 xsi:type="string"><?xml version="1.0" encoding="UTF-8"?><CheckPackage> <Parameters OperationType="1" TaxationSystem="2" CashierName="Иванов И.П. " /> <Positions> <FiscalString Name="Товар 1" Quantity="2" PriceWithDiscount="5084.64" AmountWithDiscount="10169.28" DiscountAmount="0" ExciseAmount="0" VATRate="20" VATAmount="1694.88" PaymentMethod="4" CalculationSubject="1"/> </Positions> <Payments Cash="0" ElectronicPayment="10169.28"/> </CheckPackage></Parameter3>
<Parameter4 xsi:type="string"></Parameter4>
</Request>
Ответ сервера:
<?xml version="1.0" encoding="UTF-8"?>
<Response xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Parameter4 xsi:type="string"><?xml version="1.0" encoding="utf-8"?> <DocumentOutputParameters><Parameters ShiftNumber="9" CheckNumber="4" ShiftClosingCheckNumber="2" AddressSiteInspections="" FiscalSign="1950921" DateTime="2020-05-20T16:34:18"/></DocumentOutputParameters></Parameter4>
<Result xsi:type="boolean">true</Result>
</Response>
Из ответа следует, что метод выполнился успешно (Result=true). Выходные данные (параметр 4) после разэкранирования выглядят так:
<?xml version="1.0" encoding="utf-8"?>
<DocumentOutputParameters>
<Parameters ShiftNumber="7" CheckNumber="4" ShiftClosingCheckNumber="2" AddressSiteInspections="" FiscalSign="1950921" DateTime="2020-05-20T16:34:18"/>
</DocumentOutputParameters>
6. После печати чека нужно закрыть устройство с помощью метода Close. У этого метода один параметр – ИДУстройства.
Тело запроса для Close:
<?xml version="1.0" encoding="UTF-8"?>
<Request xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Method="Close" Function="true">
<Parameter1 xsi:type="string">KKT_3002#1</Parameter1>
</Request>
Ответ сервера:
<?xml version="1.0" encoding="UTF-8"?>
<Response xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Result xsi:type="boolean">true</Result>
</Response>
7. Не забудьте в конце дня закрыть смену, последовательно выполнив методы: Open, CloseShift, Close. Параметры у метода CloseShift точно такие же, как и у OpenShift.
8. Если какой-либо метод не выполнился (вернул Result=false), то описание ошибки можно получить с помощью метода GetLastError. Этот метод имеет один выходной параметр.
Тело запроса для GetLastError:
<?xml version="1.0" encoding="UTF-8"?>
<Request xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Method="GetLastError" Function="true">
<Parameter1 xsi:type="string"></Parameter1>
</Request>
Ответ сервера:
<?xml version="1.0" encoding="UTF-8"?>
<Response xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Parameter1 xsi:type="string">Смена уже открыта!</Parameter1>
<Result xsi:type="decimal">1</Result>
</Response>
В данном примере драйвер сообщил, что смена уже открыта и вернул код ошибки=1
Примеры на языках VBA (Excel), Delphi7 и C++ можно скачать в разделе "Файлы"
Программа "Модуль ККТ" позволяет печатать чеки на основании данных из текстовых файлов. Для включения этой функции нужно в настройках установить галку "Использовать печать из файла":
Настройки:
- Каталог - папка, в которой "Модуль ККТ" будет искаль файлы *.txt для печати.
- Открывать смену:
- Нет – не открывать смену.
- При пробитии чека – программа проверит статус смены, если смена еще не открыта, то программа откроет смену.
- В указанное время – программа откроет смену в указанное время.
- Закрывать смену:
- Нет – не закрывать смену
- В указанное время – программа закроет смену в указанное время
- Кассир: ФИО кассира (для операций открытия и закрытия кассовых смен).
Для печати чека нужно подготовить текстовой файл, содержащий строки вида «реквизит=значение». Пример текстового файла:
Encoding=UTF-8
;Чек не электнонный, а бумажный
Electronically=False
;Тип операции - приход денежных средств
OperationType=1
;Система налогообложения - общая
TaxationSystem=0
CashierName=Иванов И.И.
;Оплата безналичными
ElectronicPayment=438
;Добавляем первую строку
FiscalString
;Cпособ расчета - полный расчет
PaymentMethod=4
;Предмет расчета - товар
CalculationSubject=1
Name=Товар 1
Quantity=4
PriceWithDiscount=105
AmountWithDiscount=420
;Ставка НДС - 20%
VATRate=20
;Сумма НДС
VATAmount=70
;первый вариант данных маркировки - через base64
MarkingCode=RE0CozWKae1rIlhpLDJGaEpUQWdO
;Добавляем вторую строку
FiscalString
PaymentMethod=4
CalculationSubject=1
Name=Товар 2
Quantity=1
PriceWithDiscount=18
AmountWithDiscount=18
VATRate=20
VATAmount=3
;второй вариант данных маркировки - через GTIN и серийный номер
GTIN=02900001188333
SerialNumber=k"Xi,2FhJTAgN
Имена реквизитов перечислены в таблице:
Имя реквизита | Обязательный реквизит | Описание | |
---|---|---|---|
Encoding | Нет |
Кодировка текста. Возможные значения:
По умолчанию: utf-8 |
|
Electronically | Нет |
Формирование чека электронном виде (без печати чека):
По умолчанию: False |
|
CashierName | Да | ФИО кассира | |
CashierINN | Нет | ИНН кассира | |
OperationType | Да |
Тип операции:
|
|
TaxationSystem | Да |
Код системы налогообложения:
|
|
Cash | Нет | Сумма оплаты наличными денежными средствами | |
ElectronicPayment | Нет | Сумма оплаты безналичными средствами платежа | |
PrePayment | Нет | Сумма зачтенной предоплаты или аванса | |
PostPayment | Нет | Сумма оплаты в кредит (постоплаты) | |
Barter | Нет | Сумма оплаты встречным предоставлением | |
CustomerInfo | Нет | Покупатель (клиент) - наименование организации или ФИО покупателя (клиента). | |
CustomerINN | Нет | ИНН организации или покупателя (клиента) | |
CustomerEmail | Нет | Email покупателя (клиента) | |
CustomerPhone | Нет | Телефонный номер покупателя (клиента) | |
SenderEmail | Нет | Адрес электронной почты отправителя чека | |
SaleAddress | Нет | Адрес проведения расчетов | |
SaleLocation | Нет | Место проведения расчетов | |
AgentType | Нет |
Признак агента:
|
|
AgentOperation | Нет | Операция платежного агента | |
AgentPhone | Нет | Телефон платежного агента | |
PaymentProcessorPhone | Нет | Телефон оператора по приему платежей | |
AcquirerOperatorPhone | Нет | Телефон оператора перевода | |
AcquirerOperatorName | Нет | Наименование оператора перевода | |
AcquirerOperatorAddress | Нет | Адрес оператора перевода | |
AcquirerOperatorINN | Нет | ИНН оператора перевода | |
VendorPhone | Нет | Телефон поставщика | |
VendorName | Нет | Наименование поставщика | |
VendorINN | Нет | ИНН поставщика | |
FiscalString | Нет | Начинает новую фискальную строку | |
Реквизиты фискальной строки | Name | Да | Наименование товара |
Quantity | Да | Количество товара | |
PriceWithDiscount | Да | Цена единицы товара с учетом скидок/наценок | |
AmountWithDiscount | Да | Конечная сумма по предмету расчета с учетом всех скидок/наценок | |
DiscountAmount | Нет | Сумма скидок и наценок (если значение > 0 то в чеке выводиться скидка, если значение < 0 то наценка | |
Department | Нет | Отдел, по которому ведется продажа | |
VAtrate | Да |
Ставка НДС:
|
|
VATAmount | Да | Сумма НДС | |
PaymentMethod | Нет |
Признак способа расчета:
По умолчанию: 4 |
|
CalculationSubject | Нет |
Признак предмета расчета:
По умолчанию: 1 |
|
CalculationAgent | Нет |
Признак агента по предмету расчета:
|
|
MeasurementUnit | Нет | Единица измерения предмета расчета | |
CountryOfOrigin | Нет | Цифровой код страны происхождения товара в соответствии с Общероссийским классификатором стран мира | |
CustomsDeclaration | Нет | Регистрационный номер таможенной декларации | |
ExciseAmount | Нет | Cумма акциза, включенная в стоимость | |
MarkingCode | Нет | Данные маркировки (значение тэга 1162) в кодировке Base64. При использовании ФФД 1.2 в этом поле нужно указывать полную КМ: GTIN, серийный номера, ключ проверки, код проверки. | |
GTIN | Нет | Глобальный идентификатор товара | |
SerialNumber | Нет | Серийный номер | |
Примечание: Данные маркировки могут быть переданы двумя способами: 1. С помощью реквизита MarkingCode 2. С помощью пары реквизитов GTIN и SerialNumber Для ФФД 1.2 можно использовать только MarkingCode |
|||
TextString | Нет | Начинает новую текстовую строку | |
Реквизиты текстовой строки | Text | Нет | Текст для печати |
Barcode | Нет | Начинает новую строку со штрихкодом | |
Реквизиты строки со штрихкодом | Type | Да |
Тип штрихкода:
|
Value | Нет | Значение штрихкода | |
ValueBase64 | Нет | Значение штрихкода в кодировке Base64 | |
Примечание: Значение штрихкода можно передать с помощью одного из двух реквизитов: Value или ValueBase64 |
Алгоритм работы
1. При запуске служба "Сервер ККТ" будет отслеживать появление новых файлов *.txt в указанном каталоге.
2. При появлении нового файла программа переименовывает его в файл *.pro и отправляет на печать.
3. При успешной печати программа переименовывает файл *.pro в файл *.ok и добавляет в файл следующие реквизиты:
- Result - True
- CheckNumber -Номер фискального документа
- ShiftNumber - Номер кассовой смены
- ShiftClosingCheckNumber - Номер чека за смену
- AddressSiteInspections - Адрес сайта проверки
- FiscalSign - Фискальный признак
- DateTime - Дата и время формирования документа
4. При возникновении ошибки программа переименовывает файл *.pro в файл *.err и добавляет в файл следующие реквизиты:
- Result - False
- ErrorText - Описание ошибки
5. Служба "Сервер ККТ" не удаляет файлы *.ok и *.err.
Примечание: файлы *.txt должны иметь уникальные имена.
При использовании ФФД 1.2 программа "Сервер КТТ" автоматически выполнит проверку маркированного товара с помощью вызова методов драйвера:
- ОткрытьСессиюРегистрацииКМ()
- ЗапросКМ()
- ПолучитьРезультатыЗапросаКМ()
- ПодтвердитьКМ()
Если у вас возникли проблемы с запуском службы "Сервер ККТ" или с тестом драйвера "Клиент ККТ", то мы предлагаем воспользоваться небольшой утилитой TCP_test.exe, которую можно скачать в разделе "Файлы".
Утилита TCP_test.exe предназначена для тестирования TCP-соединений. Может использоваться для тестирования не только "Сервера ККТ", но и любых других программ.
Методика тестирования
- Остановите службу "Сервер ККТ" (если она запущена)
- Запустите TCP_test.exe на том компьютере, к которому подключен кассовый аппарат
- В группе Сервер укажите порт 52111 и нажмите "Старт". Должна появиться надпись "Активен"
Если "Активен" не появилось, а выдалось сообщение об ошибке, то, скорее всего, указанный порт уже используется другой программой. Попробуйте указать другой порт (от 2000 до 65535) и повторите попытку. - В группе Клиент укажите адрес 127.0.0.1, порт 52111 и нажмите "Старт". Также должна появиться надпись "Активен", а у сервера должно появиться сообщение "connect from: 127.0.0.1"
Если "Активен" не появилось, попробуйте отключить брандмауэр, файрволы, антивирусы и т.д. (или добавить в них разрешение на TCP-порт 52111) - Далее запустите TCP_test.exe на втором компьютере (где не будет подключен кассовый аппарат, но будет запускаться 1С). В группе Клиент укажите ip-адрес первого компьютера, порт 52111 и нажмите "Старт". Также должна появиться надпись "Активен", а у сервера (на первом компьютере) должно появиться сообщение "connect from: х.х.х.х" (адрес второго компьютера)
Если "Активен" не появилось, то нужно проверять настройки брандмауэра, файрвола, антивирусов на первом компьютере. В этих настройках нужно разрешить входящие TCP-соединения на порт 52111 - Далее на обоих компьютерах нажмите Стоп в группе Сервер и в группе Клиент
- KKT_Server_Setting.exe на том компьютере, к которому подключен кассовый аппарат. Включите запись файла лога и режим эмулятора. Нажмите кнопку "Сохранить настройки". Должен создаться файл kkt_server.ini с указанными настройками
Если файл kkt_server.ini не создался, то нужно разбираться с правами пользователя на папку, откуда запускается KKT_Server_Setting.exe
- Запустите службу "Сервер ККТ". Должен создаться файл лога
22.08.2019 18:28:54 Emulation Start on port 52111 Server version: 2.0.8.10 Server mode: Emulation version 2.5 ServerInterfaceRevision: 2005
Если служба не запустилась, в файле лога будет указана причина ошибки. Если файл лога не создался, то нужно разбираться с правами службы на запись в ту папку, откуда она запускается.
- В программе TCP_test.exe на первом и на втором компьютере нажмите Старт в группе Клиент. Должны появиться надписи "Активен", а в файле лога должны появиться строки:
22.08.2019 18:35:37 Emulation ClientConnect 127.0.0.1 22.08.2019 18:37:05 Emulation ClientConnect 192.168.1.48
- Если все эти действия выполнены успешно, то проблем с сетевыми подключениями не должно быть.
Дата | Версия | Описание |
29.03.2022 | 2.0.25.2 | Добавлена поддержка обработчика "1С:Битрикс.Кассы (ФФД 1.2)" для интернет-магазина Битрикс |
26.11.2021 | 2.0.24.7 | Исправлено: в KKT_Server_Setting.exe при повторном нажатии на кнопку "Параметры" могла возникать ошибка |
19.10.2021 | 2.0.24.3 | Добавлена поддержка ревизии интерфейса 3004 |
28.09.2021 | 2.0.23.4 |
1. Исправлено: чеки из Битрикс со скидками не пробивались. 2. Исправлено: при работе с Битрикс у ККТ "Штрих-М" могла возникать ошибка "Не был произведен вызов CoInitialize". |
21.05.2021 | 2.0.22.1 | Добавлена возможность печатать чеки на основании данных из текстовых файлов |
07.05.2021 | 2.0.21.28 |
1. Добавлена поддержка обработчика "1С:Битрикс.Кассы (ФФД 1.05)" для интернет-магазина Битрикс 2. Исправлена ошибка в x64-версии KKT_Server_Setting.exe |
19.01.2021 | 2.0.20.12 | 1. Добавлена настройка "Разрешить повторное открытие/закрытие смены" - при этой настройке «Сервер ККТ» не будет выдавать ошибку при выполнении команды «Открыть смену», если смена уже открыта (для «Закрыть смену» – аналогично). Это позволит создавать в 1С несколько документов «Кассовая смена» для разных рабочих мест. 2. Добавлена 64-разрядная версия "Модуля ККТ" - для работы с 64-разрядными драйверами от производителя ККТ. |
20.11.2020 | 2.0.19.4 | 1. Добавлены драйвера "ККТ-Клиент" для Linux 2. Исправлена ошибка при работе с ККТ Меркурий из 1С 7.7 |
16.10.2020 | 2.0.18.10 | 1. Добавлена возможность запускать несколько серверов ККТ на одном компьютере. 2. Добавлена возможность восстановить регистрацию по ИНН. 3. Исправлена ошибка при работе с драйвером Штрих-М 4.15. |
28.09.2020 | 2.0.17.13 | 1. Добавлена версия сервера ККТ в виде приложения: KKT_Server_App.exe. 2. В драйверах для Android добавлена поддержка платформ arm64 и x86_64 |
11.08.2020 | 2.0.16.9 | При настройке сервера ККТ добавлена возможность выбора сетевого интерфейса |
08.07.2020 | 2.0.15.5 | 1. Добавлена возможность записывать файл лога на стороне клиента (в 1С в настройках драйвера нужно установить галку "Записывать log"). 2. Исправлен установщик компоненты для Google Chrome. |
18.05.2020 | 2.0.14.5 | Добавлена поддержка ревизии интерфейса 3003 |
13.05.2020 | 2.0.13.5 | Добавлена поддержка протокола http |
03.05.2020 | 2.0.12.1 | Добавлена возможность использовать пробный период |
04.03.2020 | 2.0.11.2 | Добавлена поддержка ревизии интерфейса 2001 |
27.02.2020 | 2.0.10.9 | Исправлена ошибка при использовании драйверов ККТ Касби |
14.02.2020 | 2.0.10.8 | Добавлена поддержка ревизии интерфейса 3002 |
14.01.2020 | 2.0.9.10 | Исправлена обработка обслуживания для УТ10.3 МодульКлиентККТ_2002.epf |
09.12.2019 | 2.0.9.9 | Добавлена настройка "Не отключать устройство" (см. инструкцию по установке и настройке) |
16.09.2019 | 2.0.8.12 | Исправлены обработки обслуживания для УТ10.3 |
13.08.2019 | 2.0.8.7 | Добавлены обработки обслуживания для конфигурации 1С:7.7 Торговля и склад 9.2 |
08.08.2019 | 2.0.8.6 | Добавлены обработки обслуживания для конфигураций УТ10.х, КА1.х и т.п. Доработана форма настройки параметров |
31.07.2019 | 2.0.8.5 | Добавлена поддержка ревизии интерфейса 3001 |
10.07.2019 | 2.0.7.1 | Добавлен драйвер для мобильного приложения для Android. Исправлено представление дробного числа в логах. |
Вопросы и ответы
Коротко: Да.
Подробнее: наша программа не вносит каких-либо изменений в данные, передаваемые между 1С и ККТ. Если конфигурация 1С поддерживание маркировку, и аппарат ККТ поддерживает маркировку, то и наша программа тоже поддерживает маркировку. Теги ФФД - аналогично. Другими словами, аппарат ККТ будет работать точно так же, как при прямом подключении к 1С.
Смена открывается один раз с любого рабочего места и закрывается один раз с любого рабочего места. Действует принцип: одна ККТ - одна смена. Для этого нужно внести изменения в конфигурацию 1С, например, с помощью механизма расширений (расширения для типовых конфигураций можно скачать в разделе "Файлы").
Да, можно. Например, можно подключить к двум разным базам (даже если эти базы имеют различные конфигурации). Или к базе 8.3 и базе 7.7. Или к базе 1С и к Интернет-сайту и т.д. Но при этом нужно продумать логику открытия и закрытия смен.
Доступ в Интернет может потребоваться только в момент регистрации программы с помощью утилиты KKT_Server_Setting.exe (есть другой вариант регистрации: по e-mail). Служба "Сервер ККТ" никогда в Интернет не обращается.
Да, такая возможность появилась в версии 2.0.18.10. В "Инструкции по установке и настройке" есть соответствующий раздел.
Да, можно. Драйверы "ККТ-клиент" выполнены по технологии Native API, поэтому могут быть загружены в конфигурацию (в общий макет) и использованы в контексте сервера 1С:Предприятие. Пример можно посмотреть здесь.
Выбор версии «Модуля ККТ» определяется драйверами от производителя ККТ: если драйвера 64-разрядные, то нужно устанавливать 64-разрядую версию «Модуля ККТ».
При этом разрядность платформы 1С не имеет значения: обе версии «Модуля ККТ» имеют в своём составе 32-разрядные и 64-разрядные драйвера «Клиент ККТ» для использования в 1С.
Причины купить
Лицензия привязывается к ИНН организации. Нет ограничений на количество ККТ, количество пользователей и на срок лицензии.
Достоинства
- Не зависит от модели онлайн-кассы
- Не привязана к конкретному драйверу: для перехода на новый драйвер от производителя кассы достаточно изменить настройки
- Наличие пробного периода 30 дней: перед покупкой можно протестировать все компоненты
- Возможность быстрой перенастройки всех клиентских 1С на другую онлайн-кассу: достаточно изменить имя компьютера в настройках
- Возможность вести протокол работы онлайн-кассы: вся история работы онлайн-кассы сохраняется в текстовой файл
- Возможность включить режим «Эмуляция ККТ» – для отладки и тестирования
- Поддержка обработчика онлайн-кассы «CashboxBitrixV2» для платформы «1С-Битрикс. Управление сайтом»
- Возможность печатать чеки с платформ 8.0, 8.1, 8.2, 8.3
- Возможность печатать чеки с мобильной платформы
- Возможность печатать чеки с платформы 7.7, при этом использовать самые свежие драйвера от 8.3
- Поддержка стандартов «Требованиями к разработке драйверов подключаемого оборудования» от версии 2.1 до версии 3.3
- Не зависит от других библиотек (таких как NET Framework, Visual C++ redistributable, Java SDK и т.п.)
Смотрите также:
Одна ККТ для розничного магазина и Интернет-сайта | Использование новых драйверов ККТ в старых конфигурациях |
Другие наши продукты:
Набор эмуляторов торгового оборудования |
Внешняя компонента WebSocketClient |
|||
Торговое оборудование по сети |
СБИС Документооборот в 1С по API |
Гарантия возврата денег
ООО "Инфостарт" гарантирует Вам 100% возврат оплаты, если программа не соответствует заявленному функционалу из описания. Деньги можно вернуть в полном объеме, если вы заявите об этом в течение 14-ти дней со дня поступления денег на наш счет.
Программа настолько проверена в работе, что мы с полной уверенностью можем дать такую гарантию. Мы хотим, чтобы все наши покупатели оставались довольны покупкой.
Для возврата оплаты просто свяжитесь с нами.