Чек ККМ / Форма оплаты СБП / Модуль формы

файл

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	// Пропускаем инициализацию, чтобы гарантировать получение формы при передаче параметра "АвтоТест".
	Если Параметры.Свойство("АвтоТест") Тогда
		Возврат;
	КонецЕсли;
	
	Пользователь = Пользователи.ТекущийПользователь();
	ПраваДоступа = НастройкиПродажДляПользователейСервер.ПраваДоступаРМК(Пользователь);
	
	РозничныеПродажи.ПодписатьГорячиеКлавишиНаКнопках(ЭтотОбъект);
	Дисплеи.ЗагрузитьЗначения(МенеджерОборудованияВызовСервера.ОборудованиеПоПараметрам("ДисплейПокупателя"));
	АвтоматическиСоздаватьПартнеров = Константы.АвтоматическиСоздаватьПартнеровПриОтправкеЭлектронногоЧекаПокупателю.Получить();
	АвтоматическиОбновлятьКонтактыПартнеров = Константы.ОбновлятьКонтактнуюИнформациюПартнеровПриОтправкеЭлектронныхЧеков.Получить();
	ОтправкаЭлектронныхЧековПослеПробитияЧека = Константы.ОтправкаЭлектронныхЧековПослеПробитияЧека.Получить();
	
	РабочееМестоКлиента = МенеджерОборудованияВызовСервера.РабочееМестоКлиента();

	Организация  = Параметры.Организация;
	КассаККМ     = Параметры.КассаККМ;
	Валюта       = Параметры.Валюта;
	
	ЗаполнитьСписокДоговоровИПодключений(Организация);
	
	ИнформацияОбОплате = Параметры.ИнформацияОбОплате;
	ДокументОплаты     = ИнформацияОбОплате.Документ;
	КОплате            = ИнформацияОбОплате.СуммаКОплате - ИнформацияОбОплате.ИтогоОплачено;
	
	ЭтоВозврат = Ложь;
	Если ТипЗнч(ДокументОплаты) = Тип("ДокументСсылка.ЧекККМВозврат")
		ИЛИ ТипЗнч(ДокументОплаты) = Тип("ДокументСсылка.ВозвратПодарочныхСертификатов")
		ИЛИ ТипЗнч(ДокументОплаты) = Тип("ДокументСсылка.ОперацияПоПлатежнойКарте") И ЗначениеЗаполнено(Параметры.ДатаВозврата) Тогда
		ЭтоВозврат = Истина;
		
		ДатаВозврата     = Параметры.ДатаВозврата;
		ДокументВозврата = ИнформацияОбОплате.Документ;
		ДокументОплаты   = Параметры.ДокументОплаты;
		ИдентификаторОплаты  = Параметры.СсылочныйНомер;

		Если ЗначениеЗаполнено(ДокументОплаты) Тогда
			ДоговорПодключения   = Параметры.ДоговорПодключения;
			НастройкаПодключения = РозничныеПродажиЛокализация.НастройкаПодключения(ДоговорПодключения);
			КОплате = ИнформацияОбОплате.СБП;
			ЗаполнитьСписокВыбораБанкаКлиента();
		Иначе
			КОплате = ИнформацияОбОплате.СуммаКОплате;
		КонецЕсли;
		
		Если ТипЗнч(ДокументВозврата) = Тип("ДокументСсылка.ОперацияПоПлатежнойКарте") Тогда
			БанкКлиента = Параметры.БанкКлиента;
		КонецЕсли;
		Заголовок = НСтр("ru='Возврат оплаты СБП'");
	Иначе
		
		ДатаОплаты = Параметры.ДатаОплаты;
		ИдентификаторФискальногоУстройства = Параметры.ИдентификаторФискальногоУстройства;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	Если ЭтоВозврат Тогда
		Если ЗначениеЗаполнено(ДокументОплаты) Тогда
			Если ТипЗнч(ДокументВозврата) = Тип("ДокументСсылка.ОперацияПоПлатежнойКарте") Тогда
				ТекущийЭтапПроцессаОплатыСБП = ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОжиданияВозвратаОплаты;
				ОтобразитьСтраницуЭтапаОжиданияВозвратаОплаты();
			Иначе
				ТекущийЭтапПроцессаОплатыСБП = ЭтапыПроцессаОплатыВозвратаСБП().ЭтапВводДанныхВозвращаемойОплаты;
				ОтобразитьСтраницуЭтапаВводДанныхВозвращаемойОплаты();
			КонецЕсли;
		Иначе
			ТекущийЭтапПроцессаОплатыСБП = ЭтапыПроцессаОплатыВозвратаСБП().ЭтапВыбораДоговораПодключения;
			ОтобразитьСтраницуЭтапаВыбораДоговораПодключения();
		КонецЕсли;
	Иначе
		ТекущийЭтапПроцессаОплатыСБП = ЭтапыПроцессаОплатыВозвратаСБП().ЭтапВыбораДоговораПодключения;
		ОтобразитьСтраницуЭтапаВыбораДоговораПодключения();
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыСписокДоговоровИПодключений

&НаКлиенте
Процедура СписокДоговоровИПодключенийВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	УстановитьВыбранныйДоговорИПодключение(Элемент.ТекущиеДанные);
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура ВыбратьДоговор(Команда)
	
	УстановитьВыбранныйДоговорИПодключение(Элементы.СписокДоговоровИПодключений.ТекущиеДанные);
	
КонецПроцедуры

&НаКлиенте
Процедура ПовторитьОперацию(Команда)
	
	Если ТекущийЭтапПроцессаОплатыСБП = ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОбработкиОшибкиПолученияQRКодаОплаты Тогда
		
		ТекущийЭтапПроцессаОплатыСБП = ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОжиданияПолученияQRКодаОплаты;
		ОтобразитьСтраницуЭтапаОжиданияПолученияQRКодаОплаты();
		
	ИначеЕсли ТекущийЭтапПроцессаОплатыСБП = ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОбработкиОшибкиВыводаПречека Тогда
		
		ВывестиПречекНаФискальномУстройстве();
		
	ИначеЕсли ТекущийЭтапПроцессаОплатыСБП = ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОжиданияВнесенияОплаты Тогда
		
		Если ВидСсылкиСБП = ПредопределенноеЗначение("Перечисление.ВидыСсылокСБП.КассоваяСсылкаСБП")
			И ПоследнийСтатусОперации = "Отменена" Тогда
			АктивироватьКассовуюСсылку();
		Иначе
			ОтобразитьСтраницуЭтапаОжиданияВнесенияОплаты();
		КонецЕсли;
		
	ИначеЕсли ТекущийЭтапПроцессаОплатыСБП = ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОжиданияВозвратаОплаты Тогда
		
		ОтобразитьСтраницуЭтапаОжиданияВозвратаОплаты();
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ВывестиПречек(Команда)
	
	ВывестиПречекНаФискальномУстройстве();
	
КонецПроцедуры

