Мы расширяем эти границы и предлагаем печать чеков на любом ФР Атол или Штрих-М в ОС Windows, Linux (Debian, Ubuntu, Mint, RedHat, CentOS), а так же на микро-ПК RaspberryPI!
Программа Кассовый сервер позволяет решить массу задач, связанных с печатью чеков на ОнЛайн кассах:
- печать на одной кассе с нескольких рабочих мест кассиров
- работа с несколькими ККМ, подключенными к одному ПК
- ускорение печати чека из терминальной RDP-сессии
- организация ультра-бюджетного кассового узла на базе RasbperryPI (не нужны лицензии Windows, Office, антивирусы и лицензии на терминальные подключения (FreeNX)).
Программа полностью соответствует требованиям ФФД 1.0 и 1.05.
Полностью кроссплатформенная. Имеются готовые сборки для разных ОС.
Универсальное и очень простое API, которое не зависит от ОС или используемой ККМ.
Для облегчения изучения API имеется встроенный конструктор запросов. Вводите параметры и выбираете команду — в нижней части экрана пишется строка-команда, которая тут же исполняется на ККМ.
Программа проста в настройке оборудования. Для настройки связи с ККМ имеется конфигуратор
Кассовый сервер можно использовать как самостоятельное рабочее место кассира: имеется встроенное рабочее место кассира, позволяющее пробить любой чек.
Касса всегда под контролем. А все операции протоколируются:
Так же для действующих и потенциальных клиентов действует техподдержка. Помогаем настроить ККМ, программу. Консультируем по вопросам интеграции…
Пример генерации самого простого чека 1С 7.7
Функция глПреобразоватьСтрокуВУТФ8(Стр) Экспорт
Длина=СтрДлина(Стр);
Итог="";
Для Н=1 По Длина Цикл
Знак=Сред(Стр,Н,1);
Код=КодСимв(Знак);
Если Код<128 Тогда
Итог=Итог+Знак;
Иначе
Если (Код>=КодСимв("А"))И(Код<=КодСимв("п")) Тогда
Итог=Итог+Симв(208)+Симв(144+Код-КодСимв("А"));
ИначеЕсли (Код>=КодСимв("р"))И(Код<=КодСимв("я")) Тогда
Итог=Итог+Симв(209)+Симв(128+Код-КодСимв("р"));
ИначеЕсли (Знак="ё") Тогда
Итог=Итог+Симв(209)+Симв(145);
ИначеЕсли (Знак="Ё") Тогда
Итог=Итог+Симв(208)+Симв(129);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат Итог;
КонецФункции
Процедура ПечатьККМ()
Если ЧерезИП=1 Тогда
АвтоВремяТекущее();
Записать();
Ф = СоздатьОбъект("Текст");
Если СокрЛП(Автор.login)="GlManager" Тогда
Ф.ДобавитьСтроку(глПреобразоватьСтрокуВУТФ8("B;0;ГЛАВНЫЙ_КАССИР;"));
Иначе
Ф.ДобавитьСтроку(глПреобразоватьСтрокуВУТФ8("B;0;"+Автор+";"));
КонецЕсли;
ИтогСумма=0;
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
Если Товар.ВидТовара=Перечисление.ВидыТоваров.Услуга Тогда
Ф.ДобавитьСтроку(глПреобразоватьСтрокуВУТФ8("SMDE;"+Товар.Наименование+";"+(Цена*100)+";"+(Количество*1000)+";6;1;0"));
Иначе
Ф.ДобавитьСтроку(глПреобразоватьСтрокуВУТФ8("SMDE;"+Товар.Наименование+";"+(Цена*100)+";"+(Количество*1000)+";6;0;0"));
КонецЕсли;
ИтогСумма = ИтогСумма + Сумма;
КонецЦикла;
Если СокрЛП(Контрагент.Наименование)="Клиент пластик" Тогда
Ф.ДобавитьСтроку("tmde;0;"+(ИтогСумма*100)+";0;0;6;0;0;0");
Иначе
Ф.ДобавитьСтроку("tmde;"+(ИтогСумма*100)+";0;0;0;6;0;0;0");
КонецЕсли;
Ф.Записать("D:KKMcheck"+НомерДок+".txt");
КонецЕсли;
КонецПроцедуры
Пример генерации чека, с указанием ФИО кассира, разбивкой по СНО (УСНО доходы и ЕНВД), отправкой электрочека на почту или телефон. 1С 7.7
Ф = СоздатьОбъект("Текст");
ИтогСумма=0;
ДопСумма=0;
Флаг=0;
ДопЧек=СоздатьОбъект("Текст");
ДопЧек.ДобавитьСтроку(глПреобразоватьСтрокуВУТФ8("B;"+?(ВидОперации = Перечисление.ВидыОперацийЧекККМ.Чек,0,1)+";"+Автор+";"));
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
Ц=Окр(Сумма/Количество,2,1);
//Сообщить(Сумма+","+Количество+","+Ц);
Если Номенклатура.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Услуга Тогда
Если Флаг=0 Тогда
Ф.ДобавитьСтроку("set_tlv;1055;1;2;"); // УСНО Доходы
Флаг=2;
ИначеЕсли Флаг=8 Тогда
Если ДопСумма=0 Тогда ДопЧек.ДобавитьСтроку("set_tlv;1055;1;2;"); КонецЕсли; // УСНО Доходы
ДопЧек.ДобавитьСтроку(глПреобразоватьСтрокуВУТФ8("SMDE;"+СтрЗаменить (Номенклатура.Наименование, """", "'")+";"+(Ц*100)+";"+(Количество*1000)+";6;2;"));
ДопСумма = ДопСумма + (Ц*Количество);
Продолжить;
КонецЕсли;
Ф.ДобавитьСтроку(глПреобразоватьСтрокуВУТФ8("SMDE;"+СтрЗаменить (Номенклатура.Наименование, """", "'")+";"+(Ц*100)+";"+(Количество*1000)+";6;2;"));
Иначе
Если Флаг=0 Тогда
Ф.ДобавитьСтроку("set_tlv;1055;1;8;"); // ЕНВД
Флаг=8;
ИначеЕсли Флаг=2 Тогда
Если ДопСумма=0 Тогда ДопЧек.ДобавитьСтроку("set_tlv;1055;1;8;"); КонецЕсли; // ЕНВД
ДопЧек.ДобавитьСтроку(глПреобразоватьСтрокуВУТФ8("SMDE;"+СтрЗаменить (Номенклатура.Наименование, """", "'")+";"+(Ц*100)+";"+(Количество*1000)+";6;1;"));
ДопСумма = ДопСумма + (Ц*Количество);
Продолжить;
КонецЕсли;
Ф.ДобавитьСтроку(глПреобразоватьСтрокуВУТФ8("SMDE;"+СтрЗаменить (Номенклатура.Наименование, """", "'")+";"+(Ц*100)+";"+(Количество*1000)+";6;1;"));
КонецЕсли;
ИтогСумма = ИтогСумма + (Ц*Количество);
КонецЦикла;
Если ПустоеЗначение(Контрагент)=0 Тогда
Д="";
Если Контрагент.ОтправкаЧека=Перечисление.ОтправкаЧека.ТелефоныФизЛица Тогда
Д=СокрЛП(Контрагент.ЮрФизЛицо.Телефоны);
ИначеЕсли Контрагент.ОтправкаЧека=Перечисление.ОтправкаЧека.ЭлПочта Тогда
Д=СокрЛП(Контрагент.ЭлПочта);
КонецЕсли;
КонецЕсли;
Если ПустоеЗначение(Д)=0 Тогда
Ф.ДобавитьСтроку("set_tlv;1008;5;"+Д+";");
КонецЕсли;
Если ПлатежнаяКарта=1 Тогда
Ф.ДобавитьСтроку("tmde;0;"+(ИтогСумма*100)+";0;0;6;0;0;0;");
Иначе
Ф.ДобавитьСтроку("tmde;"+(Макс(Получено,ИтогСумма)*100)+";0;0;0;6;0;0;0;");
КонецЕсли;
Ф.Записать("C:RndItSoftChecks"+НомерДок+".txt");
Если ДопСумма>0 Тогда
Если ПустоеЗначение(Д)=0 Тогда
ДопЧек.ДобавитьСтроку("set_tlv;1008;5;"+Д+";");
КонецЕсли;
Если ПлатежнаяКарта=1 Тогда
ДопЧек.ДобавитьСтроку("tmde;0;"+(ДопСумма*100)+";0;0;6;0;0;0;");
Иначе
ДопЧек.ДобавитьСтроку("tmde;"+(Макс(Получено-ИтогСумма,ДопСумма)*100)+";0;0;0;6;0;0;0;");
КонецЕсли;
ДопЧек.Записать("C:RndItSoftChecks"+НомерДок+"_2.txt");
КонецЕсли;
Работа с Кассовым сервером из Web-приложения. Печать чека из PHP
/**
* Class Sale
*/
class Sale{
/**
* Печать чека
* @param int $id id из sale
*/
static function CheckKKM($id=0){
$buf="B;".(isset($_REQUEST['returnsale'])?"1":"0").";".(User::comment()?User::comment():"Колесников Д.Г.").";
";
$add_summ=$summ=0;
if(!($sale=DB::Select("sale",($id>0?"id=".intval($id):"user='".$_SESSION['user']['id']."' ORDER by time DESC"))) )fb_err("Нет доступной операции для печати чека!");
// todo нельзя пробить чек на несегодняшнюю продажу
$id=$sale['id'];
$add_chek='';
$flag=0;
// $sale['visa'] - эта часть оплачена платиком, остальное наличными
$query=DB::sql("SELECT * FROM `".self::db_prefix."sale2` WHERE sale='".$id."'");
while(($data = DB::fetch_assoc($query))){
$tovar=Tovar::GetTovar($data['tovar'],1); if(!$tovar)fb_err("Нет товара № ".$data['tovar']);
if($tovar['type']==TYPE_TOVAR){
if($flag==0){ $buf .= "set_tlv;1055;1;8;
"; $flag=8; } // ЕНВД
elseif($flag!=8){
$add_chek.= "SMDE;" .$tovar['name'].";".intval(($data['summ']/$data['kol'])*100).";".intval($data['kol']*1000).";6;0;
";
$add_summ+=$data['summ'];
continue;
}
$buf .= "SMDE;" .$tovar['name'].";".intval(($data['summ']/$data['kol'])*100).";".intval($data['kol']*1000).";6;0;
";
}else{
if($flag==0){ $buf .= "set_tlv;1055;1;2;
"; $flag=2; } // УСНО Доходы
elseif($flag!=2){
$add_chek.= "SMDE;" .$tovar['name'].";".intval(($data['summ']/$data['kol'])*100).";".intval($data['kol']*1000).";6;1;
";
$add_summ+=$data['summ'];
continue;
}
$buf .= "SMDE;Загар в солярии;".intval(($data['summ']/$data['kol'])*100).";".intval($data['kol']*1000).";6;1;
";
}
$summ+=$data['summ'];
}
if($summ>0){
$sale_visa=min($sale['visa'],$summ);
$buf.="tmde;".(($summ-$sale_visa)*100).";".($sale_visa*100).";0;0;6;0;0;0;"/*.";
"*/;
// если сегодня это первый чек, открыть смену
if(!DB::Select("sale","`services`&2 and time>='".date("Y-m-d")."'")){
$buf="open_session;
".$buf;
}
self::CmdKKM($buf,$id);
DB::sql("UPDATE `" . db_prefix . "sale` SET `services`=`services`|".(isset($_REQUEST['returnsale'])?"4":"2")." WHERE id=" . $id);
if($add_summ>0){ // второй чек по другой СНО
$buf="B;".(isset($_REQUEST['returnsale'])?"1":"0").";".(User::comment()?User::comment():"Колесников Д.Г.").";
".
"set_tlv;1055;1;".($flag==8?2:8).";
" . $add_chek;
$sale_visa=min($sale['visa'],$summ);
$buf.="tmde;".(($summ-$sale_visa)*100).";".($sale_visa*100).";0;0;6;0;0;0;"/*.";
"*/;
self::CmdKKM($buf,$id.'_2');
}
}
}
/**
* Отправить команду в KKM
* @param string $format =
* open_session;
* X;
* Z;
* g; анулировать последний открытый чек
*/
static function CmdKKM($format='x',$id='')
{
$format.=";
";
file_put_contents('C:RndItSoftCheckschek'.$id.'.txt', Convert::win2utf($format));
file_put_contents($_SERVER['DOCUMENT_ROOT'].'/log/chek.log', $format."
", FILE_APPEND);
}
}
Причины купить
Решение актуальных проблем с печатью чеков, в том числе из старых конфигураций и проблемных RDP-сессий.
Полное соответствие ФФД 1.0 1.05 и большей части 1.1
Возможность получить результат исполнения команды (например, фискальный признак или фискальный номер документа).
Возможность организовать работу с одной ККМ разных кассиров (даже территориально в разных офисах).
Возможность отключить печать чека (только электрочек).
Достоинства
Единственный кассовый сервер, работающий в разных операционных системах и предоставляющий такой широкий набор функций.
Простота интеграции и предсказуемость результата работы.
Встроенный анализатор нештатных ситуаций.
Возможность адаптации ПО под требования заказчика (отдельная опция).
Гарантия возврата денег
ООО «Инфостарт» гарантирует Вам 100% возврат оплаты, если программа не соответствует заявленному функционалу из описания. Деньги можно вернуть в полном объеме, если вы заявите об этом в течение 14-ти дней со дня поступления денег на наш счет.
Программа настолько проверена в работе, что мы с полной уверенностью можем дать такую гарантию. Мы хотим, чтобы все наши покупатели оставались довольны покупкой.
Для возврата оплаты просто свяжитесь с нами.