xmlTSDGalery/CommonModules/ОборудованиеЧекопечатающиеУстройстваКлиент/Ext/Module.bsl
kykaevv 88098aa86f Initial commit: конфигурация ТСД с обменом УНФ.
Включает перемещение по ячейкам, стикеровку МП, синхронизацию справочников и обработку кодов маркировки.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-01 12:50:57 +03:00

2555 lines
236 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#Область ПрограммныйИнтерфейс
// Производить печать чека на фискальном устройстве.
//
// Параметры:
// ОповещениеПриЗавершении - ОписаниеОповещения - оповещение при завершении.
// ИдентификаторКлиента - ФормаКлиентскогоПриложения -идентификатор формы.
// ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование - идентификатор устройства.
// ПараметрыОперации - Структура - параметры выполнения операции.
// ДополнительныеПараметры - Структура - дополнительные команды.
//
Процедура НачатьФискализациюЧекаНаФискальномУстройстве(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства, ПараметрыОперации, ДополнительныеПараметры = Неопределено) Экспорт;
ПараметрыВыполнениеКоманды = МенеджерОборудованияКлиентСервер.ПараметрыВыполнениеКоманды("CheckFiscalization",
"ОборудованиеЧекопечатающиеУстройства", ДополнительныеПараметры);
// Будет сформировано сообщения в службу технической поддержки при ошибке.
ПараметрыВыполнениеКоманды.СообщенияВСлужбуТехническойПоддержки = Истина;
Если ПараметрыОперации.Свойство("АвтономнаяККТ") И ПараметрыОперации.АвтономнаяККТ Тогда
Если ОбщегоНазначенияБПОКлиент.ИспользуетсяАвтономнаяККТ() Тогда
МодульОборудованиеЧекопечатающиеАвтономныеУстройстваКлиент = ОбщегоНазначенияБПОКлиент.ОбщийМодуль("ОборудованиеЧекопечатающиеАвтономныеУстройстваКлиент");
МодульОборудованиеЧекопечатающиеАвтономныеУстройстваКлиент.НачатьВыполнениеКоманды(ОповещениеПриЗавершении,
ИдентификаторКлиента, ПараметрыОперации, ПараметрыВыполнениеКоманды, ДополнительныеПараметры);
КонецЕсли;
ИначеЕсли ПараметрыОперации.ОблачнаяККТ Тогда
Если ОбщегоНазначенияБПОКлиент.ИспользуютсяОблачныеККТ() Тогда
МодульОборудованиеОблачныеККТКлиент = ОбщегоНазначенияБПОКлиент.ОбщийМодуль("ОборудованиеЧекопечатающиеОблачныеККТКлиент");
МодульОборудованиеОблачныеККТКлиент.НачатьВыполнениеКоманды(ОповещениеПриЗавершении,
ИдентификаторКлиента, ИдентификаторУстройства, ПараметрыОперации, ПараметрыВыполнениеКоманды);
КонецЕсли;
Иначе
МенеджерОборудованияКлиент.НачатьВыполнениеКоманды(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства,
ПараметрыОперации, ПараметрыВыполнениеКоманды);
КонецЕсли;
КонецПроцедуры
// Производить печать чека на фискальном устройстве пакетом.
//
// Параметры:
// ОповещениеПриЗавершении - ОписаниеОповещения - оповещение при завершении.
// ИдентификаторКлиента - ФормаКлиентскогоПриложения -идентификатор формы.
// ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование - идентификатор устройства.
// ПараметрыОперации - Структура - параметры выполнения операции.
// ДополнительныеПараметры - Структура - дополнительные команды.
//
Процедура НачатьФискализациюЧекаНаФискальномУстройствеПакетом(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства, ПараметрыОперации, ДополнительныеПараметры = Неопределено) Экспорт
ПараметрыВыполнениеКоманды = МенеджерОборудованияКлиентСервер.ПараметрыВыполнениеКоманды("CheckFiscalizationPacket",
"ОборудованиеЧекопечатающиеУстройства", ДополнительныеПараметры);
МенеджерОборудованияКлиент.НачатьВыполнениеКоманды(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства,
ПараметрыОперации, ПараметрыВыполнениеКоманды);
КонецПроцедуры
// Производить инкассацию на фискальном устройстве.
//
// Параметры:
// ОповещениеПриЗавершении - ОписаниеОповещения - оповещение при завершении.
// ИдентификаторКлиента - ФормаКлиентскогоПриложения -идентификатор формы.
// ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование - идентификатор устройства, если неопределенно.
// ПараметрыОперации - Структура - параметры выполнения операции.
// ДополнительныеПараметры - Структура - дополнительные команды.
//
Процедура НачатьИнкассациюНаФискальномУстройстве(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства, ПараметрыОперации, ДополнительныеПараметры = Неопределено) Экспорт
ПараметрыВыполнениеКоманды = МенеджерОборудованияКлиентСервер.ПараметрыВыполнениеКоманды("Encash",
"ОборудованиеЧекопечатающиеУстройства", ДополнительныеПараметры, Истина, Истина);
Если ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ЭтоККТБезПодключения(ПараметрыОперации) Тогда
Если ОбщегоНазначенияБПОКлиент.ИспользуетсяАвтономнаяККТ() Тогда
МодульОборудованиеЧекопечатающиеАвтономныеУстройстваКлиент = ОбщегоНазначенияБПОКлиент.ОбщийМодуль("ОборудованиеЧекопечатающиеАвтономныеУстройстваКлиент");
МодульОборудованиеЧекопечатающиеАвтономныеУстройстваКлиент.НачатьВыполнениеКоманды(ОповещениеПриЗавершении,
ИдентификаторКлиента, ПараметрыОперации, ПараметрыВыполнениеКоманды);
КонецЕсли;
Иначе
МенеджерОборудованияКлиент.НачатьВыполнениеКоманды(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства,
ПараметрыОперации, ПараметрыВыполнениеКоманды);
КонецЕсли;
КонецПроцедуры
// Производить печать текста на фискальном устройстве.
//
// Параметры:
// ОповещениеПриЗавершении - ОписаниеОповещения - оповещение при завершении.
// ИдентификаторКлиента - ФормаКлиентскогоПриложения -идентификатор формы.
// ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование - идентификатор устройства, если неопределенно - будет предложен выбор.
// ПараметрыОперации - Структура - параметры выполнения операции.
// ДополнительныеПараметры - Структура - дополнительные команды.
//
Процедура НачатьПечатьТекста(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства, ПараметрыОперации, ДополнительныеПараметры = Неопределено) Экспорт
КонтекстОперации = Новый Структура();
КонтекстОперации.Вставить("ОповещениеПриЗавершении", ОповещениеПриЗавершении);
КонтекстОперации.Вставить("ИдентификаторКлиента" , ИдентификаторКлиента);
КонтекстОперации.Вставить("ИдентификаторУстройства", ИдентификаторУстройства);
КонтекстОперации.Вставить("ПараметрыОперации" , ПараметрыОперации);
КонтекстОперации.Вставить("ДополнительныеПараметры", ДополнительныеПараметры);
КонтекстОперации.Вставить("ПодготовитьДанные" , Истина);
КонтекстОперации.Вставить("ОбработатьДанные" , Ложь);
КонтекстОперации.Вставить("Команда" , "PrintText");
КонтекстОперации.Вставить("Результат", Истина);
ВыполнитьВыборФискальногоУстройства(КонтекстОперации);
КонецПроцедуры
// Начать открытие смены на фискальном устройстве.
//
// Параметры:
// ОповещениеПриЗавершении - ОписаниеОповещения - оповещение при завершении.
// ИдентификаторКлиента - ФормаКлиентскогоПриложения -идентификатор формы.
// ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование - идентификатор устройства.
// ПараметрыОперации - Структура - параметры выполнения операции.
// ДополнительныеПараметры - Структура - дополнительные команды.
//
Процедура НачатьОткрытиеСменыНаФискальномУстройстве(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства, ПараметрыОперации, ДополнительныеПараметры = Неопределено) Экспорт
Контекст = Новый Структура();
Контекст.Вставить("ОповещениеПриЗавершении", ОповещениеПриЗавершении);
Контекст.Вставить("ИдентификаторКлиента" , ИдентификаторКлиента);
Контекст.Вставить("ИдентификаторУстройства", ИдентификаторУстройства);
Контекст.Вставить("ПараметрыОперации" , ПараметрыОперации);
Контекст.Вставить("КассаККМ" , ПараметрыОперации.КассаККМ);
Оповещение = Новый ОписаниеОповещения("НачатьОткрытиеСменыНаФискальномУстройстве_Завершение", ЭтотОбъект, Контекст);
ПараметрыОперации.Вставить("ДополнительныеПараметры", ДополнительныеПараметры);
ПараметрыВыполнениеКоманды = МенеджерОборудованияКлиентСервер.ПараметрыВыполнениеКоманды("OpenShift",
"ОборудованиеЧекопечатающиеУстройства", ДополнительныеПараметры, Истина, Истина);
// Будет сформировано сообщения в службу технической поддержки при ошибке.
ПараметрыВыполнениеКоманды.СообщенияВСлужбуТехническойПоддержки = Истина;
Если ПараметрыОперации.АвтономнаяККТ Тогда
Если ОбщегоНазначенияБПОКлиент.ИспользуетсяАвтономнаяККТ() Тогда
МодульОборудованиеЧекопечатающиеАвтономныеУстройстваКлиент = ОбщегоНазначенияБПОКлиент.ОбщийМодуль("ОборудованиеЧекопечатающиеАвтономныеУстройстваКлиент");
МодульОборудованиеЧекопечатающиеАвтономныеУстройстваКлиент.НачатьВыполнениеКоманды(Оповещение,
ИдентификаторКлиента, ПараметрыОперации, ПараметрыВыполнениеКоманды);
КонецЕсли;
ИначеЕсли ПараметрыОперации.ОблачнаяККТ Тогда
Если ОбщегоНазначенияБПОКлиент.ИспользуютсяОблачныеККТ() Тогда
МодульОборудованиеОблачныеККТКлиент = ОбщегоНазначенияБПОКлиент.ОбщийМодуль("ОборудованиеЧекопечатающиеОблачныеККТКлиент");
МодульОборудованиеОблачныеККТКлиент.НачатьВыполнениеКоманды(Оповещение,
ИдентификаторКлиента, ИдентификаторУстройства, ПараметрыОперации, ПараметрыВыполнениеКоманды);
КонецЕсли;
Иначе
МенеджерОборудованияКлиент.НачатьВыполнениеКоманды(Оповещение, ИдентификаторКлиента, ИдентификаторУстройства,
ПараметрыОперации, ПараметрыВыполнениеКоманды);
КонецЕсли;
КонецПроцедуры
// Завершение операции открытие смены на фискальном устройстве.
//
// Параметры:
// Результат - см. МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании.
// Контекст - Структура
//
Процедура НачатьОткрытиеСменыНаФискальномУстройстве_Завершение(Результат, Контекст) Экспорт
Если Результат.Свойство("ПараметрыККТ") Тогда
ПараметрыККТ = Результат.ПараметрыККТ;
Если ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ЭтоККТБезПодключения(Контекст.ПараметрыОперации) Тогда
ПараметрыККТ.Вставить("ТипОборудования", ПредопределенноеЗначение("Перечисление.ТипыПодключаемогоОборудования.ККТ"));
ПараметрыККТ.Вставить("ПризнакАвтономногоРежима", Истина);
КонецЕсли;
МенеджерОборудованияКлиентПереопределяемый.ПриОткрытииСменыНаККТ(Контекст.ИдентификаторУстройства, Результат.ПараметрыККТ);
КонецЕсли;
ПоказатьПредупреждениеДрайверСнятыйСПоддержки(Результат);
ВыполнитьОбработкуОповещения(Контекст.ОповещениеПриЗавершении, Результат);
КонецПроцедуры
// Начать закрытие смены на фискальном устройстве.
//
// Параметры:
// ОповещениеПриЗавершении - ОписаниеОповещения - оповещение при завершении.
// ИдентификаторКлиента - ФормаКлиентскогоПриложения -идентификатор формы.
// ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование - идентификатор устройства.
// ПараметрыОперации - Структура - параметры выполнения операции.
// ДополнительныеПараметры - Структура - дополнительные команды.
//
Процедура НачатьЗакрытиеСменыНаФискальномУстройстве(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства, ПараметрыОперации, ДополнительныеПараметры = Неопределено) Экспорт
ПараметрыОперации.Вставить("ДополнительныеПараметры", ДополнительныеПараметры);
ПараметрыВыполнениеКоманды = МенеджерОборудованияКлиентСервер.ПараметрыВыполнениеКоманды("CloseShift",
"ОборудованиеЧекопечатающиеУстройства", ДополнительныеПараметры, Истина, Истина);
// Будет сформировано сообщения в службу технической поддержки при ошибке.
ПараметрыВыполнениеКоманды.СообщенияВСлужбуТехническойПоддержки = Истина;
Если ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ЭтоККТБезПодключения(ПараметрыОперации) Тогда
Если ОбщегоНазначенияБПОКлиент.ИспользуетсяАвтономнаяККТ() Тогда
МодульОборудованиеЧекопечатающиеАвтономныеУстройстваКлиент = ОбщегоНазначенияБПОКлиент.ОбщийМодуль("ОборудованиеЧекопечатающиеАвтономныеУстройстваКлиент");
МодульОборудованиеЧекопечатающиеАвтономныеУстройстваКлиент.НачатьВыполнениеКоманды(ОповещениеПриЗавершении,
ИдентификаторКлиента, ПараметрыОперации, ПараметрыВыполнениеКоманды);
КонецЕсли;
ИначеЕсли ПараметрыОперации.ОблачнаяККТ Тогда
Если ОбщегоНазначенияБПОКлиент.ИспользуютсяОблачныеККТ() Тогда
МодульОборудованиеОблачныеККТКлиент = ОбщегоНазначенияБПОКлиент.ОбщийМодуль("ОборудованиеЧекопечатающиеОблачныеККТКлиент");
МодульОборудованиеОблачныеККТКлиент.НачатьВыполнениеКоманды(ОповещениеПриЗавершении,
ИдентификаторКлиента, ИдентификаторУстройства, ПараметрыОперации, ПараметрыВыполнениеКоманды);
КонецЕсли;
Иначе
КонтекстОперации = Новый Структура();
КонтекстОперации.Вставить("ОповещениеПриЗавершении", ОповещениеПриЗавершении);
Оповещение = Новый ОписаниеОповещения("НачатьЗакрытиеСменыНаФискальномУстройстве_Завершение", ЭтотОбъект, КонтекстОперации);
МенеджерОборудованияКлиент.НачатьВыполнениеКоманды(Оповещение, ИдентификаторКлиента, ИдентификаторУстройства,
ПараметрыОперации, ПараметрыВыполнениеКоманды);
КонецЕсли;
КонецПроцедуры
Процедура НачатьЗакрытиеСменыНаФискальномУстройстве_Завершение(Результат, КонтекстОперации) Экспорт
ПоказатьПредупреждениеДрайверСнятыйСПоддержки(Результат);
ВыполнитьОбработкуОповещения(КонтекстОперации.ОповещениеПриЗавершении, Результат);
КонецПроцедуры
// Начать открытие денежного ящика фискальном устройстве.
//
// Параметры:
// ОповещениеПриЗавершении - ОписаниеОповещения - оповещение при завершении.
// ИдентификаторКлиента - ФормаКлиентскогоПриложения -идентификатор формы.
// ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование - идентификатор устройства, если неопределенно - будет предложен выбор.
// ПараметрыОперации - Структура - параметры выполнения операции.
// ДополнительныеПараметры - Структура - дополнительные команды.
//
Процедура НачатьОткрытиеДенежногоЯщика(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства = Неопределено, ПараметрыОперации = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт;
КонтекстОперации = Новый Структура();
КонтекстОперации.Вставить("ОповещениеПриЗавершении", ОповещениеПриЗавершении);
КонтекстОперации.Вставить("ИдентификаторКлиента" , ИдентификаторКлиента);
КонтекстОперации.Вставить("ИдентификаторУстройства", ИдентификаторУстройства);
КонтекстОперации.Вставить("ПараметрыОперации" , ПараметрыОперации);
КонтекстОперации.Вставить("ДополнительныеПараметры", ДополнительныеПараметры);
КонтекстОперации.Вставить("ПодготовитьДанные" , Ложь);
КонтекстОперации.Вставить("ОбработатьДанные" , Ложь);
КонтекстОперации.Вставить("Команда" , "OpenCashDrawer");
КонтекстОперации.Вставить("Результат", Истина);
ВыполнитьВыборФискальногоУстройства(КонтекстОперации);
КонецПроцедуры
// Получение ширины строки в символах для фискального устройства.
//
// Параметры:
// ОповещениеПриЗавершении - ОписаниеОповещения - оповещение при завершении.
// ИдентификаторКлиента - ФормаКлиентскогоПриложения -идентификатор формы.
// ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование - идентификатор устройства, если неопределенно - будет предложен выбор.
// ПараметрыОперации - Структура - параметры выполнения операции.
// ДополнительныеПараметры - Структура - дополнительные команды.
//
Процедура НачатьПолучениеШириныСтрокиПечатающегоУстройства(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства = Неопределено, ПараметрыОперации = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт
КонтекстОперации = Новый Структура();
КонтекстОперации.Вставить("ОповещениеПриЗавершении", ОповещениеПриЗавершении);
КонтекстОперации.Вставить("ИдентификаторКлиента" , ИдентификаторКлиента);
КонтекстОперации.Вставить("ИдентификаторУстройства", ИдентификаторУстройства);
КонтекстОперации.Вставить("ПараметрыОперации" , ПараметрыОперации);
КонтекстОперации.Вставить("ДополнительныеПараметры", ДополнительныеПараметры);
КонтекстОперации.Вставить("ПодготовитьДанные" , Ложь);
КонтекстОперации.Вставить("ОбработатьДанные" , Ложь);
КонтекстОперации.Вставить("Команда" , "GetLineLength");
КонтекстОперации.Вставить("Результат", Истина);
ВыполнитьВыборФискальногоУстройства(КонтекстОперации);
КонецПроцедуры
// Производить аннулирование чека на фискальном устройстве.
//
// Параметры:
// ОповещениеПриЗавершении - ОписаниеОповещения - оповещение при завершении.
// ИдентификаторКлиента - ФормаКлиентскогоПриложения -идентификатор формы.
// ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование - идентификатор устройства.
// ПараметрыОперации - Структура - параметры выполнения операции.
// ДополнительныеПараметры - Структура - дополнительные команды.
//
Процедура НачатьАннулированиеЧекаНаФискальномУстройстве(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства, ПараметрыОперации, ДополнительныеПараметры = Неопределено) Экспорт
ПараметрыВыполнениеКоманды = МенеджерОборудованияКлиентСервер.ПараметрыВыполнениеКоманды("AnnulCheck",
"ОборудованиеЧекопечатающиеУстройства", ДополнительныеПараметры, Ложь, Ложь);
МенеджерОборудованияКлиент.НачатьВыполнениеКоманды(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства,
ПараметрыОперации, ПараметрыВыполнениеКоманды);
КонецПроцедуры
// Начать формирование отчета о текущем состоянии расчетов на фискальном устройстве.
//
// Параметры:
// ОповещениеПриЗавершении - ОписаниеОповещения - оповещение при завершении.
// ИдентификаторКлиента - ФормаКлиентскогоПриложения -идентификатор формы.
// ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование - идентификатор устройства, если неопределенно - будет предложен выбор.
// ПараметрыОперации - Структура - параметры выполнения операции.
// ДополнительныеПараметры - Структура - дополнительные команды.
//
Процедура НачатьФормированиеОтчетаОТекущемСостоянииРасчетов(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства, ПараметрыОперации, ДополнительныеПараметры = Неопределено) Экспорт
КонтекстОперации = Новый Структура();
КонтекстОперации.Вставить("ОповещениеПриЗавершении", ОповещениеПриЗавершении);
КонтекстОперации.Вставить("ИдентификаторКлиента" , ИдентификаторКлиента);
КонтекстОперации.Вставить("ИдентификаторУстройства", ИдентификаторУстройства);
КонтекстОперации.Вставить("ПараметрыОперации" , ПараметрыОперации);
КонтекстОперации.Вставить("ДополнительныеПараметры", ДополнительныеПараметры);
КонтекстОперации.Вставить("ПодготовитьДанные" , Истина);
КонтекстОперации.Вставить("ОбработатьДанные" , Ложь);
КонтекстОперации.Вставить("Команда" , "ReportCurrentStatusOfSettlements");
КонтекстОперации.Вставить("Результат", Истина);
ВыполнитьВыборФискальногоУстройства(КонтекстОперации);
КонецПроцедуры
// Начать формирование отчета отчет без гашения на фискальном устройстве.
//
// Параметры:
// ОповещениеПриЗавершении - ОписаниеОповещения - оповещение при завершении.
// ИдентификаторКлиента - ФормаКлиентскогоПриложения -идентификатор формы.
// ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование - идентификатор устройства, если неопределенно - будет предложен выбор.
// ПараметрыОперации - Структура - параметры выполнения операции.
// ДополнительныеПараметры - Структура - дополнительные команды.
//
Процедура НачатьФормированиеОтчетаБезГашения(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства, ПараметрыОперации, ДополнительныеПараметры = Неопределено) Экспорт
КонтекстОперации = Новый Структура();
КонтекстОперации.Вставить("ОповещениеПриЗавершении", ОповещениеПриЗавершении);
КонтекстОперации.Вставить("ИдентификаторКлиента" , ИдентификаторКлиента);
КонтекстОперации.Вставить("ИдентификаторУстройства", ИдентификаторУстройства);
КонтекстОперации.Вставить("ПараметрыОперации" , ПараметрыОперации);
КонтекстОперации.Вставить("ДополнительныеПараметры", ДополнительныеПараметры);
КонтекстОперации.Вставить("ПодготовитьДанные" , Истина);
КонтекстОперации.Вставить("ОбработатьДанные" , Ложь);
КонтекстОперации.Вставить("Команда" , "PrintXReport");
КонтекстОперации.Вставить("Результат", Истина);
ВыполнитьВыборФискальногоУстройства(КонтекстОперации);
КонецПроцедуры
// Производить получение параметров фискального устройства.
//
// Параметры:
// ОповещениеПриЗавершении - ОписаниеОповещения - оповещение при завершении.
// ИдентификаторКлиента - ФормаКлиентскогоПриложения -идентификатор формы.
// ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование - идентификатор устройства.
// ПараметрыОперации - Структура - параметры выполнения операции.
// ДополнительныеПараметры - Структура - дополнительные команды.
//
Процедура НачатьПолучениеПараметровФискальногоУстройства(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства, ПараметрыОперации = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт
Если ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ЭтоККТБезПодключения(ПараметрыОперации) Тогда
ПараметрыККТ = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыРегистрацииККТ();
ПараметрыККТ.Вставить("ТипОборудования", ПредопределенноеЗначение("Перечисление.ТипыПодключаемогоОборудования.ККТ"));
ПараметрыККТ.Вставить("ПризнакАвтономногоРежима", Истина);
РезультатОперации = МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании(Истина);
РезультатОперации.Вставить("ПараметрыККТ" , ПараметрыККТ);
ВыполнитьОбработкуОповещения(ОповещениеПриЗавершении, РезультатОперации);
Иначе
ПараметрыВыполнениеКоманды = МенеджерОборудованияКлиентСервер.ПараметрыВыполнениеКоманды("GetDataKKT",
"ОборудованиеЧекопечатающиеУстройства", ДополнительныеПараметры, Ложь, Истина);
МенеджерОборудованияКлиент.НачатьВыполнениеКоманды(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства,
ПараметрыОперации, ПараметрыВыполнениеКоманды);
КонецЕсли;
КонецПроцедуры
// Получение текущего состояния фискального устройства.
//
// Параметры:
// ОповещениеПриЗавершении - ОписаниеОповещения - оповещение при завершении.
// ИдентификаторКлиента - ФормаКлиентскогоПриложения -идентификатор формы.
// ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование - идентификатор устройства.
// ПараметрыОперации - Структура - параметры выполнения операции.
// ДополнительныеПараметры - Структура - дополнительные команды.
//
Процедура НачатьПолучениеТекущегоСостоянияФискальногоУстройства(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства, ПараметрыОперации = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт
ПараметрыВыполнениеКоманды = МенеджерОборудованияКлиентСервер.ПараметрыВыполнениеКоманды("GetCurrentStatus",
"ОборудованиеЧекопечатающиеУстройства", ДополнительныеПараметры, Истина, Истина);
МенеджерОборудованияКлиент.НачатьВыполнениеКоманды(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства,
ПараметрыОперации, ПараметрыВыполнениеКоманды);
КонецПроцедуры
// Начать операцию ФН для фискального устройства.
//
// Параметры:
// ОповещениеПриЗавершении - ОписаниеОповещения - оповещение при завершении.
// ИдентификаторКлиента - ФормаКлиентскогоПриложения -идентификатор формы.
// ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование - идентификатор устройства.
// ПараметрыОперации - Структура - параметры выполнения операции.
// ДополнительныеПараметры - Структура - дополнительные команды.
//
Процедура НачатьОперациюФНДляФискальногоУстройства(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства, ПараметрыОперации, ДополнительныеПараметры = Неопределено) Экспорт
ПараметрыВыполнениеКоманды = МенеджерОборудованияКлиентСервер.ПараметрыВыполнениеКоманды("OperationFN",
"ОборудованиеЧекопечатающиеУстройства", ДополнительныеПараметры, Истина, Истина);
МенеджерОборудованияКлиент.НачатьВыполнениеКоманды(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства,
ПараметрыОперации, ПараметрыВыполнениеКоманды);
КонецПроцедуры
// Начать формирование чека коррекции на фискальном устройстве.
//
// Параметры:
// ОповещениеПриЗавершении - ОписаниеОповещения - оповещение при завершении.
// ИдентификаторКлиента - ФормаКлиентскогоПриложения -идентификатор формы.
// ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование - идентификатор устройства.
// ПараметрыОперации - Структура - параметры выполнения операции.
// ДополнительныеПараметры - Структура - дополнительные команды.
//
Процедура НачатьФормированиеЧекаКоррекцииНаФискальномУстройстве(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства, ПараметрыОперации, ДополнительныеПараметры = Неопределено) Экспорт
ПараметрыВыполнениеКоманды = МенеджерОборудованияКлиентСервер.ПараметрыВыполнениеКоманды("PrintReceiptCorrection",
"ОборудованиеЧекопечатающиеУстройства", ДополнительныеПараметры, Истина, Истина);
Если ПараметрыОперации.ОблачнаяККТ Тогда
Если ОбщегоНазначенияБПОКлиент.ИспользуютсяОблачныеККТ() Тогда
МодульОборудованиеОблачныеККТКлиент = ОбщегоНазначенияБПОКлиент.ОбщийМодуль("ОборудованиеЧекопечатающиеОблачныеККТКлиент");
МодульОборудованиеОблачныеККТКлиент.НачатьВыполнениеКоманды(ОповещениеПриЗавершении,
ИдентификаторКлиента, ИдентификаторУстройства, ПараметрыОперации, ПараметрыВыполнениеКоманды);
КонецЕсли;
Иначе
МенеджерОборудованияКлиент.НачатьВыполнениеКоманды(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства,
ПараметрыОперации, ПараметрыВыполнениеКоманды);
КонецЕсли;
КонецПроцедуры
// Осуществляет печать копии чека.
//
// Параметры:
// ОповещениеПриЗавершении - ОписаниеОповещения - оповещение при завершении.
// ИдентификаторКлиента - ФормаКлиентскогоПриложения -идентификатор формы.
// ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование - идентификатор устройства, если неопределенно - будет предложен выбор.
// ПараметрыОперации - Структура - параметры выполнения операции.
// ДополнительныеПараметры - Структура - дополнительные команды.
//
Процедура НачатьПечатьКопииЧека(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства, ПараметрыОперации, ДополнительныеПараметры = Неопределено) Экспорт
КонтекстОперации = Новый Структура();
КонтекстОперации.Вставить("ОповещениеПриЗавершении", ОповещениеПриЗавершении);
КонтекстОперации.Вставить("ИдентификаторКлиента" , ИдентификаторКлиента);
КонтекстОперации.Вставить("ИдентификаторУстройства", ИдентификаторУстройства);
КонтекстОперации.Вставить("ПараметрыОперации" , ПараметрыОперации);
КонтекстОперации.Вставить("ДополнительныеПараметры", ДополнительныеПараметры);
КонтекстОперации.Вставить("ПодготовитьДанные" , Истина);
КонтекстОперации.Вставить("ОбработатьДанные" , Истина);
КонтекстОперации.Вставить("Команда" , "PrintCheckCopy");
КонтекстОперации.Вставить("Результат", Истина);
ВыполнитьВыборФискальногоУстройства(КонтекстОперации);
КонецПроцедуры
// Осуществляет печать QR кода на фискальном устройстве.
//
// Параметры:
// ОповещениеПриЗавершении - ОписаниеОповещения - оповещение при завершении.
// ИдентификаторКлиента - ФормаКлиентскогоПриложения -идентификатор формы.
// ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование - идентификатор устройства, если неопределенно - будет предложен выбор.
// ПараметрыОперации - Структура - параметры выполнения операции.
// ДополнительныеПараметры - Структура - дополнительные команды.
//
Процедура НачатьПечатьQRКодаНаФискальномУстройстве(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства, ПараметрыОперации, ДополнительныеПараметры = Неопределено) Экспорт
КонтекстОперации = Новый Структура();
КонтекстОперации.Вставить("ОповещениеПриЗавершении", ОповещениеПриЗавершении);
КонтекстОперации.Вставить("ИдентификаторКлиента" , ИдентификаторКлиента);
КонтекстОперации.Вставить("ИдентификаторУстройства", ИдентификаторУстройства);
КонтекстОперации.Вставить("ПараметрыОперации" , ПараметрыОперации);
КонтекстОперации.Вставить("ДополнительныеПараметры", ДополнительныеПараметры);
КонтекстОперации.Вставить("ПодготовитьДанные" , Истина);
КонтекстОперации.Вставить("ОбработатьДанные" , Ложь);
КонтекстОперации.Вставить("Команда" , "PrintQRCode");
КонтекстОперации.Вставить("Результат", Истина);
ВыполнитьВыборФискальногоУстройства(КонтекстОперации);
КонецПроцедуры
// Осуществляет открытие сессии регистрации КМ.
//
// Параметры:
// ОповещениеПриЗавершении - ОписаниеОповещения - оповещение при завершении.
// ИдентификаторКлиента - ФормаКлиентскогоПриложения -идентификатор формы.
// ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование - идентификатор устройства.
// ПараметрыОперации - Структура - параметры выполнения операции.
// ДополнительныеПараметры - Структура - дополнительные команды.
//
Процедура НачатьОткрытиеСессииРегистрацииКМ(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства, ПараметрыОперации = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт
ПараметрыВыполнениеКоманды = МенеджерОборудованияКлиентСервер.ПараметрыВыполнениеКоманды("OpenSessionRegistrationKM",
"ОборудованиеЧекопечатающиеУстройства", ДополнительныеПараметры, Ложь, Ложь);
МенеджерОборудованияКлиент.НачатьВыполнениеКоманды(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства,
ПараметрыОперации, ПараметрыВыполнениеКоманды);
КонецПроцедуры
// Осуществляет закрытии сессии регистрации КМ.
//
// Параметры:
// ОповещениеПриЗавершении - ОписаниеОповещения - оповещение при завершении.
// ИдентификаторКлиента - ФормаКлиентскогоПриложения -идентификатор формы.
// ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование - идентификатор устройства.
// ПараметрыОперации - Структура - параметры выполнения операции.
// ДополнительныеПараметры - Структура - дополнительные команды.
//
Процедура НачатьЗакрытииСессииРегистрацииКМ(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства, ПараметрыОперации = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт
ПараметрыВыполнениеКоманды = МенеджерОборудованияКлиентСервер.ПараметрыВыполнениеКоманды("CloseSessionRegistrationKM",
"ОборудованиеЧекопечатающиеУстройства", ДополнительныеПараметры, Ложь, Ложь);
МенеджерОборудованияКлиент.НачатьВыполнениеКоманды(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства,
ПараметрыОперации, ПараметрыВыполнениеКоманды);
КонецПроцедуры
// Начать подтверждение КМ.
//
// Параметры:
// ОповещениеПриЗавершении - ОписаниеОповещения - оповещение при завершении.
// ИдентификаторКлиента - ФормаКлиентскогоПриложения -идентификатор формы.
// ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование - идентификатор устройства.
// ПараметрыОперации - Структура - параметры выполнения операции.
// ДополнительныеПараметры - Структура - дополнительные команды.
//
Процедура НачатьПодтверждениеКМ(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства, ПараметрыОперации, ДополнительныеПараметры = Неопределено) Экспорт
ПараметрыВыполнениеКоманды = МенеджерОборудованияКлиентСервер.ПараметрыВыполнениеКоманды("ConfirmKM",
"ОборудованиеЧекопечатающиеУстройства", ДополнительныеПараметры, Ложь, Ложь);
МенеджерОборудованияКлиент.НачатьВыполнениеКоманды(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства,
ПараметрыОперации, ПараметрыВыполнениеКоманды);
КонецПроцедуры
// Осуществляет запрос КМ.
//
// Параметры:
// ОповещениеПриЗавершении - ОписаниеОповещения - оповещение при завершении.
// ИдентификаторКлиента - ФормаКлиентскогоПриложения -идентификатор формы.
// ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование - идентификатор устройства.
// ПараметрыОперации - см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыПроверкиКМ.
// ДополнительныеПараметры - Структура - дополнительные команды.
//
Процедура НачатьПроверкуКМ(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства, ПараметрыОперации, ДополнительныеПараметры = Неопределено) Экспорт
Если ДополнительныеПараметры = Неопределено Тогда
ДополнительныеПараметры = МенеджерОборудованияКлиентСервер.ДополнительныеПараметрыОперации(Истина);
Иначе
Если ДополнительныеПараметры.Свойство("ОставитьПодключенным") Тогда
ДополнительныеПараметры.ОставитьПодключенным = Истина;
КонецЕсли;
КонецЕсли;
ПараметрыВыполнениеКоманды = МенеджерОборудованияКлиентСервер.ПараметрыВыполнениеКоманды("CheckKM",
"ОборудованиеЧекопечатающиеУстройства", ДополнительныеПараметры, Истина, Истина);
ПараметрыВыполнениеКоманды.Вставить("ОбработатьДанныеПриОшибке", Истина);
ПараметрыОперации.Вставить("ИдентификаторКлиента", ИдентификаторКлиента);
МенеджерОборудованияКлиент.НачатьВыполнениеКоманды(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства,
ПараметрыОперации, ПараметрыВыполнениеКоманды);
КонецПроцедуры
// Осуществляет повторный запрос КМ, который выполняет проверку без ожидания ответа от удаленного сервера и без подтверждения пользователя.
//
// Параметры:
// ОповещениеПриЗавершении - ОписаниеОповещения - оповещение при завершении.
// ИдентификаторКлиента - ФормаКлиентскогоПриложения -идентификатор формы.
// ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование - идентификатор устройства.
// ПараметрыОперации - см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыПроверкиКМ.
// ДополнительныеПараметры - Структура - дополнительные команды.
//
Процедура НачатьПовторнуюПроверкуКМ(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства, ПараметрыОперации, ДополнительныеПараметры = Неопределено) Экспорт
ПараметрыОперации.ОжидатьПолученияОтветаПроверкиКМ = Ложь;
ПараметрыОперации.Вставить("ИдентификаторКлиента", ИдентификаторКлиента);
Для Каждого ЗапросКМ Из ПараметрыОперации.ЗапросыКМ Цикл
ЗапросКМ.ВыполнятьВалидацию = Ложь;
ЗапросКМ.ЗапросРазрешенияПродажиКМ = Ложь;
ЗапросКМ.ИгнорироватьРезультатПроверкиКМ = Истина;
КонецЦикла;
ПараметрыВыполнениеКоманды = МенеджерОборудованияКлиентСервер.ПараметрыВыполнениеКоманды("CheckKM",
"ОборудованиеЧекопечатающиеУстройства", ДополнительныеПараметры, Истина, Истина);
ПараметрыВыполнениеКоманды.Вставить("ОбработатьДанныеПриОшибке", Истина);
МенеджерОборудованияКлиент.НачатьВыполнениеКоманды(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства,
ПараметрыОперации, ПараметрыВыполнениеКоманды);
КонецПроцедуры
// Функция возвращает поддерживает ли фискальное устройство.
//
// Параметры:
// ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование - Идентификатор устройства.
//
// Возвращаемое значение:
// Булево - Фискальное устройство поддерживает проверку кодов маркировки
Функция ФискальноеУстройствоПоддерживаетПроверкуКодовМаркировки(ИдентификаторУстройства) Экспорт
Возврат ОборудованиеЧекопечатающиеУстройстваВызовСервера.ФискальноеУстройствоПоддерживаетПроверкуКодовМаркировки(ИдентификаторУстройства);
КонецФункции
// Функция возвращает для фискального устройства версию ФФД.
//
// Параметры:
// ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование - Идентификатор устройства.
//
// Возвращаемое значение:
// Неопределено - Фискальное устройство поддерживает версию ФФД
Функция ФискальноеУстройствоПоддерживаетВерсиюФФД(ИдентификаторУстройства) Экспорт
Возврат ОборудованиеЧекопечатающиеУстройстваВызовСервера.ФискальноеУстройствоПоддерживаетВерсиюФФД(ИдентификаторУстройства);
КонецФункции
#Область ПакетнаяОбработка
#Область ФискализацияЧекаСОплатойКартой
// Возвращает структуру для заполнения данными оплаты эквайринговым терминалом и фискализации
//
// Возвращаемое значение:
// Структура:
// * ПараметрыФискализацииЧека - См. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыОперацииФискализацииЧека
// * ПараметрыВыполненияЭквайринговойОперации - См. ОборудованиеПлатежныеСистемыКлиентСервер.ПараметрыВыполненияЭквайринговойОперации
// * ОповещениеВопросПользователю - ОписаниеОповещения - Описание оповещения пользователя, для самостоятельной выдачи
// сообщения, это оповещение будет вызвано в случае отрицательного ответа от эквайрингового
// терминала при оплате, в процедуру будут переданы результат выполнения пакета операций,
// а также структура содержащая контекст пакета, если требуется продолжить выполнение пакета,
// тогда нужно будет вызвать в модуле ОборудованиеЧекопечатающиеУстройстваКлиент процедуры
// "НачатьФискализациюЧекаСОплатойКартой_ПродолжитьВыполнение" или
// "НачатьФискализациюЧекаСОплатойКартой_ПовторитьОплату".
// передав туда этот контекст.
// Процедура оповещения содержит следующие параметры:
// Результат - Структура:
// * РезультатОперации - См. РезультатФискализацииЧекаСОплатойКартой
// * КонтекстОперации - Структура - контекст пакета операции который нужно передать в процедуру
// "ОборудованиеЧекопечатающиеУстройстваКлиент.НачатьФискализациюЧекаСОплатойКартой_ПродолжитьВыполнение"
// для продолжения выполнения пакета
// ДополнительныеПараметры - Любой - значение переданное при создании оповещения
// * СлипЧекВТелеФискального - Булево, Неопределено - Выводить слип-чек в теле фискального, Истина - слип-чек будет выведен
// в теле фискального, Ложь - короткий слип-чек не будет выводиться, Неопределено - короткий слип-чек
// будет выводиться если поддерживает драйвер оборудования.
//
// Пример:
// Определение процедуры оповещения пользователя
// Процедура ВопросПользователюЗавершение(Результат, ДополнительныеПараметры)
// РезультатОперации = Результат.РезультатОперации;
// КонтекстОперации = Результат.КонтекстОперации;
// ...
// // продолжить выполнение пакета операций
// ОборудованиеЧекопечатающиеУстройстваКлиент.НачатьФискализациюЧекаСОплатойКартой_ПродолжитьВыполнение(Истина, КонтекстОперации);
// КонецПроцедуры
//
Функция ПараметрыФискализацияЧекаСОплатойКартой() Экспорт
Результат = ПараметрыЭквайринговаяОперацияСФискализацией();
Возврат Результат;
КонецФункции
// Выполняет оплату на эквайринговом терминале, а затем фискализацию чека с печатью слип-чека в теле фискального,
// если операция при фискализации закончилась неуспешно, тогда происходит аварийная отмена последней операции на
// эквайринговом терминале.
//
// Параметры:
// ОповещениеПриЗавершении - ОписаниеОповещения - Описание процедуры которая будет вызвана при завершении операции
// со следующими параметрами:
// * Результат - См. РезультатФискализацииЧекаСОплатойКартой
// ИдентификаторКлиента - ФормаКлиентскогоПриложения - идентификатор формы.
// ИдентификаторККТ - СправочникСсылка.ПодключаемоеОборудование - ККТ на котором будет печататься фискальный чек
// содержащий в себе слип-чек.
// ИдентификаторЭТ - СправочникСсылка.ПодключаемоеОборудование - Эквайринговый терминал для обработки операции.
// ПараметрыОперации - См. ПараметрыФискализацияЧекаСОплатойКартой
// ДополнительныеПараметры - Структура - Дополнительные параметры которые можно передать в операции
// оплаты и фискализации.
Процедура НачатьФискализациюЧекаСОплатойКартой(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторККТ,
ИдентификаторЭТ, ПараметрыОперации, ДополнительныеПараметры = Неопределено) Экспорт
// Подготовить контекст пакета операций
КонтекстОперации = КонтекстЭквайринговойОперацииСФискализацией();
КонтекстОперации.ТипОперации = "ФискализацияЧекаСОплатой";
КонтекстОперации.ОповещениеЗавершения = ОповещениеПриЗавершении;
КонтекстОперации.ИдентификаторКлиента = ИдентификаторКлиента;
КонтекстОперации.ИдентификаторККТ = ИдентификаторККТ;
КонтекстОперации.ИдентификаторЭТ = ИдентификаторЭТ;
ЗаполнитьЗначенияСвойств(КонтекстОперации, ПараметрыОперации);
ПодготовитьКонтекстПакетнойОперации(КонтекстОперации, ДополнительныеПараметры);
// Выбрать ЭТ если не указан конкретный
ОповещениеЗавершенияПодключения = Новый ОписаниеОповещения("НачатьЭкваринговуюОперациюСФискализацией_ЭквайринговаяОперация",
ЭтотОбъект,
КонтекстОперации);
ПакетнаяОбработка_ВыборУстройства(ОповещениеЗавершенияПодключения, КонтекстОперации);
КонецПроцедуры
// Запускает продолжение выполнения пакета, после обработки вопроса пользователя, или же успешной операции на
// эквайринговом терминале
//
// Параметры:
// Результат - Булево - Если Истина, тогда продолжается выполнение операции, иначе вызывается оповещение
// пользователя о завершении работы пакета
// КонтекстОперации - см. КонтекстЭквайринговойОперацииСФискализацией
Процедура НачатьФискализациюЧекаСОплатойКартой_ПродолжитьВыполнение(Результат, КонтекстОперации) Экспорт
ОписаниеОшибки = КонтекстОперации.РезультатВыполненияЭквайринговойОперации.ОписаниеОшибки;
Если Результат Тогда
НачатьЭкваринговуюОперациюСФискализацией_Фискализация(КонтекстОперации);
Иначе
КонтекстОперации.Результат = Ложь;
КонтекстОперации.ОписаниеОшибки = ОписаниеОшибки;
ВывестиСлипЧекКакТекстовыйДокумент("Отказ", КонтекстОперации);
КонецЕсли;
КонецПроцедуры
// Запускает повторно эквайринговой операции.
//
// Параметры:
// КонтекстОперации - см. КонтекстЭквайринговойОперацииСФискализацией
Процедура НачатьФискализациюЧекаСОплатойКартой_ПовторитьОплату(КонтекстОперации) Экспорт
ОписаниеОшибки = КонтекстОперации.РезультатВыполненияЭквайринговойОперации.ОписаниеОшибки;
РезультатВыполнения = МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании();
РезультатВыполнения.Результат = Истина;
РезультатВыполнения.ОписаниеОшибки = ОписаниеОшибки;
РезультатВыполнения.ПодключенноеУстройство = КонтекстОперации.ПодключенныйЭТ;
НачатьЭкваринговуюОперациюСФискализацией_ЭквайринговаяОперация(РезультатВыполнения, КонтекстОперации);
КонецПроцедуры
#КонецОбласти
#Область ПокупкаСЗачислением
// Возвращает структуру для заполнения данными выплаты эквайринговым терминалом и фискализации
//
// Возвращаемое значение:
// Структура:
// * ПараметрыФискализацииЧека - См. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыОперацииФискализацииЧека
// * ПараметрыВыполненияЭквайринговойОперации - См. ОборудованиеПлатежныеСистемыКлиентСервер.ПараметрыВыполненияЭквайринговойОперации
// * ОповещениеВопросПользователю - ОписаниеОповещения - Описание оповещения пользователя, для самостоятельной выдачи
// сообщения, это оповещение будет вызвано в случае отрицательного ответа от эквайрингового
// терминала при оплате, в процедуру будут переданы результат выполнения пакета операций,
// а также структура содержащая контекст пакета, если требуется продолжить выполнение пакета,
// тогда нужно будет вызвать в модуле ОборудованиеЧекопечатающиеУстройстваКлиент процедуры
// "НачатьФискализациюЧекаСОплатойКартой_ПродолжитьВыполнение" или
// "НачатьФискализациюЧекаСОплатойКартой_ПовторитьОплату".
// передав туда этот контекст.
// Процедура оповещения содержит следующие параметры:
// Результат - Структура:
// * РезультатОперации - См. РезультатФискализацииЧекаСОплатойКартой
// * КонтекстОперации - Структура - контекст пакета операции который нужно передать в процедуру
// "ОборудованиеЧекопечатающиеУстройстваКлиент.НачатьФискализациюЧекаСОплатойКартой_ПродолжитьВыполнение"
// для продолжения выполнения пакета
// ДополнительныеПараметры - Любой - значение переданное при создании оповещения
// * СлипЧекВТелеФискального - Булево, Неопределено - Выводить слип-чек в теле фискального, Истина - слип-чек будет выведен
// в теле фискального, Ложь - короткий слип-чек не будет выводиться, Неопределено - короткий слип-чек
// будет выводиться если поддерживает драйвер оборудования.
//
// Пример:
// Определение процедуры оповещения пользователя
// Процедура ВопросПользователюЗавершение(Результат, ДополнительныеПараметры)
// РезультатОперации = Результат.РезультатОперации;
// КонтекстОперации = Результат.КонтекстОперации;
// ...
// // продолжить выполнение пакета операций
// ОборудованиеЧекопечатающиеУстройстваКлиент.НачатьФискализациюЧекаСОплатойКартой_ПродолжитьВыполнение(Истина, КонтекстОперации);
// КонецПроцедуры
//
Функция ПараметрыПокупкаСЗачислением() Экспорт
Результат = ПараметрыЭквайринговаяОперацияСФискализацией();
Возврат Результат;
КонецФункции
// Выполняет оплату на эквайринговом терминале, а затем фискализацию чека с печатью слип-чека в теле фискального,
// если операция при фискализации закончилась неуспешно, тогда происходит аварийная отмена последней операции на
// эквайринговом терминале.
//
// Параметры:
// ОповещениеПриЗавершении - ОписаниеОповещения - Описание процедуры которая будет вызвана при завершении операции
// со следующими параметрами:
// * Результат - См. РезультатФискализацииЧекаСОплатойКартой
// ИдентификаторКлиента - ФормаКлиентскогоПриложения - идентификатор формы.
// ИдентификаторККТ - СправочникСсылка.ПодключаемоеОборудование - ККТ на котором будет печататься фискальный чек
// содержащий в себе слип-чек.
// ИдентификаторЭТ - СправочникСсылка.ПодключаемоеОборудование - Эквайринговый терминал для обработки операции.
// ПараметрыОперации - См. ПараметрыФискализацияЧекаСОплатойКартой
// ДополнительныеПараметры - Структура - Дополнительные параметры которые можно передать в операции
// оплаты и фискализации.
Процедура НачатьПокупкаСЗачислением(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторККТ,
ИдентификаторЭТ, ПараметрыОперации, ДополнительныеПараметры = Неопределено) Экспорт
// Подготовить контекст пакета операций
КонтекстОперации = КонтекстЭквайринговойОперацииСФискализацией();
КонтекстОперации.ТипОперации = "ПокупкаСЗачислением";
КонтекстОперации.ОповещениеЗавершения = ОповещениеПриЗавершении;
КонтекстОперации.ИдентификаторКлиента = ИдентификаторКлиента;
КонтекстОперации.ИдентификаторККТ = ИдентификаторККТ;
КонтекстОперации.ИдентификаторЭТ = ИдентификаторЭТ;
ЗаполнитьЗначенияСвойств(КонтекстОперации, ПараметрыОперации);
ПодготовитьКонтекстПакетнойОперации(КонтекстОперации, ДополнительныеПараметры);
// Выбрать ЭТ если не указан конкретный
ОповещениеЗавершенияПодключения = Новый ОписаниеОповещения("НачатьЭкваринговуюОперациюСФискализацией_ЭквайринговаяОперация",
ЭтотОбъект,
КонтекстОперации);
ПакетнаяОбработка_ВыборУстройства(ОповещениеЗавершенияПодключения, КонтекстОперации);
КонецПроцедуры
// Запускает продолжение выполнения пакета, после обработки вопроса пользователя, или же успешной операции на
// эквайринговом терминале
//
// Параметры:
// Результат - Булево - Если Истина, тогда продолжается выполнение операции, иначе вызывается оповещение
// пользователя о завершении работы пакета
// КонтекстОперации - см. КонтекстЭквайринговойОперацииСФискализацией
Процедура НачатьПокупкаСЗачислением_ПродолжитьВыполнение(Результат, КонтекстОперации) Экспорт
ОписаниеОшибки = КонтекстОперации.РезультатВыполненияЭквайринговойОперации.ОписаниеОшибки;
Если Результат Тогда
НачатьЭкваринговуюОперациюСФискализацией_Фискализация(КонтекстОперации);
Иначе
КонтекстОперации.Результат = Ложь;
КонтекстОперации.ОписаниеОшибки = ОписаниеОшибки;
ВывестиСлипЧекКакТекстовыйДокумент("Отказ", КонтекстОперации);
КонецЕсли;
КонецПроцедуры
// Запускает повторно эквайринговой операции.
//
// Параметры:
// КонтекстОперации - см. КонтекстЭквайринговойОперацииСФискализацией
Процедура НачатьПокупкаСЗачислением_ПовторитьОплату(КонтекстОперации) Экспорт
ОписаниеОшибки = КонтекстОперации.РезультатВыполненияЭквайринговойОперации.ОписаниеОшибки;
РезультатВыполнения = МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании();
РезультатВыполнения.Результат = Истина;
РезультатВыполнения.ОписаниеОшибки = ОписаниеОшибки;
РезультатВыполнения.ПодключенноеУстройство = КонтекстОперации.ПодключенныйЭТ;
НачатьЭкваринговуюОперациюСФискализацией_ЭквайринговаяОперация(РезультатВыполнения, КонтекстОперации);
КонецПроцедуры
#КонецОбласти
#Область ПродажаСВыдачейНаличных
// Возвращает структуру для заполнения данными операции продажи с выдачей наличных
//
// Возвращаемое значение:
// Структура:
// * ПараметрыФискализацииЧека - См. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыОперацииФискализацииЧека
// * ПараметрыФискализацииЧекаВыдачи - См. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыОперацииФискализацииЧека
// * ПараметрыФискализацииЧекаВозврата - См. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыОперацииФискализацииЧека
// * ПараметрыВыполненияЭквайринговойОперации - См. ОборудованиеПлатежныеСистемыКлиентСервер.ПараметрыВыполненияЭквайринговойОперации
// * ПризнакАгента - ПеречислениеСсылка.ПризнакиАгента - признак агента для автоматического формирования чека выдачи,
// см стандарт, по умолчанию Банковский платежный агент
// * ДанныеАгента - См. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыДанныеАгента
// * ДанныеПоставщика - См. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыДанныеПоставщика
// * СлипЧекВТелеФискального - Булево, Неопределено - Выводить слип-чек в теле фискального, Истина - слип-чек будет выведен
// в теле фискального, Ложь - короткий слип-чек не будет выводиться, Неопределено - короткий слип-чек
// будет выводиться если поддерживает драйвер оборудования.
// * ВыводитьУведомленияПользователя - Булево - если установлена Истина (по умолчанию), тогда при ошибке операции
// в пакете, будет выведено сообщение пользователю.
// * СуммаВыдачи - Число - сумма выдачи наличных денежных средств
Функция ПараметрыПродажаСВыдачейНаличных() Экспорт
ПараметрыОперацииФискализацииЧекаПродажи = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыОперацииФискализацииЧека();
ПараметрыВыполненияЭквайринговойОперации = Неопределено;
ПараметрыДанныеАгента = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыДанныеАгента();
ПараметрыДанныеПоставщика = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыДанныеПоставщика();
ПризнакАгента = ПредопределенноеЗначение("Перечисление.ПризнакиАгента.БанковскийПлатежныйАгент");
Если ОбщегоНазначенияБПОКлиент.ИспользуетсяПлатежныеСистемы() Тогда
МодульОборудованиеПлатежныеСистемыКлиентСервер = ОбщегоНазначенияБПОКлиент.ОбщийМодуль("ОборудованиеПлатежныеСистемыКлиентСервер");
ПараметрыВыполненияЭквайринговойОперации = МодульОборудованиеПлатежныеСистемыКлиентСервер.ПараметрыВыполненияЭквайринговойОперации();
КонецЕсли;
Результат = Новый Структура();
Результат.Вставить("ПараметрыФискализацииЧека", ПараметрыОперацииФискализацииЧекаПродажи);
Результат.Вставить("ПараметрыФискализацииЧекаВыдачи", Неопределено);
Результат.Вставить("ПараметрыФискализацииЧекаВозврата", Неопределено);
Результат.Вставить("ПараметрыВыполненияЭквайринговойОперации", Неопределено);
Результат.Вставить("ПризнакАгента", ПризнакАгента);
Результат.Вставить("ДанныеАгента", ПараметрыДанныеАгента);
Результат.Вставить("ДанныеПоставщика", ПараметрыДанныеПоставщика);
Результат.Вставить("СлипЧекВТелеФискального", Неопределено);
Результат.Вставить("ВыводитьУведомленияПользователя", Ложь);
Результат.Вставить("СуммаВыдачи", 0);
Результат.Вставить("ДокументОснованиеВыдачи", Неопределено);
Результат.Вставить("ДокументОснованиеВозврата", Неопределено);
Результат.Вставить("РеквизитыКартыQR", "");
Возврат Результат;
КонецФункции
// Заполняет параметры фискализации чека выдачи, по данным эквайринговой операции, параметров чека продажи,
// и данных переданных в параметрах операции, тогда они будут получены из чека продажи в соответствии
// с методическими указаниями для ФФД 1.05 и 1.1 ФНС России
//
// Параметры:
// ПараметрыОперации - см. ПараметрыПродажаСВыдачейНаличных
//
Процедура ЗаполнитьПараметрыЧекаВыдачи(ПараметрыОперации) Экспорт
ПризнакАгента = ПараметрыОперации.ПризнакАгента;
ДанныеАгента = ПараметрыОперации.ДанныеАгента;
ДанныеПоставщика = ПараметрыОперации.ДанныеПоставщика;
ПараметрыФискализацииЧека = ПараметрыОперации.ПараметрыФискализацииЧека;
ПараметрыВыполненияЭквайринговойОперации = ПараметрыОперации.ПараметрыВыполненияЭквайринговойОперации;
СуммаНаличных = ПараметрыВыполненияЭквайринговойОперации.СуммаНаличных;
// создать чек выдачи наличных
ПараметрыЧека = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыОперацииФискализацииЧека();
СписокСвойствДляКопирования = "ДокументОснование, Организация, ТорговыйОбъект, Электронно, Отправляет1СSMS,
|Отправляет1СEmail, СистемаНалогообложения, АдресРасчетов, МестоРасчетов, НомерАвтомата, ОтправительEmail,
окупательEmail, ПокупательНомер, Получатель, ПолучательИНН, СубъектПерсональныхДанных, ЕстьПерсональныеДанные,
|ТипПерсональныхДанных, СерийныйНомер, ОрганизацияНазвание, ОрганизацияИНН, ОрганизацияКПП, АдресМагазина,
|НаименованиеМагазина, НомерКассы, НомерСмены, ДатаВремя, ТекстШапки, ТекстПодвала, КопийЧека, КассаККМ";
ЗаполнитьЗначенияСвойств(ПараметрыЧека, ПараметрыФискализацииЧека, СписокСвойствДляКопирования);
Если ЗначениеЗаполнено(ПараметрыОперации.ДокументОснованиеВыдачи) Тогда
ПараметрыЧека.ДокументОснование = ПараметрыОперации.ДокументОснованиеВыдачи;
КонецЕсли;
ПараметрыЧека.ТипРасчета = ПредопределенноеЗначение("Перечисление.ТипыРасчетаДенежнымиСредствами.РасходДенежныхСредств");
ПараметрыЧека.НомерЧека = Число(ПараметрыФискализацииЧека.НомерЧека) + 1;
ЗаполнитьЗначенияСвойств(ПараметрыЧека.СведенияОПокупателе, ПараметрыФискализацииЧека.СведенияОПокупателе);
// Позиции чека для фискализации.
ПараметрыЧека.ПозицииЧека.Очистить();
СтрокаПозицииЧека = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыФискальнойСтрокиЧека();
СтрокаПозицииЧека.НомерСтрокиТовара = 1;
СтрокаПозицииЧека.Наименование = НСтр("ru = 'Выдача наличных денежных средств'");
СтрокаПозицииЧека.Количество = 1;
СтрокаПозицииЧека.Цена = СуммаНаличных;
СтрокаПозицииЧека.ЦенаСоСкидками = СуммаНаличных;
СтрокаПозицииЧека.Сумма = СуммаНаличных;
СтрокаПозицииЧека.СтавкаНДС = Неопределено;
СтрокаПозицииЧека.СуммаНДС = 0;
СтрокаПозицииЧека.ЕдиницаИзмерения = НСтр("ru = 'Штука'");
СтрокаПозицииЧека.КодЕдиницыИзмерения = "796";
СтрокаПозицииЧека.ДанныеАгента = ПараметрыЧека.ДанныеАгента;
СтрокаПозицииЧека.ДанныеПоставщика = ПараметрыЧека.ДанныеПоставщика;
СтрокаПозицииЧека.ПризнакСпособаРасчета = ПредопределенноеЗначение("Перечисление.ПризнакиСпособаРасчета.ПередачаСПолнойОплатой");
СтрокаПозицииЧека.ПризнакПредметаРасчета = ПредопределенноеЗначение("Перечисление.ПризнакиПредметаРасчета.Услуга");
СтрокаПозицииЧека.ПризнакАгентаПоПредметуРасчета = ПризнакАгента;
СтрокаПозицииЧека.ДанныеАгента = ДанныеАгента;
СтрокаПозицииЧека.ДанныеПоставщика = ДанныеПоставщика;
ПараметрыЧека.ПозицииЧека.Добавить(СтрокаПозицииЧека);
ПараметрыЧека.ТаблицаОплат.Очистить();
СтрокаОплаты = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыСтрокиОплаты();
СтрокаОплаты.Сумма = СуммаНаличных;
СтрокаОплаты.ТипОплаты = ПредопределенноеЗначение("Перечисление.ТипыОплатыККТ.Наличные");
ПараметрыЧека.ТаблицаОплат.Добавить(СтрокаОплаты);
ПараметрыЧека.ДетализацияОплаты.Очистить();
ПараметрыОперации.ПараметрыФискализацииЧекаВыдачи = ПараметрыЧека;
КонецПроцедуры
// Заполняет параметры фискализации чека возврата формируемого в случае невыполнения фискализации чека выдачи,
// по данным параметров чека продажи
//
// Параметры:
// ПараметрыОперации - см. ПараметрыПродажаСВыдачейНаличных
//
Процедура ЗаполнитьПараметрыЧекаВозврата(ПараметрыОперации) Экспорт
ПараметрыФискализацииЧека = ПараметрыОперации.ПараметрыФискализацииЧека;
// создать чек возврата
ПараметрыЧека = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыОперацииЧекаКоррекции();
ЗаполнитьЗначенияСвойств(ПараметрыЧека, ПараметрыФискализацииЧека);
ПараметрыЧека.НомерЧека = Число(ПараметрыФискализацииЧека.НомерЧека) + 1;
ПараметрыЧека.ТипРасчета = ПредопределенноеЗначение("Перечисление.ТипыРасчетаДенежнымиСредствами.ВозвратДенежныхСредств");
Если ЗначениеЗаполнено(ПараметрыОперации.ДокументОснованиеВозврата) Тогда
ПараметрыЧека.ДокументОснование = ПараметрыОперации.ДокументОснованиеВозврата;
ИначеЕсли ЗначениеЗаполнено(ПараметрыОперации.ДокументОснованиеВыдачи) Тогда
ПараметрыЧека.ДокументОснование = ПараметрыОперации.ДокументОснованиеВыдачи;
КонецЕсли;
ПараметрыОперации.ПараметрыФискализацииЧекаВозврата = ПараметрыЧека;
КонецПроцедуры
// Выполняет операцию оплата с выдачей наличных на эквайринговом терминале, затем фискализацию чека продажи
// фискализацию чека выдачи. Если фискализация чека продажи не проходит, тогда выполняется аварийная отмена
// последней эквайринговой операции. Если фискализация чека выдачи не проходит тогда выполняется отмена операции
// продажи с помощью чека коррекции, а затем выполняется аварийная отмена последней эквайринговой операции.
//
// Параметры:
// ОповещениеПриЗавершении - ОписаниеОповещения - Описание процедуры которая будет вызвана при завершении операции
// со следующими параметрами:
// * Результат - См. ОборудованиеЧекопечатающиеУстройстваКлиент.РезультатПродажаСВыдачейНаличных
// ИдентификаторКлиента - ФормаКлиентскогоПриложения - идентификатор формы.
// ИдентификаторККТ - СправочникСсылка.ПодключаемоеОборудование - ККТ на котором будет печататься фискальный чек
// содержащий в себе слип-чек.
// ИдентификаторЭТ - СправочникСсылка.ПодключаемоеОборудование - Эквайринговый терминал для обработки операции.
// ПараметрыОперации - См. ПараметрыПродажаСВыдачейНаличных
// ДополнительныеПараметры - Структура - Дополнительные параметры которые можно передать в операции
// оплаты и фискализации.
Процедура НачатьПродажаСВыдачейНаличных(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторККТ,
ИдентификаторЭТ, ПараметрыОперации, ДополнительныеПараметры = Неопределено) Экспорт
КонтекстОперации = КонтекстПродажаСВыдачейНаличных();
КонтекстОперации.ОповещениеЗавершения = ОповещениеПриЗавершении;
КонтекстОперации.ИдентификаторКлиента = ИдентификаторКлиента;
КонтекстОперации.ИдентификаторККТ = ИдентификаторККТ;
КонтекстОперации.ИдентификаторЭТ = ИдентификаторЭТ;
ЗаполнитьЗначенияСвойств(КонтекстОперации, ПараметрыОперации);
ПодготовитьКонтекстПакетнойОперации(КонтекстОперации, ДополнительныеПараметры);
Если ПараметрыОперации.ПараметрыВыполненияЭквайринговойОперации = Неопределено Тогда
ПараметрыОперации.ПараметрыВыполненияЭквайринговойОперации = КонтекстОперации.ПараметрыВыполненияЭквайринговойОперации;
КонецЕсли;
Если КонтекстОперации.ПараметрыФискализацииЧекаВыдачи = Неопределено Тогда
ЗаполнитьПараметрыЧекаВыдачи(ПараметрыОперации);
КонтекстОперации.ПараметрыФискализацииЧекаВыдачи = ПараметрыОперации.ПараметрыФискализацииЧекаВыдачи;
КонецЕсли;
Если КонтекстОперации.ПараметрыФискализацииЧекаВозврата = Неопределено Тогда
ЗаполнитьПараметрыЧекаВозврата(ПараметрыОперации);
КонтекстОперации.ПараметрыФискализацииЧекаВозврата = ПараметрыОперации.ПараметрыФискализацииЧекаВозврата;
КонецЕсли;
// Выбрать ЭТ если не указан конкретный
ОповещениеЗавершенияПодключения = Новый ОписаниеОповещения("НачатьПродажаСВыдачейНаличных_ЭквайринговаяОперация",
ЭтотОбъект,
КонтекстОперации);
ПакетнаяОбработка_ВыборУстройства(ОповещениеЗавершенияПодключения, КонтекстОперации);
КонецПроцедуры
#КонецОбласти
#КонецОбласти
// Возвращает структуру для заполнения данных открытия формы настройки регистрации ККТ
//
// Возвращаемое значение:
// Структура:
// * ФискальноеУстройство - СправочникСсылка.ПодключаемоеОборудование - ссылка на ККТ
// * Организация - ОпределяемыйТип.ОрганизацияБПО
// * ТипОперации - Число
// * ОбработчикЗавершения - ОписаниеОповещения
Функция ПараметрыФормаНастройкиРегистрацииККТ() Экспорт
Параметры = Новый Структура();
Параметры.Вставить("ФискальноеУстройство");
Параметры.Вставить("Организация");
Параметры.Вставить("ТипОперации", 0);
Возврат Параметры;
КонецФункции
// Выполняет открытие формы настроек для регистрации ККТ
//
// Параметры:
// ОповещениеПриЗавершении - ОписаниеОповещения
// ПараметрыОткрытия - см. ПараметрыФормаНастройкиРегистрацииККТ
Процедура ОткрытьФормуНастройкиРегистрацииККТ(ОповещениеПриЗавершении, ПараметрыОткрытия) Экспорт
ОборудованиеЧекопечатающиеУстройстваКлиентЛокализация.ОткрытьФормуНастройкиРегистрацииККТ(ОповещениеПриЗавершении, ПараметрыОткрытия);
КонецПроцедуры
// Возвращает планируемые статусы маркированного товара
//
// Возвращаемое значение:
// Соответствие
Функция ПланируемыеСтатусыМаркированногоТовара() Экспорт
Соответствие = Новый Соответствие();
// ++ Локализация
Соответствие.Вставить("ШтучныйТоварРеализован" , ПредопределенноеЗначение("Перечисление.ПланируемыйСтатусМаркируемогоТовара.ШтучныйТоварРеализован"));
Соответствие.Вставить("МерныйТоварВСтадииРеализации", ПредопределенноеЗначение("Перечисление.ПланируемыйСтатусМаркируемогоТовара.МерныйТоварВСтадииРеализации"));
Соответствие.Вставить("ШтучныйТоварВозвращен" , ПредопределенноеЗначение("Перечисление.ПланируемыйСтатусМаркируемогоТовара.ШтучныйТоварВозвращен"));
Соответствие.Вставить("ЧастьТовараВозвращена" , ПредопределенноеЗначение("Перечисление.ПланируемыйСтатусМаркируемогоТовара.ЧастьТовараВозвращена"));
Соответствие.Вставить("СтатусТовараНеИзменился" , ПредопределенноеЗначение("Перечисление.ПланируемыйСтатусМаркируемогоТовара.СтатусТовараНеИзменился"));
// -- Локализация
Возврат Соответствие;
КонецФункции
// Возвращает значение мера количества предмета расчета литр
//
// Возвращаемое значение:
// ПеречислениеСсылка.МераКоличестваПредметаРасчетаККТ
Функция МераКоличестваПредметаРасчетаЛитр() Экспорт
Возврат ПредопределенноеЗначение("Перечисление.МераКоличестваПредметаРасчетаККТ.Литр");
КонецФункции
// Возвращает значение статус обработки запроса по умолчанию
//
// Возвращаемое значение:
// ПеречислениеСсылка
Функция СтатусОбработкиЗапросаПоУмолчанию() Экспорт
// ++ Локализация
Возврат ПредопределенноеЗначение("Перечисление.СтатусОбработкиЗапросаКМ.ПустаяСсылка");
// -- Локализация
КонецФункции
// Возвращает значение статус результата ожидается
//
// Возвращаемое значение:
// ПеречислениеСсылка
Функция СтатусРезультатаОжидается() Экспорт
// ++ Локализация
Возврат ПредопределенноеЗначение("Перечисление.СтатусРезультатаЗапросаКМ.Ожидается");
// -- Локализация
КонецФункции
// Возвращает значение статус товара по умолчанию
//
// Возвращаемое значение:
// ПеречислениеСсылка
Функция СтатусТовараПоУмолчанию() Экспорт
// ++ Локализация
Возврат ПредопределенноеЗначение("Перечисление.ОтветОИСМОСтатусеТовара.ПустаяСсылка");
// -- Локализация
КонецФункции
// Возвращает значение статус результата по умолчанию
//
// Возвращаемое значение:
// ПеречислениеСсылка
Функция СтатусРезультатаПоУмолчанию() Экспорт
// ++ Локализация
Возврат ПредопределенноеЗначение("Перечисление.СтатусРезультатаЗапросаКМ.ПустаяСсылка");
// -- Локализация
КонецФункции
// Осуществляет запрос КМ без ожидания ответа.
//
// Параметры:
// ОповещениеПриЗавершении - ОписаниеОповещения - оповещение при завершении.
// ИдентификаторКлиента - ФормаКлиентскогоПриложения -идентификатор формы.
// ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование - идентификатор устройства.
// ПараметрыОперации - Структура - параметры выполнения операции.
// ДополнительныеПараметры - Структура - дополнительные команды.
//
Процедура НачатьЗапросКМБезОжиданияОтвета(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства, ПараметрыОперации, ДополнительныеПараметры = Неопределено) Экспорт
ПараметрыВыполнениеКоманды = МенеджерОборудованияКлиентСервер.ПараметрыВыполнениеКоманды("RequestKMKMNoWait",
"ОборудованиеЧекопечатающиеУстройства", ДополнительныеПараметры, Истина, Истина);
МенеджерОборудованияКлиент.НачатьВыполнениеКоманды(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства,
ПараметрыОперации, ПараметрыВыполнениеКоманды);
КонецПроцедуры
#Область УстаревшиеПроцедурыИФункции
// Устарела: следует использовать НачатьПроверкуКМ.
// Осуществляет запрос КМ.
//
// Параметры:
// ОповещениеПриЗавершении - ОписаниеОповещения - оповещение при завершении.
// ИдентификаторКлиента - ФормаКлиентскогоПриложения -идентификатор формы.
// ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование - идентификатор устройства.
// ПараметрыОперации - Структура - параметры выполнения операции.
// ДополнительныеПараметры - Структура - дополнительные команды.
//
Процедура НачатьЗапросКМ(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства, ПараметрыОперации, ДополнительныеПараметры = Неопределено) Экспорт
ПараметрыВыполнениеКоманды = МенеджерОборудованияКлиентСервер.ПараметрыВыполнениеКоманды("RequestKM",
"ОборудованиеЧекопечатающиеУстройства", ДополнительныеПараметры, Истина, Истина);
МенеджерОборудованияКлиент.НачатьВыполнениеКоманды(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства,
ПараметрыОперации, ПараметрыВыполнениеКоманды);
КонецПроцедуры
// Устарела: следует использовать НачатьПроверкуКМ.
// Начать получения результатов запроса КМ.
//
// Параметры:
// ОповещениеПриЗавершении - ОписаниеОповещения - оповещение при завершении.
// ИдентификаторКлиента - ФормаКлиентскогоПриложения -идентификатор формы.
// ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование - идентификатор устройства.
// ПараметрыОперации - Структура - параметры выполнения операции.
// ДополнительныеПараметры - Структура - дополнительные команды.
//
Процедура НачатьПолученияРезультатовЗапросаКМ(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства, ПараметрыОперации, ДополнительныеПараметры = Неопределено) Экспорт
ПараметрыВыполнениеКоманды = МенеджерОборудованияКлиентСервер.ПараметрыВыполнениеКоманды("GetProcessingKMResult",
"ОборудованиеЧекопечатающиеУстройства", ДополнительныеПараметры, Ложь, Истина);
МенеджерОборудованияКлиент.НачатьВыполнениеКоманды(ОповещениеПриЗавершении, ИдентификаторКлиента, ИдентификаторУстройства,
ПараметрыОперации, ПараметрыВыполнениеКоманды);
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
#Область ПакетнаяОбработка
// Обрабатывает результат выбора эквайрингового терминала
//
// Параметры:
// РезультатВыполнения - См. МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании
// КонтекстОперации - См. КонтекстЭквайринговойОперацииСФискализацией
Процедура ПакетнаяОбработка_ВыборУстройстваЗавершение(РезультатВыполнения, КонтекстОперации) Экспорт
Результат = РезультатВыполнения.Результат;
Если Не Результат Тогда
// Эквайринговый терминал не выбран, завершить пакет операций
ЗавершитьПакетОпераций(Ложь, РезультатВыполнения.ОписаниеОшибки, КонтекстОперации);
Возврат;
КонецЕсли;
ИдентификаторЭТ = РезультатВыполнения.ИдентификаторУстройства;
ИдентификаторКлиента = КонтекстОперации.ИдентификаторКлиента;
КонтекстОперации.ИдентификаторЭТ = ИдентификаторЭТ;
// Подключить ЭТ, если он не подключен (требуется для проверки возможности печати коротких слип-чеков)
Оповещение = Новый ОписаниеОповещения("ПакетнаяОбработкаодключениеУстройстваЗавершение",
ЭтотОбъект,
КонтекстОперации);
ПодключенноеУстройство = МенеджерОборудованияКлиент.ПолучитьПодключенноеУстройство(ИдентификаторЭТ);
Если ПодключенноеУстройство = Неопределено Тогда
ТипыОборудования = Новый Массив();
ТипыОборудования.Добавить("ЭквайринговыйТерминал");
МенеджерОборудованияКлиент.НачатьПодключениеОборудования(Оповещение,
ИдентификаторКлиента,
ТипыОборудования,
ИдентификаторЭТ);
Иначе
РезультатВыполнения.ПодключенноеУстройство = ПодключенноеУстройство;
ВыполнитьОбработкуОповещения(Оповещение, РезультатВыполнения);
КонецЕсли;
КонецПроцедуры
// Обрабатывает результат подключения эквайрингового терминала
//
// Параметры:
// РезультатВыполнения - См. МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании
// КонтекстОперации - См. КонтекстЭквайринговойОперацииСФискализацией
Процедура ПакетнаяОбработкаодключениеУстройстваЗавершение(РезультатВыполнения, КонтекстОперации) Экспорт
Результат = РезультатВыполнения.Результат;
ОписаниеОшибки = РезультатВыполнения.ОписаниеОшибки;
ПодключенноеУстройство = РезультатВыполнения.ПодключенноеУстройство;
Оповещение = КонтекстОперации.ОповещениеЗавершенияПодключения;
Если Не Результат Тогда
// Не удалось подключить эквайринговый терминал
ЗавершитьПакетОпераций(Ложь, ОписаниеОшибки, КонтекстОперации);
Возврат;
КонецЕсли;
КонтекстОперации.ПодключенныйЭТ = ПодключенноеУстройство;
ОпределитьВозможностьПечатиСлипЧекаВТелеФискального(КонтекстОперации);
// Подключить ЭТ, если он не подключен (требуется для проверки возможности печати коротких слип-чеков)
ВыполнитьОбработкуОповещения(Оповещение, РезультатВыполнения);
КонецПроцедуры
// Обрабатывает результат печати слип-чека как текстового документа
//
// Параметры:
// РезультатВыполнения - См. МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании
// КонтекстОперации - См. КонтекстЭквайринговойОперацииСФискализацией
Процедура ПакетнаяОбработкаечатьТекстаЗавершение(РезультатВыполнения, КонтекстОперации) Экспорт
Результат = КонтекстОперации.Результат;
ОписаниеОшибки = КонтекстОперации.ОписаниеОшибки;
ЗавершитьПакетОпераций(Результат, ОписаниеОшибки, КонтекстОперации);
КонецПроцедуры
#Область ЭквайринговаяОперацияСФискализацией
// Возвращает заполненную структуру результата выполнения пакета операций
//
// Параметры:
// РезультатОперации - Булево - Результат выполнения пакета операций
// ОписаниеОшибки - Строка - Описание ошибки выполнения пакета операции
// КонтекстОперации - см. КонтекстЭквайринговойОперацииСФискализацией
//
// Возвращаемое значение:
// Структура:
// * Результат - Булево - Результат выполнения пакета операций.
// * ОписаниеОшибки - Строка - Описание ошибки выполнения пакета операции.
// * РезультатВыполненияЭквайринговойОперации - см. МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании
// * РезультатФискализацииЧека - см. МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании
// * РезультатАварийнойОтменыОперации - см. МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании
// * ПараметрыЭквайринговойОперации - см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыПакетнойОперацииВОчередиЧеков
Функция РезультатЭквайринговойОперацииСФискализацией(РезультатОперации, ОписаниеОшибки, КонтекстОперации) Экспорт
Результат = Новый Структура();
Результат.Вставить("Результат", РезультатОперации);
Результат.Вставить("ОписаниеОшибки", ОписаниеОшибки);
Если КонтекстОперации.ТипОперации = "ПокупкаСЗачислением" Тогда
Результат.Вставить("ТипОперации", ПредопределенноеЗначение("Перечисление.ТипыПакетнойОперацииВОчередиЧеков.ПокупкаСЗачислением"));
ИначеЕсли КонтекстОперации.ТипОперации = "ФискализацияЧекаСОплатой" Тогда
Результат.Вставить("ТипОперации", ПредопределенноеЗначение("Перечисление.ТипыПакетнойОперацииВОчередиЧеков.ФискализацияЧекаСОплатойКартой"));
Иначе
ВызватьИсключение СтрШаблон(НСтр("ru = 'Неизвестный тип операции %1'"), КонтекстОперации.ТипОперации);
КонецЕсли;
Результат.Вставить("РезультатФискализацииЧека", КонтекстОперации.РезультатФискализацииЧека);
Результат.Вставить("РезультатАварийнойОтменыОперации", КонтекстОперации.РезультатАварийнойОтменыОперации);
Результат.Вставить("РезультатВыполненияЭквайринговойОперации", КонтекстОперации.РезультатВыполненияЭквайринговойОперации);
Результат.Вставить("ПараметрыЭквайринговойОперации", Новый Структура());
Возврат Результат;
КонецФункции
// Начинает выполнение операции на эквайринговом терминале
//
// Параметры:
// РезультатВыполнения - См. МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании
// КонтекстОперации - См. КонтекстЭквайринговойОперацииСФискализацией
Процедура НачатьЭкваринговуюОперациюСФискализацией_ЭквайринговаяОперация(РезультатВыполнения, КонтекстОперации) Экспорт
// Проверить возможность выполнения пакета операций
ОписаниеОшибки = "";
Если Не ЭкваринговаяОперацияСФискализациейДопустима(КонтекстОперации, ОписаниеОшибки) Тогда
ЗавершитьПакетОпераций(Ложь, ОписаниеОшибки, КонтекстОперации);
Возврат;
КонецЕсли;
// начать выполнение операций
Оповещение = Новый ОписаниеОповещения("НачатьЭкваринговуюОперациюСФискализацией_ЭквайринговаяОперацияЗавершение",
ЭтотОбъект,
КонтекстОперации);
МодульОборудованиеПлатежныеСистемыКлиент = ОбщегоНазначенияБПОКлиент.ОбщийМодуль("ОборудованиеПлатежныеСистемыКлиент");
МодульОборудованиеПлатежныеСистемыКлиент.НачатьВыполнениеОперацииНаЭквайринговомТерминале(Оповещение,
КонтекстОперации.ИдентификаторКлиента,
КонтекстОперации.ИдентификаторЭТ,
КонтекстОперации.ПараметрыВыполненияЭквайринговойОперации,
КонтекстОперации.ДополнительныеПараметры,
КонтекстОперации.ИдентификаторККТ);
КонецПроцедуры
// Обрабатывает результат выполнения эквайринговой операции, в случае успеха вставляет слип-чек,
// в тело фискального чека.
//
// Параметры:
// РезультатВыполнения - См. МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании
// КонтекстОперации - См. КонтекстЭквайринговойОперацииСФискализацией
Процедура НачатьЭкваринговуюОперациюСФискализацией_ЭквайринговаяОперацияЗавершение(
РезультатВыполнения, КонтекстОперации) Экспорт
РезультатВыполнения.Вставить("СуммаОперации", КонтекстОперации.СуммаОперации);
КонтекстОперации.РезультатВыполненияЭквайринговойОперации = РезультатВыполнения;
Если РезультатВыполнения.Результат Тогда
ВставитьСлипЧекВТелоФискальногоЧека(КонтекстОперации);
НачатьЭкваринговуюОперациюСФискализацией_Фискализация(КонтекстОперации);
Иначе
ОбработатьОтрицательныйРезультатЭквайринговойОперацииСФискализацией(КонтекстОперации);
КонецЕсли;
КонецПроцедуры
// Запускает фискализацию кассового чека.
//
// Параметры:
// КонтекстОперации - См. КонтекстЭквайринговойОперацииСФискализацией
Процедура НачатьЭкваринговуюОперациюСФискализацией_Фискализация(КонтекстОперации) Экспорт
Оповещение = Новый ОписаниеОповещения("НачатьЭкваринговуюОперациюСФискализацией_ФискализацияЗавершение",
ЭтотОбъект,
КонтекстОперации);
НачатьФискализациюЧекаНаФискальномУстройстве(Оповещение,
КонтекстОперации.ИдентификаторКлиента,
КонтекстОперации.ИдентификаторККТ,
КонтекстОперации.ПараметрыФискализацииЧека,
КонтекстОперации.ДополнительныеПараметры);
КонецПроцедуры
// Обрабатывает результаты фискализации чека, в случае ошибки фискализации вызывает аварийную отмену последней операции
// эквайрингового терминала
//
// Параметры:
// РезультатВыполнения - См. МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании
// КонтекстОперации - См. КонтекстЭквайринговойОперацииСФискализацией
Процедура НачатьЭкваринговуюОперациюСФискализацией_ФискализацияЗавершение(РезультатВыполнения, КонтекстОперации) Экспорт
КонтекстОперации.РезультатФискализацииЧека = РезультатВыполнения;
Результат = РезультатВыполнения.Результат;
ОписаниеОшибки = РезультатВыполнения.ОписаниеОшибки;
Если Результат Тогда
Если КонтекстОперации.ПараметрыФискализацииЧека.Электронно Тогда
КонтекстОперации.Результат = Истина;
ВывестиСлипЧекКакТекстовыйДокумент("Электронный", КонтекстОперации);
Иначе
ЗавершитьПакетОпераций(Истина, ОписаниеОшибки, КонтекстОперации);
КонецЕсли;
Иначе
Если КонтекстОперации.РезультатВыполненияЭквайринговойОперации.Результат Тогда
МодульОборудованиеПлатежныеСистемыКлиент = ОбщегоНазначенияБПОКлиент.ОбщийМодуль("ОборудованиеПлатежныеСистемыКлиент");
МодульОборудованиеПлатежныеСистемыКлиентСервер = ОбщегоНазначенияБПОКлиент.ОбщийМодуль("ОборудованиеПлатежныеСистемыКлиентСервер");
Оповещение = Новый ОписаниеОповещения("НачатьЭкваринговуюОперациюСФискализацией_АварийнаяОтменаЗавершение",
ЭтотОбъект,
КонтекстОперации);
ПараметрыОтменыЭквайринговойОперации = МодульОборудованиеПлатежныеСистемыКлиентСервер.ПараметрыВыполненияЭквайринговойОперации();
ЗаполнитьЗначенияСвойств(
ПараметрыОтменыЭквайринговойОперации,
КонтекстОперации.ПараметрыВыполненияЭквайринговойОперации,
,
"ТипТранзакции, ИдентификаторЗапроса");
МодульОборудованиеПлатежныеСистемыКлиент.НачатьВыполнениеАварийнойОтменыОперации(Оповещение,
КонтекстОперации.ИдентификаторКлиента,
КонтекстОперации.ИдентификаторЭТ,
ПараметрыОтменыЭквайринговойОперации,
КонтекстОперации.ДополнительныеПараметры);
Иначе
КонтекстОперации.Результат = Ложь;
КонтекстОперации.ОписаниеОшибки = ОписаниеОшибки;
ВывестиСлипЧекКакТекстовыйДокумент("Отказ", КонтекстОперации);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// Обрабатывает результаты аварийной отмены последней операции эквайрингового терминала
//
// Параметры:
// РезультатВыполнения - См. МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании
// КонтекстОперации - См. КонтекстЭквайринговойОперацииСФискализацией
Процедура НачатьЭкваринговуюОперациюСФискализацией_АварийнаяОтменаЗавершение(РезультатВыполнения, КонтекстОперации) Экспорт
КонтекстОперации.РезультатАварийнойОтменыОперации = РезультатВыполнения;
КонтекстОперации.Результат = Ложь;
Если РезультатВыполнения.Результат Тогда
КонтекстОперации.ОписаниеОшибки = КонтекстОперации.РезультатФискализацииЧека.ОписаниеОшибки;
Иначе
КонтекстОперации.ОписаниеОшибки = КонтекстОперации.РезультатАварийнойОтменыОперации.ОписаниеОшибки;
КонецЕсли;
ВывестиСлипЧекКакТекстовыйДокумент("Отказ", КонтекстОперации);
КонецПроцедуры
#КонецОбласти
#Область ПродажаСВыдачейНаличных
// Начинает выполнение эквайринговой операции "Оплата с выдачей наличных"
//
// Параметры:
// РезультатВыполнения - См. МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании
// КонтекстОперации - См. КонтекстПродажаСВыдачейНаличных
Процедура НачатьПродажаСВыдачейНаличных_ЭквайринговаяОперация(РезультатВыполнения, КонтекстОперации) Экспорт
// Проверить возможность выполнения пакета операций
ОписаниеОшибки = "";
Если Не ПродажаСВыдачейНаличныхДопустима(КонтекстОперации, ОписаниеОшибки) Тогда
ЗавершитьПакетОпераций(Ложь, ОписаниеОшибки, КонтекстОперации);
Возврат;
КонецЕсли;
Оповещение = Новый ОписаниеОповещения(
"НачатьПродажаСВыдачейНаличных_ЭквайринговаяОперацияЗавершение",
ЭтотОбъект,
КонтекстОперации);
МодульОборудованиеПлатежныеСистемыКлиент = ОбщегоНазначенияБПОКлиент.ОбщийМодуль("ОборудованиеПлатежныеСистемыКлиент");
МодульОборудованиеПлатежныеСистемыКлиент.НачатьВыполнениеОперацииНаЭквайринговомТерминале(
Оповещение,
КонтекстОперации.ИдентификаторКлиента,
КонтекстОперации.ИдентификаторЭТ,
КонтекстОперации.ПараметрыВыполненияЭквайринговойОперации,
КонтекстОперации.ДополнительныеПараметры,
КонтекстОперации.ИдентификаторККТ);
КонецПроцедуры
// Начинает выполнение фискализации продажи
//
// Параметры:
// РезультатВыполнения - См. МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании
// КонтекстОперации - См. КонтекстЭквайринговойОперацииСФискализацией
Процедура НачатьПродажаСВыдачейНаличных_ЭквайринговаяОперацияЗавершение(РезультатВыполнения, КонтекстОперации) Экспорт
РезультатВыполнения.Вставить("СуммаОперации", КонтекстОперации.СуммаОперации);
РезультатВыполнения.Вставить("СуммаНаличных", КонтекстОперации.СуммаВыдачи);
КонтекстОперации.РезультатВыполненияЭквайринговойОперации = РезультатВыполнения;
Результат = РезультатВыполнения.Результат;
ОписаниеОшибки = РезультатВыполнения.ОписаниеОшибки;
Если РезультатВыполнения.Результат Тогда
// Эквайринговая операция выполнена успешно, требуется произвести фискализацию продажи
Если КонтекстОперации.СлипЧекВТелеФискального Тогда
ВставитьСлипЧекВТелоФискальногоЧека(КонтекстОперации);
КонецЕсли;
Оповещение = Новый ОписаниеОповещения(
"НачатьПродажаСВыдачейНаличных_ФискализацияПродажиЗавершение",
ЭтотОбъект,
КонтекстОперации);
НачатьФискализациюЧекаНаФискальномУстройстве(
Оповещение,
КонтекстОперации.ИдентификаторКлиента,
КонтекстОперации.ИдентификаторККТ,
КонтекстОперации.ПараметрыФискализацииЧека,
КонтекстОперации.ДополнительныеПараметры);
Иначе
// Эквайринговая операция не выполнена, завершение пакета операций
Если КонтекстОперации.ВыводитьУведомленияПользователя Тогда
ТекстСообщения = НСтр("ru = 'Оплата с выдачей наличных не удалась.%1%2'");
ТекстСообщения = СтрШаблон(ТекстСообщения, Символы.ПС, ОписаниеОшибки);
ОбщегоНазначенияБПОКлиент.СообщитьПользователю(ТекстСообщения);
КонецЕсли;
КонтекстОперации.Результат = Ложь;
КонтекстОперации.ОписаниеОшибки = ОписаниеОшибки;
ВывестиСлипЧекКакТекстовыйДокумент("Отказ", КонтекстОперации);
КонецЕсли;
КонецПроцедуры
// Обрабатывает результат выполнения фискализации продажи
//
// Параметры:
// РезультатВыполнения - См. МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании
// КонтекстОперации - См. КонтекстПродажаСВыдачейНаличных
Процедура НачатьПродажаСВыдачейНаличных_ФискализацияПродажиЗавершение(РезультатВыполнения, КонтекстОперации) Экспорт
КонтекстОперации.РезультатФискализацииЧека = РезультатВыполнения;
Результат = РезультатВыполнения.Результат;
ОписаниеОшибки = РезультатВыполнения.ОписаниеОшибки;
Если Результат Тогда
// Фискализация продажи выполнена успешно, требуется произвести фискализацию выдачи
Оповещение = Новый ОписаниеОповещения("НачатьПродажаСВыдачейНаличных_ФискализацияВыдачиЗавершение",
ЭтотОбъект,
КонтекстОперации);
НачатьФискализациюЧекаНаФискальномУстройстве(
Оповещение,
КонтекстОперации.ИдентификаторКлиента,
КонтекстОперации.ИдентификаторККТ,
КонтекстОперации.ПараметрыФискализацииЧекаВыдачи,
КонтекстОперации.ДополнительныеПараметры);
Иначе
// продажа не выполнена, отмена эквайринговой операции
Если КонтекстОперации.ВыводитьУведомленияПользователя Тогда
ТекстСообщения = НСтр("ru = 'Не удалось произвести фискализацию чека продажи.%1%2'");
ТекстСообщения = СтрШаблон(ТекстСообщения, Символы.ПС, ОписаниеОшибки);
ОбщегоНазначенияБПОКлиент.СообщитьПользователю(ТекстСообщения);
КонецЕсли;
// фискализация не удалась, требуется произвести отмену операции на ЭТ
МодульОборудованиеПлатежныеСистемыКлиент = ОбщегоНазначенияБПОКлиент.ОбщийМодуль("ОборудованиеПлатежныеСистемыКлиент");
МодульОборудованиеПлатежныеСистемыКлиентСервер = ОбщегоНазначенияБПОКлиент.ОбщийМодуль("ОборудованиеПлатежныеСистемыКлиентСервер");
Оповещение = Новый ОписаниеОповещения(
"НачатьПродажаСВыдачейНаличных_АварийнаяОтменаЗавершение",
ЭтотОбъект,
КонтекстОперации);
ПараметрыОтменыЭквайринговойОперации = МодульОборудованиеПлатежныеСистемыКлиентСервер.ПараметрыВыполненияЭквайринговойОперации();
ЗаполнитьЗначенияСвойств(
ПараметрыОтменыЭквайринговойОперации,
КонтекстОперации.ПараметрыВыполненияЭквайринговойОперации,
,
"ТипТранзакции, ИдентификаторЗапроса");
МодульОборудованиеПлатежныеСистемыКлиент.НачатьВыполнениеАварийнойОтменыОперации(
Оповещение,
КонтекстОперации.ИдентификаторКлиента,
КонтекстОперации.ИдентификаторЭТ,
ПараметрыОтменыЭквайринговойОперации,
КонтекстОперации.ДополнительныеПараметры);
КонецЕсли;
КонецПроцедуры
// Обрабатывает результат выполнения фискализации выдачи, в случае не удачи выполняет фискализацию чека возврата
// и аварийную отмену последней эквайринговой операции. Если операция успешна, тогда операция завершается.
//
// Параметры:
// РезультатВыполнения - См. МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании
// КонтекстОперации - См. КонтекстПродажаСВыдачейНаличных
Процедура НачатьПродажаСВыдачейНаличных_ФискализацияВыдачиЗавершение(РезультатВыполнения, КонтекстОперации) Экспорт
КонтекстОперации.РезультатФискализацииЧекаВыдачи = РезультатВыполнения;
Результат = РезультатВыполнения.Результат;
Если Результат Тогда
Если КонтекстОперации.ПараметрыФискализацииЧекаВыдачи.Электронно Тогда
КонтекстОперации.Результат = Истина;
ВывестиСлипЧекКакТекстовыйДокумент("Электронный", КонтекстОперации);
Иначе
ЗавершитьПакетОпераций(Истина, "", КонтекстОперации);
КонецЕсли;
Иначе
// Фискализация не удалась, требуется произвести отмену фискализации продажи и отмену операции на ЭТ
Оповещение = Новый ОписаниеОповещения(
"НачатьПродажаСВыдачейНаличных_ФискализацияВозвратаПродажиЗавершение",
ЭтотОбъект,
КонтекстОперации);
НачатьФискализациюЧекаНаФискальномУстройстве(
Оповещение,
КонтекстОперации.ИдентификаторКлиента,
КонтекстОперации.ИдентификаторККТ,
КонтекстОперации.ПараметрыФискализацииЧекаВозврата,
КонтекстОперации.ДополнительныеПараметры);
КонецЕсли;
КонецПроцедуры
// Обрабатывает результат выполнения фискализации возврата продажи, и выполняет аварийную отмену последней
// эквайринговой операции.
//
// Параметры:
// РезультатВыполнения - См. МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании
// КонтекстОперации - См. ОборудованиеЧекопечатающиеУстройстваКлиент.КонтекстПродажаСВыдачейНаличных
Процедура НачатьПродажаСВыдачейНаличных_ФискализацияВозвратаПродажиЗавершение(РезультатВыполнения, КонтекстОперации) Экспорт
КонтекстОперации.РезультатФискализацииЧекаВозврата = РезультатВыполнения;
Результат = РезультатВыполнения.Результат;
// Независимо от результата выполнить аварийную отмену эквайринговой операции
МодульОборудованиеПлатежныеСистемыКлиент = ОбщегоНазначенияБПОКлиент.ОбщийМодуль("ОборудованиеПлатежныеСистемыКлиент");
Оповещение = Новый ОписаниеОповещения(
"НачатьПродажаСВыдачейНаличных_АварийнаяОтменаЗавершение",
ЭтотОбъект,
КонтекстОперации);
МодульОборудованиеПлатежныеСистемыКлиент.НачатьВыполнениеАварийнойОтменыОперации(
Оповещение,
КонтекстОперации.ИдентификаторКлиента,
КонтекстОперации.ИдентификаторЭТ,
КонтекстОперации.ПараметрыВыполненияЭквайринговойОперации,
КонтекстОперации.ДополнительныеПараметры);
КонецПроцедуры
// Обрабатывает результат выполнения аварийной отмены последней эквайринговой операции
//
// Параметры:
// РезультатВыполнения - См. МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании
// КонтекстОперации - См. КонтекстПродажаСВыдачейНаличных
Процедура НачатьПродажаСВыдачейНаличных_АварийнаяОтменаЗавершение(РезультатВыполнения, КонтекстОперации) Экспорт
КонтекстОперации.РезультатАварийнойОтменыОперации = РезультатВыполнения;
Если РезультатВыполнения.Результат Тогда
// аварийная отмена выполнена успешно
Если ЗначениеЗаполнено(КонтекстОперации.РезультатФискализацииЧекаВыдачи) Тогда
// отмена в момент фискализации чека выдачи
ОписаниеОшибки = КонтекстОперации.РезультатФискализацииЧекаВыдачи.ОписаниеОшибки;
ТекстСообщения = НСтр("ru = 'Фискализация чека выдачи не выполнена.%1%2'");
ТекстСообщения = СтрШаблон(ТекстСообщения, Символы.ПС, ОписаниеОшибки);
Если Не КонтекстОперации.РезультатФискализацииЧекаВозврата.Результат Тогда
// чек возврата неудачен
ОписаниеОшибки = КонтекстОперации.РезультатФискализацииЧекаВозврата.ОписаниеОшибки;
ТекстСообщенияКоррекции = НСтр("ru = '%1%2Фискализация чека возврата не выполнена.%2%3'");
ТекстСообщенияКоррекции = СтрШаблон(ТекстСообщенияКоррекции, ТекстСообщения, Символы.ПС, ОписаниеОшибки);
КонецЕсли;
Иначе
// отмена в момент фискализации чека продажи
ОписаниеОшибки = КонтекстОперации.РезультатФискализацииЧека.ОписаниеОшибки;
ТекстСообщения = НСтр("ru = 'Фискализация чека продажи не выполнена.%1%2'");
ТекстСообщения = СтрШаблон(ТекстСообщения, Символы.ПС, ОписаниеОшибки);
КонецЕсли;
Иначе
// аварийная отмена оплаты с выдачей наличных не удалась
ОписаниеОшибки = КонтекстОперации.РезультатАварийнойОтменыОперации.ОписаниеОшибки;
ТекстСообщения = НСтр("ru = 'Аварийная отмена оплаты с выдачей наличных не выполнена.%1%2'");
ТекстСообщения = СтрШаблон(ТекстСообщения, Символы.ПС, ОписаниеОшибки);
КонецЕсли;
Если КонтекстОперации.ВыводитьУведомленияПользователя Тогда
ОбщегоНазначенияБПОКлиент.СообщитьПользователю(ТекстСообщения);
КонецЕсли;
КонтекстОперации.Результат = Ложь;
КонтекстОперации.ОписаниеОшибки = ОписаниеОшибки;
ВывестиСлипЧекКакТекстовыйДокумент("Отказ", КонтекстОперации);
КонецПроцедуры
// Возвращает заполненную структуру результата выполнения пакета операций
//
// Параметры:
// РезультатОперации - Булево - Результат выполнения пакета операций
// ОписаниеОшибки - Строка - Описание ошибки выполнения пакета операции
// КонтекстОперации - см. КонтекстЭквайринговойОперацииСФискализацией
//
// Возвращаемое значение:
// Структура:
// * Результат - Булево - Результат выполнения пакета операций.
// * ОписаниеОшибки - ИнформацияОбОшибке - Описание ошибки выполнения пакета операции.
// * РезультатВыполненияЭквайринговойОперации - см. МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании
// * РезультатФискализацииЧека - см. МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании
// * РезультатФискализацииЧекаВыдачи - см. МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании
// * РезультатФискализацииЧекаВозврата - см. МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании
// * РезультатАварийнойОтменыОперации - см. МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании
// * ПараметрыЭквайринговойОперации - см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыПакетнойОперацииВОчередиЧеков
// * ПараметрыПродажаСВыдачейНаличных - см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыПакетнойОперацииВОчередиЧеков
Функция РезультатПродажаСВыдачейНаличных(РезультатОперации, ОписаниеОшибки, КонтекстОперации) Экспорт
Результат = Новый Структура();
Результат.Вставить("Результат", РезультатОперации);
Результат.Вставить("ОписаниеОшибки", ОписаниеОшибки);
Результат.Вставить("ТипОперации", ПредопределенноеЗначение("Перечисление.ТипыПакетнойОперацииВОчередиЧеков.ПродажаСВыдачейНаличных"));
Результат.Вставить("РезультатФискализацииЧека", КонтекстОперации.РезультатФискализацииЧека);
Результат.Вставить("РезультатФискализацииЧекаВыдачи", КонтекстОперации.РезультатФискализацииЧекаВыдачи);
Результат.Вставить("РезультатФискализацииЧекаВозврата", КонтекстОперации.РезультатФискализацииЧекаВозврата);
Результат.Вставить("РезультатАварийнойОтменыОперации", КонтекстОперации.РезультатАварийнойОтменыОперации);
Результат.Вставить("РезультатВыполненияЭквайринговойОперации", КонтекстОперации.РезультатВыполненияЭквайринговойОперации);
Результат.Вставить("ПараметрыЭквайринговойОперации", Новый Структура());
Результат.Вставить("ПараметрыПродажаСВыдачейНаличных", Новый Структура());
Возврат Результат;
КонецФункции
// Возвращает структуру контекст выполнения пакета операций
//
// Возвращаемое значение:
// Структура:
// * ТипОперации - Строка - тип операции
// * Результат - Булево - результат выполнения пакета операций
// * ОписаниеОшибки - Строка - Описание ошибки пакета операций
// * ОповещениеЗавершения - ОписаниеОповещения - Оповещение вызываемое при завершении выполнения пакета
// * ИдентификаторКлиента - ФормаКлиентскогоПриложения - идентификатор формы.
// * ИдентификаторККТ - СправочникСсылка.ПодключаемоеОборудование - ККТ на котором будет печататься фискальный чек
// содержащий в себе слип-чек
// * ИдентификаторЭТ - СправочникСсылка.ПодключаемоеОборудование - Эквайринговый терминал для обработки операции
// * ПодключенныйЭТ - Структура - параметры подключенного терминала
// * ПараметрыФискализацииЧека - см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыОперацииФискализацииЧека
// * ПараметрыФискализацииЧекаВыдачи -см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыОперацииФискализацииЧека
// * ПараметрыФискализацииЧекаВозврата - см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыОперацииФискализацииЧека
// * ПараметрыВыполненияЭквайринговойОперации - см. ОборудованиеПлатежныеСистемыКлиентСервер.ПараметрыВыполненияЭквайринговойОперации
// * РезультатВыполненияЭквайринговойОперации - см. МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании
// * РезультатФискализацииЧека - см. МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании
// * РезультатФискализацииЧекаВыдачи - см. МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании
// * РезультатФискализацииЧекаВозврата - см. МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании
// * РезультатАварийнойОтменыОперации - см. МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании
// * ВыводитьУведомленияПользователя - Булево - если установлена Истина (по умолчанию), тогда при ошибке операции
// в пакете, будет выведено сообщение пользователю.
// * ОставитьПодключенным - Булево - Оставить оборудование подключенным после выполнения пакета
// * ДополнительныеПараметры - Структура - Дополнительные параметры которые можно передать в операции
// оплаты и фискализации
// * РеквизитыКартыQR - Строка
//
Функция КонтекстПродажаСВыдачейНаличных() Экспорт
Результат = Новый Структура();
Результат.Вставить("ТипОперации", "ПродажаСВыдачейНаличных");
Результат.Вставить("Результат", Ложь);
Результат.Вставить("ОписаниеОшибки", "");
Результат.Вставить("ОповещениеЗавершения", Неопределено);
Результат.Вставить("ИдентификаторКлиента", Неопределено);
Результат.Вставить("ИдентификаторККТ", Неопределено);
Результат.Вставить("ИдентификаторЭТ", Неопределено);
Результат.Вставить("ПодключенныйЭТ", Неопределено);
Результат.Вставить("ПараметрыФискализацииЧека", Неопределено);
Результат.Вставить("ПараметрыФискализацииЧекаВозврата", Неопределено);
Результат.Вставить("ПараметрыФискализацииЧекаВыдачи", Неопределено);
Результат.Вставить("ПараметрыВыполненияЭквайринговойОперации", Неопределено);
Результат.Вставить("РезультатВыполненияЭквайринговойОперации", Неопределено);
Результат.Вставить("РезультатФискализацииЧека", Неопределено);
Результат.Вставить("РезультатФискализацииЧекаВозврата", Неопределено);
Результат.Вставить("РезультатФискализацииЧекаВыдачи", Неопределено);
Результат.Вставить("РезультатАварийнойОтменыОперации", Неопределено);
Результат.Вставить("СлипЧекВТелеФискального", Неопределено);
Результат.Вставить("ВыводитьУведомленияПользователя", Неопределено);
Результат.Вставить("ОставитьПодключенным", Ложь);
Результат.Вставить("ДополнительныеПараметры", Новый Структура());
Результат.Вставить("ПризнакАгента", Неопределено);
Результат.Вставить("ДанныеАгента", Неопределено);
Результат.Вставить("ДанныеПоставщика", Неопределено);
Результат.Вставить("СуммаВыдачи", 0);
Результат.Вставить("СуммаОперации", 0);
Результат.Вставить("РеквизитыКартыQR", "");
Возврат Результат;
КонецФункции
#КонецОбласти
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура ВыполнитьВыборФискальногоУстройства(КонтекстОперации)
Если КонтекстОперации.ИдентификаторУстройства = Неопределено Или ПустаяСтрока(КонтекстОперации.ИдентификаторУстройства) Тогда
ПоддерживаемыеТипы = МенеджерОборудованияКлиентСервер.ПараметрыТипыОборудования();
ПоддерживаемыеТипы.ПринтерЧеков = Истина;
ПоддерживаемыеТипы.ККТ = Истина;
Оповещение = Новый ОписаниеОповещения("ВыполнитьОперациюНаФискальномУстройстве", ЭтотОбъект, КонтекстОперации);
МенеджерОборудованияКлиент.ВыбратьУстройство(Оповещение, ПоддерживаемыеТипы,
НСтр("ru='Выберите фискальное устройство'"),
НСтр("ru='Фискальное устройство не подключено.'"),
НСтр("ru='Фискальное устройство не выбрано.'"));
Иначе
ВыполнитьОперациюНаФискальномУстройстве(КонтекстОперации, КонтекстОперации);
КонецЕсли
КонецПроцедуры
Процедура ВыполнитьОперациюНаФискальномУстройстве(РезультатВыбора, КонтекстОперации) Экспорт
Если РезультатВыбора.Результат Тогда
ПараметрыВыполнениеКоманды = МенеджерОборудованияКлиентСервер.ПараметрыВыполнениеКоманды(КонтекстОперации.Команда,
"ОборудованиеЧекопечатающиеУстройства", КонтекстОперации.ДополнительныеПараметры,
КонтекстОперации.ПодготовитьДанные, КонтекстОперации.ОбработатьДанные);
МенеджерОборудованияКлиент.НачатьВыполнениеКоманды(КонтекстОперации.ОповещениеПриЗавершении, КонтекстОперации.ИдентификаторКлиента,
РезультатВыбора.ИдентификаторУстройства, КонтекстОперации.ПараметрыОперации, ПараметрыВыполнениеКоманды);
Иначе
ВыполнитьОбработкуОповещения(КонтекстОперации.ОповещениеПриЗавершении, РезультатВыбора);
КонецЕсли;
КонецПроцедуры
Процедура ПоказатьПредупреждениеДрайверСнятыйСПоддержки(Результат)
Если Результат.Свойство("ДрайверСнятСПоддержки") И Результат.ДрайверСнятСПоддержки
И Результат.Свойство("СообщениеПриИспользовании") И Результат.СообщениеПриИспользовании Тогда
ТекстЗаголовок = НСтр("ru = 'Используемый драйвер устарел и снят с поддержки.'");
ТекстПредупреждения =
Строка(Результат.ИдентификаторУстройства) + Символы.ПС +
НСтр("ru = 'Использование данного драйвера может приводить к некорректному формированию фискальных данных на ККТ.'") + Символы.ПС +
НСтр("ru = 'Необходимо использовать актуальную версию драйвера ККТ для данного производителя.'") + Символы.ПС +
НСтр("ru = 'Перенастройте оборудование в разделе: «Поддержка оборудования Подключаемое оборудование»'");
ПоказатьПредупреждение(Неопределено, ТекстПредупреждения, 0, ТекстЗаголовок);
КонецЕсли;
КонецПроцедуры
#Область ПакетнаяОбработка
// Запустить выбор эквайрингового терминала
//
// Параметры:
// ОповещениеЗавершенияПодключения - ОписаниеОповещения
// КонтекстОперации - См. КонтекстЭквайринговойОперацииСФискализацией
Процедура ПакетнаяОбработка_ВыборУстройства(ОповещениеЗавершенияПодключения, КонтекстОперации)
ИдентификаторЭТ = КонтекстОперации.ИдентификаторЭТ;
КонтекстОперации.Вставить("ОповещениеЗавершенияПодключения", ОповещениеЗавершенияПодключения);
// Выбрать ЭТ если не указан конкретный
Оповещение = Новый ОписаниеОповещения("ПакетнаяОбработка_ВыборУстройстваЗавершение",
ЭтотОбъект,
КонтекстОперации);
Если ИдентификаторЭТ = Неопределено Или ПустаяСтрока(ИдентификаторЭТ) Тогда
ПоддерживаемыеТипы = МенеджерОборудованияКлиентСервер.ПараметрыТипыОборудования();
ПоддерживаемыеТипы.ЭквайринговыйТерминал = Истина;
МенеджерОборудованияКлиент.ВыбратьУстройство(Оповещение,
ПоддерживаемыеТипы,
НСтр("ru='Выберите эквайринговый терминал'"),
НСтр("ru='Эквайринговый терминал не подключен.'"),
НСтр("ru='Эквайринговый терминал не выбран.'"));
Иначе
РезультатВыполнения = МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании();
РезультатВыполнения.Результат = Истина;
РезультатВыполнения.ИдентификаторУстройства = ИдентификаторЭТ;
ВыполнитьОбработкуОповещения(Оповещение, РезультатВыполнения);
КонецЕсли;
КонецПроцедуры
#Область ЭквайринговаяОперацияСФискализацией
// Возвращает структуру для заполнения данными операции с эквайринговым терминалом и фискализации
//
// Возвращаемое значение:
// Структура:
// * ПараметрыФискализацииЧека - См. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыОперацииФискализацииЧека
// * ПараметрыВыполненияЭквайринговойОперации - См. ОборудованиеПлатежныеСистемыКлиентСервер.ПараметрыВыполненияЭквайринговойОперации
// * ОповещениеВопросПользователю - ОписаниеОповещения - Описание оповещения пользователя, для самостоятельной выдачи
// сообщения, это оповещение будет вызвано в случае отрицательного ответа от эквайрингового
// терминала при оплате, в процедуру будут переданы результат выполнения пакета операций,
// а также структура содержащая контекст пакета, если требуется продолжить выполнение пакета,
// тогда нужно будет вызвать в модуле ОборудованиеЧекопечатающиеУстройстваКлиент процедуры
// "НачатьФискализациюЧекаСОплатойКартой_ПродолжитьВыполнение" или
// "НачатьФискализациюЧекаСОплатойКартой_ПовторитьОплату".
// передав туда этот контекст.
// Процедура оповещения содержит следующие параметры:
// Результат - Структура:
// * РезультатОперации - См. РезультатФискализацииЧекаСОплатойКартой
// * КонтекстОперации - Структура - контекст пакета операции который нужно передать в процедуру
// "ОборудованиеЧекопечатающиеУстройстваКлиент.НачатьФискализациюЧекаСОплатойКартой_ПродолжитьВыполнение"
// для продолжения выполнения пакета
// ДополнительныеПараметры - Любой - значение переданное при создании оповещения
// * СлипЧекВТелеФискального - Булево, Неопределено - Выводить слип-чек в теле фискального, Истина - слип-чек будет выведен
// в теле фискального, Ложь - короткий слип-чек не будет выводиться, Неопределено - короткий слип-чек
// будет выводиться если поддерживает драйвер оборудования.
//
// Пример:
// Определение процедуры оповещения пользователя
// Процедура ВопросПользователюЗавершение(Результат, ДополнительныеПараметры)
// РезультатОперации = Результат.РезультатОперации;
// КонтекстОперации = Результат.КонтекстОперации;
// ...
// // продолжить выполнение пакета операций
// ОборудованиеЧекопечатающиеУстройстваКлиент.НачатьФискализациюЧекаСОплатойКартой_ПродолжитьВыполнение(Истина, КонтекстОперации);
// КонецПроцедуры
//
Функция ПараметрыЭквайринговаяОперацияСФискализацией()
Если ОбщегоНазначенияБПОКлиент.ИспользуетсяПлатежныеСистемы() Тогда
МодульОборудованиеПлатежныеСистемыКлиентСервер = ОбщегоНазначенияБПОКлиент.ОбщийМодуль("ОборудованиеПлатежныеСистемыКлиентСервер");
ПараметрыВыполненияЭквайринговойОперации = МодульОборудованиеПлатежныеСистемыКлиентСервер.ПараметрыВыполненияЭквайринговойОперации();
КонецЕсли;
ПараметрыОперацииФискализацииЧека = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыОперацииФискализацииЧека();
Результат = Новый Структура();
Результат.Вставить("ПараметрыФискализацииЧека", ПараметрыОперацииФискализацииЧека);
Результат.Вставить("ПараметрыВыполненияЭквайринговойОперации", Неопределено);
Результат.Вставить("ОповещениеВопросПользователю", Неопределено);
Результат.Вставить("СлипЧекВТелеФискального", Неопределено);
Результат.Вставить("РеквизитыКартыQR", "");
Возврат Результат;
КонецФункции
// Возвращает структуру, контекст выполнения пакета операций
//
// Возвращаемое значение:
// Структура:
// * ТипОперации - Строка - тип операции
// * Результат - Булево - результат выполнения пакета операций
// * ОписаниеОшибки - Строка - Описание ошибки пакета операций
// * ОповещениеЗавершения - ОписаниеОповещения - Оповещение вызываемое при завершении выполнения пакета
// * ИдентификаторКлиента - ФормаКлиентскогоПриложения - идентификатор формы.
// * ИдентификаторККТ - СправочникСсылка.ПодключаемоеОборудование - ККТ на котором будет печататься фискальный чек
// содержащий в себе слип-чек
// * ИдентификаторЭТ - СправочникСсылка.ПодключаемоеОборудование - Эквайринговый терминал для обработки операции
// * ПодключенныйЭТ - Структура - параметры подключенного терминала
// * ПараметрыФискализацииЧека - См. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыОперацииФискализацииЧека
// * ПараметрыВыполненияЭквайринговойОперации - См. ОборудованиеПлатежныеСистемыКлиентСервер.ПараметрыВыполненияЭквайринговойОперации
// * РезультатВыполненияЭквайринговойОперации - См. МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании
// * РезультатФискализацииЧека - См. МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании
// * РезультатАварийнойОтменыОперации - См. МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании
// * ОповещениеВопросПользователю - ОписаниеОповещения - Описание оповещения пользователя, для самостоятельной выдачи
// сообщения, это оповещение будет вызвано в случае отрицательного ответа от эквайрингового
// терминала при оплате, в процедуру будут переданы результат выполнения пакета операций,
// а также структура содержащая контекст пакета.
// * ОставитьПодключенным - Булево - Оставить оборудование подключенным после выполнения пакета
// * ДополнительныеПараметры - Структура - Дополнительные параметры которые можно передать в операции
// оплаты и фискализации
// * РеквизитыКартыQR - Строка
Функция КонтекстЭквайринговойОперацииСФискализацией() Экспорт
Результат = Новый Структура();
Результат.Вставить("ТипОперации", "");
Результат.Вставить("Результат", Ложь);
Результат.Вставить("ОписаниеОшибки", "");
Результат.Вставить("ОповещениеЗавершения", Неопределено);
Результат.Вставить("ИдентификаторКлиента", Неопределено);
Результат.Вставить("ИдентификаторККТ", Неопределено);
Результат.Вставить("ИдентификаторЭТ", Неопределено);
Результат.Вставить("ПодключенныйЭТ", Неопределено);
Результат.Вставить("ИдентификаторЗаписи", Неопределено);
Результат.Вставить("ПараметрыФискализацииЧека", Неопределено);
Результат.Вставить("ПараметрыВыполненияЭквайринговойОперации", Неопределено);
Результат.Вставить("РезультатВыполненияЭквайринговойОперации", Неопределено);
Результат.Вставить("РезультатФискализацииЧека", Неопределено);
Результат.Вставить("РезультатАварийнойОтменыОперации", Неопределено);
Результат.Вставить("СлипЧекВТелеФискального", Неопределено);
Результат.Вставить("ОповещениеВопросПользователю", Неопределено);
Результат.Вставить("ОставитьПодключенным", Ложь);
Результат.Вставить("ДополнительныеПараметры", Новый Структура());
Результат.Вставить("СуммаОперации", 0);
Результат.Вставить("РеквизитыКартыQR", "");
Возврат Результат;
КонецФункции
// Задает вопрос пользователю, или же вызывает оповещение переданное в параметрах операции
// переданной в процедуру "НачатьФискализациюЧекаСОплатойКартой"
//
// Параметры:
// КонтекстОперации - см. КонтекстЭквайринговойОперацииСФискализацией
Процедура ОбработатьОтрицательныйРезультатЭквайринговойОперацииСФискализацией(КонтекстОперации)
РезультатВыполнения = КонтекстОперации.РезультатВыполненияЭквайринговойОперации;
ОповещениеВопросПользователю = КонтекстОперации.ОповещениеВопросПользователю;
ОписаниеОшибки = РезультатВыполнения.ОписаниеОшибки;
Если ОповещениеВопросПользователю <> Неопределено Тогда
// Пользователь создал свое оповещение
Результат = Новый Структура("РезультатОперации, КонтекстОперации");
Результат.КонтекстОперации = КонтекстОперации;
Результат.РезультатОперации = РезультатЭквайринговойОперацииСФискализацией(Ложь, ОписаниеОшибки, КонтекстОперации);
ВыполнитьОбработкуОповещения(ОповещениеВопросПользователю, Результат);
Иначе
КонтекстОперации.Результат = Ложь;
КонтекстОперации.ОписаниеОшибки = ОписаниеОшибки;
ВывестиСлипЧекКакТекстовыйДокумент("Отказ", КонтекстОперации);
КонецЕсли;
КонецПроцедуры
// Выполняет проверку допустимости выполнения операции
//
// Параметры:
// КонтекстОперации - См. КонтекстЭквайринговойОперацииСФискализацией.
// ОписаниеОшибки - Строка - Описание ошибки параметра операции
//
// Возвращаемое значение:
// Булево - Возвращает истина если переданные параметры операции корректны
Функция ЭкваринговаяОперацияСФискализациейДопустима(КонтекстОперации, ОписаниеОшибки)
ОписаниеОшибки = "";
// Используется подсистема "Платежные системы"
Если Не ОбщегоНазначенияБПОКлиент.ИспользуетсяПлатежныеСистемы() Тогда
ТекстОшибки = НСтр("ru = 'Подсистема ""Платежные системы"" не подключена.'");
ОписаниеОшибки = ОписаниеОшибки + ТекстОшибки + Символы.ПС;
КонецЕсли;
ПараметрыВыполненияЭквайринговойОперации = КонтекстОперации.ПараметрыВыполненияЭквайринговойОперации;
Если ПараметрыВыполненияЭквайринговойОперации.ТипТранзакции <> "AuthorizeSales"
И ПараметрыВыполненияЭквайринговойОперации.ТипТранзакции <> "PurchaseWithEnrollment" Тогда
ТекстОшибки = НСтр("ru = 'Операция %1 не поддерживается данным режимом.'");
ТекстОшибки = СтрШаблон(ТекстОшибки, ПараметрыВыполненияЭквайринговойОперации.ТипТранзакции);
ОписаниеОшибки = ОписаниеОшибки + ТекстОшибки + Символы.ПС;
КонецЕсли;
Если ПараметрыВыполненияЭквайринговойОперации.СуммаОперации <= 0 Тогда
ОписаниеОшибки = ОписаниеОшибки + НСтр("ru = 'Сумма операции должна быть больше 0.'") + Символы.ПС;
КонецЕсли;
Если ПустаяСтрока(ОписаниеОшибки) Тогда
Возврат Истина;
Иначе
ОписаниеОшибки = Лев(ОписаниеОшибки, СтрДлина(ОписаниеОшибки) - 1);
Возврат Ложь;
КонецЕсли;
КонецФункции
#КонецОбласти
#Область ПродажаСВыдачейНаличных
// Выполняет проверку корректности заполнения банковского платежного агента
//
// Параметры:
// КонтекстОперации - см. КонтекстПродажаСВыдачейНаличных.
// ОписаниеОшибки - Строка - Описание ошибки параметра операции
//
Процедура ПроверитьКорректностьБанковскогоАгента(КонтекстОперации, ОписаниеОшибки)
ПараметрыЧекаВыдачи = КонтекстОперации.ПараметрыФискализацииЧекаВыдачи;
Если ПараметрыЧекаВыдачи.ПозицииЧека.Количество()=0 Тогда
ТекстОшибки = НСтр("ru = 'Не задана строка операции выдачи в позиции чека.'");
ОписаниеОшибки = ОписаниеОшибки + ТекстОшибки + Символы.ПС;
Иначе
ДанныеАгентаПозиция = ПараметрыЧекаВыдачи.ПозицииЧека[0].ДанныеАгента; // см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыДанныеАгента
ДанныеАгентаШапка = ПараметрыЧекаВыдачи.ДанныеАгента; // см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыДанныеАгента
Если Не ЗначениеЗаполнено(ДанныеАгентаПозиция.ОператорПеревода.Телефон)
И Не ЗначениеЗаполнено(ДанныеАгентаШапка.ОператорПеревода.Телефон) Тогда
ТекстОшибки = НСтр("ru = 'Не установлен телефон оператора перевода банковского платежного агента (эквайера).'") ;
ОписаниеОшибки = ОписаниеОшибки + ТекстОшибки + Символы.ПС;
КонецЕсли;
Если Не ЗначениеЗаполнено(ДанныеАгентаПозиция.ОператорПеревода.Наименование)
И Не ЗначениеЗаполнено(ДанныеАгентаШапка.ОператорПеревода.Наименование) Тогда
ТекстОшибки = НСтр("ru = 'Не установлено наименование оператора перевода банковского платежного агента (эквайера).'") ;
ОписаниеОшибки = ОписаниеОшибки + ТекстОшибки + Символы.ПС;
КонецЕсли;
Если Не ЗначениеЗаполнено(ДанныеАгентаПозиция.ОператорПеревода.Адрес)
И Не ЗначениеЗаполнено(ДанныеАгентаШапка.ОператорПеревода.Адрес) Тогда
ТекстОшибки = НСтр("ru = 'Не установлен адрес оператора перевода банковского платежного агента (эквайера).'") ;
ОписаниеОшибки = ОписаниеОшибки + ТекстОшибки + Символы.ПС;
КонецЕсли;
Если Не ЗначениеЗаполнено(ДанныеАгентаПозиция.ОператорПеревода.ИНН)
И Не ЗначениеЗаполнено(ДанныеАгентаШапка.ОператорПеревода.ИНН) Тогда
ТекстОшибки = НСтр("ru = 'Не установлен ИНН оператора перевода банковского платежного агента (эквайера).'") ;
ОписаниеОшибки = ОписаниеОшибки + ТекстОшибки + Символы.ПС;
КонецЕсли;
Если Не ЗначениеЗаполнено(ДанныеАгентаПозиция.ПлатежныйАгент.Телефон)
И Не ЗначениеЗаполнено(ДанныеАгентаШапка.ПлатежныйАгент.Телефон) Тогда
ТекстОшибки = НСтр("ru = 'Не установлен телефон банковского платежного агента (организации).'") ;
ОписаниеОшибки = ОписаниеОшибки + ТекстОшибки + Символы.ПС;
КонецЕсли;
Если Не ЗначениеЗаполнено(ДанныеАгентаПозиция.ПлатежныйАгент.Операция)
И Не ЗначениеЗаполнено(ДанныеАгентаШапка.ПлатежныйАгент.Операция) Тогда
ТекстОшибки = НСтр("ru = 'Не установлена операция банковского платежного агента.'") ;
ОписаниеОшибки = ОписаниеОшибки + ТекстОшибки + Символы.ПС;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// Выполняет проверку допустимости выполнения операции
//
// Параметры:
// КонтекстОперации - см. КонтекстПродажаСВыдачейНаличных.
// ОписаниеОшибки - Строка - Описание ошибки параметра операции
//
// Возвращаемое значение:
// Булево - Возвращает истина если переданные параметры операции корректны
Функция ПродажаСВыдачейНаличныхДопустима(КонтекстОперации, ОписаниеОшибки)
КратностьСуммыВыдачиНаличных = 100;
ПараметрыВыполненияЭквайринговойОперации = КонтекстОперации.ПараметрыВыполненияЭквайринговойОперации;
ПараметрыФискализацииЧекаВыдачи = КонтекстОперации.ПараметрыФискализацииЧекаВыдачи;
ТипТранзакции = ПараметрыВыполненияЭквайринговойОперации.ТипТранзакции;
СуммаОперации = ПараметрыВыполненияЭквайринговойОперации.СуммаОперации;
СуммаНаличных = ПараметрыВыполненияЭквайринговойОперации.СуммаНаличных;
ПодключенноеУстройство = КонтекстОперации.ПодключенныйЭТ;
Отказ = Ложь;
МенеджерОборудованияВызовСервераПереопределяемый.ПроверитьДостаточностьНаличныхСредств(
КонтекстОперации.ИдентификаторККТ,
СуммаНаличных,
Отказ);
Если Отказ Тогда
ТекстОшибки = НСтр("ru = 'В ККТ не достаточно денежных средств.'");
ОписаниеОшибки = ОписаниеОшибки + ТекстОшибки + Символы.ПС;
КонецЕсли;
// проверка кратности суммы выдачи наличных
Если СуммаНаличных % КратностьСуммыВыдачиНаличных <> 0 Тогда
ТекстОшибки = СтрШаблон(НСтр("ru = 'Сумма выдачи наличных должна быть кратной %1.'"), КратностьСуммыВыдачиНаличных);
ОписаниеОшибки = ОписаниеОшибки + ТекстОшибки + Символы.ПС;
КонецЕсли;
Если ПараметрыФискализацииЧекаВыдачи = Неопределено Тогда
ТекстОшибки = НСтр("ru = 'Не заданы параметры фискализации чека выдачи наличных.'");
ОписаниеОшибки = ОписаниеОшибки + ТекстОшибки + Символы.ПС;
КонецЕсли;
// Используется подсистема "Платежные системы"
Если Не ОбщегоНазначенияБПОКлиент.ИспользуетсяПлатежныеСистемы() Тогда
ТекстОшибки = НСтр("ru = 'Подсистема ""Платежные системы"" не подключена.'");
ОписаниеОшибки = ОписаниеОшибки + ТекстОшибки + Символы.ПС;
КонецЕсли;
Если ТипТранзакции <> "PayByPaymentCardWithCashWithdrawal" Тогда
ТекстОшибки = НСтр("ru = 'Операция %1 не поддерживается данным режимом.'");
ТекстОшибки = СтрШаблон(ТекстОшибки, ТипТранзакции);
ОписаниеОшибки = ОписаниеОшибки + ТекстОшибки + Символы.ПС;
КонецЕсли;
Если СуммаОперации <= 0 Тогда
ТекстОшибки = НСтр("ru = 'Сумма операции должна быть больше 0.'");
ОписаниеОшибки = ОписаниеОшибки + ТекстОшибки + Символы.ПС;
КонецЕсли;
ПроверитьКорректностьБанковскогоАгента(КонтекстОперации, ОписаниеОшибки);
Если ПустаяСтрока(ОписаниеОшибки) Тогда
Возврат Истина;
Иначе
ОписаниеОшибки = Лев(ОписаниеОшибки, СтрДлина(ОписаниеОшибки) - 1);
Возврат Ложь;
КонецЕсли;
КонецФункции
#КонецОбласти
// Заполняет параметры выполнения эквайринговой операции на основании параметров фискальной операции
//
// Параметры:
// КонтекстОперации - См. КонтекстПродажаСВыдачейНаличных
Процедура ПодготовитьПараметрыЭквайринговойОперации(КонтекстОперации)
ПараметрыВыполненияЭквайринговойОперации = КонтекстОперации.ПараметрыВыполненияЭквайринговойОперации;
ПараметрыФискализацииЧека = КонтекстОперации.ПараметрыФискализацииЧека;
Если ПараметрыВыполненияЭквайринговойОперации = Неопределено Тогда
Если ОбщегоНазначенияБПОКлиент.ИспользуетсяПлатежныеСистемы() Тогда
МодульОборудованиеПлатежныеСистемыКлиентСервер = ОбщегоНазначенияБПОКлиент.ОбщийМодуль("ОборудованиеПлатежныеСистемыКлиентСервер");
ПараметрыВыполненияЭквайринговойОперации = МодульОборудованиеПлатежныеСистемыКлиентСервер.ПараметрыВыполненияЭквайринговойОперации();
КонецЕсли;
КонтекстОперации.ПараметрыВыполненияЭквайринговойОперации = ПараметрыВыполненияЭквайринговойОперации;
СуммаОперации = 0;
ТаблицаОплат = ПараметрыФискализацииЧека.ТаблицаОплат;
Для Каждого СтрокаОплаты Из ТаблицаОплат Цикл
Если СтрокаОплаты.ТипОплаты = ПредопределенноеЗначение("Перечисление.ТипыОплатыККТ.Электронно") Тогда
СуммаОперации = СуммаОперации + СтрокаОплаты.Сумма;
КонецЕсли;
КонецЦикла;
Если КонтекстОперации.ТипОперации = "ПродажаСВыдачейНаличных" Тогда
СуммаВыдачи = КонтекстОперации.СуммаВыдачи;
ПараметрыВыполненияЭквайринговойОперации.СуммаНаличных = СуммаВыдачи;
ПараметрыВыполненияЭквайринговойОперации.СуммаОперации = СуммаОперации;
ИначеЕсли КонтекстОперации.ТипОперации = "ПокупкаСЗачислением" Тогда
ПараметрыВыполненияЭквайринговойОперации.СуммаОперации = СуммаОперации;
ИначеЕсли КонтекстОперации.ТипОперации = "ФискализацияЧекаСОплатой" Тогда
ПараметрыВыполненияЭквайринговойОперации.СуммаОперации = СуммаОперации;
Иначе
ВызватьИсключение СтрШаблон(НСтр("ru = 'Неизвестный тип операции %1'"), КонтекстОперации.ТипОперации);
КонецЕсли;
ПараметрыВыполненияЭквайринговойОперации.ДокументОснование = ПараметрыФискализацииЧека.ДокументОснование;
ПараметрыВыполненияЭквайринговойОперации.РеквизитыКартыQR = КонтекстОперации.РеквизитыКартыQR;
ПараметрыВыполненияЭквайринговойОперации.ИдентификаторЗапроса = Новый УникальныйИдентификатор();
КонецЕсли;
Если КонтекстОперации.ТипОперации = "ПродажаСВыдачейНаличных" Тогда
ПараметрыВыполненияЭквайринговойОперации.ТипТранзакции = "PayByPaymentCardWithCashWithdrawal";
ИначеЕсли КонтекстОперации.ТипОперации = "ПокупкаСЗачислением" Тогда
ПараметрыВыполненияЭквайринговойОперации.ТипТранзакции = "PurchaseWithEnrollment";
ИначеЕсли КонтекстОперации.ТипОперации = "ФискализацияЧекаСОплатой" Тогда
ПараметрыВыполненияЭквайринговойОперации.ТипТранзакции = "AuthorizeSales";
Иначе
ВызватьИсключение СтрШаблон(НСтр("ru = 'Неизвестный тип операции %1'"), КонтекстОперации.ТипОперации);
КонецЕсли;
КонецПроцедуры
// Подготавливает контекст пакетной операции для выполнения
//
// Параметры:
// КонтекстОперации - См. КонтекстПродажаСВыдачейНаличных
// ДополнительныеПараметры - Структура - дополнительные параметры переданные при запуске пакета
Процедура ПодготовитьКонтекстПакетнойОперации(КонтекстОперации, ДополнительныеПараметры)
Если Не ЗначениеЗаполнено(ДополнительныеПараметры) Тогда
ДополнительныеПараметры = Новый Структура();
КонецЕсли;
КонтекстОперации.ДополнительныеПараметры = ДополнительныеПараметры;
// запомнить состояние ОставитьПодключенным переданные пользователем
Если ДополнительныеПараметры.Свойство("ОставитьПодключенным") Тогда
КонтекстОперации.ОставитьПодключенным = ДополнительныеПараметры.ОставитьПодключенным;
КонецЕсли;
ПодготовитьПараметрыЭквайринговойОперации(КонтекстОперации);
ПараметрыВыполненияЭквайринговойОперации = КонтекстОперации.ПараметрыВыполненияЭквайринговойОперации;
КонтекстОперации.СуммаОперации = ПараметрыВыполненияЭквайринговойОперации.СуммаОперации;
// оставить подключенным оборудование, на все время выполнения пакета
ДополнительныеПараметры.Вставить("ОставитьПодключенным", Истина);
КонецПроцедуры
// Определяет существует ли возможность печати короткого слип-чека в теле фискального
//
// Параметры:
// КонтекстОперации - См. КонтекстПродажаСВыдачейНаличных
Процедура ОпределитьВозможностьПечатиСлипЧекаВТелеФискального(КонтекстОперации)
ПодключенноеУстройство = КонтекстОперации.ПодключенныйЭТ;
// если не установлено в параметрах принудительная печать слип-чека
Если КонтекстОперации.СлипЧекВТелеФискального = Неопределено Тогда
// тогда печатать слип чек в зависимости от устройства
Если ПодключенноеУстройство.КороткиеСлипЧеки И Не ПодключенноеУстройство.ПечатьКвитанцийНаТерминале Тогда
КонтекстОперации.СлипЧекВТелеФискального = Истина;
Иначе
КонтекстОперации.СлипЧекВТелеФискального = Ложь;
КонецЕсли;
КонецЕсли;
Если КонтекстОперации.СлипЧекВТелеФискального Тогда
КонтекстОперации.ДополнительныеПараметры.Вставить("ИспользоватьПечатающееУстройство", Ложь);
КонецЕсли;
КонецПроцедуры
// Отключает оборудование используемое в пакете (ККТ и ЭТ)
//
// Параметры:
// КонтекстОперации - см. КонтекстЭквайринговойОперацииСФискализацией
Процедура ОтключитьОборудованиеПакета(КонтекстОперации)
// вернуть исходное значение ОставитьПодключенным
ДополнительныеПараметры = КонтекстОперации.ДополнительныеПараметры;
Если ДополнительныеПараметры.Свойство("ОставитьПодключенным") Тогда
ДополнительныеПараметры.ОставитьПодключенным = КонтекстОперации.ОставитьПодключенным;
КонецЕсли;
ОтключатьОборудование = Не КонтекстОперации.ОставитьПодключенным;
// Требуется отключить оборудование, т.к. во время операции отключение оборудования было отменено
ПодключенноеУстройствоККТ = МенеджерОборудованияКлиент.ПолучитьПодключенноеУстройство(КонтекстОперации.ИдентификаторККТ);
Если ПодключенноеУстройствоККТ <> Неопределено Тогда
Если ОтключатьОборудование Или ПодключенноеУстройствоККТ.СетевоеОборудование Тогда
МенеджерОборудованияКлиент.НачатьОтключениеОборудованиеПоИдентификатору(
,
КонтекстОперации.ИдентификаторКлиента,
КонтекстОперации.ИдентификаторККТ);
КонецЕсли;
КонецЕсли;
ПодключенноеУстройствоЭТ = МенеджерОборудованияКлиент.ПолучитьПодключенноеУстройство(КонтекстОперации.ИдентификаторЭТ);
Если ПодключенноеУстройствоЭТ <> Неопределено Тогда
Если ОтключатьОборудование Или ПодключенноеУстройствоЭТ.СетевоеОборудование Тогда
МенеджерОборудованияКлиент.НачатьОтключениеОборудованиеПоИдентификатору(
,
КонтекстОперации.ИдентификаторКлиента,
КонтекстОперации.ИдентификаторЭТ);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// Формирует результат пакета операций и вызывает оповещение пользователя при завершении если оно было задано.
//
// Параметры:
// Результат - Булево - флаг того, что пакет операций завершился успешно
// ОписаниеОшибки - Строка - Описание ошибки, которое будет передано в оповещении
// КонтекстОперации - см. КонтекстЭквайринговойОперацииСФискализацией
Процедура ЗавершитьПакетОпераций(Результат, ОписаниеОшибки, КонтекстОперации)
ТипОперации = КонтекстОперации.ТипОперации;
ОповещениеЗавершения = КонтекстОперации.ОповещениеЗавершения;
Если КонтекстОперации.РезультатФискализацииЧека <> Неопределено
И КонтекстОперации.РезультатФискализацииЧека.Результат Тогда
ИдентификаторЗапроса = КонтекстОперации.ПараметрыВыполненияЭквайринговойОперации.ИдентификаторЗапроса;
ИдентификаторФискальнойЗаписи = КонтекстОперации.ПараметрыФискализацииЧека.ИдентификаторФискальнойЗаписи;
ЛогированиеОперацийБПОСлужебныйВызовСервера.УстановитьИдентификаторФискальнойЗаписи(ИдентификаторЗапроса, ИдентификаторФискальнойЗаписи);
КонецЕсли;
ОтключитьОборудованиеПакета(КонтекстОперации);
Если ОповещениеЗавершения <> Неопределено Тогда
Если ТипОперации = "ФискализацияЧекаСОплатой" Тогда
РезультатОперации = РезультатЭквайринговойОперацииСФискализацией(Результат, ОписаниеОшибки, КонтекстОперации);
ИначеЕсли ТипОперации = "ПокупкаСЗачислением" Тогда
РезультатОперации = РезультатЭквайринговойОперацииСФискализацией(Результат, ОписаниеОшибки, КонтекстОперации);
ИначеЕсли ТипОперации = "ПродажаСВыдачейНаличных" Тогда
РезультатОперации = РезультатПродажаСВыдачейНаличных(Результат, ОписаниеОшибки, КонтекстОперации);
Иначе
ВызватьИсключение НСтр("ru = 'Неизвестный тип операции.'");
КонецЕсли;
ВыполнитьОбработкуОповещения(ОповещениеЗавершения, РезультатОперации);
КонецЕсли;
КонецПроцедуры
#Область ФормированиеСлипЧекаВТелеФискального
// Возвращает структуру для формирования шаблона слип-чека
//
// Возвращаемое значение:
// Структура:
// * ПараметрыФискализацииЧека - См. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыОперацииФискализацииЧека
// * ПараметрыВыполненияЭквайринговойОперации - См. ОборудованиеПлатежныеСистемыКлиентСервер.ПараметрыВыполненияЭквайринговойОперации
// * РезультатВыполненияЭквайринговойОперации - См. МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании
// * РезультатАварийнойОтменыОперации - См. МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании
// * ДополнительныеПараметры - Структура - Дополнительные параметры переданные ранее в процедуру
// "НачатьФискализациюЧекаСОплатойКартой"
Функция ПараметрыФормированияШаблонаСлипЧека()
Результат = Новый Структура();
Результат.Вставить("ПараметрыФискализацииЧека", Неопределено);
Результат.Вставить("ПараметрыВыполненияЭквайринговойОперации", Неопределено);
Результат.Вставить("РезультатВыполненияЭквайринговойОперации", Неопределено);
Результат.Вставить("РезультатФискализацииЧека", Неопределено);
Результат.Вставить("РезультатАварийнойОтменыОперации", Неопределено);
Результат.Вставить("ДополнительныеПараметры", Неопределено);
Возврат Результат;
КонецФункции
// Формирует шаблон слип-чека и печатает его как текстовый документ на ККТ
//
// Параметры:
// Тип - Строка - Тип слип-чека
// КонтекстОперации - см. КонтекстЭквайринговойОперацииСФискализацией
Процедура ВывестиСлипЧекКакТекстовыйДокумент(Тип, КонтекстОперации)
Оповещение = Новый ОписаниеОповещения("ПакетнаяОбработкаечатьТекстаЗавершение",
ЭтотОбъект,
КонтекстОперации);
Если Не КонтекстОперации.СлипЧекВТелеФискального Тогда
ВыполнитьОбработкуОповещения(Оповещение, Неопределено);
Возврат;
КонецЕсли;
ПараметрыСлипЧека = КонтекстОперации.РезультатВыполненияЭквайринговойОперации;
Если КонтекстОперации.ТипОперации = "ФискализацияЧекаСОплатой" Тогда
ПараметрыФискализацииЧека = КонтекстОперации.ПараметрыФискализацииЧека;
РезультатФискализацииЧека = КонтекстОперации.РезультатФискализацииЧека;
ИначеЕсли КонтекстОперации.ТипОперации = "ПродажаСВыдачейНаличных" Тогда
ПараметрыФискализацииЧека = КонтекстОперации.ПараметрыФискализацииЧекаВыдачи;
РезультатФискализацииЧека = КонтекстОперации.РезультатФискализацииЧекаВыдачи;
Иначе
ВызватьИсключение НСтр("ru = 'Неизвестный тип операции.'");
КонецЕсли;
// дать возможность пользователю поменять текст слип чека
СтандартнаяОбработка = Истина;
ДанныеДляШаблона = ПараметрыФормированияШаблонаСлипЧека();
ДанныеДляШаблона.ПараметрыФискализацииЧека = ПараметрыФискализацииЧека;
ДанныеДляШаблона.ПараметрыВыполненияЭквайринговойОперации = КонтекстОперации.ПараметрыВыполненияЭквайринговойОперации;
ДанныеДляШаблона.РезультатВыполненияЭквайринговойОперации = КонтекстОперации.РезультатВыполненияЭквайринговойОперации;
ДанныеДляШаблона.РезультатФискализацииЧека = РезультатФискализацииЧека;
ДанныеДляШаблона.РезультатАварийнойОтменыОперации = КонтекстОперации.РезультатАварийнойОтменыОперации;
ДанныеДляШаблона.ДополнительныеПараметры = КонтекстОперации.ДополнительныеПараметры;
Если ОбщегоНазначенияБПОКлиент.ИспользуетсяПлатежныеСистемы() Тогда
МодульОборудованиеПлатежныеСистемыКлиентСервер = ОбщегоНазначенияБПОКлиент.ОбщийМодуль("ОборудованиеПлатежныеСистемыКлиентСервер");
Текст = МодульОборудованиеПлатежныеСистемыКлиентСервер.ТекстСлипЧекаПоУмолчанию(
ДанныеДляШаблона.РезультатВыполненияЭквайринговойОперации, Ложь);
Иначе
Текст = "";
КонецЕсли;
МенеджерОборудованияКлиентПереопределяемый.СформироватьШаблонСлипЧека(Тип, ДанныеДляШаблона, Текст, СтандартнаяОбработка);
Если Не СтандартнаяОбработка Тогда
Возврат;
КонецЕсли;
// запомнить текст последнего слип-чека в глобальной переменной
Если Не ПустаяСтрока(Текст) И ОбщегоНазначенияБПОКлиент.ИспользуетсяПлатежныеСистемы() Тогда
МодульОборудованиеПлатежныеСистемыКлиент = ОбщегоНазначенияБПОКлиент.ОбщийМодуль("ОборудованиеПлатежныеСистемыКлиент");
МодульОборудованиеПлатежныеСистемыКлиент.УстановитьПоследнийСлипЧек(Текст);
КонецЕсли;
ПараметрыОперации = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыПечатиТекста(Текст);
НачатьПечатьТекста(Оповещение,
КонтекстОперации.ИдентификаторКлиента,
КонтекстОперации.ИдентификаторККТ,
ПараметрыОперации,
КонтекстОперации.ДополнительныеПараметры);
КонецПроцедуры
// Получает текст слип-чека из предопределенной процедуры и вставляет его в тело фискального чека,
// так же записывает текст последнего слип-чека в глобальную переменную
//
// Параметры:
// КонтекстОперации - см. КонтекстЭквайринговойОперацииСФискализацией
Процедура ВставитьСлипЧекВТелоФискальногоЧека(КонтекстОперации)
Если Не КонтекстОперации.СлипЧекВТелеФискального Тогда
Возврат;
КонецЕсли;
// сформировать тест слип чека по умолчанию
Тип = "Обычный";
Если КонтекстОперации.ТипОперации = "ФискализацияЧекаСОплатой" Тогда
ПараметрыФискализацииЧека = КонтекстОперации.ПараметрыФискализацииЧека;
ИначеЕсли КонтекстОперации.ТипОперации = "ПокупкаСЗачислением" Тогда
ПараметрыФискализацииЧека = КонтекстОперации.ПараметрыФискализацииЧека;
ИначеЕсли КонтекстОперации.ТипОперации = "ПродажаСВыдачейНаличных" Тогда
ПараметрыФискализацииЧека = КонтекстОперации.ПараметрыФискализацииЧека;
Иначе
ВызватьИсключение НСтр("ru = 'Неизвестный тип операции.'");
КонецЕсли;
// дать возможность пользователю поменять текст слип чека
СтандартнаяОбработка = Истина;
ДанныеДляШаблона = ПараметрыФормированияШаблонаСлипЧека();
ДанныеДляШаблона.ПараметрыФискализацииЧека = ПараметрыФискализацииЧека;
ДанныеДляШаблона.ПараметрыВыполненияЭквайринговойОперации = КонтекстОперации.ПараметрыВыполненияЭквайринговойОперации;
ДанныеДляШаблона.РезультатВыполненияЭквайринговойОперации = КонтекстОперации.РезультатВыполненияЭквайринговойОперации;
ДанныеДляШаблона.ДополнительныеПараметры = КонтекстОперации.ДополнительныеПараметры;
Если ОбщегоНазначенияБПОКлиент.ИспользуетсяПлатежныеСистемы() Тогда
МодульОборудованиеПлатежныеСистемыКлиентСервер = ОбщегоНазначенияБПОКлиент.ОбщийМодуль("ОборудованиеПлатежныеСистемыКлиентСервер");
Текст = МодульОборудованиеПлатежныеСистемыКлиентСервер.ТекстСлипЧекаПоУмолчанию(
ДанныеДляШаблона.РезультатВыполненияЭквайринговойОперации);
Иначе
Текст = "";
КонецЕсли;
МенеджерОборудованияКлиентПереопределяемый.СформироватьШаблонСлипЧека(Тип, ДанныеДляШаблона, Текст, СтандартнаяОбработка);
Если Не СтандартнаяОбработка Тогда
Возврат;
КонецЕсли;
// добавить текст слип чека в тело фискального чека
Если ПустаяСтрока(ПараметрыФискализацииЧека.ТекстКороткогоСлипЧека) Тогда
ПараметрыФискализацииЧека.ТекстКороткогоСлипЧека = Текст;
КонецЕсли;
// запомнить текст последнего слип-чека в глобальной переменной
Если Не ПустаяСтрока(Текст) И ОбщегоНазначенияБПОКлиент.ИспользуетсяПлатежныеСистемы() Тогда
МодульОборудованиеПлатежныеСистемыКлиент = ОбщегоНазначенияБПОКлиент.ОбщийМодуль("ОборудованиеПлатежныеСистемыКлиент");
МодульОборудованиеПлатежныеСистемыКлиент.УстановитьПоследнийСлипЧек(Текст);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#КонецОбласти