Ничего не стоит РМК построить. Рабочее место кассира своими руками.

Недавно возникла потребность печатать документы для индивидуального предпринимателя - школы иностранных языков. Программ с таким бедным функционалам не существует в природе, поэтому я взялся за разработку РМК администратора школы иностранных языков.
Конечно ни автоматизации, ни интеграции с каким - либо нет и не предусматривается. Это печаталка товарных чеков фактически.
В качестве чпу (чекопечаующее устройство) используется не фискальный Штрих мини-ФРК. Если поставить фискальный, то придется переделать немного печатную форму. Подключение к принтеру происходит через ActiveX драйвер, который есть у производителя на сайте.

On Error Resume Next
Set Shtrih = CreateObject("AddIn.DrvFR") ' Компонент драйвера для штриха. На системах х64 надо пускать через syswow64
Set WshShell = CreateObject("WScript.Shell") ' Подключаемся к шелу операционки
Set objShell = CreateObject("Shell.Application")  
Set objFolder = objShell.Namespace(WshShell.CurrentDirectory) ' Определение рабочей папки
Set objFolderItem = objFolder.Self 
Set objFSO = CreateObject("Scripting.FileSystemObject") ' Подключаемся к файловой системе
Set wo = WScript.CreateObject("Scripting.WindowSystemObject")  ' Подключаем интерфйес

'Объявление констант
public CliName
public Wname
public Sumcash
public PayMonth
public Path
'____________________________

Path = objFolderItem.Path +""
LogFilePath=Path+"Cheqe.csv" ' Файл для сохранения операций, тестовый с разделителями. Открывается в эхселе
LogFilePath2=Path+"main.crc" ' Дубликат операций. По замыслу, для защиты информации типа.
set l1=objFSO.getfile (LogFilePath)
set l2=objFSO.getfile (LogFilePath2)
if l1.size<>l2.size then  ' Сравнили размеры двух файлов и предупредили строго
 msgbox "Контрольные суммы файлов базы данных не совпали, сообщите об этом кому надо",vbCritical, "Внимание, произошло страшное!"
End if
Shtrih.connect()   ' Пробуем зацепиться к принтеру. Настройки подключения хранятся в программе "Тест драйвера"
wo.EnableVisualStyles = true
set mform = wo.CreateDialogForm(0,0,0,0, wo.Translate("WS_THICKFRAME"))  ' Окно с программой. Без кнопок в заголовке
mform.ClientWidth =370
mform.ClientHeight = 430
mform.CenterControl()
mform.text="Печать кассового ордера"
mform.MaximizeBox=false
mform.MinimizeBox=true
mform.SizeGrip=false  
mform.icon="icon.ico" ' иконка окна
mform.OnCloseQuery = GetRef("FormCloseQuery")   ' Отрабатываем реакцию на закрытие
set R = mform.CreateReBar(0,0,0,0)
set M = R.CreateMenuBar(0,0,0,0)  ' Создаем менюху
set t = M.Menu.Add("Файл")
set y = M.Menu.Add("Отчеты") 
set v = M.Menu.Add("Помощь") 
t.Add("Печать ","ENTER").OnExecute =GetRef("printC")   ' Печатаем чек
t.Add("Печать копии чека ","F4").OnExecute =GetRef("printCC")  ' Копия
y.Add("Отчет без гашения","F9").OnExecute =GetRef("printX")  ' Отчет Х
y.Add("Отчет с гашением","F12").OnExecute = GetRef("printZ")  '  Отчет Z
t.Add("-")
t.Add("Выход","ESC").OnExecute = GetRef("CloseForm")  ' Окно можно закрыть только этой командой
v.Add("Инструкция","F1").OnExecute = GetRef("OHelp")
v.Add("-")
v.Add("О програме","").OnExecute = GetRef("OAbout")
set StatusBar = mform.CreateStatusBar() ' Статусбар внизу окна
StatusBar.Add(200).AutoSize = true
mform.TextOut 10,200,"* - поля, обязательные для заполнения"   ' Надписи в окне
 Shtrih.GetShortECRStatus ' Опрашиваем принтер
		   StatusBar.text=Shtrih.ECRModeDescription
		  if Shtrih.ReceiptRibbonIsPresent=false then msgbox "Недостаточно бумаги",vbCritical, "Внимание"
		  if Shtrih.ECRMode=0 then StatusBar.text="Принтер чеков не доступен"
