Печатаем ОнЛайн чеки из 1С в Windows и Linux, на ПК и RaspberryPI. Атол, Штрих-М. Из файлов (csv), WebAPI, FTP, Ajax.

Публикация № 872959

Администрирование - Системное

1
В последнее время появилось множество программ, которые позволяют организовать печать кассовых чеков на ОнЛайн кассах путем выгрузки файла-задания. Но вот беда: все они заточены на работу в ОС Windows... Мы расширяем эти границы и предлагаем печать чеков на любом ФР Атол или Штрих-М в ОС 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:\KKM\check"+НомерДок+".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:\RndItSoft\Checks\"+НомерДок+".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:\RndItSoft\Checks\"+НомерДок+"_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():"Колесников Д.Г.").";\n";
        $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;\n";  $flag=8; } // ЕНВД
                elseif($flag!=8){
                    $add_chek.= "SMDE;" .$tovar['name'].";".intval(($data['summ']/$data['kol'])*100).";".intval($data['kol']*1000).";6;0;\n";
                    $add_summ+=$data['summ'];
                    continue;
                }
                $buf .= "SMDE;" .$tovar['name'].";".intval(($data['summ']/$data['kol'])*100).";".intval($data['kol']*1000).";6;0;\n";
            }else{
                if($flag==0){  $buf .= "set_tlv;1055;1;2;\n"; $flag=2; } // УСНО Доходы
                elseif($flag!=2){
                    $add_chek.= "SMDE;" .$tovar['name'].";".intval(($data['summ']/$data['kol'])*100).";".intval($data['kol']*1000).";6;1;\n";
                    $add_summ+=$data['summ'];
                    continue;
                }
                $buf .= "SMDE;Загар в солярии;".intval(($data['summ']/$data['kol'])*100).";".intval($data['kol']*1000).";6;1;\n";
            }
            $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;"/*.";\n"*/;
            // если сегодня это первый чек, открыть смену
            if(!DB::Select("sale","`services`&2 and time>='".date("Y-m-d")."'")){
                $buf="open_session;\n".$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():"Колесников Д.Г.").";\n".
                    "set_tlv;1055;1;".($flag==8?2:8).";\n" . $add_chek;
                $sale_visa=min($sale['visa'],$summ);
                $buf.="tmde;".(($summ-$sale_visa)*100).";".($sale_visa*100).";0;0;6;0;0;0;"/*.";\n"*/;
                self::CmdKKM($buf,$id.'_2');
            }
        }
    }


    /**
     * Отправить команду в KKM
     * @param string $format =
     *  open_session;
     *  X;
     *  Z;
     *  g; анулировать последний открытый чек
     */
    static function CmdKKM($format='x',$id='')
    {
        $format.=";\n";
        file_put_contents('C:\RndItSoft\Checks\chek'.$id.'.txt', Convert::win2utf($format));
        file_put_contents($_SERVER['DOCUMENT_ROOT'].'/log/chek.log', $format."\n\n", FILE_APPEND);
    }

}

 

Причины купить

Решение актуальных проблем с печатью чеков, в том числе из старых конфигураций и проблемных RDP-сессий.
Полное соответствие ФФД 1.0 1.05 и большей части 1.1
Возможность получить результат исполнения команды (например, фискальный признак или фискальный номер документа).
Возможность организовать работу с одной ККМ разных кассиров (даже территориально в разных офисах).
Возможность отключить печать чека (только электрочек).
 

Достоинства

Единственный кассовый сервер, работающий в разных операционных системах и предоставляющий такой широкий набор функций.

Простота интеграции и предсказуемость результата работы.

Встроенный анализатор нештатных ситуаций.

Возможность адаптации ПО под требования заказчика (отдельная опция).

Гарантия возврата денег

ООО "Инфостарт" гарантирует Вам 100% возврат оплаты, если программа не соответствует заявленному функционалу из описания. Деньги можно вернуть в полном объеме, если вы заявите об этом в течение 14-ти дней со дня поступления денег на наш счет.

Программа настолько проверена в работе, что мы с полной уверенностью можем дать такую гарантию. Мы хотим, чтобы все наши покупатели оставались довольны покупкой.

Для возврата оплаты просто свяжитесь с нами.

1

Скачать файлы

Наименование Файл Версия Размер
Руководство по установке и настройке.
.pdf 1,46Mb
23.07.18
16
.pdf 1,46Mb 16 Скачать бесплатно
Руководство программиста: описание API (FileAPI, AjaxAPI, WebAPI)
.pdf 1 003,49Kb
23.07.18
11
.pdf 1 003,49Kb 11 Скачать бесплатно
26.07.2018
5.18.07.04 0 1300 руб.

Моментальная
доставка

26.07.2018
5.18.06.20 0 1300 руб.

Моментальная
доставка

26.07.2018
5.18.07.04 0 1300 руб.

Моментальная
доставка

26.07.2018
0 500 руб.


Новый вопрос

E-mail*
Тема (вопрос)*

См. также

Специальные предложения