Автоматическое пробитие чека ККМ после успешной оплаты по эквайрингу

1. insurgut 207 30.11.21 08:39 Сейчас в теме
Подскажите, на конфигурации УТ 11.4 кто-нибудь реализовывал подобное? В настройках не нашел.

Задача свести к минимуму нажатие кнопок. Если в интерфейсе кассира нажали "Оплатить картой" - должно сразу открыться окно эквайринга с принятием оплаты и после успешной оплаты пробиться чек ККМ. Т.е. принятие оплаты картой в одно касание :)

Кто реализовывал, подскажите, что где добавить?
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
15. insurgut 207 30.11.21 19:39 Сейчас в теме
В общем - задачу решил. Может кому-то пригодиться.

На примере конфигурации Комплексная автоматизация, 2.4.14.64 (в УТ 11.4 думаю все 1 в 1). Доработать пришлось 2 модуля (все доработки через расширение).

1. Общий модуль РозничныеПродажи, процедура ОчиститьДанныеФискальнойОперации:
&Вместо("ОчиститьДанныеФискальнойОперации")
Процедура Доп_ОчиститьДанныеФискальнойОперации(ДанныеФискальнойОперации)
	
	ДанныеФискальнойОперации.ВариантОтправкиЭлектронногоЧека = Перечисления.ВариантыОтправкиЭлектронногоЧекаПокупателю.НеОтправлять; //+АняновМА, было: Перечисления.ВариантыОтправкиЭлектронногоЧекаПокупателю.ПустаяСсылка()
	ДанныеФискальнойОперации.КонтактныеДанныеЭлектронногоЧека = "";
	
КонецПроцедуры
Показать


Если вариант оплаты не заполнен, то после эквайринговой операции (даже если она на всю сумму чека) открывается окно с кнопкой "Пробить чек". Если клиенту необходимо отправлять чеки по СМС или e-mail, это указывается в карточке клиента, которая к дисконтной карте привязана. По умолчанию всегда печатаем сразу чек.

2. Общий модуль РозничныеПродажиКлиент, процедура ОплатаКартойПослеЗавершенияВыбораЭквайринговогоТерминала:
&Вместо("ОплатаКартойПослеЗавершенияВыбораЭквайринговогоТерминала")
Процедура Доп_ОплатаКартойПослеЗавершенияВыбораЭквайринговогоТерминала­(СтруктураЭквайринговыйТерминал, ДополнительныеПараметры)
	
	Если СтруктураЭквайринговыйТерминал <> Неопределено Тогда
		ИдентификаторУстройстваЭТ = СтруктураЭквайринговыйТерминал.ПодключаемоеОборудование;
	Иначе
		ИдентификаторУстройстваЭТ = Неопределено;
	КонецЕсли;
	
	ДополнительныеПараметры.ИдентификаторУстройстваЭТ      = ИдентификаторУстройстваЭТ;
	ДополнительныеПараметры.СтруктураЭквайринговыйТерминал = СтруктураЭквайринговыйТерминал;
	
	Если ЗначениеЗаполнено(ИдентификаторУстройстваЭТ)
		Или (СтруктураЭквайринговыйТерминал <> Неопределено
		   И СтруктураЭквайринговыйТерминал.ИспользоватьБезПодключенияОборудования) Тогда
		
		Если Не СтруктураЭквайринговыйТерминал.ИспользоватьБезПодключенияОборудования Тогда
			РезультатЭТ = МенеджерОборудованияУТКлиент.ОборудованиеПодключено(ИдентификаторУстройстваЭТ);
		Иначе
			РезультатЭТ = Истина;
		КонецЕсли;
		
		Если РезультатЭТ Тогда
			
			//+АняновМА
			Если ДополнительныеПараметры.ФормаАвторизации_Сумма = ДополнительныеПараметры.ФормаАвторизации_ПределСуммы
				И НЕ СтруктураЭквайринговыйТерминал.ИспользоватьБезПодключенияОборудования Тогда
				
				СтруктураВозврата = Новый Структура();
				СтруктураВозврата.Вставить("Сумма"         , ДополнительныеПараметры.ФормаАвторизации_Сумма);
				СтруктураВозврата.Вставить("ДанныеКарты"   , "");
				СтруктураВозврата.Вставить("СсылочныйНомер", "");
				СтруктураВозврата.Вставить("ТипКарты"      , 0);
				СтруктураВозврата.Вставить("НомерКарты"    , "");
				СтруктураВозврата.Вставить("НомерЧека"     , "");
				СтруктураВозврата.Вставить("НомерЧекаЭТ"   , "");
				
				ДобавитьОплатуКартойЗавершение(СтруктураВозврата, ДополнительныеПараметры);
				Возврат;
			КонецЕсли;	
			//-АняновМА
			
			ПараметрыФормы = Новый Структура;
			ПараметрыФормы.Вставить("Сумма",       ДополнительныеПараметры.ФормаАвторизации_Сумма);
			ПараметрыФормы.Вставить("ПределСуммы", ДополнительныеПараметры.ФормаАвторизации_ПределСуммы);
			ПараметрыФормы.Вставить("Валюта",      ДополнительныеПараметры.Валюта);
			
			Если СтруктураЭквайринговыйТерминал.ИспользоватьБезПодключенияОборудования Тогда
				ПараметрыФормы.Вставить("ПоказыватьНомерКарты", Истина);
			КонецЕсли;
			
			ОткрытьФорму(
				"Справочник.ПодключаемоеОборудование.Форма.ФормаАвторизацииЭТ", ПараметрыФормы,,,,,
				Новый ОписаниеОповещения(
					"ДобавитьОплатуКартойЗавершение",
					РозничныеПродажиКлиент,
					ДополнительныеПараметры),
				РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
			
		Иначе
			
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
			НСтр("ru = 'Эквайринговый терминал не подключен. Операция по карте не выполнена.'"));
			
			ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеОЗавершении, Неопределено);
			
		КонецЕсли;
		
	Иначе
		
		// Не выбран эквайринговый терминал
		
		ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеОЗавершении, Неопределено);
		
	КонецЕсли;
	