mform.DrawImage 10,220,400,200,Path+"logo.bmp"  ' Логотип организации внизу окна
mform.TextOut 10,30,"Выберите преподавателя:"
set ComboBox1 = mform.CreateComboBox(10,50,150,25)   ' Список преподавателей
with (ComboBox1)
       .Add("Ку*******ая Т.А")
		.Add("Ря*****нко О.А.")
        .Add("Ле****ва Е.В.")
        .Add("Ст*****ая О.В")
        .Add("Лы****ко Н.В.")
        .Add("Ц*****а А.А.")
		.Add("Ма*****ва О.В")
		.Add("Со*****а В.Ю.")
		.Add("Те******ка П.В.")
end with
ComboBox1.text="Ку*****ая Т.А"   ' Значение по умолчанию
ComboBox1.ReadOnly=true
		set tx1=mform.TextOut( 200,30,"* Сумма оплаты:")
		 tx1.Font.Size=14
		set Edit1 = mform.CreateEdit(200,60,160,25)   ' Поле ввода суммы оплаты
		Edit1.DataType=2   ' Тип данных - целые числа
		edit1.Max=10000
Edit1.text="1000"
Edit1.Font.Size=20
Edit1.OnClick=GetRef("SelAll")  ' Выделение всего что введено при клике в поле
		set tx2=mform.TextOut( 10,130,"* Фамилия, имя, отчество учащегося:")
		 tx2.Font.Size=14
		set Edit2 = mform.CreateEdit(10,160,350,25)
		Edit2.Font.Size=16
Edit2.SetFocus
mform.TextOut 10,80,"Выберите месяц:"   '  Выбор месяца. Без лишних заморочек)
set ComboBox2 = mform.CreateComboBox(10,100,150,25)
ComboBox2.ReadOnly=true
with (ComboBox2)
       .Add("сентябрь")
  .Add("октябрь")
    .Add("ноябрь")
	  .Add("декабрь")
	    .Add("январь")
		  .Add("февраль")
		    .Add("март")
			  .Add("апрель")
			    .Add("май")
				  .Add("июнь")
				    .Add("июль")
					  .Add("август")
end with
ComboBox2.text="октябрь"
mform.Show()   ' Отображаем окошко
wo.Run()


sub printCC   ' Заполняем параметры для копии чека и пишем лог
CliName=Edit2.text
Sumcash=Edit1.text
Wname=ComboBox1.text
PayMonth=ComboBox2.text
call printCopy (CliName,Wname,Sumcash,PayMonth)
Shtrih.GetShortECRStatus
StatusBar.text=Shtrih.ECRModeDescription
log Cstr(now)+";"+CliName+";"+Sumcash+";"+PayMonth+";"+Wname+";Напечатана копия чека"
end sub

sub CloseForm
mform.Close()
end sub

sub SelAll   ' Выделяем
Edit1.SelectAll ()
end sub

sub OHelp()
end sub

sub printZ()  ' Отчет с гашением
 Shtrih.GetShortECRStatus
		   if Shtrih.ECRMode=4 then   ' Проверяем, статус смены
		   StatusBar.text="Смена уже закрыта"
exit sub
		   end if
i=Inputbox("Введите пароль директора:","Пароль меняется каждый день")   ' Тут типа динамический пароль, номер дня+номер месяца
d=day(now)
m=Month(Now)
p=Cstr(d+m)
if i<>p then
StatusBar.text="Не верный пароль директора"
log Cstr(now)+";"+CliName+";"+Sumcash+";"+PayMonth+";"+Wname+";Не верный пароль директора"
log Cstr(now)+";"+CliName+";"+Sumcash+";"+PayMonth+";"+Wname+";Не верный пароль директора"
exit sub
end if
Shtrih.FirstLineNumber=1
Shtrih.LastLineNumber=255
Shtrih.Draw()  ' Печать логотипа организации на чеке
Shtrih.PrintReportWithCleaning()  ' Печать отчета с гашением
wscript.sleep 1500  ' Ждем пока раступиться
Shtrih.GetShortECRStatus
StatusBar.text=Shtrih.ECRModeDescription  ' Выводим в статусбар результат
log Cstr(now)+";"+CliName+";"+Sumcash+";"+PayMonth+";"+Wname+";Смена закрыта"
end sub