&НаКлиенте
Процедура ПодтвердитьОплату(Команда)
	
	Если ТекущийЭтапПроцессаОплатыСБП = ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОжиданияВнесенияОплаты Тогда
		
		СтруктураПараметров = Новый Структура();
		СтруктураПараметров.Вставить("РучноеПодтверждениеОплаты", Истина);
		
		ОповещениеЗавершитьОплату = Новый ОписаниеОповещения("ЗавершитьОплатуВозвратПлатежнойСистемой", ЭтотОбъект, СтруктураПараметров);
		
		ТекстИнформации   = НСтр("ru = 'Проверьте выполнение операции оплаты платежной системы.'") + Символы.ПС;
		ТекстСуммыКОплате = НСтр("ru = 'Сумма операции:'") + " " + КОплате  + Символы.ПС;
		
		ПоказатьВопрос(
			ОповещениеЗавершитьОплату,
			ТекстИнформации + ТекстСуммыКОплате,
			РежимДиалогаВопрос.ДаНет,,,
			НСтр("ru = 'Операция оплаты прошла успешно?'"));
			
	ИначеЕсли ЭтоВозврат Тогда
		
		ОповещениеЗавершитьОплату = Новый ОписаниеОповещения("ЗавершитьОплатуВозвратПлатежнойСистемой", ЭтотОбъект);
		
		ТекстИнформации   = НСтр("ru = 'Проверьте выполнение операции возврата оплаты платежной системы.'") + Символы.ПС;
		ТекстСуммыКОплате = НСтр("ru = 'Сумма операции:'") + " " + КОплате  + Символы.ПС;
		
		ПоказатьВопрос(
			ОповещениеЗавершитьОплату,
			ТекстИнформации + ТекстСуммыКОплате,
			РежимДиалогаВопрос.ДаНет,,,
			НСтр("ru = 'Операция оплаты прошла успешно?'"));
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПодтвердитьВозвратОплаты(Команда)
	
	Если ЭтоВозврат Тогда
		
		ОбработатьСтатусВозврата(
			ПодтвердитьВозвратОплатыНаСервере(),
			Новый ОписаниеОповещения("ЗавершитьОплатуВозвратПлатежнойСистемой", ЭтотОбъект));
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОтложитьЧек(Команда)
	
	ОтложитьЧекНаСервере();
	ЗавершитьОплатуВозвратПлатежнойСистемой("ОтложитьЧек");
	
КонецПроцедуры

&НаКлиенте
Процедура ВернутьОплату(Команда)
	
	ТекущийЭтапПроцессаОплатыСБП = ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОжиданияВозвратаОплаты;
	ОтобразитьСтраницуЭтапаОжиданияВозвратаОплаты();
	
КонецПроцедуры

&НаКлиенте
Процедура ОтменитьОперацию(Команда)
	
	ОтменитьТекущуюОперацию();
	
КонецПроцедуры

&НаКлиенте
Процедура ПоказатьИнструкцию(Команда)
	
	Если Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаQRКодОплаты Тогда
		ОтобразитьСтраницуИнструкции();
	Иначе
		Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаQRКодОплаты;
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

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

	Возврат Этапы;
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ОбработчикиОжидания()
	
	ОбработчикиОжидания = Новый Структура;
	
	// оплата
	ОбработчикиОжидания.Вставить("ПолучитьИдентификаторОплаты", "ПолучитьИдентификаторОплаты");
	ОбработчикиОжидания.Вставить("ОпределитьСтатусОплаты", "ОпределитьСтатусОплаты");
	ОбработчикиОжидания.Вставить("АктивироватьКассовуюСсылку", "АктивироватьКассовуюСсылку");
	ОбработчикиОжидания.Вставить("ДеактивироватьКассовуюСсылку", "ДеактивироватьКассовуюСсылку");
	
	// возврат
	ОбработчикиОжидания.Вставить("ВыполнитьВозвратОплаты", "ВыполнитьВозвратОплаты");
	ОбработчикиОжидания.Вставить("ОпределитьСтатусВозврата", "ОпределитьСтатусВозврата");
	
	Возврат ОбработчикиОжидания;
	
КонецФункции

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

// Отобразить доступные команды.
// 
// Параметры:
// 	ДоступныеКоманды - см. ДоступныеКоманды
&НаСервере
Процедура ОтобразитьДоступныеКоманды(ДоступныеКоманды)
	
	Для Каждого КлючИЗначение Из ДоступныеКоманды Цикл
		ЭлементФормыКоманда = Элементы[КлючИЗначение.Ключ];
		ЭлементФормыКоманда.Видимость = КлючИЗначение.Значение;
	КонецЦикла;
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ВалютаДляПечати(Валюта)
	
	РеквизитыВалюты = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Валюта, "Код,Наименование");
	
	Если РеквизитыВалюты.Код = "643" Тогда
		ВалютаДляПечати = НСтр("ru = 'руб.'");
	Иначе
		ВалютаДляПечати = СокрЛП(РеквизитыВалюты.Наименование);
	КонецЕсли;
	
	Возврат ВалютаДляПечати;
	
КонецФункции

&НаСервере
Процедура ЗаполнитьСписокДоговоровИПодключений(Организация)
	
	СписокДоговоровИПодключений.Загрузить(
		Справочники.НастройкиРМК.СписокДоговоровИПодключенийСБП(Организация, КассаККМ));
	Если СписокДоговоровИПодключений.Количество() = 0 Тогда
		ВидСсылкиСБП = Неопределено;
	Иначе
		ВидСсылкиСБП = СписокДоговоровИПодключений[0].ВидСсылкиСБП;
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Функция СформироватьДанныеQRКода(СтруктураКода, Идентификатор)
	
	СтруктураКода = Новый Структура;
	СтруктураКода.Вставить("ИдентификаторQRКода", Идентификатор);
	СтруктураКода.Вставить("КартинкаQRКода"     , Неопределено);
	СтруктураКода.Вставить("ДанныеQRКода"       , ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор));
	
	ДвоичныеДанныеQRКода = СистемаБыстрыхПлатежей.ИзображениеQRКодаСБП(Идентификатор, 280, 0);
	
	СтруктураКода.КартинкаQRКода = Base64Строка(ДвоичныеДанныеQRКода);
	СтруктураКода.ДанныеQRКода   = ПоместитьВоВременноеХранилище(ДвоичныеДанныеQRКода, УникальныйИдентификатор);
	
	Возврат СтруктураКода;
	
КонецФункции

&НаСервере
Функция ПараметрыНастройкиПодключения()
	
	ПараметрыНастройкиПодключения = СистемаБыстрыхПлатежей.НастройкиПодключения(НастройкаПодключения);
	НастройкиВозвратаОплаты = ПереводыСБПc2b.НастройкиВозвратаОплаты(ДокументОплаты, НастройкаПодключения);
	
	ПараметрыНастройкиПодключения.Вставить("УчастникСБПВозврата", НастройкиВозвратаОплаты.УчастникСБПВозврата);
	Если НастройкиВозвратаОплаты.УчастникСБПВозврата Тогда
		ПараметрыНастройкиПодключения.Вставить("ПлатежныеСистемыВозврата", НастройкиВозвратаОплаты.УчастникиСБПДляВозврата);
	КонецЕсли;

	Возврат ПараметрыНастройкиПодключения;
	
КонецФункции

