- Установка ПО
Для работы используем менеджер оплат (Штрих-М - ShtrihPayMan). Скопируйте менеджер оплат в корень программы. Для работы эквайринга банка Райффайзен нужен модуль в каталоге «SoftCase».
-
- Установка ПО “SoftCase”
1) Распаковать архив "EFTHCXML"в корень диска "С:"
2) Запустить командную строку от имени администратора и прописать команду:
sc create EFTHCXML binpath= c:\efthcxml\efthcxml.exe start= auto
3) Зайти в раздел "Службы" и запустить службу EFTHCXML
-
- Настройка терминала
Узнать IP адрес компьютера на котором будет стоять ПО Штрих-М Кассир и служба "EFTHCXML".
Позвонить в техслужбу компании «SoftCase» 8(495)374-64-76, и следуя их инструкции добиться чтобы на экране терминала появилась надпись «Готов к работе», т.е. терминал видит службу.
- Доработка конфигурации
При начале работы нужно получить активный индекс по терминалам, для этого обрабатываем файлы ShtrihPayMan_ActivePay.ini – активные индексы и ShtrihPayMan.ini – приязка индекса и логическое описания:
Функция ПолучитьАктивныеИндексы(Банк="") Экспорт
АктивныйНомер = 0;
//
ТабИндексов = СоздатьОбъект("ТаблицаЗначений");
ТабИндексов.НоваяКолонка("Индекс");
ТабИндексов.НоваяКолонка("Активно");
ТабИндексов.НоваяКолонка("ТипБанка");
//ShtrihPayMan_ActivePay.ini
ИмяФДанных = КаталогИБ()+"ShtrihPayMan_ActivePay.ini";
Если ВнешняяКомпонента.OpenFl(ИмяФДанных)<0 Тогда
Возврат 0;
КонецЕсли;
Для Ном=0 По ВнешняяКомпонента.CountStr()-1 Цикл
Стр=ВнешняяКомпонента.GetStrPs(Ном);
Если СокрЛП(Стр)="" Тогда
Продолжить;
КонецЕсли;
Стр=СтрЗаменить(Стр,";",РазделительСтрок);
СтрВрем = Стр;
Если Лев(Стр,1)="[" Тогда
СтрВрем = СтрЗаменить(СтрВрем,"[","");
СтрВрем = СтрЗаменить(СтрВрем,"]","");
СтрВрем = СокрЛП(СтрВрем);
НомерИндекса=Число(СтрВрем);
ТабИндексов.НоваяСтрока();
ТабИндексов.Индекс = НомерИндекса;
ТабИндексов.Активно = 0;
ИначеЕсли (Найти(Стр,"active")>0) Тогда
СтрВрем = СтрЗаменить(СтрВрем,"active","");
СтрВрем = СтрЗаменить(СтрВрем,"=","");
СтрВрем = СокрЛП(СтрВрем);
ТабИндексов.Активно = Число(СтрВрем);
//
Если (ТабИндексов.Активно =Истина) И (ПустаяСтрока(Банк)=Истина) Тогда
АктивныйНомер = НомерИндекса;
КонецЕсли;
КонецЕсли;
КонецЦикла;
ВнешняяКомпонента.CloseFl();
ИмяФДанных = КаталогИБ()+"ShtrihPayMan.ini";
Если ВнешняяКомпонента.OpenFl(ИмяФДанных)<0 Тогда
Возврат 0;
КонецЕсли;
Для Ном=0 По ВнешняяКомпонента.CountStr()-1 Цикл
Стр=ВнешняяКомпонента.GetStrPs(Ном);
Если СокрЛП(Стр)="" Тогда
Продолжить;
КонецЕсли;
НашлиСтроку=0;
Стр=СтрЗаменить(Стр,";",РазделительСтрок);
СтрВрем = Стр;
Если Лев(Стр,1)="[" Тогда //Ищем по индексу
СтрВрем = СтрЗаменить(СтрВрем,"[","");
СтрВрем = СтрЗаменить(СтрВрем,"]","");
СтрВрем = СокрЛП(СтрВрем);
НомерИндекса=Число(СтрВрем);
нм="";
Если (ТабИндексов.НайтиЗначение(НомерИндекса,нм,"Индекс")>0) Тогда
ТабИндексов.ПолучитьСтрокуПоНомеру(нм);
НашлиСтроку=1;
Иначе
НашлиСтроку=0;
КонецЕсли;
ИначеЕсли (Найти(Стр,"name")>0) Тогда
СтрВрем = СтрЗаменить(СтрВрем,"name","");
СтрВрем = СтрЗаменить(СтрВрем,"=","");
СтрВрем = СокрЛП(СтрВрем);
ТабИндексов.ТипБанка = СтрВрем;
Если ПустаяСтрока(Банк)=0 Тогда
Если (Найти(Стр,Банк)>0) Тогда
//все ок
ТабИндексов.Активно = 1;
ИначеЕсли (Банк="SoftCase") И (Найти(Стр,Банк)>0) Тогда
//все ок
ТабИндексов.Активно = 1;
Иначе
ТабИндексов.Активно = 0;
КонецЕсли;
Иначе
Если (АктивныйНомер = НомерИндекса)Тогда
Если (ТабИндексов.ТипБанка = "SoftCase") Тогда
ТекАктивныйТерминал = Перечисление.ТипТерминала.Райффайзенбанк;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Иначе
Продолжить;
КонецЕсли;
КонецЦикла;
ВнешняяКомпонента.CloseFl();
Возврат ТабИндексов;
КонецФункции
Подключим компоненту:
Попытка
МенеджерОплат=СоздатьОбъект("ShtrihPayMan.PayMan");
Исключение
ВывестиПредупреждение("Ошибка загрузки менеджера оплат","Ошибка!");
Константа.ВидОплатыМенеджерОплат=0;
КонецПопытки;
Если Константа.ВидОплатыМенеджерОплат>0 Тогда
Если МенеджерОплат.Init(КаталогИБ())=0 Тогда
ВывестиПредупреждение("Ошибка инициализации менеджера оплат "+МенеджерОплат.LastError+": "+МенеджерОплат.LastErrorMsg,"Ошибка!");
Константа.ВидОплатыМенеджерОплат=0;
КонецЕсли;
КонецЕсли;
Теперь опишем продажу:
Если (ТекАктивныйТерминал=Перечисление.ТипТерминала.Райффайзенбанк) Тогда
RRN = "";
Если (ПродажаПоРайфайзенБанку(ИндексТипаОплаты, ИтогЧека("СуммаСоСкидкой"), СкидкиНаЧек, RRN)=Ложь) Тогда
//Проверка на ошибку
Если ОбработкаОшибокЭквайринга( ЕстьОплатаКартой )=Ложь Тогда
Возврат;
КонецЕсли;
КонецЕсли;
КонецЕсли;
где ИндексТипаОплаты – это активный индекс оплаты
ИтогЧека – Сумма чека по позициям с учетом скидки
СкидкиНаЧек – Скидка на чек
RRN – Данные полученные от эквайринга, которые нужно сохранить, для того чтобы сделать возврат в будущем, если нужно
Функция ПродажаПоРайфайзенБанку:
Функция ПродажаПоРайфайзенБанку(ИндексОплаты, СуммаЧека,СкидкиНаЧек, RRN)
РезОч = МенеджерОплат.ClearPays();
РезОч = МенеджерОплат.ClearGoods();
КурсРубля = 1;
//
Если (ВидЧека = 3) Тогда
Знак=-1;
//Поиск RRN
RRN = НайтиRRNВБазе(НомерЧекаВозврата, СуммаЧека);
МенеджерОплат.RRN = RRN;
Иначе
Знак=1;
КонецЕсли;
//
РезОч = МенеджерОплат.AddPay( 2,
2,//ИндексОплаты
"Безналичные",
Знак*СуммаЧека*КурсРубля * 100,
"");
РезОч = МенеджерОплат.ClearGoods();
PayType = МенеджерОплат.GetPayTypeIndex(ИндексОплаты);
//
_СуммаСкидки = 0;_СуммаБонусов = 0;
СкидкиНаЧек.ВыбратьСтроки();
Пока СкидкиНаЧек.ПолучитьСтроку()>0 Цикл
Если (ПустоеЗначение(ФиксированнаяСкидкаНаЧек)=0) И (СкидкиНаЧек.Вид=1) Тогда
//0 — ручная скидка
ИначеЕсли (ПустоеЗначение(АвтоматическаяСкидкаНаЧек)=0) И (СкидкиНаЧек.Вид=2) Тогда
//, 1 — фиксированная скидка,
ИначеЕсли СкидкиНаЧек.Вид=3 Тогда
//3 — скидка по дисконтной карте
_СуммаСкидки = ABS(СкидкиНаЧек.СуммаСкидки);
ИначеЕсли СкидкиНаЧек.Вид=4 Тогда
//4 — бонусная карта
_СуммаБонусов=ABS(СкидкиНаЧек.СуммаСкидки);
КонецЕсли;
КонецЦикла;
//
СуммаСкидкиВПозициях=0;
Чек.ВыбратьСтроки();
Пока Чек.ПолучитьСтроку() = 1 Цикл
СуммаСкидкиВПозициях = СуммаСкидкиВПозициях + Чек.СуммаСкидки;
Barcode = ПолучитьШтрихКод(Чек.Товар.ТекущийЭлемент());
MaxDiscount = Чек.ТОвар.МаксСкидка;
Если (MaxDiscount<0) Тогда
MaxDiscount=0;
КонецЕсли;
Если ВидЧека=2 Тогда
СуммаСкидки = 0;
Иначе
СуммаСкидки = Чек.СуммаСкидки*100;
КонецЕсли;
_Бонусы = Чек.СуммаСоСкидкой * КурсРубля;
_МаксСкидка = Чек.СуммаСоСкидкой * КурсРубля;
Рез = МенеджерОплат.AddGood(
Чек.Товар.Код,
Чек.Товар.Наименование,
Чек.Количество * 1000,
Чек.Цена * 100 * КурсРубля,
Чек.СуммаСоСкидкой * 100 * КурсРубля,
СуммаСкидки * КурсРубля,
MaxDiscount * 100 * КурсРубля,
Barcode,
_Бонусы*100,
_МаксСкидка * 100,
"");
КонецЦикла;
//Модифицируемые свойства:
МенеджерОплат.PayType = PayType;
МенеджерОплат.CardNumber = "";
МенеджерОплат.Amount = Знак*СуммаЧека*КурсРубля*100;
МенеджерОплат.KKMNumber = 1;//--Потому что иначе ошибка 911, это номер для службы---
МенеджерОплат.RRN = RRN;
МенеджерОплат.CheckNumber = Число(НомерЧека);
МенеджерОплат.AuthCode = СтрПолучитьСтроку(КодАвторизацииПриВозврате,1);
МенеджерОплат.RRN = СтрПолучитьСтроку(КодАвторизацииПриВозврате,2);
Если ВидЧека=2 Тогда
МенеджерОплат.DiscountAmount= 0;//Сумма скидки
МенеджерОплат.BonusAmount = 0;//Сумма бонусов
Иначе
МенеджерОплат.DiscountAmount= _СуммаСкидки*КурсРубля;//Сумма скидки
МенеджерОплат.BonusAmount = _СуммаБонусов;//Сумма боеусов
КонецЕсли;
Рез = МенеджерОплат.Pay();
Если Рез=1 Тогда
Если (Знак=1) Тогда
RRN = МенеджерОплат.RRN;//сохраняем данные по чеку для возврата
КонецЕсли;
ИначеЕсли РезОч=0 Тогда
РезОч = МенеджерОплат.ClearGoods();
Возврат 0;
КонецЕсли;
//Очистим список товаров
РезОч = МенеджерОплат.ClearGoods();
Если Рез=1 Тогда
Возврат 1;
Иначе
Возврат 0;
КонецЕсли;
Возврат 0;
КонецФункции
где Чек - табличное значение по строкам чека,
СкидкиНаЧек – список скидок на чек.
Теперь расмотрим функцию ОбработкаОшибокЭквайринга:
Функция ОбработкаОшибокЭквайринга(ЕстьОплатаКартой)
Состояние("Ошибка авторизации "+МенеджерОплат.LastError+": "+МенеджерОплат.LastErrorMsg);
Если (ТекАктивныйТерминал=Перечисление.ТипТерминала.Райффайзенбанк) Тогда
Если (МенеджерОплат.LastError=911) Тогда
Предупреждение("Номер кассы превышает лимит для передачи в эквайринг!");
Возврат 0;
КонецЕсли;
КонецЕсли;
Если (Константа.ИспользоватьККМ>0) И (ЧекНачалПечататься=0) И (СокрЛП(МенеджерОплат.StringForPrint)<>"") Тогда
СписокККМ.ПолучитьСтрокуПоНомеру(1);
УстановитьККМ();
ПечатьЧекаПлатежнойСистемы(СтрЗаменить(МенеджерОплат.StringForPrint,Симв(10),РазделительСтрок)+Симв(1));
КонецЕсли;
Возврат 0;
КонецФункции
Функция снятия конца смены по терминалу:
Процедура ЗакрытиеДняМенеджерОплат()
Если Константа.ВидОплатыМенеджерОплат=0 Тогда
ВывестиПредупреждение("На данном рабочем месте не подключен менеджер оплат!","Не подключено!");
Возврат;
КонецЕсли;
Если ЗаполнитьСписокККМ()=0 Тогда
Если Константа.ФронтОфисныйРежим>0 Тогда
ОбновитьСтроку();
КонецЕсли;
Возврат;
КонецЕсли;
СписокККМ.ВыбратьСтроки();
Пока СписокККМ.ПолучитьСтроку()>0 Цикл
Если Константа.ИспользоватьККМ=1 Тогда
ФискальныйРегистратор.DeviceEnabled=1;
Если ФискальныйРегистратор.ResultCode<0 Тогда
ВывестиПредупреждение("Ошибка кассы"+?(СписокККМ.Номер=0,""," №"+СписокККМ.Номер)+": "+ФискальныйРегистратор.ResultDescription+"!","Ошибка кассы!");
Если Константа.ФронтОфисныйРежим>0 Тогда
ОбновитьСтроку();
КонецЕсли;
Возврат;
КонецЕсли;
ИначеЕсли Константа.ИспользоватьККМ=2 Тогда
ФискальныйРегистратор.Password=Константа.ПарольСистемногоАдминистратора;
Пока 1=1 Цикл
ФискальныйРегистратор.Connect();
Рез=ОбработкаОшибокФР();
Если Рез>0 Тогда
Если Константа.ФронтОфисныйРежим>0 Тогда
ОбновитьСтроку();
КонецЕсли;
Возврат;
ИначеЕсли Рез=0 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Если (ТекАктивныйТерминал = Перечисление.ТипТерминала.Райффайзенбанк) Тогда
ТипЭквайринга = "SoftCase";
КонецЕсли;
ИндексБанковОплат = ПолучитьАктивныеИндексы(ТипЭквайринга);
Если (ИндексБанковОплат=0) Тогда
Предупреждение("Не активна не одна из платежных систем!");
Возврат;
КонецЕсли;
ИндексБанковОплат.ВыбратьСтроки();
Пока ИндексБанковОплат.ПолучитьСтроку()=1 Цикл
Если (ИндексБанковОплат.Активно=0) Тогда
Продолжить;
КонецЕсли;
Транз=СоздатьОбъект("Справочник.Транзакции");
Транз.Новый();
Транз.Наименование="Закрытие дня по кредитным картам";
Транз.НомерККМ=Константа.НомерПОС;
Транз.ДатаТранз=ТекущаяДата();
Транз.ВремяТранз=ТекущееВремя();
Транз.ТипТранзакции=63;
Транз.НомерЧека=0;
Транз.Секция=0;
Транз.КодКассира=ТекущийПользователь.Код;
Транз.КодТовара=8;
Транз.Цена=0;
Транз.Количество=0;
Транз.Сумма=0;
Попытка
Транз.Записать();
Исключение
ВывестиПредупреждение("Ошибка работы с базой данных!","Ошибка!");
ОтменитьТранзакцию();
Если Константа.ФронтОфисныйРежим>0 Тогда
ОбновитьСтроку();
КонецЕсли;
Возврат;
КонецПопытки;
Если (ТекАктивныйТерминал = Перечисление.ТипТерминала.Райффайзенбанк) Тогда
РезОч = МенеджерОплат.CloseDayAllow(1);
РезОч = МенеджерОплат.PrintReportAllow(1);
РезОч = МенеджерОплат.CloseDayAllow(1);
КонецЕсли;
МенеджерОплат.PayType = МенеджерОплат.GetPayTypeIndex(ИндексБанковОплат.Индекс);
Если (ТекАктивныйТерминал = Перечисление.ТипТерминала.Райффайзенбанк) Тогда
МенеджерОплат.KKMNumber = 1;
КонецЕсли;
Рез=МенеджерОплат.CloseDay();
ВнешняяКомпонента.SetVisWind("1С:Предприятие - Штрих-М: КАССИР",15);
Если Рез=0 Тогда
ВывестиПредупреждение("Ошибка закрытия дня "+МенеджерОплат.LastError+": "+МенеджерОплат.LastErrorMsg+". По типу :"+ИндексБанковОплат.Индекс,"Ошибка!");
ДобавитьВЛог("Ошибка закрытия дня "+МенеджерОплат.LastError+": "+МенеджерОплат.LastErrorMsg+". По типу :"+ИндексБанковОплат.Индекс);
//ОтменитьТранзакцию();
Если Константа.ФронтОфисныйРежим>0 Тогда
ОбновитьСтроку();
КонецЕсли;
Продолжить;
КонецЕсли;
Если СокрЛП(МенеджерОплат.StringForPrint)<>"" Тогда
ЧекДляОтчета=СтрЗаменить(МенеджерОплат.StringForPrint,Симв(10),РазделительСтрок)+?(Прав(МенеджерОплат.StringForPrint,1)=РазделительСтрок,"",РазделительСтрок)+Симв(1);
Для Пар=1 по СтрКоличествоСтрок(ЧекДляОтчета) Цикл
Стр=СтрПолучитьСтроку(ЧекДляОтчета,Пар);
Если Лев(Стр,1)=Симв(1) Тогда
Если Константа.ИспользоватьККМ=1 Тогда
Для Ном=1 по 2 Цикл
Если ПечатьСтроки(" ",0,0)=0 Тогда
ОтменитьТранзакцию();
Если Константа.ФронтОфисныйРежим>0 Тогда
ОбновитьСтроку();
КонецЕсли;
Возврат;
КонецЕсли;
КонецЦикла;
Пока 1=1 Цикл
Рез=ОбработкаОшибок(ФискальныйРегистратор,"кассы",ФискальныйРегистратор.PrintHeader());
Если Рез>0 Тогда
ОтменитьТранзакцию();
Если Константа.ФронтОфисныйРежим>0 Тогда
ОбновитьСтроку();
КонецЕсли;
Возврат;
ИначеЕсли Рез=0 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
ИначеЕсли Константа.ИспользоватьККМ=2 Тогда
Если СписокККМ.ПечатьРекламногоТекста>0 Тогда
Для Ном=1 по 3 Цикл
Стр=СписокККМ.ПолучитьЗначение(СписокККМ.НомерСтроки,"Клише"+Ном);
Если Стр<>"" Тогда
Если ПечатьСтроки(Стр,0,0)=0 Тогда
ОтменитьТранзакцию();
Если Константа.ФронтОфисныйРежим>0 Тогда
ОбновитьСтроку();
КонецЕсли;
Возврат;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если (Ширина>24) ИЛИ (Ширина=20) Тогда
Для Ном=1 по ?(Ширина=36,2,?(((Ширина>=40) ИЛИ (Ширина=32)),4,3)) Цикл
Если ПечатьСтроки(" ",0,0)=0 Тогда
ОтменитьТранзакцию();
Если Константа.ФронтОфисныйРежим>0 Тогда
ОбновитьСтроку();
КонецЕсли;
Возврат;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Для Ном=4 по СписокККМ.ЧислоСтрокПодКлише Цикл
Стр=СписокККМ.ПолучитьЗначение(СписокККМ.НомерСтроки,"Клише"+Ном);
Если ПечатьСтроки(Стр,0,0)=0 Тогда
ОтменитьТранзакцию();
Если Константа.ФронтОфисныйРежим>0 Тогда
ОбновитьСтроку();
КонецЕсли;
Возврат;
КонецЕсли;
КонецЦикла;
Если СписокККМ.ОтрезкаЧека>0 Тогда
ФискальныйРегистратор.Password=Число(Константа.ПарольСистемногоАдминистратора);
ФискальныйРегистратор.CutType=СписокККМ.ОтрезкаЧека-1;
ФискальныйРегистратор.CutCheck();
КонецЕсли;
КонецЕсли;
Продолжить;
КонецЕсли;
Если ПечатьСтроки(Стр,0,0)=0 Тогда
ОтменитьТранзакцию();
Если Константа.ФронтОфисныйРежим>0 Тогда
ОбновитьСтроку();
КонецЕсли;
Возврат;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если (ИндексБанковОплат.Активно=1) Тогда
Прервать;
КонецЕсли;
КонецЦикла;
ЗафиксироватьТранзакцию();
СписокККМ.ВыбратьСтроки();
Пока СписокККМ.ПолучитьСтроку()>0 Цикл
Если Константа.ИспользоватьККМ=1 Тогда
ФискальныйРегистратор.DeviceEnabled=0;
ИначеЕсли Константа.ИспользоватьККМ=2 Тогда
ФискальныйРегистратор.Disconnect();
КонецЕсли;
КонецЦикла;
Если Константа.ФронтОфисныйРежим>0 Тогда
ОбновитьСтроку();
КонецЕсли;
КонецПроцедуры