КонецПроцедуры
Показать


Тут все просто - если у нас сумма оплаты = сумме чека и используется реальный эквайринговый терминал, то не показываем окно авторизации оплаты (Справочник.ПодключаемоеОборудование.Форма.ФормаАвторизацииЭТ), а сразу отправляем команду на эквайринговый терминал.

Надеюсь кому-то пригодится.
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. TormDV 30.11.21 12:14 Сейчас в теме
День добрый. Взять код из Розницы (там такое реализовано) и пытаться адаптировать под свою конфигурацию.
3. insurgut 207 30.11.21 12:33 Сейчас в теме
(2) что-то не припомню ничего похожего в рознице. Точно так же нужно нажать на кнопку с видом оплаты. Принять оплату. Потом пробить чек. Может это какой-то настройкой в рознице регулируется?
4. oldcopy 173 30.11.21 13:05 Сейчас в теме
(2) Нет такого в Рознице. При нажатии на кнопку безналичной оплаты выходит окно формы сложной оплаты, затем окно с суммой авторизации, в нем нажимаем Enter, идет обращение к терминалу, затем снова выходит форма сложной оплаты - в ней еще раз Enter.

Чтобы изменить это поведение - нужно дорабатывать РМК, так как при безналичной оплате используется код сложной оплаты и просто так его изменить нельзя.
6. insurgut 207 30.11.21 14:34 Сейчас в теме
(4) вот и я смотрю, розница вроде последняя, а пару лишних кнопок нажимать приходится :) Да и в целом по типовым конфигурациям вроде одинаково.
5. TormDV 30.11.21 13:45 Сейчас в теме
В Рабочем месте кассира в Рознице 2 кнопки оплата наличными и оплата по карте. Если подключен эквайринговый терминал, созданы соответствующие справочники, все настроено, то при нажатии оплата по карте запускается приложение банка для оплаты по терминалу, дальше, если все успешно, идет проведение документа.
7. oldcopy 173 30.11.21 14:37 Сейчас в теме
(5) Не запускается, требуется еще одно нажатие до и одно после. Как происходит я вам описал.
8. TormDV 30.11.21 14:43 Сейчас в теме
(7)Видимо, не так Вас понял. Функциональность уже есть и все работает, нужно уменьшить число нажатий кнопок? Смотреть процедуры, "висящие" на этих кнопках, попробовать выполнить их в ПриОткрытии.
9. oldcopy 173 30.11.21 14:45 Сейчас в теме
(8) Так делать нельзя, так как в этом случае вы сломаете сложную оплату. По сути придется создавать и поддерживать альтернативную ветку кода, ну или перепахать основную кучей проверок и ветвлений.
10. TormDV 30.11.21 14:51 Сейчас в теме
(9)Расширение написать под это все. Похоже влез по запарке, не разобравшись, сейчас насоветую... Извиняйте)
11. oldcopy 173 30.11.21 14:57 Сейчас в теме
(10) Хоть в модуль, хоть в расширение. Оплата платежной картой в рознице и сложная оплата реализованы одной формой и одним алгоритмом. Просто при оплате картой туда сразу подставляется 100% суммы. Если вы начнете его менять - сломаете сложную оплату.