&НаСервере
Процедура ЗаполнитьСписокВыбораБанкаКлиента()
	
	ПараметрыНастройкиПодключения = ПараметрыНастройкиПодключения();
	
	Если ПараметрыНастройкиПодключения.УчастникСБПВозврата Тогда
		
		Элементы.БанкКлиента.СписокВыбора.Очистить();
		
		Для Каждого КлючЗначение Из ПараметрыНастройкиПодключения.ПлатежныеСистемыВозврата Цикл
			Элементы.БанкКлиента.СписокВыбора.Добавить(КлючЗначение.Ключ, КлючЗначение.Значение);
			Элементы.БанкКлиента.СписокВыбора.СортироватьПоПредставлению();
		КонецЦикла;
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗавершитьОплатуВозвратПлатежнойСистемой(Действие, ДополнительныеПараметры = Неопределено) Экспорт
	
	Если Действие = КодВозвратаДиалога.Нет Тогда   
		Возврат;
	КонецЕсли;
	
	РезультатВыполнения = Новый Структура();
	РезультатВыполнения.Вставить("Результат", Истина);
	Если ЭтоВозврат Тогда
		РезультатВыполнения.Вставить("СуммаВозврата", КОплате);
	Иначе
		РезультатВыполнения.Вставить("СуммаОплаты", КОплате);
	КонецЕсли;
	РезультатВыполнения.Вставить("ИдентификаторПлатежнойСистемы", ИдентификаторПлатежнойСистемы);
	РезультатВыполнения.Вставить("ИдентификаторОплаты", ИдентификаторОплаты);
	РезультатВыполнения.Вставить("ДоговорПодключения", ДоговорПодключения);
	РезультатВыполнения.Вставить("НастройкаПодключения", НастройкаПодключения);
	РезультатВыполнения.Вставить("РучноеПодтверждениеОплаты", Ложь);
	
	Если ЗначениеЗаполнено(ДополнительныеПараметры) И ДополнительныеПараметры.Свойство("РучноеПодтверждениеОплаты")
			И ДополнительныеПараметры.РучноеПодтверждениеОплаты = Истина Тогда
			РезультатВыполнения.РучноеПодтверждениеОплаты = Истина; 
			ОтложитьЧекНаСервере();
		КонецЕсли;
	
	Если Действие = "ОтложитьЧек" Тогда
		РезультатВыполнения.Вставить("ЧекОтложен", Истина);
	Иначе
		РезультатВыполнения.Вставить("ЧекОтложен", Ложь);
	КонецЕсли;
	
	ПринудительноЗакрытьФорму = Истина;
	Закрыть(РезультатВыполнения);
	
КонецПроцедуры

&НаСервере
Процедура ОтложитьЧекНаСервере()
	
	ДокументКОбработке = ?(ЭтоВозврат, ДокументВозврата, ДокументОплаты);
	ПереводыСБПc2b.УстановитьОтложенноеПолучениеСтатуса(ДокументКОбработке, Истина);
	
КонецПроцедуры

#Область СлужебныеМетодыОбработкиКомандФормы

&НаКлиенте
Процедура УстановитьВыбранныйДоговорИПодключение(СтрокаНастройкиДоговора)
	
	Если СтрокаНастройкиДоговора = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ДоговорПодключения = СтрокаНастройкиДоговора.ДоговорПодключения;
	НастройкаПодключения = СтрокаНастройкиДоговора.НастройкаПодключения;
	
	Если ЭтоВозврат Тогда
		ТекущийЭтапПроцессаОплатыСБП = ЭтапыПроцессаОплатыВозвратаСБП().ЭтапВводДанныхВозвращаемойОплаты;
		ОтобразитьСтраницуЭтапаВводДанныхВозвращаемойОплаты();
	ИначеЕсли ВидСсылкиСБП = ПредопределенноеЗначение("Перечисление.ВидыСсылокСБП.КассоваяСсылкаСБП") Тогда
			ДанныеКассовойСсылки = НовыйДанныеКассовойСсылки();
			ДанныеКассовойСсылки.КассоваяСсылка = СтрокаНастройкиДоговора.КассоваяСсылка;
			ДанныеКассовойСсылки.ИдентификаторОплаты = СтрокаНастройкиДоговора.ИдентификаторОплаты;
			
			ТекущийЭтапПроцессаОплатыСБП = ЭтапыПроцессаОплатыВозвратаСБП().ЭтапАктивацииКассовойСсылки;
			АктивироватьКассовуюСсылку();

	Иначе
		ТекущийЭтапПроцессаОплатыСБП = ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОжиданияПолученияQRКодаОплаты;
		ОтобразитьСтраницуЭтапаОжиданияПолученияQRКодаОплаты();
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОтменитьТекущуюОперацию()
	
	Если ТекущийЭтапПроцессаОплатыСБП = ЭтапыПроцессаОплатыВозвратаСБП().ЭтапПодтвержденияПолученияВозвратаОплаты Тогда
		ОтменитьПодтверждениеВозврата();
	ИначеЕсли ТекущийЭтапПроцессаОплатыСБП = ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОжиданияВнесенияОплаты Тогда
		ДеактивироватьКассовуюСсылку();
		Возврат;
	КонецЕсли;
	
	ПринудительноЗакрытьФорму = Истина;
	Закрыть(КодВозвратаДиалога.Отмена);
	
КонецПроцедуры

&НаКлиенте
Процедура ВывестиПречекНаДисплееПокупателя()
	
	ОписаниеОповещениеПриЗавершении  = Новый ОписаниеОповещения("ПечатьПречекаЗавершение", ЭтотОбъект);
	РозничныеПродажиКлиентЛокализация.ВывестиQRКодНаДисплейПокупателя(СтруктураQRКода.ИдентификаторQRКода, 
																	СтруктураQRКода.КартинкаQRКода, 
																	ОписаниеОповещениеПриЗавершении); 
	
КонецПроцедуры

&НаКлиенте
Процедура ВывестиПречекНаФискальномУстройстве()
	
	ОписаниеОповещениеПриЗавершении  = Новый ОписаниеОповещения("ПечатьПречекаЗавершение", ЭтотОбъект);
	
	ПараметрыОперации = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыПечатиQRКодаНаФискальномУстройстве();
		
	ПараметрыОперации.СуммаОперации       = КОплате;
	ПараметрыОперации.ТипПлатежнойСистемы = ПредопределенноеЗначение("Перечисление.ТипыПлатежнойСистемыККТ.СистемаБыстрыхПлатежей");
	ПараметрыОперации.QRКод.ЗначениеКода  = СтруктураQRКода.ИдентификаторQRКода;
	ПараметрыОперации.QRКод.ТекстПользователя = НСтр("ru='Для совершения платежа отсканируйте QR-код'");

	ОборудованиеЧекопечатающиеУстройстваКлиент.НачатьПечатьQRКодаНаФискальномУстройстве(
		ОписаниеОповещениеПриЗавершении,
		Новый УникальныйИдентификатор, 
		ИдентификаторФискальногоУстройства,
		ПараметрыОперации);
	
КонецПроцедуры

&НаКлиенте
Процедура ПечатьПречекаЗавершение(РезультатВыполнения, Параметры) Экспорт
	
	Если РезультатВыполнения.Результат Тогда
		
		Если ТекущийЭтапПроцессаОплатыСБП = ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОбработкиОшибкиВыводаПречека Тогда
			ТекущийЭтапПроцессаОплатыСБП = ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОжиданияВнесенияОплаты;
			ОтобразитьСтраницуЭтапаОжиданияВнесенияОплаты(Ложь);
		КонецЕсли;
		
	Иначе
		
		ТекущийЭтапПроцессаОплатыСБП = ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОбработкиОшибкиВыводаПречека;
		ОтобразитьСтраницуОшибкиЗавершенияОперации(
			ЭтапыПроцессаОплатыВозвратаСБП().ЭтапВыводаПречека,
			РезультатВыполнения.ОписаниеОшибки);
		
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОтображениеСтраницыЭтапа

&НаКлиенте
Процедура ОтобразитьСтраницуЭтапаВыбораДоговораПодключения()
	
	Если СписокДоговоровИПодключений.Количество() = 1 Тогда
		УстановитьВыбранныйДоговорИПодключение(СписокДоговоровИПодключений[0]);
		Возврат;
	КонецЕсли;
	
	Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаСписокДоговоровИПодключений;
	
	ДоступныеКоманды = ДоступныеКоманды();
	ДоступныеКоманды.ФормаВыбратьДоговор = Истина;
	ДоступныеКоманды.ФормаОтменитьОперацию = Истина;
	ОтобразитьДоступныеКоманды(ДоступныеКоманды);
	
КонецПроцедуры

&НаКлиенте
Процедура ОтобразитьСтраницуЭтапаОжиданияПолученияQRКодаОплаты()
	
	Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаОжиданиеЗавершенияОперации;
	
	ДоступныеКоманды = ДоступныеКоманды();
	ДоступныеКоманды.ФормаОтменитьОперацию = Истина;
	ОтобразитьДоступныеКоманды(ДоступныеКоманды);
	
	ТекстСтрока1 = НСтр("ru = 'Формируется QR-код оплаты в платежной системе.'");
	ТекстСтрока2 = НСтр("ru = 'Пожалуйста, подождите...'");
	
	Элементы.ДекорацияНадписьТекстДлительнойОперации.Заголовок = ТекстСтрока1 + Символы.ПС + ТекстСтрока2;
	
	ПодключитьОбработчикОжидания(ОбработчикиОжидания().ПолучитьИдентификаторОплаты, 0.1, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ОтобразитьСтраницуЭтапаОжиданияВнесенияОплаты(ЗапуститьОбработчикОжидания = Истина)
	
	Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаQRКодОплаты;
	
	ДоступныеКоманды = ДоступныеКоманды();
	ДоступныеКоманды.ФормаВывестиПречек = Истина;
	ДоступныеКоманды.ФормаОтменитьОперацию = Истина;
	ОтобразитьДоступныеКоманды(ДоступныеКоманды);
	
	Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаQRКодОплаты;
	
	ШаблонНадписиСуммаОплаты = НСтр("ru = 'Сумма оплаты: %1 %2'");
	Элементы.ДекорацияНадписьСуммаОплаты.Заголовок = СтрШаблон(
		ШаблонНадписиСуммаОплаты, 
		Формат(КОплате, "ЧДЦ=2; ЧГ="),
		ВалютаДляПечати(Валюта));
	
	Если ЗапуститьОбработчикОжидания Тогда
		ПодключитьОбработчикОжидания(ОбработчикиОжидания().ОпределитьСтатусОплаты, 0.1, Истина);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОтобразитьСтраницуИнструкции()
	
	Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаИнструкция;
	
	ДоступныеКоманды = ДоступныеКоманды();
	ДоступныеКоманды.ФормаВывестиПречек = Истина;
	ДоступныеКоманды.ФормаОтменитьОперацию = Истина;
	ОтобразитьДоступныеКоманды(ДоступныеКоманды);
	
КонецПроцедуры

&НаКлиенте
Процедура ОтобразитьСтраницуОшибкиЗавершенияОперации(ОшибкаЭтапаПроцесса, ТекстОшибки = "")
	
	Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаОшибкаЗавершенияОперации;
	
	ДоступныеКоманды = ДоступныеКоманды();
	Если ОшибкаЭтапаПроцесса = ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОжиданияПолученияQRКодаОплаты Тогда
		
		ДоступныеКоманды.ФормаПовторитьОперацию = Истина;
		ДоступныеКоманды.ФормаОтменитьОперацию = Истина;
		ОтобразитьДоступныеКоманды(ДоступныеКоманды);
		
		Если Не ЗначениеЗаполнено(ТекстОшибки) Тогда
			Элементы.ДекорацияНадписьТекстОшибки.Заголовок = НСтр("ru = 'Ошибка получения QR-кода оплаты'");
		КонецЕсли;
	
	ИначеЕсли ОшибкаЭтапаПроцесса = ЭтапыПроцессаОплатыВозвратаСБП().ЭтапВыводаПречека Тогда
		
		ДоступныеКоманды.ФормаПовторитьОперацию = Истина;
		ДоступныеКоманды.ФормаОтменитьОперацию = Истина;
		ОтобразитьДоступныеКоманды(ДоступныеКоманды);
		
		Если Не ЗначениеЗаполнено(ТекстОшибки) Тогда
			Элементы.ДекорацияНадписьТекстОшибки.Заголовок = НСтр("ru = 'При выводе пречека на кассовую ленту произошла ошибка'");
		КонецЕсли;
	
	ИначеЕсли ОшибкаЭтапаПроцесса = ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОжиданияВнесенияОплаты Тогда
		
		ЭтоОтменаОплатыПоКассовойСсылке = 
			ВидСсылкиСБП = ПредопределенноеЗначение("Перечисление.ВидыСсылокСБП.КассоваяСсылкаСБП") 
			И ПоследнийСтатусОперации = "Отменена";
		ДоступныеКоманды.ФормаПовторитьОперацию = НЕ ЭтоОтменаОплатыПоКассовойСсылке;
		ДоступныеКоманды.ФормаПодтвердитьОплату = 
			ПраваДоступа.РазрешитьОплатуБезПодтвержденияОтСБП
			И НЕ ЭтоОтменаОплатыПоКассовойСсылке;
		ДоступныеКоманды.ФормаОтложитьЧек = Истина;
		ДоступныеКоманды.ФормаОтменитьОперацию = Истина;
		ОтобразитьДоступныеКоманды(ДоступныеКоманды);
		
		Если Не ЗначениеЗаполнено(ТекстОшибки) Тогда
			Элементы.ДекорацияНадписьТекстОшибки.Заголовок = НСтр("ru = 'Платежная система не подтвердила оплату.'");
		КонецЕсли;
		
	ИначеЕсли ОшибкаЭтапаПроцесса = ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОжиданияВозвратаОплаты Тогда
		
		ДоступныеКоманды.ФормаПовторитьОперацию = Истина;
		ДоступныеКоманды.ФормаПодтвердитьОплату = ПраваДоступа.РазрешитьОплатуБезПодтвержденияОтСБП;
		ДоступныеКоманды.ФормаОтменитьОперацию = Истина;
		ОтобразитьДоступныеКоманды(ДоступныеКоманды);
		
		Если Не ЗначениеЗаполнено(ТекстОшибки) Тогда
			Элементы.ДекорацияНадписьТекстОшибки.Заголовок = НСтр("ru = 'Платежная система не подтвердила возврат оплаты.'");
		КонецЕсли;
		
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ТекстОшибки) Тогда
		Элементы.ДекорацияНадписьТекстОшибки.Заголовок = ТекстОшибки;
	КонецЕсли;
	
	Элементы.ДекорацияНадписьПриОшибкеПодтвердитьОплату.Видимость = ДоступныеКоманды.ФормаПодтвердитьОплату;
	Элементы.ДекорацияНадписьПриОшибкеОтложитьЧек.Видимость = ДоступныеКоманды.ФормаОтложитьЧек;
	
КонецПроцедуры