sub printX()  ' Отчет без гашения.
Shtrih.FirstLineNumber=1
Shtrih.LastLineNumber=255
Shtrih.Draw()
Shtrih.PrintReportWithoutCleaning()
Shtrih.GetShortECRStatus
StatusBar.text=Shtrih.ECRModeDescription
log Cstr(now)+";"+CliName+";"+Sumcash+";"+PayMonth+";"+Wname+";Снят отчет без гашения"
end sub

sub printC()  ' Печать чека
CliName=Edit2.text
Sumcash=Edit1.text
Wname=ComboBox1.text
PayMonth=ComboBox2.text
if CliName="" then   ' Несколько проверок на корректной введенных данных
StatusBar.text="Не указана фамилия клиента"
exit sub
end if
if Len(CliName)<9 then 
StatusBar.text="Введите инициалы полностью"
exit sub
end if
FioArr=Split(CliName," ")
if UBound(FioArr)<1 then   ' Имя и фамилия - два слова через пробел
StatusBar.text="Введите инициалы полностью"
exit sub
end if
if Sumcash="0" then 
StatusBar.text="Не указана сумма"
exit sub
end if
if Clng(Sumcash)<400 then 
StatusBar.text="Введите сумму побольше"
exit sub
end if
call printCHQ(CliName,Wname,Sumcash,PayMonth)  ' Вызываем процедуру печати чека
StatusBar.text="Чек напечатан"
wscript.sleep 1500  ' Тупим полторы секунды
Shtrih.FirstLineNumber=1
Shtrih.LastLineNumber=200
Shtrih.Draw()  ' Логотип не забываем
Shtrih.StringForPrinting="          КОПИЯ"
Shtrih.PrintWideString()
Shtrih.RepeatDocument  ' Печатаем копию чека
log Cstr(now)+";"+CliName+";"+Sumcash+";"+PayMonth+";"+Wname+";Напечатан чек"
Shtrih.GetShortECRStatus
StatusBar.text=Shtrih.ResultCodeDescription
 If Err.Number <> 0 Then 
 StatusBar.text=Err.Description
 End If
 Edit2.text=""
end sub

sub OAbout  ' Окно "о программе"
set Afrm = wo.CreateDialogForm(0,0,0,0)
Afrm.Text="О программе"
Afrm.ClientWidth =300
Afrm.ClientHeight = 100
Afrm.icon="cypher.ico" ' иконка окна
Afrm.CenterControl()
Shtrih.GetShortECRStatus
Status1=Shtrih.ResultCodeDescription
Status2=Shtrih.ECRModeDescription
set Atx=Afrm.TextOut(10, 10, "Печать приходный кассовых ордеров"+vbCrlf+Status1+vbCrlf+Status2+vbCrlf+"Разработка и поддержка:")
Afrm.CreateHyperLink 10,65,300,50, "http://skywalkeradmin.ru", ""
Afrm.ShowModal()
end sub

