#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("АвтоТест") Тогда
Возврат;
КонецЕсли;
Пользователь = Пользователи.ТекущийПользователь();
ПраваДоступа = НастройкиПродажДляПользователейСервер.ПраваДоступаРМК(Пользователь);
РозничныеПродажи.ПодписатьГорячиеКлавишиНаКнопках(ЭтотОбъект);
Дисплеи.ЗагрузитьЗначения(МенеджерОборудованияВызовСервера.ОборудованиеПоПараметрам("ДисплейПокупателя"));
АвтоматическиСоздаватьПартнеров = Константы.АвтоматическиСоздаватьПартнеровПриОтправкеЭлектронногоЧекаПокупателю.Получить();
АвтоматическиОбновлятьКонтактыПартнеров = Константы.ОбновлятьКонтактнуюИнформациюПартнеровПриОтправкеЭлектронныхЧеков.Получить();
ОтправкаЭлектронныхЧековПослеПробитияЧека = Константы.ОтправкаЭлектронныхЧековПослеПробитияЧека.Получить();
РабочееМестоКлиента = МенеджерОборудованияВызовСервера.РабочееМестоКлиента();
Организация = Параметры.Организация;
КассаККМ = Параметры.КассаККМ;
Валюта = Параметры.Валюта;
ЗаполнитьСписокДоговоровИПодключений(Организация);
ИнформацияОбОплате = Параметры.ИнформацияОбОплате;
ДокументОплаты = ИнформацияОбОплате.Документ;
КОплате = ИнформацияОбОплате.СуммаКОплате - ИнформацияОбОплате.ИтогоОплачено;
ЭтоВозврат = Ложь;
Если ТипЗнч(ДокументОплаты) = Тип("ДокументСсылка.ЧекККМВозврат")
ИЛИ ТипЗнч(ДокументОплаты) = Тип("ДокументСсылка.ВозвратПодарочныхСертификатов")
ИЛИ ТипЗнч(ДокументОплаты) = Тип("ДокументСсылка.ОперацияПоПлатежнойКарте") И ЗначениеЗаполнено(Параметры.ДатаВозврата) Тогда
ЭтоВозврат = Истина;
ДатаВозврата = Параметры.ДатаВозврата;
ДокументВозврата = ИнформацияОбОплате.Документ;
ДокументОплаты = Параметры.ДокументОплаты;
ИдентификаторОплаты = Параметры.СсылочныйНомер;
Если ЗначениеЗаполнено(ДокументОплаты) Тогда
ДоговорПодключения = Параметры.ДоговорПодключения;
НастройкаПодключения = РозничныеПродажиЛокализация.НастройкаПодключения(ДоговорПодключения);
КОплате = ИнформацияОбОплате.СБП;
ЗаполнитьСписокВыбораБанкаКлиента();
Иначе
КОплате = ИнформацияОбОплате.СуммаКОплате;
КонецЕсли;
Если ТипЗнч(ДокументВозврата) = Тип("ДокументСсылка.ОперацияПоПлатежнойКарте") Тогда
БанкКлиента = Параметры.БанкКлиента;
КонецЕсли;
Заголовок = НСтр("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КодаОплаты);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ПолучениеСтатусаОплаты
&НаКлиенте
Процедура ОпределитьСтатусОплаты() Экспорт
ОповещениеЗавершитьОплату = Новый ОписаниеОповещения("ЗавершитьОплатуВозвратПлатежнойСистемой", ЭтотОбъект);
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
ПараметрыОжидания.ВыводитьОкноОжидания = Ложь;
ПараметрыОжидания.Интервал = 1;
РезультатВыполнения = ОпределитьСтатусОплатыНаСервере();
ИдентификаторЗаданияПроверкиСтатуса = РезультатВыполнения.ИдентификаторЗадания;
ПараметрыЗавершения = Новый Структура("Форма, ОповещениеЗавершитьОплату", ЭтотОбъект, ОповещениеЗавершитьОплату);
ОповещениеОЗавершении = Новый ОписаниеОповещения("ОпределитьСтатусОплатыЗавершение", ЭтотОбъект, ПараметрыЗавершения);
Если РезультатВыполнения.Статус = "Выполнено" Тогда
ОпределитьСтатусОплатыЗавершение(РезультатВыполнения, ПараметрыЗавершения);
Возврат;
КонецЕсли;
ДлительныеОперацииКлиент.ОжидатьЗавершение(
РезультатВыполнения,
ОповещениеОЗавершении,
ПараметрыОжидания);
КонецПроцедуры
&НаКлиенте
Процедура ОпределитьСтатусОплатыЗавершение(РезультатВыполнения, ДополнительныеПараметры) Экспорт
Если РезультатВыполнения = Неопределено Тогда
Возврат;
КонецЕсли;
ОповещениеЗавершитьОплату = ДополнительныеПараметры.ОповещениеЗавершитьОплату;
Если РезультатВыполнения.Статус = "Выполнено" Тогда
РезультатОперации = ПолучитьИзВременногоХранилища(РезультатВыполнения.АдресРезультата);
СтатусОперацииВыполняется = СистемаБыстрыхПлатежейКлиентСервер.СтатусОперацииВыполняется();
СтатусОперацииВыполнена = СистемаБыстрыхПлатежейКлиентСервер.СтатусОперацииВыполнена();
СтатусОперацииОтменена = СистемаБыстрыхПлатежейКлиентСервер.СтатусОперацииОтменена();
СтатусОперацииОшибка = СистемаБыстрыхПлатежейКлиентСервер.СтатусОперацииОшибка();
ПоследнийСтатусОперации = РезультатОперации.СтатусОперации;
Если РезультатОперации.СтатусОперации = СтатусОперацииВыполняется Тогда
ОтобразитьСтраницуОшибкиЗавершенияОперации(ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОжиданияВнесенияОплаты);
ИначеЕсли РезультатОперации.СтатусОперации = СтатусОперацииВыполнена Тогда
ВыполнитьОбработкуОповещения(ОповещениеЗавершитьОплату, "ДобавитьВидОплаты");
ИначеЕсли РезультатОперации.СтатусОперации = СтатусОперацииОтменена Тогда
ОтобразитьСтраницуОшибкиЗавершенияОперации(
ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОжиданияВнесенияОплаты,
НСтр("ru = 'Операция отменена. Истек срок действия QR-кода или операция была отклонена СБП.'"));
ИначеЕсли РезультатОперации.СтатусОперации = СтатусОперацииОшибка Тогда
ОтобразитьСтраницуОшибкиЗавершенияОперации(
ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОжиданияВнесенияОплаты,
РезультатОперации.СообщениеОбОшибке);
КонецЕсли;
ИначеЕсли РезультатВыполнения.Статус = "Ошибка" Тогда
ОтобразитьСтраницуОшибкиЗавершенияОперации(
ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОжиданияВнесенияОплаты,
РезультатВыполнения.КраткоеПредставлениеОшибки);
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ОпределитьСтатусОплатыНаСервере()
ПараметрыПроцедуры = Новый Структура;
ПараметрыПроцедуры.Вставить("ДокументОплаты", ДокументОплаты);
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Проверка статуса оплаты.'");
РезультатВыполнения = ДлительныеОперации.ВыполнитьВФоне(
"РозничныеПродажиЛокализация.СтатусОплатыВПлатежнойСистеме",
ПараметрыПроцедуры,
ПараметрыВыполнения);
Возврат РезультатВыполнения;
КонецФункции
#КонецОбласти
#Область КассоваяСсылка
&НаКлиенте
Процедура АктивироватьКассовуюСсылку()
Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаОжиданиеЗавершенияОперации;
ДоступныеКоманды = ДоступныеКоманды();
ДоступныеКоманды.ФормаОтменитьОперацию = Истина;
ОтобразитьДоступныеКоманды(ДоступныеКоманды);
ТекстСтрока1 = НСтр("ru = 'Идет активация кассовой ссылки для оплаты.'");
ТекстСтрока2 = НСтр("ru = 'Пожалуйста, подождите...'");
Элементы.ДекорацияНадписьТекстДлительнойОперации.Заголовок = ТекстСтрока1 + Символы.ПС + ТекстСтрока2;
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
ПараметрыОжидания.ВыводитьОкноОжидания = Ложь;
РезультатВыполнения = АктивироватьКассовуюСсылкуНаСервере();
ИдентификаторЗаданияФормированияQRКода = РезультатВыполнения.ИдентификаторЗадания;
СтруктураСФормой = Новый Структура();
СтруктураСФормой.Вставить("Форма", ЭтотОбъект);
ОповещениеОЗавершении = Новый ОписаниеОповещения("АктивироватьКассовуюСсылкуЗавершение", ЭтотОбъект, СтруктураСФормой);
Если РезультатВыполнения.Статус = "Выполнено" Тогда
ПолучитьИдентификаторОплатыЗавершение(РезультатВыполнения, СтруктураСФормой);
Возврат;
КонецЕсли;
ДлительныеОперацииКлиент.ОжидатьЗавершение(
РезультатВыполнения,
ОповещениеОЗавершении,
ПараметрыОжидания);
КонецПроцедуры
&НаСервере
Функция АктивироватьКассовуюСсылкуНаСервере()
ПараметрыПроцедуры = Новый Структура;
ПараметрыПроцедуры.Вставить("ДокументОплаты", ДокументОплаты);
ПараметрыПроцедуры.Вставить("НастройкаПодключения", НастройкаПодключения);
ПараметрыПроцедуры.Вставить("ДатаОплаты", ДатаОплаты);
ПараметрыПроцедуры.Вставить("СуммаОплаты", КОплате);
ПараметрыПроцедуры.Вставить("ДанныеСсылки", ДанныеКассовойСсылки);
ПараметрыПроцедуры.Вставить("ТорговаяТочка", НастройкаПодключения);
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Активация кассовой ссылки.'");
РезультатВыполнения = ДлительныеОперации.ВыполнитьВФоне(
"РозничныеПродажиЛокализация.АктивироватьКассовуюСсылку",
ПараметрыПроцедуры,
ПараметрыВыполнения);
Возврат РезультатВыполнения;
КонецФункции
&НаКлиенте
Процедура АктивироватьКассовуюСсылкуЗавершение(РезультатВыполнения, ДополнительныеПараметры) Экспорт
ПолучитьИдентификаторОплатыЗавершение(РезультатВыполнения, ДополнительныеПараметры);
КонецПроцедуры
&НаКлиенте
Процедура ДеактивироватьКассовуюСсылку()
Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаОжиданиеЗавершенияОперации;
ДоступныеКоманды = ДоступныеКоманды();
ДоступныеКоманды.ФормаОтменитьОперацию = Истина;
ОтобразитьДоступныеКоманды(ДоступныеКоманды);
ТекстСтрока1 = НСтр("ru = 'Идет деактивация кассовой ссылки для оплаты.'");
ТекстСтрока2 = НСтр("ru = 'Пожалуйста, подождите...'");
Элементы.ДекорацияНадписьТекстДлительнойОперации.Заголовок = ТекстСтрока1 + Символы.ПС + ТекстСтрока2;
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
ПараметрыОжидания.ВыводитьОкноОжидания = Ложь;
РезультатВыполнения = ДеактивироватьКассовуюСсылкуНаСервере();
СтруктураСФормой = Новый Структура();
СтруктураСФормой.Вставить("Форма", ЭтотОбъект);
ОповещениеОЗавершении = Новый ОписаниеОповещения("ДеактивироватьКассовуюСсылкуЗавершение", ЭтотОбъект, СтруктураСФормой);
Если РезультатВыполнения.Статус = "Выполнено" Тогда
ДеактивироватьКассовуюСсылкуЗавершение(РезультатВыполнения, СтруктураСФормой);
Возврат;
КонецЕсли;
ДлительныеОперацииКлиент.ОжидатьЗавершение(
РезультатВыполнения,
ОповещениеОЗавершении,
ПараметрыОжидания);
КонецПроцедуры
&НаСервере
Функция ДеактивироватьКассовуюСсылкуНаСервере()
ПараметрыПроцедуры = Новый Структура;
ПараметрыПроцедуры.Вставить("ДокументОплаты", ДокументОплаты);
ПараметрыПроцедуры.Вставить("НастройкаПодключения", НастройкаПодключения);
ПараметрыПроцедуры.Вставить("ДатаОплаты", ДатаОплаты);
ПараметрыПроцедуры.Вставить("СуммаОплаты", КОплате);
ПараметрыПроцедуры.Вставить("ДанныеСсылки", ДанныеКассовойСсылки);
ПараметрыПроцедуры.Вставить("ТорговаяТочка", НастройкаПодключения);
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Деактивация кассовой ссылки.'");
РезультатВыполнения = ДлительныеОперации.ВыполнитьВФоне(
"РозничныеПродажиЛокализация.ДеактивироватьКассовуюСсылку",
ПараметрыПроцедуры,
ПараметрыВыполнения);
Возврат РезультатВыполнения;
КонецФункции
&НаКлиенте
Процедура ДеактивироватьКассовуюСсылкуЗавершение(РезультатВыполнения, ДополнительныеПараметры) Экспорт
Если РезультатВыполнения = Неопределено Тогда
Возврат;
КонецЕсли;
Если РезультатВыполнения.Статус = "Выполнено" Тогда
РезультатОперации = ПолучитьИзВременногоХранилища(РезультатВыполнения.АдресРезультата);
Если ЗначениеЗаполнено(РезультатОперации.КодОшибки) Тогда
ТекущийЭтапПроцессаОплатыСБП = ЭтапыПроцессаОплатыВозвратаСБП().ЭтапДеактивацииКассовойСсылки;
ОтобразитьСтраницуОшибкиЗавершенияОперации(
ЭтапыПроцессаОплатыВозвратаСБП().ЭтапДеактивацииКассовойСсылки,
РезультатОперации.СообщениеОбОшибке);
Иначе
Закрыть(КодВозвратаДиалога.Отмена);
КонецЕсли;
ИначеЕсли РезультатВыполнения.Статус = "Ошибка" Тогда
ТекущийЭтапПроцессаОплатыСБП = ЭтапыПроцессаОплатыВозвратаСБП().ЭтапДеактивацииКассовойСсылки;
ОтобразитьСтраницуОшибкиЗавершенияОперации(ЭтапыПроцессаОплатыВозвратаСБП().ЭтапДеактивацииКассовойСсылки);
КонецЕсли;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция НовыйДанныеКассовойСсылки()
Результат = Новый Структура;
Результат.Вставить("КассоваяСсылка", ПредопределенноеЗначение("Перечисление.ВидыСсылокСБП.ПустаяСсылка"));
Результат.Вставить("ИдентификаторОплаты", "");
Возврат Результат;
КонецФункции
#КонецОбласти
#КонецОбласти
#Область ПлатежнаяСистема_ВозвратОплаты
#Область ВыполнениеВозвратаОплаты
&НаКлиенте
Процедура ВыполнитьВозвратОплаты() Экспорт
ОповещениеЗавершитьОплату = Новый ОписаниеОповещения("ЗавершитьОплатуВозвратПлатежнойСистемой", ЭтотОбъект);
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
ПараметрыОжидания.ВыводитьОкноОжидания = Ложь;
РезультатВыполнения = ВыполнитьВозвратОплатыНаСервере();
ИдентификаторЗаданияВозврата = РезультатВыполнения.ИдентификаторЗадания;
ПараметрыЗавершения = Новый Структура("Форма, ОповещениеЗавершитьОплату", ЭтотОбъект, ОповещениеЗавершитьОплату);
ОповещениеОЗавершении = Новый ОписаниеОповещения("ВыполнитьВозвратОплатыЗавершение", ЭтотОбъект, ПараметрыЗавершения);
Если РезультатВыполнения.Статус = "Выполнено" Тогда
ВыполнитьВозвратОплатыЗавершение(РезультатВыполнения, ПараметрыЗавершения);
Возврат;
КонецЕсли;
ДлительныеОперацииКлиент.ОжидатьЗавершение(
РезультатВыполнения,
ОповещениеОЗавершении,
ПараметрыОжидания);
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьВозвратОплатыЗавершение(РезультатВыполнения, ДополнительныеПараметры) Экспорт
Если РезультатВыполнения = Неопределено Тогда
Возврат;
КонецЕсли;
ОповещениеЗавершитьОплату = ДополнительныеПараметры.ОповещениеЗавершитьОплату;
Если РезультатВыполнения.Статус = "Выполнено" Тогда
РезультатОперации = ПолучитьИзВременногоХранилища(РезультатВыполнения.АдресРезультата);
ОбработатьСтатусВозврата(РезультатОперации, ОповещениеЗавершитьОплату);
ИначеЕсли РезультатВыполнения.Статус = "Ошибка" Тогда
ОтобразитьСтраницуОшибкиЗавершенияОперации(
ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОжиданияВозвратаОплаты,
РезультатВыполнения.КраткоеПредставлениеОшибки);
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ВыполнитьВозвратОплатыНаСервере()
ПараметрыПроцедуры = Новый Структура;
ПараметрыПроцедуры.Вставить("ДатаВозврата", ДатаВозврата);
ПараметрыПроцедуры.Вставить("СуммаВозврата", КОплате);
ПараметрыПроцедуры.Вставить("ДокументВозврата", ДокументВозврата);
ПараметрыПроцедуры.Вставить("ДокументОплаты", ДокументОплаты);
ПараметрыПроцедуры.Вставить("ИдентификаторОплаты", ИдентификаторОплаты);
ПараметрыПроцедуры.Вставить("НастройкаПодключения", НастройкаПодключения);
ПараметрыПроцедуры.Вставить("БанкКлиента", ?(ЗначениеЗаполнено(БанкКлиента), БанкКлиента, Неопределено));
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Возврат оплаты в платежной системе.'");
РезультатВыполнения = ДлительныеОперации.ВыполнитьВФоне(
"РозничныеПродажиЛокализация.ВыполнитьВозвратОплаты",
ПараметрыПроцедуры,
ПараметрыВыполнения);
Возврат РезультатВыполнения;
КонецФункции
#КонецОбласти
#Область ПолучениеСтатусаВозвратаОплаты
&НаКлиенте
Процедура ОпределитьСтатусВозврата()
ОповещениеЗавершитьОплату = Новый ОписаниеОповещения("ЗавершитьОплатуВозвратПлатежнойСистемой", ЭтотОбъект);
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
ПараметрыОжидания.ВыводитьОкноОжидания = Ложь;
ПараметрыОжидания.Интервал = 1;
РезультатВыполнения = ОпределитьСтатусВозвратаНаСервере();
ИдентификаторЗаданияПроверкиСтатуса = РезультатВыполнения.ИдентификаторЗадания;
ПараметрыЗавершения = Новый Структура("Форма, ОповещениеЗавершитьОплату", ЭтотОбъект, ОповещениеЗавершитьОплату);
ОповещениеОЗавершении = Новый ОписаниеОповещения("ОпределитьСтатусВозвратаЗавершение", ЭтотОбъект, ПараметрыЗавершения);
Если РезультатВыполнения.Статус = "Выполнено" Тогда
ОпределитьСтатусВозвратаЗавершение(РезультатВыполнения, ПараметрыЗавершения);
Возврат;
КонецЕсли;
ДлительныеОперацииКлиент.ОжидатьЗавершение(
РезультатВыполнения,
ОповещениеОЗавершении,
ПараметрыОжидания);
КонецПроцедуры
&НаКлиенте
Процедура ОпределитьСтатусВозвратаЗавершение(РезультатВыполнения, ДополнительныеПараметры) Экспорт
Если РезультатВыполнения = Неопределено Тогда
Возврат;
КонецЕсли;
ОповещениеЗавершитьОплату = ДополнительныеПараметры.ОповещениеЗавершитьОплату;
Если РезультатВыполнения.Статус = "Выполнено" Тогда
РезультатОперации = ПолучитьИзВременногоХранилища(РезультатВыполнения.АдресРезультата);
ОбработатьСтатусВозврата(РезультатОперации, ОповещениеЗавершитьОплату, Ложь);
ИначеЕсли РезультатВыполнения.Статус = "Ошибка" Тогда
ОтобразитьСтраницуОшибкиЗавершенияОперации(
ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОжиданияВнесенияОплаты,
РезультатВыполнения.КраткоеПредставлениеОшибки);
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ОпределитьСтатусВозвратаНаСервере()
ПараметрыПроцедуры = Новый Структура;
ПараметрыПроцедуры.Вставить("ДокументВозврата", ДокументВозврата);
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Проверка статуса возврата.'");
РезультатВыполнения = ДлительныеОперации.ВыполнитьВФоне(
"РозничныеПродажиЛокализация.СтатусВозвратаОплатыВПлатежнойСистеме",
ПараметрыПроцедуры,
ПараметрыВыполнения);
Возврат РезультатВыполнения;
КонецФункции
&НаКлиенте
Процедура ОбработатьСтатусВозврата(РезультатОперации, ОповещениеЗавершитьОплату, ЗапускПроверкиСтатуса = Истина)
СтатусОперацииТребуетсяПодтверждение = СистемаБыстрыхПлатежейКлиентСервер.СтатусОперацииТребуетсяПодтверждение();
СтатусОперацииВыполняется = СистемаБыстрыхПлатежейКлиентСервер.СтатусОперацииВыполняется();
СтатусОперацииВыполнена = СистемаБыстрыхПлатежейКлиентСервер.СтатусОперацииВыполнена();
Если РезультатОперации.СтатусОперации = СтатусОперацииТребуетсяПодтверждение Тогда
ТекущийЭтапПроцессаОплатыСБП = ЭтапыПроцессаОплатыВозвратаСБП().ЭтапПодтвержденияПолученияВозвратаОплаты;
ОтобразитьСтраницуЭтапаПодтвержденияПолученияВозвратаОплаты(РезультатОперации.Подтверждение);
ИначеЕсли РезультатОперации.СтатусОперации = СтатусОперацииВыполняется Тогда
Если ЗапускПроверкиСтатуса Тогда
ОтобразитьСтраницуЭтапаОпределенияСтатусаВозвратаОплаты();
Иначе
ОтобразитьСтраницуОшибкиЗавершенияОперации(ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОжиданияВозвратаОплаты);
КонецЕсли;
ИначеЕсли РезультатОперации.СтатусОперации = СтатусОперацииВыполнена Тогда
ВыполнитьОбработкуОповещения(ОповещениеЗавершитьОплату, "ДобавитьВидОплаты");
Иначе
ОтобразитьСтраницуОшибкиЗавершенияОперации(
ЭтапыПроцессаОплатыВозвратаСБП().ЭтапОжиданияВозвратаОплаты,
РезультатОперации.СообщениеОбОшибке);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ПодтверждениеВозвратаОплаты
&НаСервере
Функция ПодтвердитьВозвратОплатыНаСервере()
Возврат РозничныеПродажиЛокализация.ПодтвердитьВозвратОплаты(ДокументВозврата);
КонецФункции
&НаСервере
Процедура ОтменитьПодтверждениеВозврата()
ПереводыСБПc2b.УдалитьИдентификаторыОперации(ДокументВозврата);
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#КонецОбласти