&НаКлиенте
Процедура ОтобразитьСтраницуЭтапаВводДанныхВозвращаемойОплаты()
	
	Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаВозвратОплаты;
	
	ДоступныеКоманды = ДоступныеКоманды();
	ДоступныеКоманды.ФормаВернутьОплату = Истина;
	ДоступныеКоманды.ФормаОтменитьОперацию = Истина;
	ОтобразитьДоступныеКоманды(ДоступныеКоманды);
	
	Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаВозвратОплаты;
	
	Элементы.ИдентификаторОплаты.Видимость = НЕ ЗначениеЗаполнено(ИдентификаторОплаты);
	
	Элементы.БанкКлиента.Видимость = Элементы.БанкКлиента.СписокВыбора.Количество() > 0;
	
КонецПроцедуры

&НаКлиенте
Процедура ОтобразитьСтраницуЭтапаОжиданияВозвратаОплаты()
	
	Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаОжиданиеЗавершенияОперации;
	
	ДоступныеКоманды = ДоступныеКоманды();
	ДоступныеКоманды.ФормаОтменитьОперацию = Истина;
	ОтобразитьДоступныеКоманды(ДоступныеКоманды);
	
	ТекстСообщения = НСтр("ru = 'Выполнение возврата в платежной системе. Пожалуйста, подождите...'");
	Элементы.ДекорацияНадписьТекстДлительнойОперации.Заголовок = ТекстСообщения;
	
	ПодключитьОбработчикОжидания(ОбработчикиОжидания().ВыполнитьВозвратОплаты, 0.1, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ОтобразитьСтраницуЭтапаОпределенияСтатусаВозвратаОплаты()
	
	Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаОжиданиеЗавершенияОперации;
	
	ДоступныеКоманды = ДоступныеКоманды();
	ДоступныеКоманды.ФормаОтменитьОперацию = Истина;
	ОтобразитьДоступныеКоманды(ДоступныеКоманды);
	
	ТекстСообщения = НСтр("ru = 'Получение подтверждения возврата. Пожалуйста, подождите...'");
	Элементы.ДекорацияНадписьТекстДлительнойОперации.Заголовок = ТекстСообщения;
	
	ПодключитьОбработчикОжидания(ОбработчикиОжидания().ОпределитьСтатусВозврата, 0.1, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ОтобразитьСтраницуЭтапаПодтвержденияПолученияВозвратаОплаты(ДанныеОПодтверждении)
	
	Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаПодтверждениеОперации;
	
	ДоступныеКоманды = ДоступныеКоманды();
	ДоступныеКоманды.ФормаПодтвердитьВозвратОплаты = Истина;
	ДоступныеКоманды.ФормаОтменитьОперацию = Истина;
	ОтобразитьДоступныеКоманды(ДоступныеКоманды);
	
	Если ЗначениеЗаполнено(ДанныеОПодтверждении.НомерТелефона)
		И ЗначениеЗаполнено(ДанныеОПодтверждении.НомерСчета) Тогда
	
		Элементы.ДекорацияНадписьПодтверждениеОперации.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Денежные средства будут переведены %1 (номер телефона %2) в %3 на расчетный счет %4. 
						|Проверьте реквизиты и подтвердите перевод.'"),
			ДанныеОПодтверждении.ФИО,
			ДанныеОПодтверждении.НомерТелефона,
			Элементы.БанкКлиента.СписокВыбора.НайтиПоЗначению(БанкКлиента).Представление,
			ДанныеОПодтверждении.НомерСчета);
			
	Иначе
			
		Элементы.ДекорацияНадписьПодтверждениеОперации.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Денежные средства будут переведены %1 в %2 на расчетный счет. 
						|Проверьте реквизиты и подтвердите перевод.'"),
			
			ДанныеОПодтверждении.ФИО,
			Элементы.БанкКлиента.СписокВыбора.НайтиПоЗначению(БанкКлиента).Представление);
				
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ПлатежнаяСистема_Оплата

#Область ПолучениеИдентификатораОплаты

&НаКлиенте
Процедура ПолучитьИдентификаторОплаты() Экспорт
	
	ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
	ПараметрыОжидания.ВыводитьОкноОжидания = Ложь;
	
	РезультатВыполнения = ПолучитьИдентификаторОплатыНаСервере();
	ИдентификаторЗаданияФормированияQRКода = РезультатВыполнения.ИдентификаторЗадания;
	
	СтруктураСФормой = Новый Структура();
	СтруктураСФормой.Вставить("Форма", ЭтотОбъект);
	
	ОповещениеОЗавершении = Новый ОписаниеОповещения("ПолучитьИдентификаторОплатыЗавершение", ЭтотОбъект, СтруктураСФормой);
	
	Если РезультатВыполнения.Статус = "Выполнено" Тогда
		ПолучитьИдентификаторОплатыЗавершение(РезультатВыполнения, СтруктураСФормой);
		Возврат;
	КонецЕсли;
	
	ДлительныеОперацииКлиент.ОжидатьЗавершение(
		РезультатВыполнения,
		ОповещениеОЗавершении,
		ПараметрыОжидания);
	
КонецПроцедуры

&НаСервере
Функция ПолучитьИдентификаторОплатыНаСервере()
	
	ПараметрыПроцедуры = Новый Структура;
	ПараметрыПроцедуры.Вставить("ДокументОплаты", ДокументОплаты);
	ПараметрыПроцедуры.Вставить("НастройкаПодключения", НастройкаПодключения);
	ПараметрыПроцедуры.Вставить("ДатаОплаты", ДатаОплаты);
	ПараметрыПроцедуры.Вставить("СуммаОплаты", КОплате);
	
	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
	ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Формирование идентификатора оплаты.'");
	
	РезультатВыполнения = ДлительныеОперации.ВыполнитьВФоне(
		"РозничныеПродажиЛокализация.ИдентификаторОплатыВПлатежнойСистеме",
		ПараметрыПроцедуры,
		ПараметрыВыполнения);
		
	Возврат РезультатВыполнения;
	
КонецФункции

&НаКлиенте
Процедура ПолучитьИдентификаторОплатыЗавершение(РезультатВыполнения, ДополнительныеПараметры) Экспорт
	
	Если РезультатВыполнения = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если РезультатВыполнения.Статус = "Выполнено" Тогда
		
		РезультатОперации = ПолучитьИзВременногоХранилища(РезультатВыполнения.АдресРезультата);
		
		Если ЗначениеЗаполнено(РезультатОперации.КодОшибки) Тогда
			
			Если РезультатОперации.КодОшибки = "УжеОплачен" Тогда
				
				ОпределитьСтатусОплаты();
				
			Иначе
				
				ТекущийЭтапПроцессаОплатыСБП = ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОбработкиОшибкиПолученияQRКодаОплаты;
				ОтобразитьСтраницуОшибкиЗавершенияОперации(
					ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОжиданияПолученияQRКодаОплаты,
					РезультатОперации.СообщениеОбОшибке);
				
			КонецЕсли;
			
		Иначе
			
			ЭтоКассоваяСсылка = ВидСсылкиСБП = ПредопределенноеЗначение("Перечисление.ВидыСсылокСБП.КассоваяСсылкаСБП");
			Если ЭтоКассоваяСсылка Тогда
				
				СтруктураQRКода = СформироватьДанныеQRКода(Неопределено, ДанныеКассовойСсылки.КассоваяСсылка);
				
			Иначе
				
				СтруктураQRКода = СформироватьДанныеQRКода(СтруктураQRКода, РезультатОперации.ПлатежнаяСсылка);
			
			КонецЕсли;
			QRКодОплаты = СтруктураQRКода.ДанныеQRКода; // Отобразить QR-код оплаты на форме
			
			Если ОборудованиеДисплеиПокупателяКлиент.ПодключенныеДисплеиПокупателяВыводятQRКод() Тогда
				ВывестиПречекНаДисплееПокупателя();
			ИначеЕсли НЕ ЭтоКассоваяСсылка Тогда
				ВывестиПречекНаФискальномУстройстве();
			КонецЕсли;
			
			ТекущийЭтапПроцессаОплатыСБП = ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОжиданияВнесенияОплаты;
			ОтобразитьСтраницуЭтапаОжиданияВнесенияОплаты();
			
		КонецЕсли;
		
	ИначеЕсли РезультатВыполнения.Статус = "Ошибка" Тогда
		
		ТекущийЭтапПроцессаОплатыСБП = ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОбработкиОшибкиПолученияQRКодаОплаты;
		ОтобразитьСтраницуОшибкиЗавершенияОперации(ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОжиданияПолученияQRКодаОплаты);
		
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ПолучениеСтатусаОплаты

&НаКлиенте
Процедура ОпределитьСтатусОплаты() Экспорт
	
	ОповещениеЗавершитьОплату = Новый ОписаниеОповещения("ЗавершитьОплатуВозвратПлатежнойСистемой", ЭтотОбъект);
	
	ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
	ПараметрыОжидания.ВыводитьОкноОжидания = Ложь;
	ПараметрыОжидания.Интервал = 1;
	
	РезультатВыполнения = ОпределитьСтатусОплатыНаСервере();
	
	ИдентификаторЗаданияПроверкиСтатуса = РезультатВыполнения.ИдентификаторЗадания;
	
	ПараметрыЗавершения	  = Новый Структура("Форма, ОповещениеЗавершитьОплату", ЭтотОбъект, ОповещениеЗавершитьОплату);	
	ОповещениеОЗавершении = Новый ОписаниеОповещения("ОпределитьСтатусОплатыЗавершение", ЭтотОбъект, ПараметрыЗавершения);
	
	Если РезультатВыполнения.Статус = "Выполнено" Тогда
		ОпределитьСтатусОплатыЗавершение(РезультатВыполнения, ПараметрыЗавершения);
		Возврат;
	КонецЕсли;
	
	ДлительныеОперацииКлиент.ОжидатьЗавершение(
		РезультатВыполнения,
		ОповещениеОЗавершении,
		ПараметрыОжидания);
	
КонецПроцедуры

&НаКлиенте
Процедура ОпределитьСтатусОплатыЗавершение(РезультатВыполнения, ДополнительныеПараметры) Экспорт
	
	Если РезультатВыполнения = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ОповещениеЗавершитьОплату = ДополнительныеПараметры.ОповещениеЗавершитьОплату;
	
	Если РезультатВыполнения.Статус = "Выполнено" Тогда
		
		РезультатОперации = ПолучитьИзВременногоХранилища(РезультатВыполнения.АдресРезультата);
		
		СтатусОперацииВыполняется = СистемаБыстрыхПлатежейКлиентСервер.СтатусОперацииВыполняется();
		СтатусОперацииВыполнена   = СистемаБыстрыхПлатежейКлиентСервер.СтатусОперацииВыполнена();
		СтатусОперацииОтменена    = СистемаБыстрыхПлатежейКлиентСервер.СтатусОперацииОтменена();
		СтатусОперацииОшибка      = СистемаБыстрыхПлатежейКлиентСервер.СтатусОперацииОшибка();
		
		ПоследнийСтатусОперации = РезультатОперации.СтатусОперации;
		
		Если РезультатОперации.СтатусОперации = СтатусОперацииВыполняется Тогда
			
			ОтобразитьСтраницуОшибкиЗавершенияОперации(ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОжиданияВнесенияОплаты);
			
		ИначеЕсли РезультатОперации.СтатусОперации = СтатусОперацииВыполнена Тогда
			
			ВыполнитьОбработкуОповещения(ОповещениеЗавершитьОплату, "ДобавитьВидОплаты");
			
		ИначеЕсли РезультатОперации.СтатусОперации = СтатусОперацииОтменена Тогда
			
			ОтобразитьСтраницуОшибкиЗавершенияОперации(
				ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОжиданияВнесенияОплаты,
				НСтр("ru = 'Операция отменена. Истек срок действия QR-кода или операция была отклонена СБП.'"));
			
		ИначеЕсли РезультатОперации.СтатусОперации = СтатусОперацииОшибка Тогда
			
			ОтобразитьСтраницуОшибкиЗавершенияОперации(
				ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОжиданияВнесенияОплаты,
				РезультатОперации.СообщениеОбОшибке);
			
		КонецЕсли;
		
	ИначеЕсли РезультатВыполнения.Статус = "Ошибка" Тогда
		
		ОтобразитьСтраницуОшибкиЗавершенияОперации(
			ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОжиданияВнесенияОплаты,
			РезультатВыполнения.КраткоеПредставлениеОшибки);
		
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Функция ОпределитьСтатусОплатыНаСервере()
	
	ПараметрыПроцедуры = Новый Структура;
	ПараметрыПроцедуры.Вставить("ДокументОплаты",       ДокументОплаты);
	
	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
	ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Проверка статуса оплаты.'");
	
	РезультатВыполнения = ДлительныеОперации.ВыполнитьВФоне(
		"РозничныеПродажиЛокализация.СтатусОплатыВПлатежнойСистеме",
		ПараметрыПроцедуры,
		ПараметрыВыполнения);
	
	Возврат РезультатВыполнения;
	
КонецФункции

#КонецОбласти

#Область КассоваяСсылка

&НаКлиенте
Процедура АктивироватьКассовуюСсылку()

	Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаОжиданиеЗавершенияОперации;
	
	ДоступныеКоманды = ДоступныеКоманды();
	ДоступныеКоманды.ФормаОтменитьОперацию = Истина;
	ОтобразитьДоступныеКоманды(ДоступныеКоманды);
	
	ТекстСтрока1 = НСтр("ru = 'Идет активация кассовой ссылки для оплаты.'");
	ТекстСтрока2 = НСтр("ru = 'Пожалуйста, подождите...'");
	
	Элементы.ДекорацияНадписьТекстДлительнойОперации.Заголовок = ТекстСтрока1 + Символы.ПС + ТекстСтрока2;
	
	ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
	ПараметрыОжидания.ВыводитьОкноОжидания = Ложь;
	
	РезультатВыполнения = АктивироватьКассовуюСсылкуНаСервере();
	ИдентификаторЗаданияФормированияQRКода = РезультатВыполнения.ИдентификаторЗадания;
	
	СтруктураСФормой = Новый Структура();
	СтруктураСФормой.Вставить("Форма", ЭтотОбъект);
	
	ОповещениеОЗавершении = Новый ОписаниеОповещения("АктивироватьКассовуюСсылкуЗавершение", ЭтотОбъект, СтруктураСФормой);
	
	Если РезультатВыполнения.Статус = "Выполнено" Тогда
		ПолучитьИдентификаторОплатыЗавершение(РезультатВыполнения, СтруктураСФормой);
		Возврат;
	КонецЕсли;
	
	ДлительныеОперацииКлиент.ОжидатьЗавершение(
		РезультатВыполнения,
		ОповещениеОЗавершении,
		ПараметрыОжидания);
	
КонецПроцедуры

