Связка 1с и фронтол - классический пример успешного взаимодействия бэк и фронт-офиса, имеет давнюю историю, достаточно популярен сейчас, хорошо изучен и работает стабильно. Но основным отличием фронтола (особенно версии xpos) от решений 1с является невозможность внесения изменений в алгоритм работы данного ПО, что в принципе не умаляет его достоинств (скорости работы, низкие требования к железу, возможность работы в Линукс и проч.)
Но поскольку настройки и данные фронтол xpos хранятся во внешней базе SQLite, менять их можно, а иногда и даже нужно.
В этой публикации прилагается небольшое HTA-приложение, в котором можно менять следующие настройки в случае возникновения нештатных ситуаций, ниже приводятся примеры из жизни.
Ситуация 1. Запрос акцизной марки АЛКО при сканировании. Продавец отсканировал штрихкод, акцизную марку, перешел в режим оплаты, клиент рассчитывается картой, оплата проходит успешно, покупатель покидает магазин с покупкой, а чек не закрывается (причины отказа: УТМ ЕГАИС не работает или акцизная марка некорректна). Правильней всего сделать сторно оплаты, отменить чек, забрать товар, но его уже нет. Исправляем ситуацию: отключаем запрос акцизной марки, оформляем чек и закрываем, запрос акцизной марки включаем. При оплате картой, если используется интегрированный терминал параллельно применяем решение в ситуации 3.
Ситуация 2. Проверка кода маркировки (СИГАРЕТЫ, МОЛОКО, ВОДА) при сканировании. Аналогично ситуации 1, сканируется штрихкод, код маркировки, переход на оплату, оплата картой проходит успешно, покупатель уходит с товаром, а чек не закрывается (сбой в ЧЗ или проблема с ОФД). Исправляем ситуацию: отключаем проверку кода маркировки, закрываем чек, включаем проверку. Применяется совместно с решением в ситуации 3.
Ситуация 3. Оплата картой прошла, а чек не закрывается, и покупатель уже ушел, например как в ситуации 1. Исправляем ситуацию: перезагружаем оборудование, создаем чек заново, отключаем запрос карты при оплате, закрываем чек. Включаем запрос карты.
Вот собственно и все, этим hta-скриптом пользуются мои клиенты, в случае, если что-то пошло не так, самостоятельно и оперативно решают проблемы.
Условия в запросах к базе Sqlite хардкодны, поэтому код придется править под себя.
Как это сделано сейчас в коде:
Запрос акцизной марки АЛКО при сканировании, у клиента используется своя обработка выгрузки файла товаров в фронтол, и весь алкоголь с акцизными марками идет под кодом 200
RunQuery("update WARE set MARKING=1 where ALCOHOL_TYPE_CODE='200';")
Проверка кода маркировки (СИГАРЕТЫ, МОЛОКО, ВОДА) при сканировании, группы этих товаров имеют коды 66666,77777,88888
RunQuery("update WARE set PRODUCT_TYPE=0 where parentid IN (select id from WARE where code='66666' or code='77777' or code='88888');")
Эти строки придется изменить под свои условия.
<html>
<head>
<title>Изменить настройки программы Фронтол XPOS</title>
<HTA:APPLICATION
APPLICATIONNAME="1CUpdateDB"
ID="1CUpdateDB"
VERSION="1.0"
MAXIMIZEBUTTON="no"
MINIMIZEBUTTON="no"
SCROLL="no"/>
</head>
<script language="VBScript">
Sub Window_OnLoad
Self.Focus()
Self.ResizeTo 700,400
Self.MoveTo 0,0
divDBname.innerHTML="\\test1\e$\DATA\XPOS\DB\main.db"
divSQLLiteUtil.innerHTML="D:\programs\sqlite-tools-win32-x86-3410200\sqlite3.exe"
ReadSettings()
'msgbox Self.location.pathname
End Sub
Sub ReadSettings
RunQuery("select count(*) from WARE where MARKING=0 AND ALCOHOL_TYPE_CODE='200';")
ChangeSpanDiv("StatusAM")
RunQuery("select count(*) from WARE where PRODUCT_TYPE<>0 AND parentid IN (select id from WARE where code='66666' or code='77777' or code='88888');")
ChangeSpanDiv("StatusKM")
RunQuery("select count(*) from DEVICES where CONNECTIONSTATE=0 AND GROUPDEV=4;")
ChangeSpanDiv("BankCard")
End Sub
Sub ChangeSpanDiv(NameID)
divElem=document.getElementsByName("div" & NameID)
spanElem=document.getElementsByName("span" & NameID)
divElem.innerHTML="нет данных"
spanElem.style.backgroundcolor = "ivory"
spanElem.style.color="black"
if divResult.innerHTML="0" Then
divElem.innerHTML="OТКЛЮЧЕН"
spanElem.style.backgroundcolor = "red"
spanElem.style.color="white"
else
divElem.innerHTML="ВКЛЮЧЕН"
spanElem.style.backgroundcolor = "green"
spanElem.style.color="white"
end if
End Sub
Sub RunQuery(QueryText)
Set WshShell = CreateObject("WScript.Shell")
Set FSO=CreateObject("Scripting.FileSystemObject")
WorkDir=FSO.GetParentFolderName(divSQLLiteUtil.innerHTML)
WshShell.CurrentDirectory=WorkDir
Set f = FSO.CreateTextFile("QueryText.txt", True)
f.WriteLine(".output result.txt")
f.WriteLine(QueryText)
f.WriteLine(".quit")
f.close
Set f = FSO.CreateTextFile("SqlRun.cmd", True)
f.WriteLine(FSO.GetFileName(divSQLLiteUtil.innerHTML) & " " & divDBName.innerHTML & " <QueryText.txt")
f.WriteLine("exit")
f.close
WshShell.Run "SqlRun.cmd", 0, True
divResult.innerHTML=""
if FSO.FileExists("result.txt") Then
Set f = FSO.GetFile("result.txt")
if f.size>0 Then
Set f = FSO.OpenTextFile("result.txt")
divResult.innerHTML=f.readline
end if
end if
End Sub
Sub StatusAMChange()
if divStatusAM.innerHTML="ВКЛЮЧЕН" Then
RunQuery("update WARE set MARKING=1 where ALCOHOL_TYPE_CODE='200';")
else
RunQuery("update WARE set MARKING=0 where ALCOHOL_TYPE_CODE='200';")
end if
ReadSettings()
End Sub
Sub StatusKMChange()
if divStatusKM.innerHTML="ВКЛЮЧЕН" Then
RunQuery("update WARE set PRODUCT_TYPE=0 where parentid IN (select id from WARE where code='66666' or code='77777' or code='88888');")
else
RunQuery("update WARE set PRODUCT_TYPE=4 where parentid IN (select id from WARE where code='88888');")
RunQuery("update WARE set PRODUCT_TYPE=13 where parentid IN (select id from WARE where code='77777');")
RunQuery("update WARE set PRODUCT_TYPE=7 where parentid IN (select id from WARE where code='66666');")
end if
ReadSettings()
End Sub
Sub BankCardChange()
if divBankCard.innerHTML="ВКЛЮЧЕН" Then
RunQuery("update DEVICES set CONNECTIONSTATE=2 where GROUPDEV=4;")
else
RunQuery("update DEVICES set CONNECTIONSTATE=0 where GROUPDEV=4;")
end if
ReadSettings()
End Sub
Sub TaskkillXpos()
Set WshShell = CreateObject("WScript.Shell")
Set FSO=CreateObject("Scripting.FileSystemObject")
WorkDir=FSO.GetParentFolderName(divSQLLiteUtil.innerHTML)
WshShell.CurrentDirectory=WorkDir
Set f = FSO.CreateTextFile("TaskkillXpos.cmd", True)
f.WriteLine("timeout /t 10 /nobreak")
f.WriteLine("TASKKILL /IM pos.exe /F")
f.WriteLine("exit")
f.close
WshShell.Run "TaskkillXpos.cmd", 1, False
End Sub
Sub OnClickButtonCloseApp()
Self.close
End Sub
</script>
<body bgcolor="ivory">
<h4><a href="#" style="font-family:'Arial';font-size:14pt" ВЫХОД</a></h4>
<table style="width:100%;font-family:'Arial';font-weight:bold;font-size:14pt" border>
<tr>
<td width="80%">Запрос акцизной марки АЛКО при сканировании</br>
<a href="#" запрос акцизной марки</a></td>
<td width="20%"><span id="SpanStatusAM"><div id="divStatusAM"></div></span></td>
</tr>
<tr>
<td width="80%">Проверка кода маркировки (СИГАРЕТЫ, МОЛОКО, ВОДА) при сканировании</br>
<a href="#" проверку кода маркировки при сканировании</a></td>
<td width="20%"><span id="SpanStatusKM"><div id="divStatusKM"></div></span></td>
</tr>
<tr>
<td width="80%">Запрос банковской карты при оплате</br>
<a href="#" запрос банковской карты при оплате</a></td>
<td width="20%"><span id="SpanBankCard"><div id="divBankCard"></div></span></td>
</tr>
<tr>
<td width="80%"><a href="#" закрыть (завершить) программу фронтол</a></td>
<td width="20%">*</td>
</tr>
</table>
<span style="font-family:'Arial';font-size:10pt">
<div id="divDBName"></div>
<div id="divSQLLiteUtil"></div>
<div id="divResult" style="display:none"></div>
</span>
</body>
</html>
Скрипт написан под Windows, но возможна доработка и под Линукс, если такая потребность будет.
Всем желаю успехов, пожелания, критика принимаются