sub printCHQ(CliName,Wname,Sumcash,PayMonth)   ' Печать чека
Shtrih.OpenCheck()  ' Открывает чек и смену (если смена закрыта)
Shtrih.CheckType=1  ' наличный чек
Shtrih.StringForPrinting="ПРИХОДНЫЙ КАССОВЫЙ ОРДЕР"
Shtrih.PrintWideString()  ' Печать строоки БОЛЬШИМ КАПСОМ
Shtrih.StringForPrinting="     ИП Ку******ая Т.А. ИНН 31********22"
Shtrih.PrintString()
Shtrih.StringForPrinting="Дата составления: "+Cstr(now)
Shtrih.PrintString()
Shtrih.StringForPrinting="Принято от: "+CliName
Shtrih.PrintString()
Shtrih.StringForPrinting="Основание: образовательные услуги"
Shtrih.PrintString()
Shtrih.StringForPrinting="Оплачиваемый период:                     "+PayMonth
Shtrih.PrintString()
Shtrih.Quantity=1  ' Количество
Shtrih.Price=Clng(Sumcash)  ' Сумма
Shtrih.StringForPrinting="Принятая сумма: "
Shtrih.Sale()  ' Расчет по операции. В этом месте на чеке печатается слово ИТОГ и сумма
Shtrih.StringForPrinting="Преподаватель: "+Wname
Shtrih.PrintString()
Shtrih.StringForPrinting="      ШКОЛА ХОГВАРДС"
Shtrih.PrintWideString()
Shtrih.StringForPrinting="   тел. 8******* 83"
Shtrih.PrintWideString()
Shtrih.StringForPrinting="              ул. Заводская 8 оф.202"
Shtrih.PrintString()
Shtrih.StringForPrinting="---------------------------------------------------------"  ' Эта строка печатается 2 раза (кто знает почему?)
Shtrih.PrintString()
Shtrih.Summ1=Clng(Sumcash)
Shtrih.CloseCheck()  ' Закрываем чек
end sub


sub printCopy(CliName,Wname,Sumcash,PayMonth)  ' Копия чека. Тут ничего кроме печати строк
Shtrih.StringForPrinting=" ПРИХОДНЫЙ КАССОВЫЙ ОРДЕР"
Shtrih.PrintWideString()
Shtrih.StringForPrinting="          КОПИЯ"
Shtrih.PrintWideString()
Shtrih.StringQuantity =1
Shtrih.FeedDocument()
Shtrih.StringForPrinting="     ИП Ку******ая Т.А. ИНН 31**************22"
Shtrih.PrintString()
Shtrih.StringForPrinting="Дата составления: "+Cstr(now)
Shtrih.PrintString()
Shtrih.StringQuantity =1
Shtrih.FeedDocument()
Shtrih.StringForPrinting="Принято от: "+CliName
Shtrih.PrintString()
Shtrih.StringForPrinting="Основание: образовательные услуги"
Shtrih.PrintString()
Shtrih.StringForPrinting="Оплачиваемый период:                   "+PayMonth
Shtrih.PrintString()
Shtrih.StringForPrinting="Принятая сумма: "+Sumcash
Shtrih.PrintWideString()
Shtrih.StringForPrinting="Преподаватель: "+Wname
Shtrih.PrintString()
Shtrih.StringQuantity =3
Shtrih.FeedDocument()
Shtrih.StringForPrinting="Подпись: _________________________________"
Shtrih.PrintString()
Shtrih.StringForPrinting="      ШКОЛА ХОГВАРДС"
Shtrih.PrintWideString()
Shtrih.StringForPrinting="   тел. 8 ******* 83"
Shtrih.PrintWideString()
Shtrih.StringForPrinting="                   ул. Заводская 8 оф.202"
Shtrih.PrintString()
Shtrih.StringQuantity =10
Shtrih.FeedDocument()
end sub

 Function Log (strLog)' Запись логов
  Set objTSlog = objFSO.OpenTextFile(LogFilePath, 8)
  objTSlog.Writeline strLog
  objTSlog.Close
    Set objTSlog2 = objFSO.OpenTextFile(LogFilePath2, 8)
  objTSlog2.Writeline strLog
  objTSlog2.Close
 End Function

 Sub FormCloseQuery(Sender,ResultPtr)  ' Запрос о закрытии окна
	ResultPtr.Put(Sender.Form.MessageBox("Закрыть окно и выйти из програмы?","Уже уходите?",wo.Translate("MB_OKCANCEL | MB_ICONQUESTION")) = wo.Translate("IDOK"))
	log Cstr(now)+";"+CliName+";"+Sumcash+";"+PayMonth+";"+Wname+";Приложение закрыто"
End Sub

Как вы уже заметили (фраза паразит для подобных текстов) тут интерфейс создается при помощи windows system object (WSO)