&НаСервере
Функция АктивироватьКассовуюСсылкуНаСервере()
	
	ПараметрыПроцедуры = Новый Структура;
	ПараметрыПроцедуры.Вставить("ДокументОплаты", ДокументОплаты);
	ПараметрыПроцедуры.Вставить("НастройкаПодключения", НастройкаПодключения);
	ПараметрыПроцедуры.Вставить("ДатаОплаты", ДатаОплаты);
	ПараметрыПроцедуры.Вставить("СуммаОплаты", КОплате);
	ПараметрыПроцедуры.Вставить("ДанныеСсылки", ДанныеКассовойСсылки);
	ПараметрыПроцедуры.Вставить("ТорговаяТочка", НастройкаПодключения);
	
	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
	ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Активация кассовой ссылки.'");
	
	РезультатВыполнения = ДлительныеОперации.ВыполнитьВФоне(
		"РозничныеПродажиЛокализация.АктивироватьКассовуюСсылку",
		ПараметрыПроцедуры,
		ПараметрыВыполнения);
		
	Возврат РезультатВыполнения;
	
КонецФункции

&НаКлиенте
Процедура АктивироватьКассовуюСсылкуЗавершение(РезультатВыполнения, ДополнительныеПараметры) Экспорт
	
	ПолучитьИдентификаторОплатыЗавершение(РезультатВыполнения, ДополнительныеПараметры);
	
КонецПроцедуры

&НаКлиенте
Процедура ДеактивироватьКассовуюСсылку()
	
	Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаОжиданиеЗавершенияОперации;
	
	ДоступныеКоманды = ДоступныеКоманды();
	ДоступныеКоманды.ФормаОтменитьОперацию = Истина;
	ОтобразитьДоступныеКоманды(ДоступныеКоманды);
	
	ТекстСтрока1 = НСтр("ru = 'Идет деактивация кассовой ссылки для оплаты.'");
	ТекстСтрока2 = НСтр("ru = 'Пожалуйста, подождите...'");
	
	Элементы.ДекорацияНадписьТекстДлительнойОперации.Заголовок = ТекстСтрока1 + Символы.ПС + ТекстСтрока2;
	
	ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
	ПараметрыОжидания.ВыводитьОкноОжидания = Ложь;
	
	РезультатВыполнения = ДеактивироватьКассовуюСсылкуНаСервере();
	
	СтруктураСФормой = Новый Структура();
	СтруктураСФормой.Вставить("Форма", ЭтотОбъект);
	
	ОповещениеОЗавершении = Новый ОписаниеОповещения("ДеактивироватьКассовуюСсылкуЗавершение", ЭтотОбъект, СтруктураСФормой);
	
	Если РезультатВыполнения.Статус = "Выполнено" Тогда
		ДеактивироватьКассовуюСсылкуЗавершение(РезультатВыполнения, СтруктураСФормой);
		Возврат;
	КонецЕсли;
	
	ДлительныеОперацииКлиент.ОжидатьЗавершение(
		РезультатВыполнения,
		ОповещениеОЗавершении,
		ПараметрыОжидания);
	
КонецПроцедуры

&НаСервере
Функция ДеактивироватьКассовуюСсылкуНаСервере()
	
	ПараметрыПроцедуры = Новый Структура;
	ПараметрыПроцедуры.Вставить("ДокументОплаты", ДокументОплаты);
	ПараметрыПроцедуры.Вставить("НастройкаПодключения", НастройкаПодключения);
	ПараметрыПроцедуры.Вставить("ДатаОплаты", ДатаОплаты);
	ПараметрыПроцедуры.Вставить("СуммаОплаты", КОплате);
	ПараметрыПроцедуры.Вставить("ДанныеСсылки", ДанныеКассовойСсылки);
	ПараметрыПроцедуры.Вставить("ТорговаяТочка", НастройкаПодключения);
	
	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
	ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Деактивация кассовой ссылки.'");
	
	РезультатВыполнения = ДлительныеОперации.ВыполнитьВФоне(
		"РозничныеПродажиЛокализация.ДеактивироватьКассовуюСсылку",
		ПараметрыПроцедуры,
		ПараметрыВыполнения);
		
	Возврат РезультатВыполнения;
	
КонецФункции

&НаКлиенте
Процедура ДеактивироватьКассовуюСсылкуЗавершение(РезультатВыполнения, ДополнительныеПараметры) Экспорт
	
	Если РезультатВыполнения = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если РезультатВыполнения.Статус = "Выполнено" Тогда
		
		РезультатОперации = ПолучитьИзВременногоХранилища(РезультатВыполнения.АдресРезультата);
		
		Если ЗначениеЗаполнено(РезультатОперации.КодОшибки) Тогда
			
			ТекущийЭтапПроцессаОплатыСБП = ЭтапыПроцессаОплатыВозвратаСБП().ЭтапДеактивацииКассовойСсылки;
			ОтобразитьСтраницуОшибкиЗавершенияОперации(
				ЭтапыПроцессаОплатыВозвратаСБП().ЭтапДеактивацииКассовойСсылки,
				РезультатОперации.СообщениеОбОшибке);
			
		Иначе
			
			Закрыть(КодВозвратаДиалога.Отмена);
			
		КонецЕсли;
		
	ИначеЕсли РезультатВыполнения.Статус = "Ошибка" Тогда
		
		ТекущийЭтапПроцессаОплатыСБП = ЭтапыПроцессаОплатыВозвратаСБП().ЭтапДеактивацииКассовойСсылки;
		ОтобразитьСтраницуОшибкиЗавершенияОперации(ЭтапыПроцессаОплатыВозвратаСБП().ЭтапДеактивацииКассовойСсылки);
		
	КонецЕсли;

КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция НовыйДанныеКассовойСсылки()
	
	Результат = Новый Структура;
	Результат.Вставить("КассоваяСсылка", ПредопределенноеЗначение("Перечисление.ВидыСсылокСБП.ПустаяСсылка"));
	Результат.Вставить("ИдентификаторОплаты", "");
	
	Возврат Результат;
	
КонецФункции

#КонецОбласти
	
#КонецОбласти

#Область ПлатежнаяСистема_ВозвратОплаты

#Область ВыполнениеВозвратаОплаты