Нужно либо создавать свою ветку кода на обработку нажатия кнопки Оплата картой и потом поддерживать ее. Либо переделывать основную, делая проверки на то, что форма была вызвана именно по кнопке Оплата картой, а не Сложная оплата.

И не понятно что проще, с учетом того, что там и так весьма сложный код, так как только налом и картами способы оплаты не исчерпываются.
12. insurgut 207 30.11.21 16:36 Сейчас в теме
(11) что сделать нужно, понятно. Вопрос по сути был к тем, кто такое возможно уже реализовал :) Видимо придется погружаться. Где взять только эмулятор эквайрингового терминала под управляемые формы.
14. insurgut 207 30.11.21 19:29 Сейчас в теме
(13) да, уже тестирую, спасибо.
15. insurgut 207 30.11.21 19:39 Сейчас в теме
В общем - задачу решил. Может кому-то пригодиться.

На примере конфигурации Комплексная автоматизация, 2.4.14.64 (в УТ 11.4 думаю все 1 в 1). Доработать пришлось 2 модуля (все доработки через расширение).

1. Общий модуль РозничныеПродажи, процедура ОчиститьДанныеФискальнойОперации:
&Вместо("ОчиститьДанныеФискальнойОперации")
Процедура Доп_ОчиститьДанныеФискальнойОперации(ДанныеФискальнойОперации)
	
	ДанныеФискальнойОперации.ВариантОтправкиЭлектронногоЧека = Перечисления.ВариантыОтправкиЭлектронногоЧекаПокупателю.НеОтправлять; //+АняновМА, было: Перечисления.ВариантыОтправкиЭлектронногоЧекаПокупателю.ПустаяСсылка()
	ДанныеФискальнойОперации.КонтактныеДанныеЭлектронногоЧека = "";
	
КонецПроцедуры
Показать


Если вариант оплаты не заполнен, то после эквайринговой операции (даже если она на всю сумму чека) открывается окно с кнопкой "Пробить чек". Если клиенту необходимо отправлять чеки по СМС или e-mail, это указывается в карточке клиента, которая к дисконтной карте привязана. По умолчанию всегда печатаем сразу чек.

