Настройки ЮKassa / Форма подготовки платежной ссылки / Модуль формы

файл
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2025, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

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

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

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

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

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

#Область ОбработчикиСобытийЭлементовШапкиФормы

#Область ДоставкаЧека

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

&НаКлиенте
Процедура ВариантДоставкиЧекаТелефонПриИзменении(Элемент)
	
	ТребуетсяОбновлениеКонтактнойИнформацииВСервисе = Истина;
	
	УправлениеЭлементамиФормыПоДанным();
	
КонецПроцедуры

&НаКлиенте
Процедура ДоставкаЧекаЭлектроннаяПочтаПриИзменении(Элемент)
	
	ВариантДоставкиЧека = "ЭлектроннаяПочта";
	ТребуетсяОбновлениеКонтактнойИнформацииВСервисе = Истина;
	УправлениеЭлементамиФормыПоДанным();
	
КонецПроцедуры

&НаКлиенте
Процедура ДоставкаЧекаТелефонПриИзменении(Элемент)
	
	ДоставкаЧекаТелефон = ФорматироватьНомер(ДоставкаЧекаТелефон);
	ВариантДоставкиЧека = "Телефон";
	ТребуетсяОбновлениеКонтактнойИнформацииВСервисе = Истина;
	УправлениеЭлементамиФормыПоДанным();
	
КонецПроцедуры

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

#Область ОтправкаСсылки

&НаКлиенте
Процедура ВариантОтправкиЭлектроннаяПочтаПриИзменении(Элемент)
	УправлениеЭлементамиФормыПоВариантуОтправки();
КонецПроцедуры

&НаКлиенте
Процедура ВариантОтправкиТелеграмПриИзменении(Элемент)
	УправлениеЭлементамиФормыПоВариантуОтправки();
КонецПроцедуры

&НаКлиенте
Процедура ВариантОтправкиТелефонПриИзменении(Элемент)
	УправлениеЭлементамиФормыПоВариантуОтправки();
КонецПроцедуры

&НаКлиенте
Процедура ВариантОтправкиWhatsAppПриИзменении(Элемент)
	УправлениеЭлементамиФормыПоВариантуОтправки();
КонецПроцедуры

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

#Область ПодсказкаФормы

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

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

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

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

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

&НаКлиенте
Процедура КопироватьВБуфер(Команда)
	
	КопироватьСсылкуВБуфер();
	
КонецПроцедуры

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

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

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

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

#Область ОтправкаСсылки

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

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

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

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

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

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

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

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

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

&НаКлиенте
Функция ТекстПисьмаБезШаблонаHTML()
	
	HTMLСтрока =
	
	"<html>
	|<head>
	|<meta http-equiv=""Content-Type"" content=""text/html; charset=utf-8"" />
	|<meta http-equiv=""X-UA-Compatible"" content=""IE=Edge"" />
	|<meta name=""format-detection"" content=""telephone=no"" />
	|</head>
	|<body>
	|<p>Ссылка для оплаты: <a href=""%1"">%1</a></p>
	|
	|</body>
	|</html>";
	
	Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1'"), HTMLСтрока);
	
КонецФункции

&НаКлиенте
Функция ТекстПисьмаБезШаблонаТекст()
	
	Возврат НСтр("ru = 'Ссылка для оплаты: %1'");
	
КонецФункции

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

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

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

#Область РаботаССервисом

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

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

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

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

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

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

&НаКлиенте
Функция ПроверитьВозможностьФормированияПлатежнойСсылки(КонтактныеДанныеЧека) 

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

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

#Область РаботаССервисомВФоне

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

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

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

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

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

&НаСервереБезКонтекста
Функция РезультатФоновогоЗаданияИзВременногоХранилища(Знач Адрес)
	
	Результат = ПолучитьИзВременногоХранилища(Адрес);
	УдалитьИзВременногоХранилища(Адрес);
	
	Возврат Результат;
	
КонецФункции

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

#Область КонтактнаяИнформация

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

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

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