&НаКлиенте
Процедура ВыполнитьВозвратОплаты() Экспорт
	
	ОповещениеЗавершитьОплату = Новый ОписаниеОповещения("ЗавершитьОплатуВозвратПлатежнойСистемой", ЭтотОбъект);
	
	ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
	ПараметрыОжидания.ВыводитьОкноОжидания = Ложь;
	
	РезультатВыполнения = ВыполнитьВозвратОплатыНаСервере();
	
	ИдентификаторЗаданияВозврата = РезультатВыполнения.ИдентификаторЗадания;
	
	ПараметрыЗавершения       = Новый Структура("Форма, ОповещениеЗавершитьОплату", ЭтотОбъект, ОповещениеЗавершитьОплату);
	ОповещениеОЗавершении     = Новый ОписаниеОповещения("ВыполнитьВозвратОплатыЗавершение", ЭтотОбъект, ПараметрыЗавершения);
	
	Если РезультатВыполнения.Статус = "Выполнено" Тогда
		ВыполнитьВозвратОплатыЗавершение(РезультатВыполнения, ПараметрыЗавершения);
		Возврат;
	КонецЕсли;
	
	ДлительныеОперацииКлиент.ОжидатьЗавершение(
		РезультатВыполнения,
		ОповещениеОЗавершении,
		ПараметрыОжидания);
	
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьВозвратОплатыЗавершение(РезультатВыполнения, ДополнительныеПараметры) Экспорт
	
	Если РезультатВыполнения = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ОповещениеЗавершитьОплату = ДополнительныеПараметры.ОповещениеЗавершитьОплату;
	
	Если РезультатВыполнения.Статус = "Выполнено" Тогда
		
		РезультатОперации = ПолучитьИзВременногоХранилища(РезультатВыполнения.АдресРезультата);
		ОбработатьСтатусВозврата(РезультатОперации, ОповещениеЗавершитьОплату);
		
	ИначеЕсли РезультатВыполнения.Статус = "Ошибка" Тогда
		
		ОтобразитьСтраницуОшибкиЗавершенияОперации(
			ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОжиданияВозвратаОплаты,
			РезультатВыполнения.КраткоеПредставлениеОшибки);
		
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Функция ВыполнитьВозвратОплатыНаСервере()
	
	ПараметрыПроцедуры = Новый Структура;
	ПараметрыПроцедуры.Вставить("ДатаВозврата",         ДатаВозврата);
	ПараметрыПроцедуры.Вставить("СуммаВозврата",        КОплате);
	ПараметрыПроцедуры.Вставить("ДокументВозврата",     ДокументВозврата);
	ПараметрыПроцедуры.Вставить("ДокументОплаты",       ДокументОплаты);
	ПараметрыПроцедуры.Вставить("ИдентификаторОплаты",  ИдентификаторОплаты);
	ПараметрыПроцедуры.Вставить("НастройкаПодключения", НастройкаПодключения);
	ПараметрыПроцедуры.Вставить("БанкКлиента", ?(ЗначениеЗаполнено(БанкКлиента), БанкКлиента, Неопределено));
	
	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
	ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Возврат оплаты в платежной системе.'");
	
	РезультатВыполнения = ДлительныеОперации.ВыполнитьВФоне(
		"РозничныеПродажиЛокализация.ВыполнитьВозвратОплаты",
		ПараметрыПроцедуры,
		ПараметрыВыполнения);
	
	Возврат РезультатВыполнения;
	
КонецФункции

#КонецОбласти

#Область ПолучениеСтатусаВозвратаОплаты

&НаКлиенте
Процедура ОпределитьСтатусВозврата()
	
	ОповещениеЗавершитьОплату = Новый ОписаниеОповещения("ЗавершитьОплатуВозвратПлатежнойСистемой", ЭтотОбъект);
	
	ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
	ПараметрыОжидания.ВыводитьОкноОжидания = Ложь;
	ПараметрыОжидания.Интервал             = 1;
	
	РезультатВыполнения = ОпределитьСтатусВозвратаНаСервере();
	
	ИдентификаторЗаданияПроверкиСтатуса = РезультатВыполнения.ИдентификаторЗадания;
	
	ПараметрыЗавершения = Новый Структура("Форма, ОповещениеЗавершитьОплату", ЭтотОбъект, ОповещениеЗавершитьОплату);
	ОповещениеОЗавершении = Новый ОписаниеОповещения("ОпределитьСтатусВозвратаЗавершение", ЭтотОбъект, ПараметрыЗавершения);
	
	Если РезультатВыполнения.Статус = "Выполнено" Тогда
		ОпределитьСтатусВозвратаЗавершение(РезультатВыполнения, ПараметрыЗавершения);
		Возврат;
	КонецЕсли;
	
	ДлительныеОперацииКлиент.ОжидатьЗавершение(
		РезультатВыполнения,
		ОповещениеОЗавершении,
		ПараметрыОжидания);
	
КонецПроцедуры

&НаКлиенте
Процедура ОпределитьСтатусВозвратаЗавершение(РезультатВыполнения, ДополнительныеПараметры) Экспорт
	
	Если РезультатВыполнения = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ОповещениеЗавершитьОплату   = ДополнительныеПараметры.ОповещениеЗавершитьОплату;
	
	Если РезультатВыполнения.Статус = "Выполнено" Тогда
		
		РезультатОперации = ПолучитьИзВременногоХранилища(РезультатВыполнения.АдресРезультата);
		ОбработатьСтатусВозврата(РезультатОперации, ОповещениеЗавершитьОплату, Ложь);
		
	ИначеЕсли РезультатВыполнения.Статус = "Ошибка" Тогда
		
		ОтобразитьСтраницуОшибкиЗавершенияОперации(
			ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОжиданияВнесенияОплаты,
			РезультатВыполнения.КраткоеПредставлениеОшибки);
		
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Функция ОпределитьСтатусВозвратаНаСервере()
	
	ПараметрыПроцедуры = Новый Структура;
	ПараметрыПроцедуры.Вставить("ДокументВозврата",     ДокументВозврата);
	
	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
	ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Проверка статуса возврата.'");
	
	РезультатВыполнения = ДлительныеОперации.ВыполнитьВФоне(
		"РозничныеПродажиЛокализация.СтатусВозвратаОплатыВПлатежнойСистеме",
		ПараметрыПроцедуры,
		ПараметрыВыполнения);
	
	Возврат РезультатВыполнения;
	
КонецФункции

&НаКлиенте
Процедура ОбработатьСтатусВозврата(РезультатОперации, ОповещениеЗавершитьОплату, ЗапускПроверкиСтатуса = Истина)
	
	СтатусОперацииТребуетсяПодтверждение = СистемаБыстрыхПлатежейКлиентСервер.СтатусОперацииТребуетсяПодтверждение();
	СтатусОперацииВыполняется            = СистемаБыстрыхПлатежейКлиентСервер.СтатусОперацииВыполняется();
	СтатусОперацииВыполнена              = СистемаБыстрыхПлатежейКлиентСервер.СтатусОперацииВыполнена();
	
	Если РезультатОперации.СтатусОперации = СтатусОперацииТребуетсяПодтверждение Тогда
		
		ТекущийЭтапПроцессаОплатыСБП = ЭтапыПроцессаОплатыВозвратаСБП().ЭтапПодтвержденияПолученияВозвратаОплаты;
		ОтобразитьСтраницуЭтапаПодтвержденияПолученияВозвратаОплаты(РезультатОперации.Подтверждение);
		
	ИначеЕсли РезультатОперации.СтатусОперации = СтатусОперацииВыполняется Тогда
		
		Если ЗапускПроверкиСтатуса Тогда
			ОтобразитьСтраницуЭтапаОпределенияСтатусаВозвратаОплаты();
		Иначе
			ОтобразитьСтраницуОшибкиЗавершенияОперации(ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОжиданияВозвратаОплаты);
		КонецЕсли;
		
	ИначеЕсли РезультатОперации.СтатусОперации = СтатусОперацииВыполнена Тогда
		
		ВыполнитьОбработкуОповещения(ОповещениеЗавершитьОплату, "ДобавитьВидОплаты");
		
	Иначе
		
		ОтобразитьСтраницуОшибкиЗавершенияОперации(
			ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОжиданияВозвратаОплаты,
			РезультатОперации.СообщениеОбОшибке);
		
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ПодтверждениеВозвратаОплаты

&НаСервере
Функция ПодтвердитьВозвратОплатыНаСервере()
	
	Возврат РозничныеПродажиЛокализация.ПодтвердитьВозвратОплаты(ДокументВозврата);
	
КонецФункции

&НаСервере
Процедура ОтменитьПодтверждениеВозврата()
	
	ПереводыСБПc2b.УдалитьИдентификаторыОперации(ДокументВозврата);
	
КонецПроцедуры

#КонецОбласти

#КонецОбласти

#КонецОбласти

Связанные материалы