2. Общий модуль РозничныеПродажиКлиент, процедура ОплатаКартойПослеЗавершенияВыбораЭквайринговогоТерминала:
&Вместо("ОплатаКартойПослеЗавершенияВыбораЭквайринговогоТерминала")
Процедура Доп_ОплатаКартойПослеЗавершенияВыбораЭквайринговогоТерминала­(СтруктураЭквайринговыйТерминал, ДополнительныеПараметры)
	
	Если СтруктураЭквайринговыйТерминал <> Неопределено Тогда
		ИдентификаторУстройстваЭТ = СтруктураЭквайринговыйТерминал.ПодключаемоеОборудование;
	Иначе
		ИдентификаторУстройстваЭТ = Неопределено;
	КонецЕсли;
	
	ДополнительныеПараметры.ИдентификаторУстройстваЭТ      = ИдентификаторУстройстваЭТ;
	ДополнительныеПараметры.СтруктураЭквайринговыйТерминал = СтруктураЭквайринговыйТерминал;
	
	Если ЗначениеЗаполнено(ИдентификаторУстройстваЭТ)
		Или (СтруктураЭквайринговыйТерминал <> Неопределено
		   И СтруктураЭквайринговыйТерминал.ИспользоватьБезПодключенияОборудования) Тогда
		
		Если Не СтруктураЭквайринговыйТерминал.ИспользоватьБезПодключенияОборудования Тогда
			РезультатЭТ = МенеджерОборудованияУТКлиент.ОборудованиеПодключено(ИдентификаторУстройстваЭТ);
		Иначе
			РезультатЭТ = Истина;
		КонецЕсли;
		
		Если РезультатЭТ Тогда
			
			//+АняновМА
			Если ДополнительныеПараметры.ФормаАвторизации_Сумма = ДополнительныеПараметры.ФормаАвторизации_ПределСуммы
				И НЕ СтруктураЭквайринговыйТерминал.ИспользоватьБезПодключенияОборудования Тогда
				
				СтруктураВозврата = Новый Структура();
				СтруктураВозврата.Вставить("Сумма"         , ДополнительныеПараметры.ФормаАвторизации_Сумма);
				СтруктураВозврата.Вставить("ДанныеКарты"   , "");
				СтруктураВозврата.Вставить("СсылочныйНомер", "");
				СтруктураВозврата.Вставить("ТипКарты"      , 0);
				СтруктураВозврата.Вставить("НомерКарты"    , "");
				СтруктураВозврата.Вставить("НомерЧека"     , "");
				СтруктураВозврата.Вставить("НомерЧекаЭТ"   , "");
				
				ДобавитьОплатуКартойЗавершение(СтруктураВозврата, ДополнительныеПараметры);
				Возврат;
			КонецЕсли;	
			//-АняновМА
			
			ПараметрыФормы = Новый Структура;
			ПараметрыФормы.Вставить("Сумма",       ДополнительныеПараметры.ФормаАвторизации_Сумма);
			ПараметрыФормы.Вставить("ПределСуммы", ДополнительныеПараметры.ФормаАвторизации_ПределСуммы);
			ПараметрыФормы.Вставить("Валюта",      ДополнительныеПараметры.Валюта);
			
			Если СтруктураЭквайринговыйТерминал.ИспользоватьБезПодключенияОборудования Тогда
				ПараметрыФормы.Вставить("ПоказыватьНомерКарты", Истина);
			КонецЕсли;
			
			ОткрытьФорму(
				"Справочник.ПодключаемоеОборудование.Форма.ФормаАвторизацииЭТ", ПараметрыФормы,,,,,
				Новый ОписаниеОповещения(
					"ДобавитьОплатуКартойЗавершение",
					РозничныеПродажиКлиент,
					ДополнительныеПараметры),
				РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
			
		Иначе
			
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
			НСтр("ru = 'Эквайринговый терминал не подключен. Операция по карте не выполнена.'"));
			
			ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеОЗавершении, Неопределено);
			
		КонецЕсли;
		
	Иначе
		
		// Не выбран эквайринговый терминал
		
		ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеОЗавершении, Неопределено);
		
	КонецЕсли;
	
КонецПроцедуры
Показать


Тут все просто - если у нас сумма оплаты = сумме чека и используется реальный эквайринговый терминал, то не показываем окно авторизации оплаты (Справочник.ПодключаемоеОборудование.Форма.ФормаАвторизацииЭТ), а сразу отправляем команду на эквайринговый терминал.

Надеюсь кому-то пригодится.
Оставьте свое сообщение
Вакансии
Программист 1С
Казань
зарплата от 150 000 руб.
Полный день

Программист 1С:ERP
Москва
зарплата от 100 000 руб.
Полный день

Разработчик 1С
Москва
зарплата от 200 000 руб. до 300 000 руб.
Полный день

Программист 1С (удаленно)
Самара
зарплата от 230 000 руб. до 230 000 руб.
Полный день

Руководитель группы разработки 1С
Москва
зарплата от 250 000 руб. до 250 000 руб.
Полный день