&НаКлиентеНаСервереБезКонтекста
Функция ФорматироватьНомер(Номер)
	
	Результат = "";
	ДопустимыеСимволы = "1234567890";
	Для Позиция = 1 По СтрДлина(Номер) Цикл
		Символ = Сред(Номер,Позиция,1);
		Если СтрНайти(ДопустимыеСимволы, Символ) > 0 Тогда
			Результат = Результат + Символ;
		КонецЕсли;
	КонецЦикла;
	
	Если СтрДлина(Результат) = 10 Тогда
		Возврат Результат;
	КонецЕсли;
	
	Если Лев(Результат,1) = "7" 
		Или Лев(Результат,1) = "8" Тогда
		Возврат Сред(Результат, 2, 10);
	Иначе
		Возврат Лев(Результат, 10);
	КонецЕсли;
	
КонецФункции

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

#Область УправлениеЭлементамиФормы

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

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

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

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

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

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

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

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

&НаСервере
Процедура ВосстановитьШаблоныПоУмолчанию()
	
	Если НастройкиШаблонов.Используется 	
		И ЗначениеЗаполнено(ОснованиеПлатежа) Тогда
		
		Если ОбщегоНазначения.ЭтоСсылка(ТипЗнч(ОснованиеПлатежа)) Тогда
			ПредставлениеОснования = ОснованиеПлатежа.Метаданные().ПолноеИмя();
		Иначе
			ПредставлениеОснования = ОснованиеПлатежа;
		КонецЕсли;
		
		// Шаблоны электронной почты
		Настройки = ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекЗагрузить(
			"ФормаПодготовкиПлатежнойСсылки",
			"ШаблоныСообщенийЭлектроннойПочты");
		
		Если Настройки <> Неопределено
			И ТипЗнч(Настройки) = Тип("Соответствие")
			И Настройки[ПредставлениеОснования] <> Неопределено Тогда
			
			ШаблонСообщенияЭлектроннаяПочта = Настройки[ПредставлениеОснования];
			
		КонецЕсли;
		
		// Шаблоны SMS сообщений
		Настройки = ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекЗагрузить(
			"ФормаПодготовкиПлатежнойСсылки",
			"ШаблоныСообщенийSMS");
		
		Если Настройки <> Неопределено
			И ТипЗнч(Настройки) = Тип("Соответствие")
			И Настройки[ПредставлениеОснования] <> Неопределено Тогда
			
			ШаблонСообщенияТелефон = Настройки[ПредставлениеОснования];
			
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

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

#Область Прочее

&НаСервере
Процедура НастроитьФормуПослеПроверкиДоступа()
	
	Если Не МагазинПодключен Тогда
		
		Если ОнлайнОплатыСлужебный.ЕстьПравоИзмененияНастроек() Тогда
			Элементы.ДекорацияПояснениеКФорме.Заголовок = СтроковыеФункции.ФорматированнаяСтрока(
				НСтр("ru = 'Истек период доступа к ЮKassa. 
				|Необходимо повторно <a href = ""ОткрытьНастройку"">предоставить доступ</a>'"));
		Иначе
			Элементы.ДекорацияПояснениеКФорме.Заголовок = СтроковыеФункции.ФорматированнаяСтрока(
				НСтр("ru = 'Истек период доступа к ЮKassa. Необходимо повторно предоставить доступ. Обратитесь к администратору'"));
		КонецЕсли;
		
		Элементы.ДекорацияПояснениеКФорме.ЦветТекста = ЦветаСтиля.ЦветТекстаКнопки;
		
	КонецЕсли;
	
	Элементы.КартинкаПредупреждение.Видимость      = Не МагазинПодключен;
	Элементы.ГруппаВариантДоставкиЧека.Доступность = МагазинПодключен;
	Элементы.ГруппаВариантОтправки.Доступность     = МагазинПодключен;
	Элементы.Справка.Видимость                     = МагазинПодключен;
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьНастройкуОнлайнОплаты()
	
	ПараметрыФормы = ОнлайнОплатыСлужебныйКлиент.ОписаниеПараметровФормыНастройкиОнлайнОплаты();
	
	ПараметрыФормы.Ключ = НастройкаОнлайнОплаты.Ссылка;
	ПараметрыФормы.ПроверкаПодключенияСервиса= Истина;
	
	Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияФормыНастроек", ЭтотОбъект);
	
	ОнлайнОплатыСлужебныйКлиент.ОткрытьФормуНастроекОнлайнОплаты(ПараметрыФормы, ЭтотОбъект, Оповещение);
	
КонецПроцедуры

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

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

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

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

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