#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("АвтоТест") Тогда
Возврат;
КонецЕсли;
РозничныеПродажи.ПодписатьГорячиеКлавишиНаКнопках(ЭтотОбъект);
Дисплеи.ЗагрузитьЗначения(МенеджерОборудованияВызовСервера.ОборудованиеПоПараметрам("ДисплейПокупателя"));
АвтоматическиСоздаватьПартнеров = Константы.АвтоматическиСоздаватьПартнеровПриОтправкеЭлектронногоЧекаПокупателю.Получить();
АвтоматическиОбновлятьКонтактыПартнеров = Константы.ОбновлятьКонтактнуюИнформациюПартнеровПриОтправкеЭлектронныхЧеков.Получить();
ОтправкаЭлектронныхЧековПослеПробитияЧека = Константы.ОтправкаЭлектронныхЧековПослеПробитияЧека.Получить();
КоличествоСимволовПослеЗапятой = 2;
ПервыйВвод = Истина;
Организация = Параметры.Организация;
КассаККМ = Параметры.КассаККМ;
ИдентификаторКорзины = Параметры.ИдентификаторКорзины;
СсылочныйНомер = Параметры.СсылочныйНомер;
ИнформацияОбОплате = Параметры.ИнформацияОбОплате;
Документ = ИнформацияОбОплате.Документ;
КОплате = ИнформацияОбОплате.СуммаКОплате;
ПолученоНаличными = Формат(ИнформацияОбОплате.Наличные, "ЧДЦ=2; ЧГ=3,0");
ОплаченоСертификатами = ИнформацияОбОплате.ПодарочныеСертификаты;
ОплаченоБонуснымиБаллами = ИнформацияОбОплате.БонусныеБаллы;
ЭтоОплатаЭСФСС = ИнформацияОбОплате.ДоступныеВидыОплаты.ЭСФСС;
ПодключенныеЭквайринговыеТерминалы.Загрузить(
ПолучитьЭквайринговыеТерминалыДляПроверкиНаСервереБезКонтекста(Организация, КассаККМ));
Если ЭтоОплатаЭСФСС Тогда
ОплаченоЭСФСС = ИнформацияОбОплате.ЭСФСС;
КонецЕсли;
ОплаченоПлатежнымиКартами = ИнформацияОбОплате.ПлатежныеКарты;
ЭтоВозврат = Ложь;
Если ТипЗнч(Документ) = Тип("ДокументСсылка.ЧекККМВозврат")
ИЛИ ТипЗнч(Документ) = Тип("ДокументСсылка.ВозвратПодарочныхСертификатов") Тогда
ЭтоВозврат = Истина;
ОплаченоПлатежнымиКартами = Макс(Мин(ИнформацияОбОплате.СуммаКОплате - ОплаченоЭСФСС, ОплаченоПлатежнымиКартами), 0);
ПолученоНаличными = Формат(ИнформацияОбОплате.СуммаКОплате - ОплаченоЭСФСС - ОплаченоПлатежнымиКартами, "ЧДЦ=2; ЧГ=3,0");
КонецЕсли;
ТоварныеПозиции = Новый Массив();
Параметры.Свойство("ТоварныеПозиции", ТоварныеПозиции);
ЗаполнитьТоварыФСС(ТоварныеПозиции);
ПредварительноеОдобрениеПолучено = Ложь;
Если ЭтоОплатаЭСФСС Тогда
Если ЗначениеЗаполнено(ИдентификаторКорзины) И Не ЭтоВозврат Тогда
ПредварительноеОдобрениеПолучено = Истина;
ОплатаЭСФССПрошлаЧекНеПробит = Истина;
КонецЕсли;
УстановитьЗаголовкиОплатыДляЭСФСС(ЭтотОбъект);
КонецЕсли;
НастроитьВидимостьЭлементов(ИнформацияОбОплате);
Элементы.ГруппаОтправкаЭлектронногоЧека.Видимость = (Параметры.ДоступнаПередачаДанных И ОтправкаЭлектронныхЧековПослеПробитияЧека);
ЦветФонаВыделенияПоля = ЦветаСтиля.ЦветФонаВыделения;
Партнер = Параметры.Партнер;
РозничныеПродажи.ЗаполнитьПараметрыОтправкиЭлектронногоЧекаПоПартнеру(ЭтотОбъект);
РозничныеПродажиКлиентСервер.УстановитьАктивныйЭлемент(ЭтотОбъект, Элементы.ПолеПолученоНаличными);
Телефон = РозничныеПродажиКлиентСервер.ОтформатироватьНомерТелефона(Телефон10Знаков);
РассчитатьИтоги(ЭтотОбъект, ИнформацияОбОплате);
УстановитьДоступностьИзмененияОплатыНаличными(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПодключитьОбработчикОжидания("ВывестиИнформациюНаДисплейПокупателя", 0.1, Истина);
ПодключитьОбработчикОжидания("УстановитьАктивностьЭлементов", 1, Ложь);
КонецПроцедуры
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
Если ПринудительноЗакрытьФорму ИЛИ ЗавершениеРаботы ИЛИ ОплатаЭСФССПрошлаЧекНеПробит Тогда
Возврат;
КонецЕсли;
Если ПредварительноеОдобрениеПолучено Тогда
Отказ = Истина;
Если ЭтоВозврат Тогда
Кнопки = Новый СписокЗначений;
Кнопки.Добавить("ЗакрытьФорму", НСтр("ru = 'Отменить оплату'"));
Кнопки.Добавить("Отмена", НСтр("ru = 'Отмена'"));
ТекстВопроса = НСтр("ru = 'Перед закрытием формы возврата оплаты требуется отменить проверку.'");
ПоказатьВопрос(
Новый ОписаниеОповещения("ПередЗакрытиемВопросЗавершение", ЭтотОбъект),
ТекстВопроса, Кнопки);
Иначе
Кнопки = Новый СписокЗначений;
Кнопки.Добавить("ОтменитьОплату", НСтр("ru = 'Отменить оплату'"));
Кнопки.Добавить("Отмена", НСтр("ru = 'Отмена'"));
ТекстВопроса = НСтр("ru = 'Перед закрытием формы оплаты требуется отменить проверку.'");
ПоказатьВопрос(
Новый ОписаниеОповещения("ПередЗакрытиемВопросЗавершение", ЭтотОбъект),
ТекстВопроса, Кнопки);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовШапкиФормы
&НаКлиенте
Процедура ТелефонПриИзменении(Элемент)
Телефон10Знаков = РозничныеПродажиКлиентСервер.НомерТелефонаВФормате10Знаков(Телефон);
КонецПроцедуры
&НаКлиенте
Процедура EmailПриИзменении(Элемент)
РозничныеПродажиКлиентСервер.УстановитьВариантОтправкиЭлектронногоЧека(
ЭтотОбъект,
ПредопределенноеЗначение("Перечисление.ВариантыОтправкиЭлектронногоЧекаПокупателю.ОтправитьEmail"));
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиКомандФормы
&НаКлиенте
Процедура Команда0(Команда)
ДобавитьЦифру("0")
КонецПроцедуры
&НаКлиенте
Процедура Команда1(Команда)
ДобавитьЦифру("1")
КонецПроцедуры
&НаКлиенте
Процедура Команда2(Команда)
ДобавитьЦифру("2")
КонецПроцедуры
&НаКлиенте
Процедура Команда3(Команда)
ДобавитьЦифру("3")
КонецПроцедуры
&НаКлиенте
Процедура Команда4(Команда)
ДобавитьЦифру("4")
КонецПроцедуры
&НаКлиенте
Процедура Команда5(Команда)
ДобавитьЦифру("5")
КонецПроцедуры
&НаКлиенте
Процедура Команда6(Команда)
ДобавитьЦифру("6")
КонецПроцедуры
&НаКлиенте
Процедура Команда7(Команда)
ДобавитьЦифру("7")
КонецПроцедуры
&НаКлиенте
Процедура Команда8(Команда)
ДобавитьЦифру("8")
КонецПроцедуры
&НаКлиенте
Процедура Команда9(Команда)
ДобавитьЦифру("9")
КонецПроцедуры
&НаКлиенте
Процедура Команда0ПраваяКлавиатура(Команда)
ДобавитьЦифру("0")
КонецПроцедуры
&НаКлиенте
Процедура Команда1ПраваяКлавиатура(Команда)
ДобавитьЦифру("1")
КонецПроцедуры
&НаКлиенте
Процедура Команда2ПраваяКлавиатура(Команда)
ДобавитьЦифру("2")
КонецПроцедуры
&НаКлиенте
Процедура Команда3ПраваяКлавиатура(Команда)
ДобавитьЦифру("3")
КонецПроцедуры
&НаКлиенте
Процедура Команда4ПраваяКлавиатура(Команда)
ДобавитьЦифру("4")
КонецПроцедуры
&НаКлиенте
Процедура Команда5ПраваяКлавиатура(Команда)
ДобавитьЦифру("5")
КонецПроцедуры
&НаКлиенте
Процедура Команда6ПраваяКлавиатура(Команда)
ДобавитьЦифру("6")
КонецПроцедуры
&НаКлиенте
Процедура Команда7ПраваяКлавиатура(Команда)
ДобавитьЦифру("7")
КонецПроцедуры
&НаКлиенте
Процедура Команда8ПраваяКлавиатура(Команда)
ДобавитьЦифру("8")
КонецПроцедуры
&НаКлиенте
Процедура Команда9ПраваяКлавиатура(Команда)
ДобавитьЦифру("9")
КонецПроцедуры
&НаКлиенте
Процедура КомандаТочка(Команда)
Если АктивноеПоле = Элементы.ПолеПолученоНаличными.Имя Тогда
Если ПервыйВвод Тогда
ПолученоНаличными = "";
ПервыйВвод = Ложь;
КонецЕсли;
Если ПолученоНаличными = "" Тогда
ПолученоНаличными = "0";
КонецЕсли;
ЧислоВхождений = СтрЧислоВхождений(ПолученоНаличными, ",");
Если Не ЧислоВхождений > 0 Тогда
ПолученоНаличными = ПолученоНаличными + ",";
КонецЕсли;
РассчитатьИтоги(ЭтотОбъект);
ПодключитьОбработчикОжидания("ВывестиИнформациюНаДисплейПокупателя", 0.1, Истина);
ИначеЕсли АктивноеПоле = Элементы.Телефон.Имя Тогда
Телефон10Знаков = "";
ИначеЕсли АктивноеПоле = Элементы.НомерЭлектронногоСертификатаФСС.Имя Тогда
НомерЭлектронногоСертификатаФСС = "";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура КомандаСтереть(Команда)
Если АктивноеПоле = Элементы.ПолеПолученоНаличными.Имя Тогда
ПолученоНаличными = "";
ПервыйВвод = Ложь;
РассчитатьИтоги(ЭтотОбъект);
ПодключитьОбработчикОжидания("ВывестиИнформациюНаДисплейПокупателя", 0.1, Истина);
ИначеЕсли АктивноеПоле = Элементы.Телефон.Имя Тогда
Телефон10Знаков = "";
Телефон = РозничныеПродажиКлиентСервер.ОтформатироватьНомерТелефона(Телефон10Знаков);
ИначеЕсли АктивноеПоле = Элементы.НомерЭлектронногоСертификатаФСС.Имя Тогда
НомерЭлектронногоСертификатаФСС = "";
ИначеЕсли АктивноеПоле = Элементы.Email.Имя Тогда
Email = "";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура КомандаПробитьЧек(Команда)
Если ЭтоОплатаЭСФСС Тогда
ТоварныеПозиции = Новый Массив();
ДополнительныеПараметры = Новый Структура();
Если ПредварительноеОдобрениеПолучено Тогда
СледующаяОперация = "ОплатитьЭлектроннымСертификатом";
Если ЭтоВозврат Тогда
СледующаяОперация = "ВернутьЭлектроннымСертификатом";
ИначеЕсли ОплатаЭСФССПрошлаЧекНеПробит Тогда
СледующаяОперация = "ПробитьЧек";
КонецЕсли;
Иначе
РезультатПроверки = ПроверитьВозможностьОплатыЭСФССНаСервере(Организация, КассаККМ, ПодключенныеЭквайринговыеТерминалы);
Если ЗначениеЗаполнено(РезультатПроверки) Тогда
Элементы.ПроверкаВозможностиОплаты.Заголовок = РезультатПроверки;
Элементы.ПроверкаВозможностиОплаты.Видимость = Истина;
Возврат;
Иначе
Элементы.ПроверкаВозможностиОплаты.Видимость = Ложь;
КонецЕсли;
СледующаяОперация = "ПредварительноеОдобрениеИспользования";
Если ЭтоВозврат Тогда
СледующаяОперация = "ПредварительноеОдобрениеВозврата";
КонецЕсли;
КонецЕсли;
ДополнительныеПараметры.Вставить("СледующаяОперация", СледующаяОперация);
ИдентификаторУстройства = Неопределено;
Если ПодключенныеЭквайринговыеТерминалы.Количество() = 1 Тогда
ИдентификаторУстройства = ПодключенныеЭквайринговыеТерминалы[0].ПодключаемоеОборудование;
КонецЕсли;
Если ПредварительноеОдобрениеПолучено Тогда
Если ЭтоВозврат Тогда
ВернутьЭлектронныйСертификат(СледующаяОперация, ИдентификаторУстройства);
ИначеЕсли ОплатаЭСФССПрошлаЧекНеПробит Тогда
ОплатитьВернутьЭСФССЗавершение(ДополнительныеПараметры);
Иначе
ОплатитьЭлектроннымСертификатом(СледующаяОперация, ИдентификаторУстройства);
КонецЕсли;
Иначе
Для Каждого СтрокаТоваров Из ТоварыФСС Цикл
ТоварнаяПозиция = ЭлектронныеСертификатыНСПККлиентСервер.ПараметрыТоварнойПозиции();
ТоварнаяПозиция.Вставить("НомерПозиции", СтрокаТоваров.НомерПозиции);
ТоварнаяПозиция.Вставить("Артикул", СтрокаТоваров.Артикул);
ТоварнаяПозиция.Вставить("КодТовараТРУ", СтрокаТоваров.КодТовараТРУ);
ТоварнаяПозиция.Вставить("Количество", СтрокаТоваров.Количество);
ТоварнаяПозиция.Вставить("Цена", СтрокаТоваров.Цена);
ТоварнаяПозиция.Вставить("НомерПозицииВозврата", СтрокаТоваров.НомерПозицииВозврата);
Если СтрДлина(НомерЭлектронногоСертификатаФСС) >= 7 Тогда
ТоварнаяПозиция.Вставить("СертификатПоследниеЦифры", Сред(НомерЭлектронногоСертификатаФСС,2,6));
КонецЕсли;
ТоварныеПозиции.Добавить(ТоварнаяПозиция);
КонецЦикла;
ДополнительныеПараметры.Вставить("ТоварныеПозиции", ТоварныеПозиции);
Если ЭтоВозврат Тогда
ДополнительныеПараметры.Вставить("ИдентификаторКорзины", ИдентификаторКорзины);
ДополнительныеПараметры.Вставить("СсылочныйНомер", СсылочныйНомер);
КонецЕсли;
ОписаниеОповещения = Новый ОписаниеОповещения("ВыполнитьОперациюЭТЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ОборудованиеПлатежныеСистемыКлиент.НачатьПолучениеПараметровКарты(
ОписаниеОповещения,
УникальныйИдентификатор,
ИдентификаторУстройства);
КонецЕсли;
Иначе
СуммаОплатыЧисло = РозничныеПродажиКлиентСервер.ПривестиСтрокуКЧислу(ПолученоНаличными);
ДанныеЭлектронногоЧека = РозничныеПродажиКлиентСервер.ДанныеЭлектронногоЧека(ЭтотОбъект);
НеобходимостьОбработкиДанных = РозничныеПродажиКлиентСервер.ПроверитьНеобходимостьОбработкиДанныхЭлектронногоЧека(ЭтотОбъект);
Если НеобходимостьОбработкиДанных.ТребуетсяОбновитьКонтактнуюИнформацию
Или НеобходимостьОбработкиДанных.ТребуетсяСоздатьПартнера
Или НеобходимостьОбработкиДанных.ТребуетсяОбновитьВариантОтправкиЭлектронногоЧекаПартнера Тогда
ДанныеЭлектронногоЧека = ОбработатьДанныеЭлектронногоЧека();
КонецЕсли;
Если ДанныеЭлектронногоЧека = Неопределено Тогда
Возврат;
КонецЕсли;
РозничныеПродажиКлиент.ЗаблокироватьФорму(ЭтотОбъект);
РезультатОплаты = РозничныеПродажиКлиентСервер.СтруктураРезультатаОплаты();
РезультатОплаты.ПолученоНаличными = СуммаОплатыЧисло;
РезультатОплаты.ДанныеЭлектронногоЧека = ДанныеЭлектронногоЧека;
ПринудительноЗакрытьФорму = Истина;
Закрыть(РезультатОплаты);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗакрытьФорму(Команда)
Закрыть(ПараметрыЗакрытияФормы().Отмена);
КонецПроцедуры
&НаКлиенте
Процедура ОплатаПодарочныйСертификат(Команда)
ОчиститьСообщения();
Если ТипЗнч(Документ) = Тип("ДокументСсылка.ЧекККМ")
ИЛИ ТипЗнч(Документ) = Тип("ДокументСсылка.РеализацияПодарочныхСертификатов") Тогда
Если СуммаДоплаты <= 0 И НЕ ЭтоОплатаЭСФСС
ИЛИ ОплаченоПлатежнымиКартами = 0 И ЭтоОплатаЭСФСС Тогда
ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru = 'Чек оплачен'"));
Возврат;
КонецЕсли;
КонецЕсли;
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ОповещениеВФормуОплаты", Новый ОписаниеОповещения("ОплатаЗавершение", ЭтотОбъект));
ДополнительныеПараметры.Вставить("ПолученоНаличными", РозничныеПродажиКлиентСервер.ПривестиСтрокуКЧислу(ПолученоНаличными));
ДополнительныеПараметры.Вставить("ОплаченоПлатежнымиКартами", ОплаченоПлатежнымиКартами);
ДополнительныеПараметры.Вставить("ЭтоОплатаЭСФСС", ЭтоОплатаЭСФСС);
ВыполнитьОбработкуОповещения(
Новый ОписаниеОповещения("ДобавитьОплатуПодарочнымСертификатом", ВладелецФормы, ДополнительныеПараметры),
Истина);
КонецПроцедуры
&НаКлиенте
Процедура ОплатаБонусныеБаллы(Команда)
ОчиститьСообщения();
Если ТипЗнч(Документ) = Тип("ДокументСсылка.ЧекККМ")
ИЛИ ТипЗнч(Документ) = Тип("ДокументСсылка.РеализацияПодарочныхСертификатов") Тогда
Если СуммаДоплаты <= 0 Тогда
ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru = 'Чек оплачен'"));
Возврат;
КонецЕсли;
КонецЕсли;
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ОповещениеВФормуОплаты", Новый ОписаниеОповещения("ОплатаЗавершение", ЭтотОбъект));
ДополнительныеПараметры.Вставить("ПолученоНаличными", РозничныеПродажиКлиентСервер.ПривестиСтрокуКЧислу(ПолученоНаличными));
ВыполнитьОбработкуОповещения(
Новый ОписаниеОповещения("ДобавитьОплатуБонуснымиБаллами", ВладелецФормы, ДополнительныеПараметры),
Истина);
КонецПроцедуры
&НаКлиенте
Процедура КомандаСторно(Команда)
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ОповещениеВФормуОплаты", Новый ОписаниеОповещения("ОплатаЗавершение", ЭтотОбъект));
ДополнительныеПараметры.Вставить("ПолученоНаличными", РозничныеПродажиКлиентСервер.ПривестиСтрокуКЧислу(ПолученоНаличными));
ВыполнитьОбработкуОповещения(
Новый ОписаниеОповещения("ОтменитьОплатыПлатежнымиКартами", ВладелецФормы, ДополнительныеПараметры),
Истина);
КонецПроцедуры
&НаКлиенте
Процедура КомандаОтправитьSMS(Команда)
РозничныеПродажиКлиентСервер.УстановитьАктивныйЭлемент(ЭтотОбъект, Элементы.Телефон);
РозничныеПродажиКлиентСервер.УстановитьВариантОтправкиЭлектронногоЧека(
ЭтотОбъект,
ПредопределенноеЗначение("Перечисление.ВариантыОтправкиЭлектронногоЧекаПокупателю.ОтправитьSMS"));
КонецПроцедуры
&НаКлиенте
Процедура КомандаОтправитьEmail(Команда)
РозничныеПродажиКлиентСервер.УстановитьАктивныйЭлемент(ЭтотОбъект, Элементы.Email);
РозничныеПродажиКлиентСервер.УстановитьВариантОтправкиЭлектронногоЧека(
ЭтотОбъект,
ПредопределенноеЗначение("Перечисление.ВариантыОтправкиЭлектронногоЧекаПокупателю.ОтправитьEmail"));
КонецПроцедуры
&НаКлиенте
Процедура КомандаОтправкаНеТребуется(Команда)
РозничныеПродажиКлиентСервер.УстановитьВариантОтправкиЭлектронногоЧека(
ЭтотОбъект,
ПредопределенноеЗначение("Перечисление.ВариантыОтправкиЭлектронногоЧекаПокупателю.НеОтправлять"));
КонецПроцедуры
&НаКлиенте
Процедура СтатусТоваровФСС(Команда)
ИменаМакетов = Новый Массив;
ИменаМакетов.Добавить("ДанныеПроверкиТоваровФСС");
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(Документ);
ДанныеОплаты = Новый Структура;
ДанныеОплаты.Вставить("Ссылка", Документ);
ДанныеОплаты.Вставить("ЭтоВозврат", ЭтоВозврат);
ДанныеОплаты.Вставить("СуммаЧека", КОплате);
ДанныеОплаты.Вставить("СуммаЭС", ОплаченоЭСФСС);
ДанныеДляПечати = Новый Структура;
ДанныеДляПечати.Вставить("ДанныеОплаты", ДанныеОплаты);
КолонкиТоварыФСС = КолонкиТоварыФСС();
СтрокиТоварыФСС = Новый Массив;
Для каждого ЭлемСтрока Из ТоварыФСС Цикл
ДанныеСтроки = Новый Структура;
Для каждого ЭлемКолонка Из КолонкиТоварыФСС Цикл
ДанныеСтроки.Вставить(ЭлемКолонка.Ключ, ЭлемСтрока[ЭлемКолонка.Ключ]);
КонецЦикла;
СтрокиТоварыФСС.Добавить(ДанныеСтроки);
КонецЦикла;
ДанныеДляПечати.Вставить("ТоварыФСС", СтрокиТоварыФСС);
ДанныеДляПечати.Вставить("ЗаголовокДокумента", НСтр("ru = 'Статус товаров ФСС'"));
ПараметрыПечати = Новый Структура;
ПараметрыПечати.Вставить("ДополнитьКомплектВнешнимиПечатнымиФормами", Ложь);
ПараметрыПечати.Вставить("ДанныеДляПечати", ДанныеДляПечати);
УправлениеПечатьюКлиент.ВыполнитьКомандуПечати(
"Обработка.ПечатьСтатусовТоваровФСС",
ИменаМакетов,
МассивОбъектов,
ЭтотОбъект,
ПараметрыПечати);
КонецПроцедуры
&НаКлиенте
Процедура ПолучитьСписокЭлектронныхСертификатовФСС(Команда)
ПолучитьСписокЭлектронныхСертификатовФССКлиент();
КонецПроцедуры
#КонецОбласти
#Область ОплатаЭСФСС
&НаКлиенте
Процедура ОплатитьЭлектроннымСертификатом(СледующаяОперация, ИдентификаторУстройства)
ПараметрыОперации = ОборудованиеПлатежныеСистемыКлиентСервер.ПараметрыВыполненияЭквайринговойОперации();
ПараметрыОперации.ТипТранзакции = "PayElectronicCertificate";
ПараметрыОперации.ИдентификаторКорзины = ИдентификаторКорзины;
ПараметрыОперации.СуммаЭлектронногоСертификата = ОплаченоЭСФСС;
ПараметрыОперации.СуммаСобственныхСредств = ОплаченоПлатежнымиКартами;
ПараметрыОперации.ДокументОснование = Документ;
ПараметрыОперации.Вставить("СледующаяОперация", СледующаяОперация);
ОписаниеОповещения = Новый ОписаниеОповещения("ВыполнитьОперациюЭТЗавершение", ЭтотОбъект, ПараметрыОперации);
ОборудованиеПлатежныеСистемыКлиент.НачатьВыполнениеОперацииНаЭквайринговомТерминале(
ОписаниеОповещения,
УникальныйИдентификатор,
ИдентификаторУстройства,
ПараметрыОперации,
Неопределено,
Неопределено);
КонецПроцедуры
&НаКлиенте
Процедура ВернутьЭлектронныйСертификат(СледующаяОперация, ИдентификаторУстройства)
ПараметрыОперации = ОборудованиеПлатежныеСистемыКлиентСервер.ПараметрыВыполненияЭквайринговойОперации();
ПараметрыОперации.ТипТранзакции = "ReturnElectronicCertificate";
ПараметрыОперации.ИдентификаторКорзины = ИдентификаторКорзины;
ПараметрыОперации.СсылочныйНомер = СсылочныйНомер;
ПараметрыОперации.СуммаЭлектронногоСертификата = ОплаченоЭСФСС;
ПараметрыОперации.СуммаСобственныхСредств = ОплаченоПлатежнымиКартами;
ПараметрыОперации.ДокументОснование = Документ;
ПараметрыОперации.Вставить("СледующаяОперация", СледующаяОперация);
ОписаниеОповещения = Новый ОписаниеОповещения("ВыполнитьОперациюЭТЗавершение", ЭтотОбъект, ПараметрыОперации);
ОборудованиеПлатежныеСистемыКлиент.НачатьВыполнениеОперацииНаЭквайринговомТерминале(
ОписаниеОповещения,
УникальныйИдентификатор,
ИдентификаторУстройства,
ПараметрыОперации,
Неопределено,
Неопределено);
КонецПроцедуры
&НаКлиенте
Процедура ОплатитьВернутьЭСФССЗавершение(ДополнительныеПараметры)
ДанныеЭлектронногоЧека = РозничныеПродажиКлиентСервер.ДанныеЭлектронногоЧека(ЭтотОбъект);
НеобходимостьОбработкиДанных = РозничныеПродажиКлиентСервер.ПроверитьНеобходимостьОбработкиДанныхЭлектронногоЧека(ЭтотОбъект);
Если НеобходимостьОбработкиДанных.ТребуетсяОбновитьКонтактнуюИнформацию
Или НеобходимостьОбработкиДанных.ТребуетсяСоздатьПартнера
Или НеобходимостьОбработкиДанных.ТребуетсяОбновитьВариантОтправкиЭлектронногоЧекаПартнера Тогда
ДанныеЭлектронногоЧека = ОбработатьДанныеЭлектронногоЧека();
КонецЕсли;
ДополнительныеПараметры.Вставить("ДанныеЭлектронногоЧека", ДанныеЭлектронногоЧека);
ДополнительныеПараметры.Вставить("Результат", Истина);
ДополнительныеПараметры.Вставить("Наличными", РозничныеПродажиКлиентСервер.ПривестиСтрокуКЧислу(ПолученоНаличными));
ДополнительныеПараметры.Вставить("Сдача", СуммаСдачи);
ПринудительноЗакрытьФорму = Истина;
Закрыть(ДополнительныеПараметры);
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьОперациюЭТЗавершение(РезультатВыполнения, ДополнительныеПараметры = Неопределено) Экспорт
Если РезультатВыполнения.Результат Тогда
Если РезультатВыполнения.Свойство("ХешНомерКарты") Тогда
ХешНомерКарты = РезультатВыполнения.ХешНомерКарты;
СсылкаНаПлатежныйСчет = РезультатВыполнения.СсылкаНаПлатежныйСчет;
КонецЕсли;
Если НЕ ДополнительныеПараметры = Неопределено И ДополнительныеПараметры.Свойство("СледующаяОперация") Тогда
Если ДополнительныеПараметры.СледующаяОперация = "ПредварительноеОдобрениеИспользования" Тогда
СогласоватьЭСФСС(ДополнительныеПараметры.ТоварныеПозиции, ХешНомерКарты, СсылкаНаПлатежныйСчет);
ИначеЕсли ДополнительныеПараметры.СледующаяОперация = "ПредварительноеОдобрениеВозврата" Тогда
СогласоватьВозвратЭСФСС(ДополнительныеПараметры.ТоварныеПозиции, ХешНомерКарты, СсылкаНаПлатежныйСчет);
ИначеЕсли ДополнительныеПараметры.СледующаяОперация = "ПолучениеСпискаСертификатов" Тогда
ОбработатьПолучениеСпискаЭлектронныхСертификатовФСС(РезультатВЫполнения.ДоступныеСертификаты);
Иначе
ДополнительныеПараметры.Вставить("ИдентификаторУстройства", РезультатВыполнения.ИдентификаторУстройства);
ДополнительныеПараметры.Вставить("НомерКарты", РезультатВыполнения.НомерКарты);
ДополнительныеПараметры.Вставить("НомерЧекаЭТ", РезультатВыполнения.НомерЧекаЭТ);
ДополнительныеПараметры.Вставить("СсылочныйНомер", РезультатВыполнения.СсылочныйНомер);
ДополнительныеПараметры.Вставить("КодАвторизации", РезультатВыполнения.КодАвторизации);
ДополнительныеПараметры.Вставить("ИдентификаторКорзины", РезультатВыполнения.ИдентификаторКорзины);
ОплатитьВернутьЭСФССЗавершение(ДополнительныеПараметры);
КонецЕсли;
КонецЕсли;
Иначе
ОчиститьСообщения();
ТекстСообщения = РезультатВыполнения.ОписаниеОшибки;
ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СогласоватьЭСФСС(ТоварныеПозиции, ХешНомерКарты, СсылкаНаПлатежныйСчет)
ПараметрыОперации = ПараметрыОперацииНСПКПоКассеККМ(КассаККМ);
ПараметрыОперации.ХешНомерКарты = ХешНомерКарты;
ПараметрыОперации.СсылкаНаПлатежныйСчет = СсылкаНаПлатежныйСчет;
ПараметрыОперации.ТоварныеПозиции = ТоварныеПозиции;
ОповещениеМетода = Новый ОписаниеОповещения("ПредварительноеОдобрениеЭСФССЗавершение", ЭтотОбъект, ПараметрыОперации);
ЭлектронныеСертификатыНСПККлиент.НачатьПредварительноеОдобрениеИспользования(ОповещениеМетода, ПараметрыОперации);
КонецПроцедуры
&НаСервере
Функция ПараметрыОперацииНСПКПоКассеККМ(КассаККМ, ИдентификаторКорзины = "", ИдентификаторЗапроса = "0")
Возврат ЭлектронныеСертификатыНСПКУТ.ПараметрыОперацииНСПКПоКассеККМ(КассаККМ, ИдентификаторКорзины, ИдентификаторЗапроса);
КонецФункции
&НаКлиенте
Процедура ПредварительноеОдобрениеЭСФССЗавершение(РезультатВыполнения, ДополнительныеПараметры) Экспорт
Если НЕ (ТипЗнч(РезультатВыполнения) = Тип("Структура") И РезультатВыполнения.Свойство("Результат")) Тогда
Возврат;
КонецЕсли;
Если РезультатВыполнения.Результат Тогда
ПредварительноеОдобрениеПолучено = Истина;
КонецЕсли;
ОбработатьРезультатПроверкиЭСФССНаСервере(РезультатВыполнения);
Элементы.ГруппаВыбораНомераЭСФСС.Доступность = Не ПредварительноеОдобрениеПолучено;
КонецПроцедуры
&НаКлиенте
Процедура СогласоватьВозвратЭСФСС(ТоварныеПозиции, ХешНомерКарты, СсылкаНаПлатежныйСчет)
ПараметрыОперации = ПараметрыОперацииНСПКПоКассеККМ(КассаККМ, ИдентификаторКорзины);
ПараметрыОперации.ХешНомерКарты = ХешНомерКарты;
ПараметрыОперации.СсылкаНаПлатежныйСчет = СсылкаНаПлатежныйСчет;
ДополнительныеПараметры = Новый Структура("ПараметрыОперации, ТоварныеПозиции", ПараметрыОперации, ТоварныеПозиции);
ОповещениеМетода = Новый ОписаниеОповещения("ПолучениеСоставаКорзиныНСПКЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ЭлектронныеСертификатыНСПККлиент.НачатьПолучениеСоставаКорзины(ОповещениеМетода, ПараметрыОперации);
КонецПроцедуры
&НаКлиенте
Процедура ПолучениеСоставаКорзиныНСПКЗавершение(РезультатВыполнения, ДополнительныеПараметры) Экспорт
Если НЕ (ТипЗнч(РезультатВыполнения) = Тип("Структура") И РезультатВыполнения.Свойство("Результат")) Тогда
Возврат;
КонецЕсли;
Если РезультатВыполнения.Результат Тогда
РезультатВыполнения.Вставить("ПредыдущаяПокупка", Истина);
ОбработатьРезультатПроверкиЭСФССНаСервере(РезультатВыполнения);
РезультатВыполнения.Удалить("ПредыдущаяПокупка");
Если НЕ РезультатВыполнения.Результат Тогда
Возврат;
КонецЕсли;
ТоварныеПозиции = ДополнительныеПараметры.ТоварныеПозиции;
СтрокиНеИзВозврата = ТоварыФСС.НайтиСтроки(Новый Структура("НомерПозицииВозврата", 999));
Для каждого СтрокаНеИзВозврата Из СтрокиНеИзВозврата Цикл
КоличествоТоварныхПозиций = ТоварныеПозиции.Количество();
Для Индекс = 1 По КоличествоТоварныхПозиций Цикл
СтрокаТовара = ТоварныеПозиции[КоличествоТоварныхПозиций - Индекс];
Если СтрокаТовара.Артикул = СтрокаНеИзВозврата.Артикул Тогда
ТоварныеПозиции.Удалить(КоличествоТоварныхПозиций - Индекс);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Для каждого СтрокаПодтверждения Из ТоварныеПозиции Цикл
СтрокаФСС = ТоварыФСС.НайтиПоИдентификатору(СтрокаПодтверждения.НомерПозиции);
Если НЕ СтрокаФСС = Неопределено Тогда
СтрокаПодтверждения.НомерПозицииВозврата = СтрокаФСС.НомерПозицииВозврата;
КонецЕсли;
КонецЦикла;
ПараметрыОперации = ДополнительныеПараметры.ПараметрыОперации;
ПараметрыОперации.ТоварныеПозиции = ТоварныеПозиции;
ПараметрыОперации.ИдентификаторЗапроса = Строка(Новый УникальныйИдентификатор());
ПредварительноеОдобрениеНСПКПолучено = Ложь;
ОповещениеМетода = Новый ОписаниеОповещения("ПредварительноеОдобрениеНСПКЗавершение", ЭтотОбъект, ПараметрыОперации);
ЭлектронныеСертификатыНСПККлиент.НачатьПредварительноеОдобрениеВозврата(ОповещениеМетода, ПараметрыОперации);
Иначе
ОписаниеОшибки =
СтрШаблон(НСтр("ru='Ошибка: (%1) %2'"), РезультатВыполнения.КодРезультата, РезультатВыполнения.ОписаниеОшибки);
ОбщегоНазначенияКлиент.СообщитьПользователю(ОписаниеОшибки);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПредварительноеОдобрениеНСПКЗавершение(РезультатВыполнения, ДополнительныеПараметры) Экспорт
Если НЕ (ТипЗнч(РезультатВыполнения) = Тип("Структура") И РезультатВыполнения.Свойство("Результат")) Тогда
Возврат;
КонецЕсли;
Если РезультатВыполнения.Результат Тогда
ПредварительноеОдобрениеПолучено = Истина;
КонецЕсли;
ОбработатьРезультатПроверкиЭСФССНаСервере(РезультатВыполнения);
Элементы.ГруппаВыбораНомераЭСФСС.Доступность = Не ПредварительноеОдобрениеПолучено;
КонецПроцедуры
&НаСервере
Процедура ОбработатьРезультатПроверкиЭСФССНаСервере(РезультатВыполнения);
Если РезультатВыполнения.Результат Тогда
Если РезультатВыполнения.Свойство("ИдентификаторКорзины") И НЕ ПустаяСтрока(РезультатВыполнения.ИдентификаторКорзины) Тогда
ИдентификаторКорзины = РезультатВыполнения.ИдентификаторКорзины;
КонецЕсли;
Если РезультатВыполнения.Свойство("СсылочныйНомер") И НЕ ПустаяСтрока(РезультатВыполнения.СсылочныйНомер) Тогда
СсылочныйНомер = РезультатВыполнения.СсылочныйНомер;
КонецЕсли;
Если РезультатВыполнения.Свойство("СуммаСертификатами") Тогда
ОплаченоЭСФСС = РезультатВыполнения.СуммаСертификатами;
ОплаченоПлатежнымиКартами = КОплате - ОплаченоЭСФСС - РозничныеПродажиКлиентСервер.ПривестиСтрокуКЧислу(ПолученоНаличными);
КонецЕсли;
Если РезультатВыполнения.Свойство("ТоварныеПозиции") И РезультатВыполнения.ТоварныеПозиции.Количество() > 0 Тогда
Для Каждого ТоварнаяПозиция Из РезультатВыполнения.ТоварныеПозиции Цикл
СтрокаТовара = Неопределено;
Если РезультатВыполнения.Свойство("ПредыдущаяПокупка") Тогда
СтрокиТоваров = ТоварыФСС.НайтиСтроки(Новый Структура("Артикул", ТоварнаяПозиция.Артикул));
Если СтрокиТоваров.Количество()>0 Тогда
СтрокаТовара = СтрокиТоваров[0];
КонецЕсли;
Иначе
СтрокаТовара = ТоварыФСС.НайтиПоИдентификатору(ТоварнаяПозиция.НомерПозиции);
КонецЕсли;
Если СтрокаТовара = Неопределено Тогда
Продолжить;
КонецЕсли;
Если РезультатВыполнения.Свойство("ПредыдущаяПокупка") Тогда
СтрокаТовара.НомерПозицииВозврата = ТоварнаяПозиция.НомерПозиции;
КонецЕсли;
СтрокаТовара.КоличествоФСС = ТоварнаяПозиция.Количество;
СтрокаТовара.ЦенаФСС = ТоварнаяПозиция.Цена;
СтрокаТовара.СуммаФСС = СтрокаТовара.КоличествоФСС*СтрокаТовара.ЦенаФСС;
Если ТоварнаяПозиция.Свойство("Сертификаты") И ТоварнаяПозиция.Сертификаты.Количество() > 0 Тогда
КоличествоПоСертификату = 0;
СуммаПоСертификату = 0;
МаксимальнаяЦена = 0;
Для Каждого Сертификат Из ТоварнаяПозиция.Сертификаты Цикл
СтрокаСертификата = СтрокаТовара.Сертификаты.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаСертификата, Сертификат);
КоличествоПоСертификату = КоличествоПоСертификату + СтрокаСертификата.Количество;
СуммаПоСертификату = СуммаПоСертификату + (СтрокаСертификата.Количество * СтрокаСертификата.Цена);
МаксимальнаяЦена = Макс(МаксимальнаяЦена, СтрокаСертификата.МаксимальнаяЦена);
КонецЦикла;
СтрокаТовара.МаксимальнаяЦена = МаксимальнаяЦена;
СтрокаТовара.КоличествоФСС = КоличествоПоСертификату;
СтрокаТовара.СуммаФСС = СуммаПоСертификату;
СтрокаТовара.ЦенаФСС =
?(КоличествоПоСертификату = 0, СуммаПоСертификату, Окр(СуммаПоСертификату/КоличествоПоСертификату, 2));
КонецЕсли;
КонецЦикла;
КонецЕсли;
УстановитьЗаголовкиОплатыДляЭСФСС(ЭтотОбъект);
РассчитатьИтоги(ЭтотОбъект);
УстановитьДоступностьИзмененияОплатыНаличными(ЭтотОбъект);
Иначе
ОписаниеОшибки =
СтрШаблон(НСтр("ru='Ошибка: (%1) %2'"), РезультатВыполнения.КодРезультата, РезультатВыполнения.ОписаниеОшибки);
ОбщегоНазначения.СообщитьПользователю(ОписаниеОшибки);
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПроверитьВозможностьОплатыЭСФССНаСервере(Организация, КассаККМ, Знач ПодключенныеЭквайринговыеТерминалы)
ЧастиФорматированнойСтроки = Новый Массив;
КассаККМСклад = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(КассаККМ, "Склад");
АдресМагазина = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(
КассаККМСклад, Перечисления.ТипыКонтактнойИнформации.Адрес, ТекущаяДатаСеанса(), Ложь);
Если Не ЗначениеЗаполнено(АдресМагазина) Тогда
ЧастиФорматированнойСтроки.Добавить(
СтроковыеФункции.ФорматированнаяСтрока(НСтр("ru = 'Необходимо указать адрес <a href=""%1"">склада</a>.'"),
ПолучитьНавигационнуюСсылку(КассаККМСклад)));
ЧастиФорматированнойСтроки.Добавить(Символы.ПС);
КонецЕсли;
ЕстьНастроенныйТерминал = Ложь;
Если НЕ ПодключенныеЭквайринговыеТерминалы.Количество() = 0 Тогда
ЕстьНастроенныйТерминал = Истина;
КонецЕсли;
Если Не ЕстьНастроенныйТерминал Тогда
ЧастиФорматированнойСтроки.Добавить(
СтроковыеФункции.ФорматированнаяСтрока(
НСтр("ru = 'В доступные виды оплаты эквайрингового терминала необходимо добавить вид оплаты Оплата ЭС (ФЗ-491)'")));
ЧастиФорматированнойСтроки.Добавить(Символы.ПС);
КонецЕсли;
Возврат Новый ФорматированнаяСтрока(ЧастиФорматированнойСтроки);
КонецФункции
&НаСервереБезКонтекста
Функция ПолучитьЭквайринговыеТерминалыДляПроверкиНаСервереБезКонтекста(Организация, КассаККМ)
РабочееМесто = МенеджерОборудованияВызовСервера.РабочееМестоКлиента();
Запрос = Новый Запрос(
"ВЫБРАТЬ
| НастройкиРМКЭквайринговыеТерминалы.ЭквайринговыйТерминал КАК ЭквайринговыйТерминал,
| НастройкиРМКЭквайринговыеТерминалы.ПодключаемоеОборудование КАК ПодключаемоеОборудование
|ИЗ
| Справочник.НастройкиРМК.ЭквайринговыеТерминалы КАК НастройкиРМКЭквайринговыеТерминалы
|
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ЭквайринговыеТерминалы КАК ЭквайринговыеТерминалыТипы
| ПО НастройкиРМКЭквайринговыеТерминалы.ЭквайринговыйТерминал = ЭквайринговыеТерминалыТипы.Ссылка
|
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.НастройкиРМК.КассыККМ КАК НастройкиРМККассыККМ
| ПО НастройкиРМКЭквайринговыеТерминалы.ПодключаемоеОборудованиеККТ = НастройкиРМККассыККМ.ПодключаемоеОборудование
| И НастройкиРМККассыККМ.КассаККМ = &КассаККМ
|ГДЕ
| НастройкиРМКЭквайринговыеТерминалы.Ссылка.РабочееМесто = &РабочееМесто
| И (НастройкиРМКЭквайринговыеТерминалы.ПодключаемоеОборудование <> ЗНАЧЕНИЕ(Справочник.ПодключаемоеОборудование.ПустаяСсылка)
| И НастройкиРМКЭквайринговыеТерминалы.ПодключаемоеОборудование.РабочееМесто = &РабочееМестоОборудования
| ИЛИ НастройкиРМКЭквайринговыеТерминалы.ИспользоватьБезПодключенияОборудования)
| И ЭквайринговыеТерминалыТипы.Ссылка.Владелец.БанковскийСчет.Владелец = &Организация
| И ЭквайринговыеТерминалыТипы.ПоддерживаетОплатуЭСФСС = ИСТИНА");
Запрос.УстановитьПараметр("РабочееМесто", РабочееМесто);
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("РабочееМестоОборудования", РабочееМесто);
Запрос.УстановитьПараметр("КассаККМ", КассаККМ);
Результат = Запрос.Выполнить().Выгрузить();
Возврат Результат;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьЗаголовкиОплатыДляЭСФСС(Форма)
Если Форма.ПредварительноеОдобрениеПолучено Тогда
Если Форма.ЭтоВозврат Тогда
ЗаголовокОплаты = НСтр("ru = 'Вернуть'");
ТекстПодсказки = НСтр("ru = 'Возврат электронного сертификата должен производиться только на карту, к которой приписываются электронные сертификаты покупателя.'");
ИначеЕсли Форма.ОплатаЭСФССПрошлаЧекНеПробит Тогда
ЗаголовокОплаты = НСтр("ru = 'Пробить чек'");
ТекстПодсказки = НСтр("ru = 'Оплата электронным сертификатом уже прошла, необходимо пробить чек.'");
Иначе
ЗаголовокОплаты = НСтр("ru = 'Оплатить'");
ТекстПодсказки = НСтр("ru = 'Доплата к электронному сертификату может производиться собственными средствами с той же карты,
|а также наличными.'");
КонецЕсли;
Иначе
ЗаголовокОплаты = НСтр("ru = 'Проверить'");
Если Форма.ЭтоВозврат Тогда
ТекстПодсказки = НСтр("ru = 'Перед возвратом необходимо проверить доступную сумму к возврату ЭС (ФЗ-491).'");
Иначе
ТекстПодсказки = НСтр("ru = 'Перед оплатой необходимо проверить доступную сумму к оплате ЭС (ФЗ-491).'");
КонецЕсли;
КонецЕсли;
Форма.Элементы.КомандаПробитьЧек.Заголовок = ЗаголовокОплаты;
Форма.Элементы.ГруппаСумм.РасширеннаяПодсказка.Заголовок = ТекстПодсказки;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция КолонкиТоварыФСС()
Результат = Новый Структура;
Результат.Вставить("Номенклатура");
Результат.Вставить("Артикул");
Результат.Вставить("Сумма");
Возврат Результат;
КонецФункции
&НаКлиенте
Процедура ПолучитьСписокЭлектронныхСертификатовФССКлиент()
Если ПредварительноеОдобрениеПолучено = Ложь Тогда
ИдентификаторУстройства = Неопределено;
Если ПодключенныеЭквайринговыеТерминалы.Количество() = 1 Тогда
ИдентификаторУстройства = ПодключенныеЭквайринговыеТерминалы[0].ПодключаемоеОборудование;
КонецЕсли;
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("СледующаяОперация", "ПолучениеСпискаСертификатов");
ОписаниеОповещения = Новый ОписаниеОповещения("ПолучитьСписокЭлектронныхСертификатовФССКлиентПродолжение", ЭтотОбъект, ДополнительныеПараметры);
ОборудованиеПлатежныеСистемыКлиент.НачатьПолучениеПараметровКарты(
ОписаниеОповещения,
УникальныйИдентификатор,
ИдентификаторУстройства);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПолучитьСписокЭлектронныхСертификатовФССКлиентПродолжение(РезультатВыполнения, ДополнительныеПараметры) Экспорт
Если Не (ТипЗнч(РезультатВыполнения) = Тип("Структура") И РезультатВыполнения.Свойство("Результат")) Тогда
Возврат;
КонецЕсли;
Если РезультатВыполнения.Результат Тогда
ПараметрыОперации = ПараметрыОперацииНСПКПоКассеККМ(КассаККМ);
ПараметрыОперации.ХешНомерКарты = РезультатВыполнения.ХешНомерКарты;
ПараметрыОперации.СсылкаНаПлатежныйСчет = РезультатВыполнения.СсылкаНаПлатежныйСчет;
ОписаниеОповещения = Новый ОписаниеОповещения("ВыполнитьОперациюЭТЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ЭлектронныеСертификатыНСПККлиент.НачатьПолучениеСпискаСертификатов(ОписаниеОповещения, ПараметрыОперации);
Иначе
ОчиститьСообщения();
ТекстСообщения = РезультатВыполнения.ОписаниеОшибки;
ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстСообщения);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьПолучениеСпискаЭлектронныхСертификатовФСС(ДоступныеСертификаты)
НомерЭлектронногоСертификатаФСС = "";
ЭлементЭлектронногоСертификатаФСС = Элементы.НомерЭлектронногоСертификатаФСС;
ЭлементЭлектронногоСертификатаФСС.СписокВыбора.Очистить();
ЭлементЭлектронногоСертификатаФСС.РежимВыбораИзСписка = Ложь;
Если ДоступныеСертификаты.Количество() Тогда
Для Каждого СертификатНСПК Из ДоступныеСертификаты Цикл
ИдентификаторСертификатаНСПК = СертификатНСПК.Идентификатор;
ПредставлениеНомера = НСтр("ru='*'") + Прав(ИдентификаторСертификатаНСПК, 6);
ЭлементЭлектронногоСертификатаФСС.СписокВыбора.Вставить(0, ПредставлениеНомера, ПредставлениеНомера);
КонецЦикла;
Если ДоступныеСертификаты.Количество() = 1 Тогда
НомерЭлектронногоСертификатаФСС = ЭлементЭлектронногоСертификатаФСС.СписокВыбора[0].Значение;
КонецЕсли;
ЭлементЭлектронногоСертификатаФСС.РежимВыбораИзСписка = Истина;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьДоступностьИзмененияОплатыНаличными(Форма)
ПолеПолученоНаличнымиДоступно = Форма.ПредварительноеОдобрениеПолучено И Форма.КОплате > Форма.ОплаченоЭСФСС И Не Форма.ОплатаЭСФССПрошлаЧекНеПробит;
Форма.Элементы.ПолеПолученоНаличными.Доступность = ПолеПолученоНаличнымиДоступно;
Форма.Элементы.ГруппаОтправкаЭлектронногоЧека.Доступность = Форма.ПредварительноеОдобрениеПолучено;
Форма.Элементы.ГруппаСтраницаПраваяКлавиатура.Доступность = ПолеПолученоНаличнымиДоступно ИЛИ Форма.АктивноеПоле = Форма.Элементы.Телефон.Имя ИЛИ Форма.АктивноеПоле = Форма.Элементы.НомерЭлектронногоСертификатаФСС.Имя;
Форма.Элементы.ГруппаСтраницаПрочее.Доступность = ПолеПолученоНаличнымиДоступно ИЛИ Форма.АктивноеПоле = Форма.Элементы.Телефон.Имя ИЛИ Форма.АктивноеПоле = Форма.Элементы.НомерЭлектронногоСертификатаФСС.Имя;
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьЦифру(ВведеннаяЦифраСтрокой)
Если АктивноеПоле = Элементы.ПолеПолученоНаличными.Имя Тогда
Если ЭтоВозврат Тогда
Возврат;
КонецЕсли;
Если ПервыйВвод Тогда
Если ВведеннаяЦифраСтрокой = "0" Тогда
Возврат;
КонецЕсли;
ПолученоНаличными = "";
ПервыйВвод = Ложь;
КонецЕсли;
Запятая = Сред(ПолученоНаличными, СтрДлина(ПолученоНаличными) - КоличествоСимволовПослеЗапятой, 1);
Если НЕ Запятая = "," Тогда
ПолученоНаличными = ПолученоНаличными + ВведеннаяЦифраСтрокой;
КонецЕсли;
РассчитатьИтоги(ЭтотОбъект);
ПодключитьОбработчикОжидания("ВывестиИнформациюНаДисплейПокупателя", 0.1, Истина);
ИначеЕсли АктивноеПоле = Элементы.Телефон.Имя Тогда
Если ПервыйВвод Тогда
Телефон10Знаков = "";
ПервыйВвод = Ложь;
КонецЕсли;
Телефон10Знаков = Телефон10Знаков + ВведеннаяЦифраСтрокой;
Телефон = РозничныеПродажиКлиентСервер.ОтформатироватьНомерТелефона(Телефон10Знаков);
Если СтрДлина(Телефон10Знаков) = 10 Тогда
ТекущийЭлемент = Элементы.КомандаПробитьЧек;
КонецЕсли;
РозничныеПродажиКлиентСервер.УстановитьВариантОтправкиЭлектронногоЧека(
ЭтотОбъект,
ПредопределенноеЗначение("Перечисление.ВариантыОтправкиЭлектронногоЧекаПокупателю.ОтправитьSMS"));
ИначеЕсли АктивноеПоле = Элементы.НомерЭлектронногоСертификатаФСС.Имя Тогда
Если ПервыйВвод Тогда
НомерЭлектронногоСертификатаФСС = "";
ПервыйВвод = Ложь;
КонецЕсли;
НомерЭлектронногоСертификатаФСС = НомерЭлектронногоСертификатаФСС + ВведеннаяЦифраСтрокой;
Если СтрДлина(НомерЭлектронногоСертификатаФСС) > 6 Тогда
ТекущийЭлемент = Элементы.КомандаПробитьЧек;
КонецЕсли;
ИначеЕсли АктивноеПоле = Элементы.Email.Имя Тогда
Если ПервыйВвод Тогда
Email = "";
ПервыйВвод = Ложь;
КонецЕсли;
Email = СокрЛП(Email) + ВведеннаяЦифраСтрокой;
КонецЕсли;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура СуммаОплаты(Форма)
Форма.СуммаОплаты = РозничныеПродажиКлиентСервер.ПривестиСтрокуКЧислу(Форма.ПолученоНаличными)
+ Форма.ОплаченоБонуснымиБаллами
+ Форма.ОплаченоПлатежнымиКартами
+ Форма.ОплаченоЭСФСС
+ Форма.ОплаченоСертификатами;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура РассчитатьИтоги(Форма, ИнформацияОбОплате = Неопределено)
СуммаОплаты(Форма);
Если Форма.ЭтоОплатаЭСФСС
И НЕ Форма.ПредварительноеОдобрениеПолучено Тогда
Форма.СуммаСдачи = 0;
Форма.СуммаДоплаты = Форма.КОплате - Форма.СуммаОплаты;
Форма.Элементы.ГруппаИтого.ТекущаяСтраница = Форма.Элементы.ГруппаДоплата;
Форма.Элементы.КомандаПробитьЧек.Доступность = Истина;
Форма.Элементы.ОплатаПодарочныйСертификат.Доступность = Ложь;
Форма.Элементы.ОплатаБонусныеБаллы.Доступность = Истина;
Форма.ТекущийЭлемент = Форма.Элементы.КомандаПробитьЧек;
ИначеЕсли Форма.ЭтоОплатаЭСФСС
И Форма.ПредварительноеОдобрениеПолучено Тогда
ОплаченоПлатежнымиКартами = Форма.КОплате + Форма.ОплаченоПлатежнымиКартами - Форма.СуммаОплаты;
Форма.ОплаченоПлатежнымиКартами = Макс(ОплаченоПлатежнымиКартами, 0);
СуммаОплаты(Форма);
Форма.СуммаСдачи = Форма.СуммаОплаты - Форма.КОплате;
Форма.СуммаДоплаты = 0;
Форма.Элементы.ГруппаИтого.ТекущаяСтраница = Форма.Элементы.ГруппаСдача;
Форма.Элементы.КомандаПробитьЧек.Доступность = Истина;
Форма.Элементы.ОплатаПодарочныйСертификат.Доступность = Истина;
Форма.Элементы.ОплатаБонусныеБаллы.Доступность = Ложь;
Если Форма.ОплатаЭСФССПрошлаЧекНеПробит Тогда
Форма.Элементы.ОплатаПодарочныйСертификат.Доступность = Ложь;
Форма.Элементы.ОплатаБонусныеБаллы.Доступность = Ложь;
КонецЕсли;
Форма.ТекущийЭлемент = Форма.Элементы.КомандаПробитьЧек;
ИначеЕсли Форма.СуммаОплаты >= Форма.КОплате Тогда
Форма.СуммаСдачи = Форма.СуммаОплаты - Форма.КОплате;
Форма.СуммаДоплаты = 0;
Форма.Элементы.ГруппаИтого.ТекущаяСтраница = Форма.Элементы.ГруппаСдача;
Форма.Элементы.КомандаПробитьЧек.Доступность = Истина;
Форма.ТекущийЭлемент = Форма.Элементы.КомандаПробитьЧек;
Иначе
Форма.СуммаСдачи = 0;
Форма.СуммаДоплаты = Форма.КОплате - Форма.СуммаОплаты;
Форма.Элементы.ГруппаИтого.ТекущаяСтраница = Форма.Элементы.ГруппаДоплата;
Форма.Элементы.КомандаПробитьЧек.Доступность = Ложь;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПолучитьОбновленныеДанныеПоТоварарамФСС()
ПолучитьОбновленныеДанныеПоТоварарамФССНаСервере(ВладелецФормы.Объект);
КонецПроцедуры
&НаСервере
Процедура ПолучитьОбновленныеДанныеПоТоварарамФССНаСервере(ЗНАЧ ДанныеОбъекта)
ТоварныеПозиции = ЧекККМЛокализация.ТоварыФССВДокументеКОплате(
ДанныеОбъекта.Товары.Выгрузить(),
ДанныеОбъекта.ЦенаВключаетНДС);
ЗаполнитьТоварыФСС(ТоварныеПозиции);
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьТоварыФСС(ТоварныеПозиции)
ТоварыФСС.Очистить();
Для Каждого СтрокаТовара Из ТоварныеПозиции Цикл
ТоварныеСтроки = ТоварыФСС.НайтиСтроки(Новый Структура("Номенклатура", СтрокаТовара.Номенклатура));
Если ТоварныеСтроки.Количество() = 0 Тогда
НоваяСтрока = ТоварыФСС.Добавить();
НоваяСтрока.НомерПозиции = НоваяСтрока.ПолучитьИдентификатор();
НоваяСтрока.НомерПозицииВозврата = 999;
НоваяСтрока.Артикул = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СтрокаТовара.Номенклатура, "Код");
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТовара);
Иначе
НоваяСтрока = ТоварныеСтроки[0];
НоваяСтрока.Количество = НоваяСтрока.Количество + СтрокаТовара.Количество;
НоваяСтрока.Сумма = НоваяСтрока.Сумма + СтрокаТовара.Сумма;
НоваяСтрока.Цена =
?(НоваяСтрока.Количество = 0, НоваяСтрока.Сумма, Окр(НоваяСтрока.Сумма/НоваяСтрока.Количество, 2));
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ОплатаЗавершение(ИнформацияОбОплате, ДополнительныеПараметры) Экспорт
ПолучитьОбновленныеДанныеПоТоварарамФСС();
КОплате = ИнформацияОбОплате.СуммаКОплате;
ОплаченоСертификатами = ИнформацияОбОплате.ПодарочныеСертификаты;
ОплаченоБонуснымиБаллами = ИнформацияОбОплате.БонусныеБаллы;
Если ЭтоВозврат Тогда
ОплаченоПлатежнымиКартами = ИнформацияОбОплате.ПлатежныеКартыОтменено;
Иначе
ОплаченоПлатежнымиКартами = ИнформацияОбОплате.ПлатежныеКарты;
КонецЕсли;
РассчитатьИтоги(ЭтотОбъект, ИнформацияОбОплате);
ПодключитьОбработчикОжидания("ВывестиИнформациюНаДисплейПокупателя", 0.1, Истина);
Если ПринудительноЗакрытьФормуПриУспешнойОтменеОплаты Тогда
Если ИнформацияОбОплате.ИтогоОплачено = 0 Тогда
ПринудительноЗакрытьФорму = Истина;
Закрыть(ПараметрыЗакрытияФормы().Отмена);
Иначе
ПринудительноЗакрытьФормуПриУспешнойОтменеОплаты = Ложь;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПередЗакрытиемВопросЗавершение(ОтветНаВопрос, ДополнительныеПараметры) Экспорт
Если ОтветНаВопрос = "ОтменитьОплату" Тогда
ПринудительноЗакрытьФормуПриУспешнойОтменеОплаты = Истина;
ПредварительноеОдобрениеПолучено = Ложь;
ПолученоНаличными = Формат(0, "ЧДЦ=2; ЧГ=3,0");
ОплаченоЭСФСС = 0;
ОплаченоПлатежнымиКартами = 0;
СуммаОплаты = 0;
ОплаченоБонуснымиБаллами = 0;
РозничныеПродажиКлиентСервер.УстановитьАктивныйЭлемент(ЭтотОбъект, Элементы.ПолеПолученоНаличными);
РассчитатьИтоги(ЭтотОбъект);
УстановитьДоступностьИзмененияОплатыНаличными(ЭтотОбъект);
Элементы.ГруппаВыбораНомераЭСФСС.Доступность = Не ПредварительноеОдобрениеПолучено;
Если ЭтоОплатаЭСФСС Тогда
УстановитьЗаголовкиОплатыДляЭСФСС(ЭтотОбъект);
КонецЕсли;
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ОповещениеВФормуОплаты", Новый ОписаниеОповещения("ОплатаЗавершение", ЭтотОбъект));
ДополнительныеПараметры.Вставить("ПолученоНаличными", РозничныеПродажиКлиентСервер.ПривестиСтрокуКЧислу(ПолученоНаличными));
ДополнительныеПараметры.Вставить("ЭтоОплатаЭСФСС", Истина);
ВыполнитьОбработкуОповещения(
Новый ОписаниеОповещения("ОтменитьОплату", ВладелецФормы, ДополнительныеПараметры),
Истина);
ИначеЕсли ОтветНаВопрос = "ЗакрытьФорму" Тогда
ПринудительноЗакрытьФормуПриУспешнойОтменеОплаты = Истина;
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ОповещениеВФормуОплаты", Новый ОписаниеОповещения("ОплатаЗавершение", ЭтотОбъект));
ДополнительныеПараметры.Вставить("ПолученоНаличными", РозничныеПродажиКлиентСервер.ПривестиСтрокуКЧислу(ПолученоНаличными));
ДополнительныеПараметры.Вставить("ЭтоОплатаЭСФСС", Истина);
ВыполнитьОбработкуОповещения(
Новый ОписаниеОповещения("ОтменитьОплатуСторно", ВладелецФормы, ДополнительныеПараметры),
Истина);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура НастроитьВидимостьЭлементов(ИнформацияОбОплате)
ДоступныеВидыОплаты = ИнформацияОбОплате.ДоступныеВидыОплаты;
ДоступныеВидыОплаты.ПодарочныеСертификаты = Ложь;
Элементы.ПолеОплаченоПлатежнымиКартами.Видимость = ДоступныеВидыОплаты.ПлатежныеКарты;
Элементы.КомандаСторно.Видимость = ДоступныеВидыОплаты.ПлатежныеКарты И НЕ ЭтоОплатаЭСФСС;
Если НЕ ЭтоОплатаЭСФСС Тогда
Элементы.ПолеОплаченоПлатежнымиКартами.ОтображениеПодсказки = ОтображениеПодсказки.Нет;
КонецЕсли;
Элементы.ПолеОплаченоЭСФСС.Видимость = ЭтоОплатаЭСФСС;
Элементы.ПолеОплаченоСертификатами.Видимость = ДоступныеВидыОплаты.ПодарочныеСертификаты;
Элементы.ОплатаПодарочныйСертификат.Видимость = ДоступныеВидыОплаты.ПодарочныеСертификаты;
Элементы.ПолеОплаченоБонуснымиБаллами.Видимость = ДоступныеВидыОплаты.БонусныеБаллы;
Элементы.ОплатаБонусныеБаллы.Видимость = ДоступныеВидыОплаты.БонусныеБаллы;
Элементы.ГруппаВыбораНомераЭСФСС.Видимость = Ложь;
Элементы.ГруппаВыбораНомераЭСФСС.Доступность = Истина;
Если ЭтоОплатаЭСФСС Тогда
Если ЭтоВозврат Тогда
Заголовок = НСтр("ru = 'Возврат оплаты ЭС (ФЗ-491)'");
Иначе
Заголовок = НСтр("ru = 'Оплата ЭС (ФЗ-491)'");
Элементы.ГруппаВыбораНомераЭСФСС.Видимость = Не ОплатаЭСФССПрошлаЧекНеПробит;
Если ПредварительноеОдобрениеПолучено = Истина Тогда
Элементы.ГруппаВыбораНомераЭСФСС.Доступность = Ложь;
КонецЕсли;
КонецЕсли;
Элементы.КнопкаСтатусТоваровФСС.Видимость = Истина;
Элементы.ГруппаВыбораНомераЭСФСС.Видимость = Истина;
Иначе
Элементы.КнопкаСтатусТоваровФСС.Видимость = Ложь;
Если ЭтоВозврат Тогда
Заголовок = НСтр("ru = 'Возврат смешанной оплаты'");
КонецЕсли;
КонецЕсли;
Если ЭтоВозврат Тогда
Элементы.КОплате.Заголовок = НСтр("ru = 'К возврату'");
Элементы.ОплатаПодарочныйСертификат.Заголовок = НСтр("ru = 'Вернуть оплату подарочным сертификатом'");
Элементы.ОплатаБонусныеБаллы.Заголовок = НСтр("ru = 'Отменить оплату бонусными баллами'");
Элементы.СуммаСдачи.Заголовок = НСтр("ru = 'Получить сдачу'");
Элементы.СуммаДоплаты.Заголовок = НСтр("ru = 'Осталось вернуть'");
Элементы.КомандаСторно.Видимость = Ложь;
Элементы.ПолеПолученоНаличными.Доступность = Ложь;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВывестиИнформациюНаДисплейПокупателя()
Если Не ВводДоступен() Тогда
Возврат;
КонецЕсли;
Если ТипЗнч(Документ) = Тип("ДокументСсылка.ЧекККМ")
ИЛИ ТипЗнч(Документ) = Тип("ДокументСсылка.РеализацияПодарочныхСертификатов") Тогда
ТекстКОплате = НСтр("ru = 'К оплате'") + ":";
ТекстСдача = НСтр("ru = 'Сдача'") + ":";
ТекстДоплата = НСтр("ru = 'Доплатить'") + ":";
Иначе
ТекстКОплате = НСтр("ru = 'К возврату'") + ":";
ТекстСдача = НСтр("ru = 'Сдача'") + ":";
ТекстДоплата = НСтр("ru = 'Вернуть'") + ":";
КонецЕсли;
ДПТекст1 = РозничныеПродажиКлиент.ПодготовитьСтрокуКВыводуНаДисплейПокупателя(ТекстКОплате, КОплате);
Если СуммаДоплаты > 0 Тогда
ДПТекст2 = РозничныеПродажиКлиент.ПодготовитьСтрокуКВыводуНаДисплейПокупателя(ТекстДоплата, СуммаДоплаты);
ИначеЕсли СуммаСдачи > 0 Тогда
ДПТекст2 = РозничныеПродажиКлиент.ПодготовитьСтрокуКВыводуНаДисплейПокупателя(ТекстСдача, СуммаСдачи);
Иначе
ДПТекст2 = "";
КонецЕсли;
РозничныеПродажиКлиент.ВывестиТекстНаДисплеиПокупателя(
ВладелецФормы,
Дисплеи,
ДПТекст1 + Символы.ПС + ДПТекст2);
КонецПроцедуры
&НаКлиенте
Процедура УстановитьАктивностьЭлементов()
АктивноеПолеДоИзменения = АктивноеПоле;
РозничныеПродажиКлиентСервер.УстановитьАктивностьЭлементов(ЭтотОбъект);
Если АктивноеПолеДоИзменения <> АктивноеПоле Тогда
УстановитьДоступностьИзмененияОплатыНаличными(ЭтотОбъект);
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ОбработатьДанныеЭлектронногоЧека()
Возврат РозничныеПродажи.ОбработатьДанныеЭлектронногоЧека(ЭтотОбъект);
КонецФункции
&НаКлиенте
Функция ПараметрыЗакрытияФормы()
ПараметрыЗакрытия = Новый Структура;
ПараметрыЗакрытия.Вставить("Отмена", "Отмена");
Возврат ПараметрыЗакрытия;
КонецФункции
#КонецОбласти