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

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

3859 lines
321 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" Тогда
РезультатВыполнения = Ждать ФискализацияЧека(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли Команда = "PrintText" Или Команда = "PrintQRCode" Тогда
РезультатВыполнения = Ждать ПечатьТекста(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли Команда = "OpenShift" Тогда
РезультатВыполнения = Ждать ОткрытьСмену(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли Команда = "CloseShift" Тогда
РезультатВыполнения = Ждать ЗакрытьСмену(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли Команда = "Encash" Тогда
РезультатВыполнения = Ждать Инкассация(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли Команда = "OpenCashDrawer" Тогда
РезультатВыполнения = Ждать ОткрытьДенежныйЯщик(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли Команда = "PrintReceiptCorrection" Тогда
РезультатВыполнения = Ждать ПечатьЧекаКоррекции(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли Команда = "ReportCurrentStatusOfSettlements" Тогда
РезультатВыполнения = Ждать ОтчетОТекущемСостоянииРасчетов(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли Команда = "PrintXReport" Тогда
РезультатВыполнения = Ждать ОтчетБезГашения(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли Команда = "GetLineLength" Тогда
РезультатВыполнения = Ждать ШиринаСтроки(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли Команда = "AnnulCheck" Тогда
РезультатВыполнения = Ждать АннулированиеЧека(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли Команда = "GetDataKKT" Тогда
РезультатВыполнения = Ждать ПараметрыККТ(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли Команда = "GetCurrentStatus" Тогда
РезультатВыполнения = Ждать ТекущееСостояние(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли Команда = "OperationFN" Тогда
РезультатВыполнения = Ждать ОперацияФискальногоНакопителя(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли Команда = "PrintCheckCopy" Тогда
РезультатВыполнения = Ждать НапечататьКопиюЧека(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли Команда = "OpenSessionRegistrationKM" Тогда
РезультатВыполнения = Ждать ОткрытьСессиюРегистрацииКМ(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли Команда = "CloseSessionRegistrationKM" Тогда
РезультатВыполнения = Ждать ЗакрытьСессиюРегистрацииКМ(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли Команда = "RequestKM" Тогда
РезультатВыполнения = Ждать ЗапросКМ(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли Команда = "RequestKMKMNoWait" Тогда
РезультатВыполнения = Ждать ЗапросКМБезОжиданияОтвета(ПараметрыПодключения.ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли Команда = "GetProcessingKMResult" Тогда
РезультатВыполнения = Ждать РезультатыЗапросаКМ(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли Команда = "ConfirmKM" Тогда
РезультатВыполнения = Ждать ПодтвердитьКМ(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли Команда = "CheckKM" Тогда
РезультатВыполнения = Ждать ПроверкаКМ(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли Команда = "CheckFiscalizationPacket" Тогда
РезультатВыполнения = Ждать ФискализацияЧекаПакетом(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
// ПРОЦЕДУРЫ ДЛЯ РАБОТЫ С ЭКВАЙРИНГОВЫМИ ТЕРМИНАЛАМИ
ИначеЕсли Команда = "AuthorizeSales" Или Команда = "AuthorizeRefund" Или Команда = "AuthorizeVoid"
Или Команда = "PayByPaymentCardWithCashWithdrawal" Или Команда = "PurchaseWithEnrollment" Тогда
Если ПараметрыПодключения.РевизияИнтерфейса > 4002 Тогда
РезультатВыполнения = Ждать ЭквайринговаяОперацияXML(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации, Команда);
Иначе
РезультатВыполнения = Ждать ЭквайринговаяОперация(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации, Команда);
КонецЕсли;
ИначеЕсли Команда = "PayElectronicCertificate" Или Команда = "ReturnElectronicCertificate" Тогда
Если ПараметрыПодключения.РевизияИнтерфейса > 4002 Тогда
РезультатВыполнения = Ждать ЭквайринговаяОперацияСЭлектроннымСертификатомXML(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации, Команда);
Иначе
РезультатВыполнения = Ждать ЭквайринговаяОперацияСЭлектроннымСертификатом(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации, Команда);
КонецЕсли;
ИначеЕсли Команда = "Settlement" Тогда // Сверка итогов по картам
РезультатВыполнения = Ждать ИтогиДняПоКартам(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли Команда = "EmergencyVoid" Тогда // Аварийная отмена платежа
РезультатВыполнения = Ждать АварийнаяОтменаОперации(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли Команда = "GetCardParametrs" Тогда // Получить параметры карты
РезультатВыполнения = Ждать ПараметрыКарты(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли Команда = "GetOperationByCards" Тогда // Получить параметры карты
РезультатВыполнения = Ждать ОперацииПоКартам(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли Команда = "AuthorizePreSales" Или Команда = "AuthorizeCompletion" Или Команда = "AuthorizeVoidPreSales" Тогда
РезультатВыполнения = Ждать ЭквайринговаяОперацияXML(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации, Команда);
// ПРОЦЕДУРЫ ДЛЯ РАБОТЫ С ДИСПЛЕЯМИ ПОКУПАТЕЛЯ
ИначеЕсли Команда = "GetOutputOptions" Тогда // Получить параметры вывода.
РезультатВыполнения = Ждать ПараметрыВывода(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли Команда = "DisplayText" Тогда // Вывод строк на дисплей.
РезультатВыполнения = Ждать ВывестиСтрокуНаДисплейПокупателя(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли Команда = "ClearText" Тогда // Очистка дисплея.
РезультатВыполнения = Ждать ОчиститьДисплейПокупателя(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли Команда = "DisplayQRCode" Тогда // Вывод QR кода на дисплей.
РезультатВыполнения = Ждать ВывестиQRКодНаДисплейПокупателя(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли Команда = "DisplayStatus" Тогда // Вывести статус на дисплей покупателя
РезультатВыполнения = Ждать ВывестиСтатусНаДисплейПокупателя(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли Команда = "DisplayStatusRM" Тогда // Вывести статус рабочего места на дисплей покупателя
РезультатВыполнения = Ждать ВывестиСтатусРабочегоМестаНаДисплейПокупателя(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли Команда = "OutputHTML" Тогда // Вывести HTML на дисплей покупателя.
РезультатВыполнения = Ждать ВывестиHTMLНаДисплейПокупателя(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли Команда = "DisplayInfo" Тогда // Вывести информацию на дисплей покупателя
РезультатВыполнения = Ждать ВывестиИнформациюНаДисплейПокупателя(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
// ПРОЦЕДУРЫ ДЛЯ РАБОТЫ С ЭЛЕКТРОННЫМИ ВЕСАМИ
ИначеЕсли Команда = "GetWeight" Тогда // Получить вес.
РезультатВыполнения = Ждать ПолучитьВес(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли Команда = "Calibrate" Тогда // Установить вес тары.
РезультатВыполнения = Ждать Тарировать(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
Иначе
ОписаниеОшибки = НСтр("ru='Недопустимая команда.'");
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
КонецЕсли;
Возврат РезультатВыполнения;
КонецФункции
// Функция начинает выполнение команды несертифицированного оборудования, обрабатывает и перенаправляет
// на исполнение команду к драйверу.
//
// Параметры:
// ОповещениеПриЗавершении - ОписаниеОповещения - событие описания оповещения.
// ПараметрыПодключения - Структура
// Команда - Строка - команда для выполнения
// ДанныеОперации - Структура - данные операции для выполнения команды
//
// Возвращаемое значение:
// см. РезультатОперацииНаОборудовании
//
Асинх Функция ВыполнениеКомандыНесертифицированногоОборудованияАсинх(ПараметрыПодключения, Команда, ДанныеОперации) Экспорт;
ОбъектДрайвера = ПараметрыПодключения.ОбъектДрайвера;
РезультатВыполнения = МенеджерОборудованияКлиентСервер.ПараметрыВыполненияОперацииНаОборудовании();
РезультатВыполнения.Вставить("Результат", Ложь);
РезультатВыполнения.Вставить("ОписаниеОшибки", "");
РезультатВыполнения.Вставить("ИдентификаторУстройства", ПараметрыПодключения.ИдентификаторУстройства);
Попытка
МодульОборудованиеНесертифицированноеКлиентПереопределяемый = ОбщегоНазначенияБПОКлиент.ОбщийМодуль("ОборудованиеНесертифицированноеКлиентПереопределяемый");
Результат = Ждать МодульОборудованиеНесертифицированноеКлиентПереопределяемый.ВыполнитьКомандуАсинх(
ОбъектДрайвера, ПараметрыПодключения, Команда, ДанныеОперации, РезультатВыполнения);
Если Результат <> Неопределено Тогда
РезультатВыполнения.Результат = Результат;
КонецЕсли;
Исключение
Возврат ОшибкаВызоваДрайвера(Команда, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Если Не РезультатВыполнения.Результат Тогда
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера);
КонецЕсли;
Возврат РезультатВыполнения;
КонецФункции
// Возвращает объект драйвера
//
// Параметры:
// ПараметрыПодключения - Структура
//
// Возвращаемое значение:
// ОбъектВнешнейКомпоненты
//
Асинх Функция ОбъектДрайвераАсинх(ПараметрыПодключения) Экспорт
Если ПараметрыПодключения.ИдентификаторОбъекта = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
ОбъектДрайвера = МенеджерОборудованияКлиент.ОбъектДрайвераИзКэша(ПараметрыПодключения.ИдентификаторОбъекта);
Если ОбъектДрайвера <> Неопределено Тогда
Возврат ОбъектДрайвера;
КонецЕсли;
ТекстСообщения = СтрШаблон(
НСтр("ru = 'Для продолжения работы требуется установка внешней компоненты ""%1"".'"),
ПараметрыПодключения.Наименование);
Если ПараметрыПодключения.ПодключениеИзМакета Или ОбщегоНазначенияБПОКлиентСервер.ЭтоМобильныйКлиент() Тогда
Операция = НСтр("ru = 'Подключить из макета'");
Если Не ПараметрыПодключения.МакетДоступен Тогда
ОписаниеОшибки = СтрШаблон(НСтр("ru = 'Для внешней компоненты макет %1 не обнаружен.'"), ПараметрыПодключения.ИмяМакетаДрайвера);
ЗаписатьОшибкуВЛог(ПараметрыПодключения, Операция, ОписаниеОшибки);
Возврат Неопределено;
КонецЕсли;
Если МенеджерОборудованияКлиент.ДопустимаУстановкаКомпоненты(ПараметрыПодключения.ИмяМакетаДрайвера) Тогда
Параметры = ВнешниеКомпонентыБПОКлиент.ПараметрыПодключения();
Параметры.ТекстПояснения = ТекстСообщения;
Параметры.Изолированно = ПараметрыПодключения.БезопасноеПодключение;
Параметры.Кэшировать = Ложь;
ДанныеЛога = Новый Структура();
ДанныеЛога.Вставить("Идентификатор", ПараметрыПодключения.ИдентификаторОбъекта);
ДанныеЛога.Вставить("ПолноеИмяМакета", ПараметрыПодключения.ИмяМакетаДрайвера);
ДанныеЛога.Вставить("ПараметрыПодключения", Параметры);
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, Операция, ДанныеЛога);
РезультатПодключения = Ждать ВнешниеКомпонентыБПОКлиент.ПодключитьКомпонентуИзМакетаАсинх(ПараметрыПодключения.ИдентификаторОбъекта, ПараметрыПодключения.ИмяМакетаДрайвера, Параметры);
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатПодключения, "Подключено, ОписаниеОшибки");
Иначе
РезультатПодключения = ВнешниеКомпонентыБПОКлиент.РезультатПодключения();
РезультатПодключения.Подключено = Ложь;
ОписаниеОшибки = СтрШаблон(НСтр("ru = 'Подключение внешней компоненты из макета %1 не допустимо.'"), ПараметрыПодключения.ИмяМакетаДрайвера);
ЗаписатьОшибкуВЛог(ПараметрыПодключения, Операция, ОписаниеОшибки);
КонецЕсли;
ИначеЕсли ПараметрыПодключения.ПодключениеЛокальноПоИдентификатору Тогда
#Если ВебКлиент Тогда
РезультатПодключения = ВнешниеКомпонентыБПОКлиент.РезультатПодключения();
РезультатПодключения.Подключено = Ложь;
#Иначе
Операция = НСтр("ru = 'Подключить из реестра Windows'");
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, Операция, ПараметрыПодключения.ИдентификаторОбъекта, "Идентификатор");
РезультатПодключения = Ждать ВнешниеКомпонентыБПОКлиент.ПодключитьКомпонентуИзРеестраWindowsАсинх(ПараметрыПодключения.ИдентификаторОбъекта);
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатПодключения, "Подключено, ОписаниеОшибки");
#КонецЕсли
Иначе
Параметры = ВнешниеКомпонентыБПОКлиент.ПараметрыПодключения();
Параметры.ТекстПояснения = ТекстСообщения;
Параметры.Изолированно = ПараметрыПодключения.БезопасноеПодключение;
Параметры.Кэшировать = Ложь;
Параметры.ПредложитьЗагрузить = Истина;
Параметры.ПредложитьУстановить = Истина;
Параметры.ОбновлятьАвтоматически = Ложь;
Операция = НСтр("ru = 'Подключить компоненту'");
ДанныеЛога = Новый Структура();
ДанныеЛога.Вставить("Идентификатор", ПараметрыПодключения.ИдентификаторОбъекта);
ДанныеЛога.Вставить("ПараметрыПодключения", Параметры);
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, Операция, ДанныеЛога);
РезультатПодключения = Ждать ВнешниеКомпонентыБПОКлиент.ПодключитьКомпонентуАсинх(ПараметрыПодключения.ИдентификаторОбъекта, Неопределено, Параметры);
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатПодключения, "Подключено, ОписаниеОшибки");
КонецЕсли;
Если РезультатПодключения.Подключено Тогда
ОбъектДрайвера = РезультатПодключения.ПодключаемыйМодуль;
МенеджерОборудованияКлиент.ДобавитьДрайверВКэш(ПараметрыПодключения.ИдентификаторОбъекта, ОбъектДрайвера);
КонецЕсли;
Возврат ОбъектДрайвера;
КонецФункции
// Возвращает описание драйвера
//
// Параметры:
// ПараметрыПодключения - Структура
//
// Возвращаемое значение:
// см. РезультатОперацииНаОборудовании
//
Асинх Функция ОписаниеДрайвераАсинх(ПараметрыПодключения) Экспорт
ОбъектДрайвера = Ждать ОбъектДрайвераАсинх(ПараметрыПодключения);
Если ОбъектДрайвера = Неопределено Тогда
РезультатВыполнения = ОшибкаЗагрузкиДрайвера(ПараметрыПодключения);
Возврат РезультатВыполнения;
Иначе
Если Не ПустаяСтрока(ПараметрыПодключения.ШаблонЛокализации) Тогда
Попытка
ТекущийЯзык = ТекущийЯзык();
КодЯзыкаПользователя = ?(ТипЗнч(ТекущийЯзык) = Тип("Строка"), ТекущийЯзык, ТекущийЯзык.КодЯзыка);
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "SetLocalization", ВМассив(КодЯзыкаПользователя, ПараметрыПодключения.ШаблонЛокализации));
РезультатВызова = Ждать ОбъектДрайвера.УстановитьЛокализациюАсинх(КодЯзыкаПользователя, ПараметрыПодключения.ШаблонЛокализации); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Если Не РезультатВызова.Значение Тогда
ОбщегоНазначенияБПОКлиент.СообщитьПользователю(НСтр("ru='Ошибка локализации драйвера.'"));
ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
КонецПопытки;
КонецЕсли;
ОписаниеПолучено = Истина;
ОписаниеДрайвера = МенеджерОборудованияКлиентСервер.ПараметрыОписанияДрайвера();
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "GetDescription");
РезультатВызова = Ждать ОбъектДрайвера.ПолучитьОписаниеАсинх(ОписаниеДрайвера.ОписаниеДрайвераXML); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Исключение
РевизияИнтерфейса = 2005;
ОписаниеПолучено = Ложь;
КонецПопытки;
Если Не ОписаниеПолучено Тогда
Попытка
РезультатВызова = Ждать ОбъектДрайвера.ПолучитьОписаниеАсинх(ОписаниеДрайвера.НаименованиеДрайвера, ОписаниеДрайвера.ОписаниеДрайвера, ОписаниеДрайвера.ТипОборудования,
РевизияИнтерфейса, ОписаниеДрайвера.ИнтеграционныйКомпонент, ОписаниеДрайвера.ОсновнойДрайверУстановлен, ОписаниеДрайвера.URLЗагрузкиДрайвера); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова,
"Name, Description, EquipmentType, InterfaceRevision, IntegrationLibrary, MainDriverInstalled, DownloadURL");
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
Возврат ОшибкаВызоваДрайвера("ПолучитьОписание", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), Истина);
КонецПопытки;
КонецЕсли;
Если РезультатВызова.Значение <> Истина Тогда
ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
ПараметрыВызова = РезультатВызова.Параметры;
Если ПараметрыВызова.Количество() > 1 И Не СтрНачинаетсяС(ПараметрыВызова[0], "<?") Тогда
// WEB клиент не генерирует исключение при вызове метода с неверным количество параметров.
ОписаниеДрайвера.НаименованиеДрайвера = ПараметрыВызова[0]; // НаименованиеДрайвера
ОписаниеДрайвера.ОписаниеДрайвера = ПараметрыВызова[1]; // ОписаниеДрайвера
ОписаниеДрайвера.ТипОборудования = ПараметрыВызова[2]; // ТипОборудования
ОписаниеДрайвера.РевизияИнтерфейса = ПараметрыВызова[3]; // РевизияИнтерфейса
ОписаниеДрайвера.ИнтеграционныйКомпонент = ПараметрыВызова[4]; // ИнтеграционныйКомпонент
ОписаниеДрайвера.ОсновнойДрайверУстановлен = ПараметрыВызова[5]; // ОсновнойДрайверУстановлен
ОписаниеДрайвера.URLЗагрузкиДрайвера = ПараметрыВызова[6]; // URLЗагрузкиДрайвера
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "GetVersion");
РезультатВызова = Ждать ОбъектДрайвера.ПолучитьНомерВерсииАсинх(); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
КонецПопытки;
ОписаниеДрайвера.ВерсияДрайвера = РезультатВызова.Значение;
Иначе
ОписаниеДрайвераПараметры = МенеджерОборудованияКлиент.ПолучитьОписаниеДрайвера(ПараметрыВызова[0]); // ОписаниеДрайвераXML
ЗаполнитьЗначенияСвойств(ОписаниеДрайвера, ОписаниеДрайвераПараметры);
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "GetInterfaceRevision");
РезультатВызова = Ждать ОбъектДрайвера.ПолучитьРевизиюИнтерфейсаАсинх(); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
КонецПопытки;
ОписаниеДрайвера.РевизияИнтерфейса = РезультатВызова.Значение;
КонецЕсли;
ПараметрыПодключения.РевизияИнтерфейса = ОписаниеДрайвера.РевизияИнтерфейса;
Если ОписаниеДрайвера.РевизияИнтерфейса >= 4000 И ОписаниеДрайвера.ПоддерживаетсяЛокализация Тогда
ШаблонЛокализации = "";
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "GetLocalizationPattern");
РезультатВызова = Ждать ОбъектДрайвера.ПолучитьШаблонЛокализацииАсинх(ШаблонЛокализации); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Если РезультатВызова.Значение Тогда
ПараметрыВызова = РезультатВызова.Параметры;
ОписаниеДрайвера.ШаблонЛокализации = ПараметрыВызова[0];
КонецЕсли
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
ОписаниеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ОбщегоНазначенияБПОКлиент.СообщитьПользователю(НСтр("ru='Ошибка получения шаблон локализации драйвера.'") + Символы.ПС + ОписаниеОшибки);
КонецПопытки;
Если РезультатВызова.Значение <> Истина Тогда
ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
КонецЕсли;
ОписаниеДрайвера.РевизияИнтерфейсаПредставление = ПредставлениеРевизияИнтерфейса(ОписаниеДрайвера.РевизияИнтерфейса);
ПараметрыПодключения.РевизияИнтерфейса = ОписаниеДрайвера.РевизияИнтерфейса;
Если НЕ ОписаниеДрайвера.РевизияИнтерфейса > 4002 Тогда
// Устанавливаем тип оборудования.
Результат = Ждать УстановитьПараметрыДрайвераАсинх(ОбъектДрайвера, ПараметрыПодключения, Истина, Ложь);
Если Не Результат Тогда
Возврат ОшибкаВызоваДрайвера("УстановитьПараметрыДрайвера");
КонецЕсли;
КонецЕсли;
// Получаем параметры драйвера. Для 4003 и выше - тип оборудования установиться в методе.
Результат = Ждать ПараметрыДрайвераАсинх(ОбъектДрайвера, ОписаниеДрайвера, ПараметрыПодключения);
РезультатВыполнения = РезультатОперацииНаОборудовании(Результат);
РезультатВыполнения.Вставить("ОписаниеДрайвера", ОписаниеДрайвера);
Возврат РезультатВыполнения;
КонецЕсли;
КонецФункции
// Возвращает параметры драйвера
//
// Параметры:
// ОбъектДрайвера - ОбъектВнешнейКомпоненты
// ОписаниеДрайвера - Структура
// ПараметрыПодключения - Структура
//
// Возвращаемое значение:
// Булево
//
Асинх Функция ПараметрыДрайвераАсинх(ОбъектДрайвера, ОписаниеДрайвера, ПараметрыПодключения) Экспорт
ПараметрыДрайвера = "";
Если ПараметрыПодключения.РевизияИнтерфейса > 4002 Тогда
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "EquipmentParameters", ПараметрыПодключения, "ТипОборудованияИмя");
РезультатВызова = Ждать ОбъектДрайвера.ПараметрыОборудованияАсинх(ПараметрыПодключения.ТипОборудованияИмя, ПараметрыДрайвера); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
ОписаниеДрайвера.ПараметрыДрайвера = РезультатВызова.Параметры[1];
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
ОписаниеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ОбщегоНазначенияБПОКлиент.СообщитьПользователю(НСтр("ru='Ошибка получения параметров драйвера.'") + Символы.ПС + ОписаниеОшибки);
Возврат Ложь;
КонецПопытки;
Иначе
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "GetParameters");
РезультатВызова = Ждать ОбъектДрайвера.ПолучитьПараметрыАсинх(ПараметрыДрайвера); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
ОписаниеДрайвера.ПараметрыДрайвера = РезультатВызова.Параметры[0];
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
ОписаниеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ОбщегоНазначенияБПОКлиент.СообщитьПользователю(НСтр("ru='Ошибка получения параметров драйвера.'") + Символы.ПС + ОписаниеОшибки);
Возврат Ложь;
КонецПопытки;
КонецЕсли;
Если РезультатВызова.Значение <> Истина Тогда
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
ДополнительныеДействия = "";
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "GetAdditionalActions");
РезультатВызова = Ждать ОбъектДрайвера.ПолучитьДополнительныеДействияАсинх(ДополнительныеДействия); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
ОбщегоНазначенияБПОКлиент.СообщитьПользователю(НСтр("ru='Ошибка получения описания драйвера.'"));
Возврат Ложь;
КонецПопытки;
Если РезультатВызова.Значение <> Истина Тогда
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
ПараметрыВызова = РезультатВызова.Параметры;
ОписаниеДрайвера.ДополнительныеДействия = ПараметрыВызова[0];
ОписаниеДрайвера.Установлен = Истина;
Если ПараметрыПодключения.Свойство("КоличествоПодключенных") Тогда
ОписаниеДрайвера.Вставить("КоличествоПодключенных", ПараметрыПодключения.КоличествоПодключенных);
КонецЕсли;
Возврат Истина;
КонецФункции
// Устанавливает параметры драйвера
//
// Параметры:
// ОбъектДрайвера - ОбъектВнешнейКомпоненты
// ПараметрыПодключения - Структура
// УстановитьТипОборудования - Булево
// УстановитьПараметры - Булево
//
// Возвращаемое значение:
// Булево
//
Асинх Функция УстановитьПараметрыДрайвераАсинх(ОбъектДрайвера, ПараметрыПодключения, УстановитьТипОборудования = Истина, УстановитьПараметры = Истина) Экспорт
Если УстановитьТипОборудования И ПараметрыПодключения.Свойство("ТипОборудованияИмя") Тогда
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "SetParameter", ВМассив("EquipmentType", ПараметрыПодключения.ТипОборудованияИмя));
РезультатВызова = Ждать ОбъектДрайвера.УстановитьПараметрАсинх("EquipmentType", ПараметрыПодключения.ТипОборудованияИмя); // ТипОборудования
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
Возврат Ложь;
КонецПопытки;
Если РезультатВызова.Значение <> Истина Тогда // Может быть Неопределено
ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
КонецЕсли;
Если УстановитьПараметры И ПараметрыПодключения.Параметры <> Неопределено Тогда
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "SetParameter", ПараметрыПодключения.Параметры);
Для Каждого Параметр Из ПараметрыПодключения.Параметры Цикл
Если Лев(Параметр.Ключ, 2) = "P_" Тогда
ЗначениеПараметра = Параметр.Значение;
ИмяПараметра = Сред(Параметр.Ключ, 3);
Попытка
РезультатВызова = Ждать ОбъектДрайвера.УстановитьПараметрАсинх(ИмяПараметра, ЗначениеПараметра); // Структура
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
Возврат Ложь;
КонецПопытки;
Если РезультатВызова.Значение <> Истина Тогда // Может быть Неопределено
ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
КонецЕсли;
КонецЦикла;
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
КонецЕсли;
Возврат Истина;
КонецФункции
// Функция начинает подключение устройства.
//
// Параметры:
// ПараметрыПодключения - Структура
//
// Возвращаемое значение:
// см. РезультатОперацииНаОборудовании
//
Асинх Функция ПодключитьУстройствоАсинх(ПараметрыПодключения) Экспорт
Если ПараметрыПодключения.ТипОборудования = ПредопределенноеЗначение("Перечисление.ТипыПодключаемогоОборудования.ОблачнаяККТ") Тогда
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
Возврат РезультатВыполнения;
КонецЕсли;
ОбъектДрайвера = Ждать ОбъектДрайвераАсинх(ПараметрыПодключения);
Если ОбъектДрайвера = Неопределено Тогда
Возврат ОшибкаЗагрузкиДрайвера(ПараметрыПодключения);
КонецЕсли;
ПараметрыПодключения.ОбъектДрайвера = ОбъектДрайвера;
РевизияИнтерфейса = 2005;
ОписаниеПолучено = Истина;
ОписаниеДрайвера = МенеджерОборудованияКлиентСервер.ПараметрыОписанияДрайвера();
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "GetInterfaceRevision");
РезультатВызова = Ждать ОбъектДрайвера.ПолучитьРевизиюИнтерфейсаАсинх(); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
РевизияИнтерфейса = РезультатВызова.Значение;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
ОписаниеПолучено = Ложь;
КонецПопытки;
Если Не ОписаниеПолучено Тогда
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "GetDescription");
РезультатВызова = Ждать ОбъектДрайвера.ПолучитьОписаниеАсинх(ОписаниеДрайвера.НаименованиеДрайвера, ОписаниеДрайвера.ОписаниеДрайвера, ОписаниеДрайвера.ТипОборудования,
ОписаниеДрайвера.РевизияИнтерфейса, ОписаниеДрайвера.ИнтеграционныйКомпонент, ОписаниеДрайвера.ОсновнойДрайверУстановлен, ОписаниеДрайвера.URLЗагрузкиДрайвера); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
РевизияИнтерфейса = РезультатВызова.Параметры[3];
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
Возврат ОшибкаВызоваДрайвера("ПолучитьОписание");
КонецПопытки;
КонецЕсли;
ПараметрыПодключения.РевизияИнтерфейса = РевизияИнтерфейса;
ОписаниеДрайвера.РевизияИнтерфейса = РевизияИнтерфейса;
Если ПустаяСтрока(ПараметрыПодключения.РевизияИнтерфейса) Или ПараметрыПодключения.РевизияИнтерфейса = 0 Тогда
ОписаниеОшибки = НСтр("ru='Ревизия интерфейса драйвера не определена.'");
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
Возврат РезультатВыполнения;
Иначе
ПараметрыПодключения.РевизияИнтерфейсаПредставление = ПредставлениеРевизияИнтерфейса(ПараметрыПодключения.РевизияИнтерфейса);
КонецЕсли;
Если ПараметрыПодключения.РевизияИнтерфейса >= 4000 Тогда
Если Не ПустаяСтрока(ПараметрыПодключения.ШаблонЛокализации) Тогда
Попытка
ТекущийЯзык = ТекущийЯзык();
КодЯзыка = ?(ТипЗнч(ТекущийЯзык) = Тип("Строка"), ТекущийЯзык, ТекущийЯзык.КодЯзыка);
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "SetLocalization", ВМассив(КодЯзыка, ПараметрыПодключения.ШаблонЛокализации));
РезультатВызова = Ждать ОбъектДрайвера.УстановитьЛокализациюАсинх(КодЯзыка, ПараметрыПодключения.ШаблонЛокализации); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Если НЕ РезультатВызова.Значение Тогда
ОбщегоНазначенияБПОКлиент.СообщитьПользователю(НСтр("ru='Ошибка локализации драйвера.'"));
ОшибкаВызоваДрайвера("УстановитьЛокализацию");
КонецЕсли
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
КонецПопытки;
КонецЕсли;
КонецЕсли;
Если ПараметрыПодключения.РевизияИнтерфейса > 4002 Тогда
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "ConnectEquipment", ПараметрыПодключения, ", ТипОборудованияИмя, ПараметрыXML");
РезультатВызова = Ждать ОбъектДрайвера.ПодключитьОборудованиеАсинх(ПараметрыПодключения.ИДУстройства,
ПараметрыПодключения.ТипОборудованияИмя, ПараметрыПодключения.ПараметрыXML); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
ПараметрыПодключения.ИДУстройства = РезультатВызова.Параметры[0];
Результат = РезультатВызова.Значение;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
Возврат ОшибкаВызоваДрайвера("ПодключитьОборудование", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Иначе
Результат = Ждать УстановитьПараметрыДрайвераАсинх(ОбъектДрайвера, ПараметрыПодключения, Истина, Ложь);
Если Не Результат Тогда
Возврат ОшибкаВызоваДрайвера("УстановитьПараметрыДрайвера");
КонецЕсли;
Результат = Ждать УстановитьПараметрыДрайвераАсинх(ОбъектДрайвера, ПараметрыПодключения, Ложь);
Если Не Результат Тогда
Возврат ОшибкаВызоваДрайвера("УстановитьПараметрыДрайвера");
КонецЕсли;
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "Open");
РезультатВызова = Ждать ОбъектДрайвера.ПодключитьАсинх(ПараметрыПодключения.ИДУстройства); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
ПараметрыПодключения.ИДУстройства = РезультатВызова.Параметры[0];
Результат = РезультатВызова.Значение;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
Возврат ОшибкаВызоваДрайвера("Подключить", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЕсли;
Если Результат <> Истина Тогда // Может быть Неопределено
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
Возврат РезультатВыполнения;
Иначе
ТипыОборудования = ПараметрыПодключения.ТипыОборудования;
Если ОбщегоНазначенияБПОКлиент.ИспользуетсяЧекопечатающиеУстройства()
И ((ТипыОборудования.Свойство("ККТ") И ТипыОборудования.ККТ)
Или (ТипыОборудования.Свойство("ПринтерЧеков") И ТипыОборудования.ПринтерЧеков)
Или (ТипыОборудования.Свойство("ФискальныйРегистратор") И ТипыОборудования.ФискальныйРегистратор)
) Тогда
Результат = Ждать ШиринаСтроки(ОбъектДрайвера, ПараметрыПодключения, Неопределено)
КонецЕсли;
Если ОбщегоНазначенияБПОКлиент.ИспользуетсяПлатежныеСистемы()
И ТипыОборудования.Свойство("ЭквайринговыйТерминал") И ТипыОборудования.ЭквайринговыйТерминал Тогда
Результат = Ждать ПараметрыТерминала(ОбъектДрайвера, ПараметрыПодключения, Неопределено)
КонецЕсли;
Если ОбщегоНазначенияБПОКлиент.ИспользуетсяДисплеиПокупателя()
И ТипыОборудования.Свойство("ДисплейПокупателя") И ТипыОборудования.ДисплейПокупателя Тогда
Результат = Ждать ПараметрыВывода(ОбъектДрайвера, ПараметрыПодключения, Неопределено);
Если ПараметрыПодключения.ДисплейОтрабатываетНажатия Тогда
ПараметрыПодключения.ИменаСобытий.Добавить("Нажатие"); //@NON-NLS-1 @NON-NLS-2
ПараметрыПодключения.ИменаСобытий.Добавить("OnClick");
КонецЕсли;
КонецЕсли;
Если ОбщегоНазначенияБПОКлиент.ИспользуетсяВесовоеОборудование()
И ТипыОборудования.Свойство("ЭлектронныеВесы") И ТипыОборудования.ЭлектронныеВесы Тогда
Результат = Ждать ПараметрыВесов(ОбъектДрайвера, ПараметрыПодключения, Неопределено);
Если ПараметрыПодключения.СобытиеПолученииВеса Тогда
ПараметрыПодключения.ИменаСобытий.Добавить("Взвешивание"); //@NON-NLS-1 @NON-NLS-2
ПараметрыПодключения.ИменаСобытий.Добавить("Weighting");
КонецЕсли;
КонецЕсли;
Если ОбщегоНазначенияБПОКлиент.ИспользуетсяУстройстваВвода()
И ТипыОборудования.Свойство("СканерШтрихкода") Тогда
Если ПараметрыПодключения.ТипыОборудования.СканерШтрихкода Тогда
ПараметрыПодключения.ИменаСобытий.Добавить("Штрихкод"); //@NON-NLS-1 @NON-NLS-2
ПараметрыПодключения.ИменаСобытий.Добавить("ШтрихкодBase64"); //@NON-NLS-1 @NON-NLS-2
ПараметрыПодключения.ИменаСобытий.Добавить("Barcode");
ПараметрыПодключения.ИменаСобытий.Добавить("BarcodeBase64");
КонецЕсли;
Если ПараметрыПодключения.ТипыОборудования.СканерШтрихкода Тогда
ПараметрыПодключения.ИменаСобытий.Добавить("НажатиеКлавиши"); //@NON-NLS-1 @NON-NLS-2
ПараметрыПодключения.ИменаСобытий.Добавить("KeyPress");
КонецЕсли;
КонецЕсли;
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
Возврат РезультатВыполнения;
КонецЕсли;
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
Возврат РезультатВыполнения;
КонецФункции
// Функция начинает отключение устройства.
//
// Параметры:
// ПараметрыПодключения - Структура
//
// Возвращаемое значение:
// см. РезультатОперацииНаОборудовании
//
Асинх Функция ОтключитьУстройствоАсинх(ПараметрыПодключения) Экспорт
ОбъектДрайвера = ПараметрыПодключения.ОбъектДрайвера;
Если ОбъектДрайвера = Неопределено Тогда
Возврат ОшибкаЗагрузкиДрайвера(ПараметрыПодключения);
КонецЕсли;
Если ПараметрыПодключения.РевизияИнтерфейса > 4002 Тогда
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "DisconnectEquipment");
РезультатВызова = Ждать ОбъектДрайвера.ОтключитьОборудованиеАсинх(ПараметрыПодключения.ИДУстройства); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
РезультатВыполнения = РезультатОперацииНаОборудовании(РезультатВызова.Значение);
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
Возврат ОшибкаВызоваДрайвера("ОтключитьОборудование", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Иначе
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "Close");
РезультатВызова = Ждать ОбъектДрайвера.ОтключитьАсинх(ПараметрыПодключения.ИДУстройства); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
РезультатВыполнения = РезультатОперацииНаОборудовании(РезультатВызова.Значение);
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
Возврат ОшибкаВызоваДрайвера("Отключить", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЕсли;
Если РезультатВызова.Значение <> Истина Тогда
ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Возврат РезультатВыполнения;
КонецФункции
// Выполняет тест устройства
//
// Параметры:
// ПараметрыПодключения - Структура
//
// Возвращаемое значение:
// см. РезультатОперацииНаОборудовании
//
Асинх Функция ТестУстройстваАсинх(ПараметрыПодключения) Экспорт
ОбъектДрайвера = Ждать ОбъектДрайвераАсинх(ПараметрыПодключения);
Если ОбъектДрайвера = Неопределено Тогда
Возврат ОшибкаЗагрузкиДрайвера(ПараметрыПодключения);
КонецЕсли;
РевизияИнтерфейса = Ждать РевизияИнтерфейсаАсинх(ОбъектДрайвера, ПараметрыПодключения);
Результат = Ложь;
РезультатТеста = "";
АктивированДемоРежим = "";
Если РевизияИнтерфейса > 4002 Тогда
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "EquipmentTest", ПараметрыПодключения, "ТипОборудованияИмя, ПараметрыXML");
РезультатВызова = Ждать ОбъектДрайвера.ТестированиеОборудованияАсинх(ПараметрыПодключения.ТипОборудованияИмя,
ПараметрыПодключения.ПараметрыXML, РезультатТеста, АктивированДемоРежим); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
Возврат ОшибкаВызоваДрайвера("ТестированиеОборудования", ТекстОшибки);
КонецПопытки;
Если ТипЗнч(РезультатВызова.Значение) = Тип("Булево") Тогда
Результат = РезультатВызова.Значение;
РезультатТеста = РезультатВызова.Параметры[2];
АктивированДемоРежим = РезультатВызова.Параметры[3];
Если РезультатВызова.Значение <> Истина Тогда
ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
КонецЕсли;
Иначе
Результат = Ждать УстановитьПараметрыДрайвераАсинх(ОбъектДрайвера, ПараметрыПодключения);
Если Результат Тогда
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "DeviceTest");
РезультатВызова = Ждать ОбъектДрайвера.ТестУстройстваАсинх(РезультатТеста, АктивированДемоРежим); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
Возврат ОшибкаВызоваДрайвера("ТестУстройства");
КонецПопытки;
Если ТипЗнч(РезультатВызова.Значение) = Тип("Булево") Тогда
Результат = РезультатВызова.Значение;
РезультатТеста = РезультатВызова.Параметры[0];
АктивированДемоРежим = РезультатВызова.Параметры[1];
Если РезультатВызова.Значение <> Истина Тогда
ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
КонецЕсли;
Иначе
Возврат ОшибкаВызоваДрайвера("УстановитьПараметрыДрайвера");
КонецЕсли;
КонецЕсли;
РезультатВыполнения = РезультатОперацииНаОборудовании(Результат);
РезультатВыполнения.Вставить("РезультатВыполнения" , РезультатТеста);
РезультатВыполнения.Вставить("АктивированДемоРежим", АктивированДемоРежим);
Возврат РезультатВыполнения;
КонецФункции
// Выполняет автонастройку устройства
//
// Параметры:
// ПараметрыПодключения - Структура
//
// Возвращаемое значение:
// см. РезультатОперацииНаОборудовании
//
Асинх Функция АвтонастройкаУстройстваАсинх(ПараметрыПодключения) Экспорт
ОбъектДрайвера = Ждать ОбъектДрайвераАсинх(ПараметрыПодключения);
Если ОбъектДрайвера = Неопределено Тогда
Возврат ОшибкаЗагрузкиДрайвера(ПараметрыПодключения);
КонецЕсли;
РевизияИнтерфейса = Ждать РевизияИнтерфейсаАсинх(ОбъектДрайвера, ПараметрыПодключения);
Результат = Ложь;
ПоказыватьОкноАвтонастройки = Истина;
Таймаут = 60;
ПараметрыПодключенияXML = "";
Если РевизияИнтерфейса > 4002 Тогда
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "EquipmentAutoSetup",
ВМассив(,ПараметрыПодключения.ПараметрыXML,,ПоказыватьОкноАвтонастройки,Таймаут));
РезультатВызова = Ждать ОбъектДрайвера.АвтонастройкаОборудованияАсинх(ПараметрыПодключения.ТипОборудованияИмя,
ПараметрыПодключения.ПараметрыXML, ПараметрыПодключенияXML, ПоказыватьОкноАвтонастройки, Таймаут); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
КонецПопытки;
Если ТипЗнч(РезультатВызова.Значение) = Тип("Булево") Тогда
Результат = РезультатВызова.Значение;
ПараметрыПодключенияXML = РезультатВызова.Параметры[2];
Если РезультатВызова.Значение <> Истина Тогда
ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
КонецЕсли;
РезультатВыполнения = РезультатОперацииНаОборудовании(Результат);
РезультатВыполнения.Вставить("ПараметрыПодключенияXML", ПараметрыПодключенияXML);
РезультатВыполнения.Вставить("ПараметрыПодключения" , МенеджерОборудованияВызовСервера.ЗагрузитьПараметрыXML(ПараметрыПодключенияXML));
Иначе
ОписаниеОшибки = НСтр("ru='Драйвер не поддерживает операцию.'");
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
КонецЕсли;
Возврат РезультатВыполнения;
КонецФункции
// Выполняет дополнительное действие
//
// Параметры:
// ПараметрыПодключения - Структура
// ПараметрыВыполнения - Структура
//
// Возвращаемое значение:
// см. РезультатОперацииНаОборудовании
//
Асинх Функция ВыполнитьДополнительноеДействиеАсинх(ПараметрыПодключения, ПараметрыВыполнения) Экспорт
ОбъектДрайвера = Ждать ОбъектДрайвераАсинх(ПараметрыПодключения);
Если ОбъектДрайвера = Неопределено Тогда
Возврат ОшибкаЗагрузкиДрайвера(ПараметрыПодключения);
КонецЕсли;
Результат = Ждать УстановитьПараметрыДрайвераАсинх(ОбъектДрайвера, ПараметрыПодключения);
Если Результат Тогда
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "DoAdditionalAction", ПараметрыВыполнения, "ИмяДействия");
РезультатВызова = Ждать ОбъектДрайвера.ВыполнитьДополнительноеДействиеАсинх(ПараметрыВыполнения.ИмяДействия); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Результат = РезультатВызова.Значение;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
ОписаниеОшибки = НСтр("ru='Ошибка выполнения дополнительного действия.'");
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
Возврат РезультатВыполнения;
КонецПопытки;
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
Если РезультатВызова.Значение <> Истина Тогда
РезультатВыполнения = ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Иначе
Возврат ОшибкаВызоваДрайвера("УстановитьПараметрыДрайвера");
КонецЕсли;
Возврат РезультатВыполнения;
КонецФункции
// Выполняет тест устройства
//
// Параметры:
// ПараметрыПодключения - Структура
//
// Возвращаемое значение:
// см. РезультатОперацииНаОборудовании
//
Асинх Функция РевизияИнтерфейсаАсинх(ОбъектДрайвера, ПараметрыПодключения) Экспорт
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "GetInterfaceRevision");
РезультатВызова = Ждать ОбъектДрайвера.ПолучитьРевизиюИнтерфейсаАсинх(); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
РевизияИнтерфейса = РезультатВызова.Значение;
Исключение
// Версия требований 2.5 и ниже
РевизияИнтерфейса = 2005;
КонецПопытки;
ПараметрыПодключения.РевизияИнтерфейса = РевизияИнтерфейса;
Возврат РевизияИнтерфейса;
КонецФункции
#Область РежимСовместимости
// Начинает выполнение команды, обрабатывает и перенаправляет на исполнение команду к драйверу.
//
// Параметры:
// ОповещениеПриЗавершении - ОписаниеОповещения - событие описания оповещения.
// ПараметрыПодключения - Структура
// Команда - Строка - команда для выполнения
// ДанныеОперации - Структура - данные операции для выполнения команды
//
Асинх Процедура НачатьВыполнениеКоманды(ОповещениеПриЗавершении, ПараметрыПодключения, Команда, ДанныеОперации) Экспорт
Если ПараметрыПодключения.Несертифицированное Тогда
Если ОбщегоНазначенияБПОКлиент.ИспользуетсяНесертифицированноеОборудование() Тогда
РезультатВыполнения = Ждать ВыполнениеКомандыНесертифицированногоОборудованияАсинх(ПараметрыПодключения, Команда, ДанныеОперации);
ВыполнитьОбработкуОповещения(ОповещениеПриЗавершении, РезультатВыполнения);
КонецЕсли;
Иначе
Результат = Ждать ВыполнениеКоманды(ПараметрыПодключения, Команда, ДанныеОперации);
Если Результат.Свойство("ДлительнаяОперация") Тогда
Если Результат.ДлительнаяОперация = "ПроверкаКМ" Тогда
МодульМенеджерОборудованияМаркировкаКлиент = ОбщегоНазначенияБПОКлиент.ОбщийМодуль("МенеджерОборудованияМаркировкаКлиент");
МодульМенеджерОборудованияМаркировкаКлиент.ДлительнаяОперацияПроверкаКМ(ОповещениеПриЗавершении, Команда, ПараметрыПодключения, ДанныеОперации);
КонецЕсли;
Иначе
ВыполнитьОбработкуОповещения(ОповещениеПриЗавершении, Результат);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// Начинает получение объекта драйвера
Асинх Процедура НачатьПолучениеОбъектаДрайвера(ОповещениеПриЗавершении, ПараметрыПодключения) Экспорт
Результат = Ждать ОбъектДрайвераАсинх(ПараметрыПодключения);
ВыполнитьОбработкуОповещения(ОповещениеПриЗавершении, Результат);
КонецПроцедуры
// Начинает получение описания драйвера
Асинх Процедура НачатьПолучениеОписанияДрайвера(ОповещениеПриЗавершении, ПараметрыПодключения) Экспорт
Результат = Ждать ОписаниеДрайвераАсинх(ПараметрыПодключения);
ВыполнитьОбработкуОповещения(ОповещениеПриЗавершении, Результат);
КонецПроцедуры
// Процедура начинает подключение устройства.
//
Асинх Процедура НачатьПодключениеУстройства(ОповещениеПриЗавершении, ПараметрыПодключения) Экспорт
Результат = Ждать ПодключитьУстройствоАсинх(ПараметрыПодключения);
ВыполнитьОбработкуОповещения(ОповещениеПриЗавершении, Результат);
КонецПроцедуры
// Процедура начинает отключение устройства.
//
Асинх Процедура НачатьОтключениеУстройства(ОповещениеПриЗавершении, ПараметрыПодключения) Экспорт
Результат = Ждать ОтключитьУстройствоАсинх(ПараметрыПодключения);
ВыполнитьОбработкуОповещения(ОповещениеПриЗавершении, Результат);
КонецПроцедуры
// Процедура начинает тест устройства.
//
Асинх Процедура НачатьТестУстройства(ОповещениеПриЗавершении, ПараметрыПодключения, ПараметрыВыполнения) Экспорт
Результат = Ждать ТестУстройстваАсинх(ПараметрыПодключения);
ВыполнитьОбработкуОповещения(ОповещениеПриЗавершении, Результат);
КонецПроцедуры
// Процедура начинает автонастройку устройства.
//
Асинх Процедура НачатьАвтонастройкуУстройства(ОповещениеПриЗавершении, ПараметрыПодключения, ПараметрыВыполнения) Экспорт
Результат = Ждать АвтонастройкаУстройстваАсинх(ПараметрыПодключения);
ВыполнитьОбработкуОповещения(ОповещениеПриЗавершении, Результат);
КонецПроцедуры
// Выполнение дополнительного действия для устройства.
//
Асинх Процедура НачатьВыполнитьДополнительноеДействие(ОповещениеПриЗавершении, ПараметрыПодключения, ПараметрыВыполнения) Экспорт
Результат = Ждать ВыполнитьДополнительноеДействиеАсинх(ПараметрыПодключения, ПараметрыВыполнения);
ВыполнитьОбработкуОповещения(ОповещениеПриЗавершении, Результат);
КонецПроцедуры
#КонецОбласти
#Область ОбработатьСобытие
Функция ОбработатьСобытиеШтрихкод(Данные) Экспорт
ИмяСобытия = "ScanData";
Штрихкод = СокрЛП(Данные);
Если МенеджерОборудованияКлиент.СобытиеУстройствВводаНовыйФормат() Тогда
ДанныеСобытия = Новый Структура("Штрихкод,Данные", Штрихкод, Данные);
Иначе
ДанныеСобытия = Новый Массив();
ДанныеСобытия.Добавить(Штрихкод);
МассивВторогоПорядка = Новый Массив();
МассивВторогоПорядка.Добавить(Данные);
МассивВторогоПорядка.Добавить(Штрихкод);
МассивВторогоПорядка.Добавить(0);
ДанныеСобытия.Добавить(МассивВторогоПорядка);
КонецЕсли;
РезультатОбработки = Новый Структура();
РезультатОбработки.Вставить("Результат", Истина);
РезультатОбработки.Вставить("Событие" , ИмяСобытия);
РезультатОбработки.Вставить("Данные" , ДанныеСобытия);
Возврат РезультатОбработки;
КонецФункции
Функция ОбработатьСобытиеШтрихкод64(Данные) Экспорт
ИмяСобытия = "ScanDataBase64";
Штрихкод = СокрЛП(Данные);
Если МенеджерОборудованияКлиент.СобытиеУстройствВводаНовыйФормат() Тогда
ДанныеСобытия = Новый Структура("Штрихкод,Данные", Штрихкод, Данные);
Иначе
ДанныеСобытия = Новый Массив();
ДанныеСобытия.Добавить(Штрихкод);
МассивВторогоПорядка = Новый Массив();
МассивВторогоПорядка.Добавить(Данные);
МассивВторогоПорядка.Добавить(Штрихкод);
МассивВторогоПорядка.Добавить(0);
ДанныеСобытия.Добавить(МассивВторогоПорядка);
КонецЕсли;
РезультатОбработки = Новый Структура();
РезультатОбработки.Вставить("Результат", Истина);
РезультатОбработки.Вставить("Событие" , ИмяСобытия);
РезультатОбработки.Вставить("Данные" , ДанныеСобытия);
Возврат РезультатОбработки;
КонецФункции
Функция ОбработатьНажатиеКлавиши(Данные) Экспорт
ИмяСобытия = "KeyPress";
Штрихкод = СокрЛП(Данные);
ДанныеСобытия = Новый Структура("НажатаяКлавиша,Данные", СокрЛП(Данные), Данные);
РезультатОбработки = Новый Структура();
РезультатОбработки.Вставить("Результат", Истина);
РезультатОбработки.Вставить("Событие" , ИмяСобытия);
РезультатОбработки.Вставить("Данные" , ДанныеСобытия);
Возврат РезультатОбработки;
КонецФункции
Функция ОбработатьНажатиеНаДисплее(Данные) Экспорт
ИмяСобытия = "Pressed";
РезультатОбработки = Новый Структура();
РезультатОбработки.Вставить("Результат", Истина);
РезультатОбработки.Вставить("Событие" , ИмяСобытия);
РезультатОбработки.Вставить("Данные" , Данные);
Возврат РезультатОбработки;
КонецФункции
Функция ОбработатьСобытиеВеса(ПараметрыПодключения, Данные) Экспорт
Результат = Истина;
ИмяСобытия = "Weighting";
Стабилизация = Истина;
ОшибкаРазмещения = Ложь;
ЗонаПересечения = Новый Массив();
Вес = 0;
ДанныеМассив = СтрРазделить(СокрЛП(Данные), ";");
Попытка
Вес = ?(ДанныеМассив.Количество() > 0, Число(ДанныеМассив[0]), 0);
Если ДанныеМассив.Количество() > 1 И ВРег(ДанныеМассив[1]) = "UNSTABLE" Тогда
Стабилизация = Ложь; // Вес не стабилизирован
КонецЕсли;
Если ДанныеМассив.Количество() > 2 Тогда // Ошибка размещения
ОшибкаРазмещенияМассив = СтрРазделить(СокрЛП(ДанныеМассив[2]), ",");
Для Каждого ОшибкаРазмещенияЭлемент Из ОшибкаРазмещенияМассив Цикл
ОшибкаРазмещения = Истина;
Если Не ПустаяСтрока(ОшибкаРазмещенияЭлемент) И ВРег(Лев(ОшибкаРазмещенияЭлемент,3)) = "ERR" Тогда
СтрЗонаПересечения = Сред(ОшибкаРазмещенияЭлемент, 5);
Если Не ПустаяСтрока(СтрЗонаПересечения) Тогда
ЗонаПересечения.Добавить(Число(СтрЗонаПересечения));
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Исключение
Результат = Ложь;
КонецПопытки;
ДанныеСобытия = ПараметрыСобытияВеса();
ДанныеСобытия.ИдентификаторУстройства = ПараметрыПодключения.ИдентификаторУстройства;
ДанныеСобытия.Вес = Вес;
ДанныеСобытия.Стабилизация = Стабилизация;
ДанныеСобытия.ОшибкаРазмещения = ОшибкаРазмещения;
ДанныеСобытия.ЗонаПересечения = ЗонаПересечения;
РезультатОбработки = Новый Структура();
РезультатОбработки.Вставить("Результат", Результат);
РезультатОбработки.Вставить("Событие" , ИмяСобытия);
РезультатОбработки.Вставить("Данные" , ДанныеСобытия);
Возврат РезультатОбработки;
КонецФункции
// Функция осуществляет обработку внешних событий подключаемого оборудования.
//
// Возвращаемое значение:
// Структура.
//
Функция ОбработатьСобытие(ОбъектДрайвера, ПараметрыПодключения, Событие, Данные) Экспорт
Операция = СтрШаблон(НСтр("ru = 'Событие: %1'"), Событие);
ДанныеДляЛога = ОбщегоНазначенияБПОКлиентСервер.ШтрихкодВBase64(Данные);
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, Операция, ДанныеДляЛога, "Данные");
Если Событие = "Штрихкод" Или Событие = "Barcode" Тогда
РезультатОбработки = ОбработатьСобытиеШтрихкод(Данные);
ИначеЕсли Событие = "ШтрихкодBase64" Или Событие = "BarcodeBase64" Тогда
РезультатОбработки = ОбработатьСобытиеШтрихкод64(Данные);
ИначеЕсли Событие = "НажатиеКлавиши" Или Событие = "KeyPress" Тогда
РезультатОбработки = ОбработатьНажатиеКлавиши(Данные);
ИначеЕсли Событие = "Взвешивание" Или Событие = "Weighting" Тогда
РезультатОбработки = ОбработатьСобытиеВеса(ПараметрыПодключения, Данные);
ИначеЕсли Событие = "Нажатие" Или Событие = "OnClick" Тогда
РезультатОбработки = ОбработатьНажатиеНаДисплее(Данные);
Иначе
РезультатОбработки = Новый Структура();
РезультатОбработки.Вставить("Результат", Ложь);
РезультатОбработки.Вставить("Событие" , "");
РезультатОбработки.Вставить("Данные" , Данные);
Возврат РезультатОбработки;
КонецЕсли;
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатОбработки);
Возврат РезультатОбработки;
КонецФункции
#КонецОбласти
#Область ОбщиеСинхронныеМетодыОбработчиков
// Конструктор результата выполнения операции на оборудовании
//
// Параметры:
// Результат - Булево
// ОписаниеОшибки - Строка
// - Неопределено
// ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование
// - Неопределено
//
// Возвращаемое значение:
// Структура:
// * Результат - Булево
// * ОписаниеОшибки - Строка
// - Неопределено
// * ОшибкаЗагрузки - Булево
// * ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование
// - Неопределено
//
Функция РезультатОперацииНаОборудовании(Результат = Ложь, ОписаниеОшибки = Неопределено, ИдентификаторУстройства = Неопределено) Экспорт
РезультатВыполнения = Новый Структура();
РезультатВыполнения.Вставить("Результат" , Результат);
РезультатВыполнения.Вставить("ОписаниеОшибки", ОписаниеОшибки);
РезультатВыполнения.Вставить("ОшибкаЗагрузки", Ложь);
РезультатВыполнения.Вставить("ИдентификаторУстройства", ИдентификаторУстройства);
Возврат РезультатВыполнения;
КонецФункции
Функция ОшибкаЗагрузкиДрайвера(ПараметрыПодключения, ОписаниеОшибки = "") Экспорт
Текст = НСтр("ru='%1: Не удалось загрузить драйвер устройства.
|Проверьте, что драйвер корректно установлен и зарегистрирован в системе.
|%2'");
Текст = СтрШаблон(Текст, ПараметрыПодключения.Наименование, ОписаниеОшибки);
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, Текст);
РезультатВыполнения.ОшибкаЗагрузки = Истина;
Возврат РезультатВыполнения;
КонецФункции
Функция ОшибкаВызоваДрайвера(МетодДрайвера = Неопределено, ОписаниеОшибки = Неопределено, ЗаписьВЖурналРегистрации = Ложь) Экспорт
Если НЕ ПустаяСтрока(МетодДрайвера) Тогда
СообщениеОбОшибке = НСтр("ru='Ошибка вызова метода драйвера <%1>.'");
СообщениеОбОшибке = СтрШаблон(СообщениеОбОшибке, МетодДрайвера);
Иначе
СообщениеОбОшибке = НСтр("ru='Данный тип оборудования не поддерживает данную команду.'");
КонецЕсли;
Если НЕ ПустаяСтрока(ОписаниеОшибки) Тогда
СообщениеОбОшибке = СообщениеОбОшибке + Символы.ПС + ОписаниеОшибки;
КонецЕсли;
Если ЗаписьВЖурналРегистрации Тогда
ОбщегоНазначенияБПОКлиент.ЗаписатьОшибкуВЖурналРегистрации(НСтр("ru = 'Подключаемое оборудование.'"), СообщениеОбОшибке);
КонецЕсли;
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, СообщениеОбОшибке);
Возврат РезультатВыполнения;
КонецФункции
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
// Установить информацию приложения в драйвере
//
// Параметры:
// ПараметрыПодключения - Структура
// ПараметрыВыполнения - Структура
//
// Возвращаемое значение:
// см. РезультатОперацииНаОборудовании
//
Асинх Функция УстановитьИнформациюПриложенияАсинх(ОбъектДрайвера, ПараметрыПодключения)
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "SetApplicationInformation", ПараметрыПодключения, "ПараметрыПриложенияXML");
РезультатВызова = Ждать ОбъектДрайвера.УстановитьИнформациюПриложенияАсинх(ПараметрыПодключения.ПараметрыПриложенияXML); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
ОписаниеОшибки = НСтр("ru='Ошибка установки информации приложения для драйвера.'");
Возврат РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
КонецПопытки;
РезультатВыполнения = РезультатОперацииНаОборудовании(РезультатВызова.Значение);
Если РезультатВызова.Значение <> Истина Тогда
ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Возврат РезультатВыполнения;
КонецФункции
Асинх Функция ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога = Неопределено)
РезультатВызова = Ждать ОбъектДрайвера.ПолучитьОшибкуАсинх(""); // Структура
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, РезультатВызова.Параметры[0]);
Если ЗаписьЛога <> Неопределено Тогда
ЗаписатьОшибкуДрайвераВЛогОперации(ЗаписьЛога, РезультатВызова);
КонецЕсли;
Возврат РезультатВыполнения;
КонецФункции
Функция ПредставлениеРевизияИнтерфейса(РевизияИнтерфейса)
Возврат ОбщегоНазначенияБПОКлиентСервер.ПредставлениеРевизияИнтерфейса(РевизияИнтерфейса);
КонецФункции
#Область ФискальныеУстройства
// Получает ширину строки в символах.
//
// Параметры:
// ОбъектДрайвера - ОбъектВнешнейКомпоненты
// ПараметрыПодключения - Структура
// ДанныеОперации - Структура - данные операции для выполнения команды
//
Асинх Функция ШиринаСтроки(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
Если ПараметрыПодключения.Свойство("ШиринаСтроки") И ПараметрыПодключения.ШиринаСтроки > 0 Тогда
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
РезультатВыполнения.Вставить("ШиринаСтроки", ПараметрыПодключения.ШиринаСтроки);
Возврат РезультатВыполнения;
КонецЕсли;
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "GetLineLength");
РезультатВызова = Ждать ОбъектДрайвера.ПолучитьШиринуСтрокиАсинх(ПараметрыПодключения.ИДУстройства, 0); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
ПараметрыПодключения.ШиринаСтроки = РезультатВызова.Параметры[1];
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
Возврат ОшибкаВызоваДрайвера("ПолучитьШиринуСтроки", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Если РезультатВызова.Значение Тогда
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
РезультатВыполнения.Вставить("ШиринаСтроки", РезультатВызова.Параметры[1]); // Структура
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Возврат РезультатВыполнения;
КонецФункции
// Осуществляет фискализацию чека.
//
// Параметры:
// ОбъектДрайвера - ОбъектВнешнейКомпоненты
// ПараметрыПодключения - Структура
// ДанныеОперации - Структура - данные операции для выполнения команды
//
Асинх Функция ФискализацияЧека(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
Если ПараметрыПодключения.ТипыОборудования.Свойство("ПринтерЧеков") И ПараметрыПодключения.ТипыОборудования.ПринтерЧеков Тогда
РезультатВыполнения = Ждать ПечатьТекста(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли ПараметрыПодключения.ТипыОборудования.ККТ Тогда
ТекущийСтатус = Неопределено;
ВыполнялосьПодтверждениеПокупки = Ложь;
Если ПараметрыПодключения.РевизияИнтерфейса >= 3004 Тогда
ТекущийСтатус = МенеджерОборудованияКлиент.ПроверкаКодаМаркировки(ПараметрыПодключения.ИдентификаторУстройства);
// Если есть текущая проверка КМ
Если НЕ ПустаяСтрока(ТекущийСтатус.ИдентификаторЗапроса) Тогда
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "ConfirmKM", ВМассив(ТекущийСтатус.ИдентификаторЗапроса,0));
РезультатВызова = Ждать ОбъектДрайвера.ПодтвердитьКМАсинх(ПараметрыПодключения.ИДУстройства, ТекущийСтатус.ИдентификаторЗапроса, 0); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
МенеджерОборудованияКлиент.УстановитьПроверкуКодаМаркировки(ПараметрыПодключения.ИдентификаторУстройства);
ВыполнялосьПодтверждениеПокупки = Истина;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("ПодтвердитьКМ", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
Возврат РезультатВыполнения;
КонецПопытки;
КонецЕсли;
КонецЕсли;
Попытка
Если ПараметрыПодключения.РевизияИнтерфейса >= 3000 Тогда // Версия стандарта 3.0 (ОФД 1.1)
Если ДанныеОперации.ЕстьПерсональныеДанные Тогда
ДанныеЧекаXML = ДанныеОперации.ДанныеЧекаXMLПерсональныеДанные
Иначе
ДанныеЧекаXML = ДанныеОперации.ДанныеЧекаXML;
КонецЕсли;
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "ProcessCheck", ВМассив(ПараметрыПодключения.ИДУстройства, ДанныеОперации.Электронно, Экранировать(ДанныеОперации.ДанныеЧекаXML)));
РезультатВызова = Ждать ОбъектДрайвера.СформироватьЧекАсинх(ПараметрыПодключения.ИДУстройства, ДанныеОперации.Электронно, ДанныеЧекаXML, ДанныеОперации.РезультатОперацииXML); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
ПараметрыВызова = РезультатВызова.Параметры;
ДанныеОперации.РезультатОперацииXML = ПараметрыВызова[3];
Иначе // Версия стандарта 2.2 (ОФД 1.05)
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "ProcessCheck", ВМассив(,ДанныеОперации.Электронно, Экранировать(ДанныеОперации.ДанныеЧекаXML)));
РезультатВызова = Ждать ОбъектДрайвера.СформироватьЧекАсинх(ПараметрыПодключения.ИДУстройства, ДанныеОперации.Электронно,
ДанныеОперации.ДанныеЧекаXML, ДанныеОперации.НомерЧекаККТ, ДанныеОперации.НомерСменыККТ, ДанныеОперации.ФискальныйПризнак, ДанныеОперации.АдресСайтаПроверки); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
ПараметрыВызова = РезультатВызова.Параметры;
ДанныеОперации.НомерЧекаККТ = ПараметрыВызова[3];
ДанныеОперации.НомерСменыККТ = ПараметрыВызова[4];
ДанныеОперации.ФискальныйПризнак = ПараметрыВызова[5];
ДанныеОперации.АдресСайтаПроверки = ПараметрыВызова[6];
КонецЕсли;
ДанныеОперации.ДатаВремяЧека = ОбщегоНазначенияБПОКлиент.ДатаСеанса();
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("СформироватьЧек", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
Возврат РезультатВыполнения;
КонецПопытки;
Если РезультатВызова.Значение Тогда
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
МенеджерОборудованияКлиент.УстановитьСессиюПроверкиКодовМаркировки(ПараметрыПодключения.ИдентификаторУстройства);
Если ТекущийСтатус <> Неопределено Тогда
ЗаписьОперацииКМ = Новый Структура();
ЗаписьОперацииКМ.Вставить("ИдентификаторСессии", ТекущийСтатус.ИдентификаторСессии);
ЗаписьОперацииКМ.Вставить("ИдентификаторЗапроса", ТекущийСтатус.ИдентификаторЗапроса);
ЗаписьОперацииКМ.Вставить("ВыполнялосьПодтверждениеПокупки", ВыполнялосьПодтверждениеПокупки);
ДанныеОперации.Вставить("ЗаписьОперацииКМ", ЗаписьОперацииКМ);
КонецЕсли;
Если ДанныеОперации.ТестовыеЧеки <> Неопределено И ДанныеОперации.ТестовыеЧеки.Количество() > 0 Тогда
РезультатПечатиНефискальныхДокументов = Ждать ПечатьТекста(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
РезультатВыполнения.Вставить("РезультатПечатиНефискальныхДокументов", РезультатПечатиНефискальныхДокументов);
КонецЕсли;
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Иначе
ОписаниеОшибки = НСтр("ru='Драйвер не поддерживает операцию.'");
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
КонецЕсли;
Возврат РезультатВыполнения;
КонецФункции
// Осуществляет печать чека коррекции.
//
Асинх Функция ПечатьЧекаКоррекции(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
Попытка
Если ДанныеОперации.ЧекКоррекцииНаККТ Тогда
Если ПараметрыПодключения.РевизияИнтерфейса >= 3000 Тогда // Версия стандарта 3.0 (ОФД 1.1)
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "ProcessCorrectionCheck", ВМассив( , Экранировать(ДанныеОперации.ДанныеЧекаXML)));
Если ПараметрыПодключения.РевизияИнтерфейса >= 4004 Тогда
РезультатВызова = Ждать ОбъектДрайвера.СформироватьЧекКоррекцииАсинх(ПараметрыПодключения.ИДУстройства, ДанныеОперации.Электронно,
ДанныеОперации.ДанныеЧекаXML, ДанныеОперации.РезультатОперацииXML); // Структура
ПараметрыВызова = РезультатВызова.Параметры;
Результат = РезультатВызова.Значение;
Если Результат Тогда
ДанныеОперации.ДанныеЧекаXML = ПараметрыВызова[2];
ДанныеОперации.РезультатОперацииXML = ПараметрыВызова[3];
КонецЕсли;
Иначе
РезультатВызова = Ждать ОбъектДрайвера.СформироватьЧекКоррекцииАсинх(ПараметрыПодключения.ИДУстройства,
ДанныеОперации.ДанныеЧекаXML, ДанныеОперации.РезультатОперацииXML); // Структура
ПараметрыВызова = РезультатВызова.Параметры;
Результат = РезультатВызова.Значение;
Если Результат Тогда
ДанныеОперации.ДанныеЧекаXML = ПараметрыВызова[1];
ДанныеОперации.РезультатОперацииXML = ПараметрыВызова[2];
КонецЕсли;
КонецЕсли;
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Иначе
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "ProcessCorrectionCheck", ВМассив(, Экранировать(ДанныеОперации.ДанныеЧекаXML)));
РезультатВызова = Ждать ОбъектДрайвера.СформироватьЧекКоррекцииАсинх(ПараметрыПодключения.ИДУстройства, ДанныеОперации.ДанныеЧекаXML, ДанныеОперации.НомерЧекаККТ, ДанныеОперации.НомерСменыККТ,
ДанныеОперации.ФискальныйПризнак, ДанныеОперации.АдресСайтаПроверки); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
ПараметрыВызова = РезультатВызова.Параметры;
Результат = РезультатВызова.Значение;
Если Результат Тогда
ДанныеОперации.ДанныеЧекаXML = ПараметрыВызова[1];
ДанныеОперации.НомерЧекаККТ = ПараметрыВызова[2];
ДанныеОперации.НомерСменыККТ = ПараметрыВызова[3];
ДанныеОперации.ФискальныйПризнак = ПараметрыВызова[4];
ДанныеОперации.АдресСайтаПроверки = ПараметрыВызова[5];
КонецЕсли;
ДанныеОперации.ДатаВремяЧека = ОбщегоНазначенияБПОКлиент.ДатаСеанса();
КонецЕсли;
Иначе
Если ПараметрыПодключения.РевизияИнтерфейса >= 3000 Тогда // Версия стандарта 3.0
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "ProcessCheck", ВМассив(,ДанныеОперации.Электронно, Экранировать(ДанныеОперации.ДанныеЧекаXML)));
РезультатВызова = Ждать ОбъектДрайвера.СформироватьЧекАсинх(ПараметрыПодключения.ИДУстройства, ДанныеОперации.Электронно,
ДанныеОперации.ДанныеЧекаXML, ДанныеОперации.РезультатОперацииXML); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
ПараметрыВызова = РезультатВызова.Параметры;
Результат = РезультатВызова.Значение;
Если Результат Тогда
ДанныеОперации.ДанныеЧекаXML = ПараметрыВызова[2];
ДанныеОперации.РезультатОперацииXML = ПараметрыВызова[3];
КонецЕсли;
Иначе
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "ProcessCheck", ВМассив(,ДанныеОперации.Электронно, Экранировать(ДанныеОперации.ДанныеЧекаXML)));
РезультатВызова = Ждать ОбъектДрайвера.СформироватьЧекАсинх(ПараметрыПодключения.ИДУстройства, ДанныеОперации.Электронно,
ДанныеОперации.ДанныеЧекаXML, ДанныеОперации.НомерЧекаККТ, ДанныеОперации.НомерСменыККТ, ДанныеОперации.ФискальныйПризнак, ДанныеОперации.АдресСайтаПроверки); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
ПараметрыВызова = РезультатВызова.Параметры;
Результат = РезультатВызова.Значение;
Если Результат Тогда
ДанныеОперации.ДанныеЧекаXML = ПараметрыВызова[2];
ДанныеОперации.НомерЧекаККТ = ПараметрыВызова[3];
ДанныеОперации.НомерСменыККТ = ПараметрыВызова[4];
ДанныеОперации.ФискальныйПризнак = ПараметрыВызова[5];
ДанныеОперации.АдресСайтаПроверки = ПараметрыВызова[6];
КонецЕсли;
ДанныеОперации.ДатаВремяЧека = ОбщегоНазначенияБПОКлиент.ДатаСеанса();
КонецЕсли;
КонецЕсли;
Если Результат И ДанныеОперации.СформироватьЧекКоррекцииСторно Тогда
ПараметрыФискализацииСторно = ДанныеОперации.ЧекКоррекцииСторно;
Если ДанныеОперации.ЧекКоррекцииНаККТ Тогда
Если ПараметрыПодключения.РевизияИнтерфейса >= 3000 Тогда // Версия стандарта 3.0 (ОФД 1.1)
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "ProcessCorrectionCheck", ВМассив(, Экранировать(ДанныеОперации.ДанныеЧекаXML)));
Если ПараметрыПодключения.РевизияИнтерфейса >= 4004 Тогда
РезультатВызова = Ждать ОбъектДрайвера.СформироватьЧекКоррекцииАсинх(ПараметрыПодключения.ИДУстройства, ПараметрыФискализацииСторно.Электронно,
ПараметрыФискализацииСторно.ДанныеЧекаXML, ПараметрыФискализацииСторно.РезультатОперацииXML); // Структура
ПараметрыВызова = РезультатВызова.Параметры;
Результат = РезультатВызова.Значение;
Если Результат Тогда
ПараметрыФискализацииСторно.ДанныеЧекаXML = ПараметрыВызова[2];
ПараметрыФискализацииСторно.РезультатОперацииXML = ПараметрыВызова[3];
КонецЕсли;
Иначе
РезультатВызова = Ждать ОбъектДрайвера.СформироватьЧекКоррекцииАсинх(ПараметрыПодключения.ИДУстройства,
ПараметрыФискализацииСторно.ДанныеЧекаXML, ПараметрыФискализацииСторно.РезультатОперацииXML); // Структура
ПараметрыВызова = РезультатВызова.Параметры;
Результат = РезультатВызова.Значение;
Если Результат Тогда
ПараметрыФискализацииСторно.ДанныеЧекаXML = ПараметрыВызова[1];
ПараметрыФискализацииСторно.РезультатОперацииXML = ПараметрыВызова[2];
КонецЕсли;
КонецЕсли;
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Иначе
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "ProcessCorrectionCheck", ВМассив(, Экранировать(ДанныеОперации.ДанныеЧекаXML)));
РезультатВызова = Ждать ОбъектДрайвера.СформироватьЧекКоррекцииАсинх(ПараметрыПодключения.ИДУстройства, ПараметрыФискализацииСторно.ДанныеЧекаXML, ПараметрыФискализацииСторно.НомерЧекаККТ, ПараметрыФискализацииСторно.НомерСменыККТ,
ПараметрыФискализацииСторно.ФискальныйПризнак, ПараметрыФискализацииСторно.АдресСайтаПроверки); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
ПараметрыВызова = РезультатВызова.Параметры;
Результат = РезультатВызова.Значение;
Если Результат Тогда
ПараметрыФискализацииСторно.ДанныеЧекаXML = ПараметрыВызова[1];
ПараметрыФискализацииСторно.НомерЧекаККТ = ПараметрыВызова[2];
ПараметрыФискализацииСторно.НомерСменыККТ = ПараметрыВызова[3];
ПараметрыФискализацииСторно.ФискальныйПризнак = ПараметрыВызова[4];
ПараметрыФискализацииСторно.АдресСайтаПроверки = ПараметрыВызова[5];
КонецЕсли;
ПараметрыФискализацииСторно.ДатаВремяЧека = ОбщегоНазначенияБПОКлиент.ДатаСеанса();
КонецЕсли;
Иначе
Если ПараметрыПодключения.РевизияИнтерфейса >= 3000 Тогда // Версия стандарта 3.0
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "ProcessCheck", ВМассив(, ДанныеОперации.Электронно, Экранировать(ДанныеОперации.ДанныеЧекаXML)));
РезультатВызова = Ждать ОбъектДрайвера.СформироватьЧекАсинх(ПараметрыПодключения.ИДУстройства, ПараметрыФискализацииСторно.Электронно,
ПараметрыФискализацииСторно.ДанныеЧекаXML, ПараметрыФискализацииСторно.РезультатОперацииXML); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
ПараметрыВызова = РезультатВызова.Параметры;
Результат = РезультатВызова.Значение;
Если Результат Тогда
ПараметрыФискализацииСторно.ДанныеЧекаXML = ПараметрыВызова[2];
ПараметрыФискализацииСторно.РезультатОперацииXML = ПараметрыВызова[3];
КонецЕсли;
Иначе
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "ProcessCheck", ВМассив(, ДанныеОперации.Электронно, Экранировать(ДанныеОперации.ДанныеЧекаXML)));
РезультатВызова = Ждать ОбъектДрайвера.СформироватьЧекАсинх(
ПараметрыПодключения.ИДУстройства,
ПараметрыФискализацииСторно.Электронно,
ПараметрыФискализацииСторно.ДанныеЧекаXML,
ПараметрыФискализацииСторно.НомерЧекаККТ,
ПараметрыФискализацииСторно.НомерСменыККТ,
ПараметрыФискализацииСторно.ФискальныйПризнак,
ПараметрыФискализацииСторно.АдресСайтаПроверки); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
ПараметрыВызова = РезультатВызова.Параметры;
Результат = РезультатВызова.Значение;
Если Результат Тогда
ПараметрыФискализацииСторно.ДанныеЧекаXML = ПараметрыВызова[2];
ПараметрыФискализацииСторно.НомерЧекаККТ = ПараметрыВызова[3];
ПараметрыФискализацииСторно.НомерСменыККТ = ПараметрыВызова[4];
ПараметрыФискализацииСторно.ФискальныйПризнак = ПараметрыВызова[5];
ПараметрыФискализацииСторно.АдресСайтаПроверки = ПараметрыВызова[6];
КонецЕсли;
ПараметрыФискализацииСторно.ДатаВремяЧека = ОбщегоНазначенияБПОКлиент.ДатаСеанса();
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если Результат Тогда
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("СформироватьЧекКоррекции", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Возврат РезультатВыполнения;
КонецФункции
// Осуществляет печать текста.
//
// Параметры:
// ОбъектДрайвера - ОбъектВнешнейКомпоненты
// ПараметрыПодключения - Структура
// ДанныеОперации - Структура - данные операции для выполнения команды
//
Асинх Функция ПечатьТекста(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
Попытка
Если ДанныеОперации.Свойство("ТестовыеЧеки") И ДанныеОперации.ТестовыеЧеки.Количество() > 0 Тогда
Для Каждого ТекстПечати Из ДанныеОперации.ТестовыеЧеки Цикл
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "PrintTextDocument", ВМассив(,ТекстПечати));
РезультатВызова = Ждать ОбъектДрайвера.НапечататьТекстовыйДокументАсинх(ПараметрыПодключения.ИДУстройства, ТекстПечати); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Если НЕ РезультатВызова.Значение Тогда
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
Возврат РезультатВыполнения;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ДанныеОперации.Свойство("КопияЧека") И ДанныеОперации.КопияЧека.Количество() > 0 Тогда
Для Каждого Копия Из ДанныеОперации.КопияЧека Цикл
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "PrintTextDocument", ВМассив(,Копия));
РезультатВызова = Ждать ОбъектДрайвера.НапечататьТекстовыйДокументАсинх(ПараметрыПодключения.ИДУстройства, Копия); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Если НЕ РезультатВызова.Значение Тогда
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
Возврат РезультатВыполнения;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("НапечататьТекстовыйДокумент", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Возврат РезультатВыполнения;
КонецФункции
// Осуществляет инкассацию.
//
// Параметры:
// ОбъектДрайвера - ОбъектВнешнейКомпоненты
// ПараметрыПодключения - Структура
// ДанныеОперации - Структура - данные операции для выполнения команды
//
Асинх Функция Инкассация(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
Если ПараметрыПодключения.ТипыОборудования.Свойство("ПринтерЧеков") И ПараметрыПодключения.ТипыОборудования.ПринтерЧеков Тогда
РезультатВыполнения = Ждать ПечатьТекста(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли ПараметрыПодключения.ТипыОборудования.ККТ Тогда
СуммаЧека = ?(ДанныеОперации.ТипИнкассации = 1, ДанныеОперации.СуммаЧека, - ДанныеОперации.СуммаЧека);
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "CashInOutcome", ВМассив(,ДанныеОперации.ДанныеЧекаXML, СуммаЧека));
РезультатВызова = Ждать ОбъектДрайвера.НапечататьЧекВнесенияВыемкиАсинх(ПараметрыПодключения.ИДУстройства, ДанныеОперации.ДанныеЧекаXML, СуммаЧека); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Если РезультатВызова.Значение Тогда
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
ДанныеОперации.СтатусСмены = 1; // Открыта
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("НапечататьЧекВнесенияВыемки", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Иначе
РезультатВыполнения = ОшибкаВызоваДрайвера();
КонецЕсли;
Возврат РезультатВыполнения;
КонецФункции
// Осуществляет закрытие смены.
//
// Параметры:
// ОбъектДрайвера - ОбъектВнешнейКомпоненты
// ПараметрыПодключения - Структура
// ДанныеОперации - Структура - данные операции для выполнения команды
//
Асинх Функция ЗакрытьСмену(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
Если ПараметрыПодключения.ТипыОборудования.Свойство("ПринтерЧеков") И ПараметрыПодключения.ТипыОборудования.ПринтерЧеков Тогда
РезультатВыполнения = Ждать ПечатьТекста(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли ПараметрыПодключения.ТипыОборудования.ККТ Тогда
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь);
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "CloseShift", ДанныеОперации, ", ПараметрыXML");
Если ПараметрыПодключения.РевизияИнтерфейса >= 3000 Тогда // Версия стандарта 3.0 (ОФД 1.1)
РезультатВызова = Ждать ОбъектДрайвера.ЗакрытьСменуАсинх(ПараметрыПодключения.ИДУстройства, ДанныеОперации.ПараметрыXML, ДанныеОперации.РезультатXML); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Иначе
РезультатВызова = Ждать ОбъектДрайвера.ЗакрытьСменуАсинх(ПараметрыПодключения.ИДУстройства, ДанныеОперации.ПараметрыXML, ДанныеОперации.РезультатXML,
ДанныеОперации.НомерСменыККТ, ДанныеОперации.НомерЧекаККТ); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
КонецЕсли;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
Возврат ОшибкаВызоваДрайвера("ЗакрытьСмену", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))
КонецПопытки;
Если РезультатВызова.Значение Тогда
ПараметрыВызова = РезультатВызова.Параметры;
ДанныеОперации.СтатусСмены = 1; // Статус 1 - Закрыта, 2 - Открыта, 3 - Истекла.
ДанныеОперации.РезультатXML = ПараметрыВызова[2];
Если ПараметрыВызова.Количество() > 3 Тогда
ДанныеОперации.НомерСменыККТ = ПараметрыВызова[3];
ДанныеОперации.НомерЧекаККТ = ПараметрыВызова[4];
КонецЕсли;
РезультатВыполнения.Результат = Истина;
РезультатВыполнения.Вставить("ДрайверСнятСПоддержки" , ПараметрыПодключения.СнятСПоддержки);
РезультатВыполнения.Вставить("СообщениеПриИспользовании", ПараметрыПодключения.СообщениеПриИспользовании);
Если ПараметрыПодключения.РевизияИнтерфейса > 4001 Тогда
Результат = Ждать УстановитьИнформациюПриложенияАсинх(ОбъектДрайвера, ПараметрыПодключения);
КонецЕсли;
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Иначе
РезультатВыполнения = ОшибкаВызоваДрайвера();
КонецЕсли;
Возврат РезультатВыполнения;
КонецФункции
// Осуществляет открытие смены.
//
// Параметры:
// ОбъектДрайвера - ОбъектВнешнейКомпоненты
// ПараметрыПодключения - Структура
// ДанныеОперации - Структура - данные операции для выполнения команды
//
Асинх Функция ОткрытьСмену(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
Если ПараметрыПодключения.ТипыОборудования.Свойство("ПринтерЧеков") И ПараметрыПодключения.ТипыОборудования.ПринтерЧеков Тогда
РезультатВыполнения = Ждать ПечатьТекста(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли ПараметрыПодключения.ТипыОборудования.ККТ Тогда
ПараметрыККТ = "";
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "GetDataKKT");
РезультатВызова = Ждать ОбъектДрайвера.ПолучитьПараметрыККТАсинх(ПараметрыПодключения.ИДУстройства, ПараметрыККТ); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Исключение
РезультатВыполнения = ОшибкаВызоваДрайвера("ПолучитьПараметрыККТ", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
Возврат РезультатВыполнения;
КонецПопытки;
Если РезультатВызова.Значение Тогда
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
ПараметрыККТ = РезультатВызова.Параметры[1];
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
Возврат РезультатВыполнения;
КонецЕсли;
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь);
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "OpenShift", ДанныеОперации, ", ПараметрыXML");
Если ПараметрыПодключения.РевизияИнтерфейса >= 3000 Тогда // Версия стандарта 3.0 (ОФД 1.1)
РезультатВызова = Ждать ОбъектДрайвера.ОткрытьСменуАсинх(ПараметрыПодключения.ИДУстройства, ДанныеОперации.ПараметрыXML, ДанныеОперации.РезультатXML); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Иначе
РезультатВызова = Ждать ОбъектДрайвера.ОткрытьСменуАсинх(ПараметрыПодключения.ИДУстройства, ДанныеОперации.ПараметрыXML, ДанныеОперации.РезультатXML,
ДанныеОперации.НомерСменыККТ, ДанныеОперации.НомерЧекаККТ); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
КонецЕсли;
Исключение
Возврат ОшибкаВызоваДрайвера("ОткрытьСмену", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))
КонецПопытки;
Если РезультатВызова.Значение Тогда
ПараметрыВызова = РезультатВызова.Параметры;
ДанныеОперации.СтатусСмены = 2; // Статус 1 - Закрыта, 2 - Открыта, 3 - Истекла.
ДанныеОперации.Вставить("ПараметрыККТ", ПараметрыККТ);
ДанныеОперации.РезультатXML = ПараметрыВызова[2];
Если ПараметрыВызова.Количество() > 3 Тогда
ДанныеОперации.НомерСменыККТ = ПараметрыВызова[3];
ДанныеОперации.НомерЧекаККТ = ПараметрыВызова[4];
КонецЕсли;
РезультатВыполнения.Результат = Истина;
РезультатВыполнения.Вставить("ДрайверСнятСПоддержки" , ПараметрыПодключения.СнятСПоддержки);
РезультатВыполнения.Вставить("СообщениеПриИспользовании", ПараметрыПодключения.СообщениеПриИспользовании);
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Иначе
РезультатВыполнения = ОшибкаВызоваДрайвера();
КонецЕсли;
Возврат РезультатВыполнения;
КонецФункции
// Осуществляет открытие денежного ящика.
//
// Параметры:
// ОбъектДрайвера - ОбъектВнешнейКомпоненты
// ПараметрыПодключения - Структура
// ДанныеОперации - Структура - данные операции для выполнения команды
//
Асинх Функция ОткрытьДенежныйЯщик(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "OpenCashDrawer");
РезультатВызова = Ждать ОбъектДрайвера.ОткрытьДенежныйЯщикАсинх(ПараметрыПодключения.ИДУстройства); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Если РезультатВызова.Значение Тогда
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("ОткрытьДенежныйЯщик", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Возврат РезультатВыполнения;
КонецФункции
// Осуществляет формирование отчета о текущем состоянии расчетов.
//
// Параметры:
// ОбъектДрайвера - ОбъектВнешнейКомпоненты
// ПараметрыПодключения - Структура
// ДанныеОперации - Структура - данные операции для выполнения команды
//
Асинх Функция ОтчетОТекущемСостоянииРасчетов(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
Если ПараметрыПодключения.ТипыОборудования.ККТ Тогда
РезультатXML = "";
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "ReportCurrentStatusOfSettlements", ДанныеОперации, ", ПараметрыXML");
РезультатВызова = Ждать ОбъектДрайвера.ОтчетОТекущемСостоянииРасчетовАсинх(ПараметрыПодключения.ИДУстройства, ДанныеОперации.ПараметрыXML, РезультатXML); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Если РезультатВызова.Значение Тогда
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
ДанныеОперации.РезультатXML = РезультатВызова.Параметры[2];
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("ОтчетОТекущемСостоянииРасчетов", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Иначе
РезультатВыполнения = ОшибкаВызоваДрайвера();
КонецЕсли;
Возврат РезультатВыполнения;
КонецФункции
// Осуществляет формирование отчет без гашения.
//
// Параметры:
// ОбъектДрайвера - ОбъектВнешнейКомпоненты
// ПараметрыПодключения - Структура
// ДанныеОперации - Структура - данные операции для выполнения команды
//
Асинх Функция ОтчетБезГашения(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
Если ПараметрыПодключения.ТипыОборудования.Свойство("ПринтерЧеков") И ПараметрыПодключения.ТипыОборудования.ПринтерЧеков Тогда
РезультатВыполнения = Ждать ПечатьТекста(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
ИначеЕсли ПараметрыПодключения.ТипыОборудования.ККТ Тогда
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "PrintXReport", ДанныеОперации, ", ПараметрыXML");
РезультатВызова = Ждать ОбъектДрайвера.НапечататьОтчетБезГашенияАсинх(ПараметрыПодключения.ИДУстройства, ДанныеОперации.ПараметрыXML); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Если РезультатВызова.Значение Тогда
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("НапечататьОтчетБезГашения", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Иначе
РезультатВыполнения = ОшибкаВызоваДрайвера();
КонецЕсли;
Возврат РезультатВыполнения;
КонецФункции
// Осуществляет аннулирование чека.
//
// Параметры:
// ОбъектДрайвера - ОбъектВнешнейКомпоненты
// ПараметрыПодключения - Структура
// ДанныеОперации - Структура - данные операции для выполнения команды
//
Асинх Функция АннулированиеЧека(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
РезультатВыполнения.Вставить("НомерСменыККТ" , Неопределено);
РезультатВыполнения.Вставить("НомерЧекаККТ" , Неопределено);
РезультатВыполнения.Вставить("СтатусСмены", 2);
РезультатВыполнения.Вставить("ДатаВремяЧека", ОбщегоНазначенияБПОКлиент.ДатаСеанса());
Возврат РезультатВыполнения;
КонецФункции
// Осуществляет получение параметров ККТ.
//
// Параметры:
// ОбъектДрайвера - ОбъектВнешнейКомпоненты
// ПараметрыПодключения - Структура
// ДанныеОперации - Структура - данные операции для выполнения команды
//
Асинх Функция ПараметрыККТ(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
Если ПараметрыПодключения.ТипыОборудования.ККТ Тогда
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "GetDataKKT");
РезультатВызова = Ждать ОбъектДрайвера.ПолучитьПараметрыККТАсинх(ПараметрыПодключения.ИДУстройства, ""); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
Возврат ОшибкаВызоваДрайвера("ПолучитьПараметрыККТ", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Если РезультатВызова.Значение Тогда
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
РезультатВыполнения.Вставить("ПараметрыККТXML", РезультатВызова.Параметры[1]);
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Иначе
РезультатВыполнения = ОшибкаВызоваДрайвера();
КонецЕсли;
Возврат РезультатВыполнения;
КонецФункции
// Осуществляет открытие смены.
//
// Параметры:
// ОбъектДрайвера - ОбъектВнешнейКомпоненты
// ПараметрыПодключения - Структура
// ДанныеОперации - Структура - данные операции для выполнения команды
//
Асинх Функция ТекущееСостояние(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
Если НЕ ПараметрыПодключения.ТипыОборудования.ККТ Тогда
Возврат ОшибкаВызоваДрайвера();
КонецЕсли;
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь);
Попытка
Если ПараметрыПодключения.РевизияИнтерфейса >= 3000 Тогда // Версия стандарта 3.0 (ОФД 1.1)
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "GetCurrentStatus", ДанныеОперации, ", ПараметрыXML");
РезультатВызова = Ждать ОбъектДрайвера.ПолучитьТекущееСостояниеАсинх(ПараметрыПодключения.ИДУстройства, ДанныеОперации.ПараметрыXML, ДанныеОперации.РезультатXML); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Иначе
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "GetCurrentStatus");
РезультатВызова = Ждать ОбъектДрайвера.ПолучитьТекущееСостояниеАсинх(ПараметрыПодключения.ИДУстройства, ДанныеОперации.НомерЧекаККТ, ДанныеОперации.НомерСменыККТ,
ДанныеОперации.СтатусСмены, ДанныеОперации.РезультатXML); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
КонецЕсли;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
Возврат ОшибкаВызоваДрайвера("ПолучитьТекущееСостояние", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))
КонецПопытки;
Если РезультатВызова.Значение Тогда
ПараметрыВызова = РезультатВызова.Параметры;
РезультатВыполнения.Результат = Истина;
Если ПараметрыПодключения.РевизияИнтерфейса >= 3000 Тогда
ДанныеОперации.ПараметрыXML = ПараметрыВызова[1];
ДанныеОперации.РезультатXML = ПараметрыВызова[2];
Иначе
ДанныеОперации.НомерЧекаККТ = ПараметрыВызова[1];
ДанныеОперации.НомерСменыККТ = ПараметрыВызова[2];
ДанныеОперации.СтатусСмены = ПараметрыВызова[3];
ДанныеОперации.РезультатXML = ПараметрыВызова[4];
КонецЕсли;
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
Возврат РезультатВыполнения;
КонецЕсли;
Возврат РезультатВыполнения;
КонецФункции
// Процедура осуществляет операцию с фискальным накопителем.
//
Асинх Функция ОперацияФискальногоНакопителя(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
Если НЕ ПараметрыПодключения.ТипыОборудования.ККТ Тогда
Возврат ОшибкаВызоваДрайвера();
КонецЕсли;
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "OperationFN", ДанныеОперации, ", ТипОперации, ПараметрыXML");
РезультатВызова = Ждать ОбъектДрайвера.ОперацияФНАсинх(ПараметрыПодключения.ИДУстройства, ДанныеОперации.ТипОперации, ДанныеОперации.ПараметрыXML); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Если НЕ РезультатВызова.Значение Тогда
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
Возврат РезультатВыполнения;
КонецЕсли;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("ОперацияФН", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "GetDataKKT");
РезультатВызова = Ждать ОбъектДрайвера.ПолучитьПараметрыККТАсинх(ПараметрыПодключения.ИДУстройства, ""); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Если РезультатВызова.Значение Тогда
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
ДанныеОперации.Вставить("ПараметрыККТ", РезультатВызова.Параметры[1]);
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("ПолучитьПараметрыККТ", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Возврат РезультатВыполнения;
КонецФункции
// Функция печать копию чека.
//
Асинх Функция НапечататьКопиюЧека(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
Если НЕ ПараметрыПодключения.ТипыОборудования.ККТ Тогда
Возврат ОшибкаВызоваДрайвера();
КонецЕсли;
Если ДанныеОперации.Свойство("Аппаратно") И ДанныеОперации.Аппаратно Тогда
НомерЧека = 0;
Если ДанныеОперации <> Неопределено И ДанныеОперации.Свойство("НомерЧека") Тогда
НомерЧека = ДанныеОперации.НомерЧека;
КонецЕсли;
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "PrintCheckCopy", ВМассив(, НомерЧека));
РезультатВызова = Ждать ОбъектДрайвера.НапечататьКопиюЧекаАсинх(ПараметрыПодключения.ИДУстройства, НомерЧека); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Если РезультатВызова.Значение Тогда
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
РезультатВыполнения.Вставить("НомерЧека", НомерЧека);
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("НапечататьКопиюЧека", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Иначе
РезультатВыполнения = Ждать ПечатьТекста(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
КонецЕсли;
Возврат РезультатВыполнения;
КонецФункции
// Функция открывает сессию регистрации КМ.
//
Асинх Функция ОткрытьСессиюРегистрацииКМ(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
Если НЕ ПараметрыПодключения.ТипыОборудования.ККТ Или ПараметрыПодключения.РевизияИнтерфейса < 3004 Тогда
ОписаниеОшибки = НСтр("ru='Драйвер не поддерживает операцию.'");
ЗаписатьОшибкуВЛог(ПараметрыПодключения, "OpenSessionRegistrationKM", ОписаниеОшибки);
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
Возврат РезультатВыполнения;
КонецЕсли;
ИдентификаторСессии = МенеджерОборудованияКлиент.СессияПроверкиКодовМаркировки(ПараметрыПодключения.ИдентификаторУстройства);
Если НЕ ПустаяСтрока(ИдентификаторСессии) Тогда
ОписаниеОшибки = НСтр("ru='Сессия проверки кодов маркировки уже открыта.'");
ЗаписатьОшибкуВЛог(ПараметрыПодключения, "OpenSessionRegistrationKM", ОписаниеОшибки);
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
Возврат РезультатВыполнения;
КонецЕсли;
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "OpenSessionRegistrationKM");
РезультатВызова = Ждать ОбъектДрайвера.ОткрытьСессиюРегистрацииКМАсинх(ПараметрыПодключения.ИДУстройства); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Если РезультатВызова.Значение Тогда
ИдентификаторСессии = Строка(Новый УникальныйИдентификатор);
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
РезультатВыполнения.Вставить("ИдентификаторСессии", ИдентификаторСессии);
МенеджерОборудованияКлиент.УстановитьСессиюПроверкиКодовМаркировки(ПараметрыПодключения.ИдентификаторУстройства, ИдентификаторСессии);
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("ОткрытьСессиюРегистрацииКМ", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Возврат РезультатВыполнения;
КонецФункции
// Функция закрывает сессию регистрации КМ.
//
Асинх Функция ЗакрытьСессиюРегистрацииКМ(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
Если НЕ ПараметрыПодключения.ТипыОборудования.ККТ Или ПараметрыПодключения.РевизияИнтерфейса < 3004 Тогда
ОписаниеОшибки = НСтр("ru='Драйвер не поддерживает операцию.'");
ЗаписатьОшибкуВЛог(ПараметрыПодключения, "CloseSessionRegistrationKM", ОписаниеОшибки);
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
Возврат РезультатВыполнения;
КонецЕсли;
ИдентификаторСессии = МенеджерОборудованияКлиент.СессияПроверкиКодовМаркировки(ПараметрыПодключения.ИдентификаторУстройства);
Если ПустаяСтрока(ИдентификаторСессии) Тогда
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
Возврат РезультатВыполнения;
КонецЕсли;
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "CloseSessionRegistrationKM");
РезультатВызова = Ждать ОбъектДрайвера.ЗакрытьСессиюРегистрацииКМАсинх(ПараметрыПодключения.ИДУстройства); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Если РезультатВызова.Значение Тогда
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
МенеджерОборудованияКлиент.УстановитьСессиюПроверкиКодовМаркировки(ПараметрыПодключения.ИдентификаторУстройства);
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("ЗакрытьСессиюРегистрацииКМ", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Возврат РезультатВыполнения;
КонецФункции
// Запрос КМ.
//
Асинх Функция ЗапросКМ(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
Если НЕ ПараметрыПодключения.ТипыОборудования.ККТ Или ПараметрыПодключения.РевизияИнтерфейса < 3004 Тогда
ОписаниеОшибки = НСтр("ru='Драйвер не поддерживает операцию.'");
ЗаписатьОшибкуВЛог(ПараметрыПодключения, "ConfirmKM", ОписаниеОшибки);
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
Возврат РезультатВыполнения;
КонецЕсли;
ТекущийСтатус = МенеджерОборудованияКлиент.ПроверкаКодаМаркировки(ПараметрыПодключения.ИдентификаторУстройства);
ИдентификаторСессии = ТекущийСтатус.ИдентификаторСессии;
ИдентификаторЗапроса = ТекущийСтатус.ИдентификаторЗапроса;
// Если нет открытой сессии - открываем автоматически.
Если ПустаяСтрока(ИдентификаторСессии) Тогда
ВремРезультатВыполнения = Ждать ОткрытьСессиюРегистрацииКМ(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
Если Не ВремРезультатВыполнения.Результат Тогда
Возврат ВремРезультатВыполнения;
Иначе
ИдентификаторСессии = ВремРезультатВыполнения.ИдентификаторСессии;
КонецЕсли;
КонецЕсли;
// Если есть текущая проверка КМ
Если НЕ ПустаяСтрока(ИдентификаторЗапроса) Тогда
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "ConfirmKM", ВМассив(, ИдентификаторЗапроса, 0));
РезультатВызова = Ждать ОбъектДрайвера.ПодтвердитьКМАсинх(ПараметрыПодключения.ИДУстройства, ИдентификаторЗапроса, 0); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
МенеджерОборудованияКлиент.УстановитьПроверкуКодаМаркировки(ПараметрыПодключения.ИдентификаторУстройства);
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("ПодтвердитьКМ", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
Возврат РезультатВыполнения;
КонецПопытки;
КонецЕсли;
ИдентификаторЗапроса = ДанныеОперации.ИдентификаторЗапроса;
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "RequestKM", ВМассив(, Экранировать(ДанныеОперации.ПараметрыXML)));
РезультатВызова = Ждать ОбъектДрайвера.ЗапросКМАсинх(ПараметрыПодключения.ИДУстройства, ДанныеОперации.ПараметрыXML, ""); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Если РезультатВызова.Значение Тогда
ПараметрыВызова = РезультатВызова.Параметры;
РезультатОперацииXML = ПараметрыВызова[2];
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
РезультатВыполнения.Вставить("ИдентификаторСессии" , ИдентификаторСессии);
РезультатВыполнения.Вставить("ИдентификаторЗапроса", ИдентификаторЗапроса);
РезультатВыполнения.Вставить("ЗапросXML" , ДанныеОперации.ПараметрыXML);
РезультатВыполнения.Вставить("РезультатXML", РезультатОперацииXML);
МенеджерОборудованияКлиент.УстановитьРезультатПроверкиКодаМаркировки(ПараметрыПодключения.ИдентификаторУстройства,
ИдентификаторСессии, ДанныеОперации, РезультатВыполнения, ИдентификаторЗапроса);
ПромежуточныйРезультат = МенеджерОборудованияКлиент.ПодключаемоеОборудование().ПромежуточныйРезультат;
ДанныеПромежуточногоРезультата = Новый Структура();
ДанныеПромежуточногоРезультата.Вставить("ДанныеОперации", ДанныеОперации);
ДанныеПромежуточногоРезультата.Вставить("РезультатВыполнения", РезультатВыполнения);
ПромежуточныйРезультат.Вставить("ЗапросКМ", ДанныеПромежуточногоРезультата);
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("ЗапросКМ", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Возврат РезультатВыполнения;
КонецФункции
// Запрос КМ без ожидания ответа.
//
Асинх Функция ЗапросКМБезОжиданияОтвета(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
РезультатВыполнения = Ждать ЗапросКМ(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
СтатусЗапроса = 0;
РезультатОперацииXML = "";
Если РезультатВыполнения.Результат Тогда
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "GetProcessingKMResult");
РезультатВызова = Ждать ОбъектДрайвера.ПолучитьРезультатыЗапросаКМАсинх(ПараметрыПодключения.ИДУстройства, РезультатОперацииXML, СтатусЗапроса); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Если РезультатВызова.Значение Тогда
РезультатОперацииXML = РезультатВызова.Параметры[1];
СтатусЗапроса = РезультатВызова.Параметры[2];
ДанныеОперации.Вставить("РезультатXML", РезультатОперацииXML);
ДанныеОперации.Вставить("СтатусРезультатаКод", СтатусЗапроса);
РезультатВыполнения.Результат = Истина;
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("ПолучитьРезультатыЗапросаКМ", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Если РезультатВызова.Значение Тогда
ДанныеОперации.Вставить("Выбытие", Истина);
РезультатВыполнения = Ждать ПодтвердитьКМ(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
КонецЕсли;
КонецЕсли;
Если РезультатВыполнения.Результат И (СтатусЗапроса = 0 Или СтатусЗапроса = 2) Тогда
ПромежуточныйРезультат = МенеджерОборудованияКлиент.ПодключаемоеОборудование().ПромежуточныйРезультат;
РезультатВыполнения.Вставить("ЗапросКМ", ПромежуточныйРезультат.Получить("ЗапросКМ"));
ПромежуточныйРезультат.Удалить("ЗапросКМ");
ИначеЕсли Не РезультатВыполнения.Результат Тогда
ПромежуточныйРезультат = МенеджерОборудованияКлиент.ПодключаемоеОборудование().ПромежуточныйРезультат;
РезультатВыполнения.Вставить("ЗапросКМ", ПромежуточныйРезультат.Получить("ЗапросКМ"));
ПромежуточныйРезультат.Удалить("ЗапросКМ");
КонецЕсли;
Возврат РезультатВыполнения;
КонецФункции
// Подтвердить результаты запроса КМ.
//
Асинх Функция ПодтвердитьКМ(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
Если НЕ ПараметрыПодключения.ТипыОборудования.ККТ Или ПараметрыПодключения.РевизияИнтерфейса < 3004 Тогда
ОписаниеОшибки = НСтр("ru='Драйвер не поддерживает операцию.'");
ЗаписатьОшибкуВЛог(ПараметрыПодключения, "ConfirmKM", ОписаниеОшибки);
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
Возврат РезультатВыполнения;
КонецЕсли;
ИдентификаторЗапроса = ?(ДанныеОперации.Свойство("ИдентификаторЗапроса"), ДанныеОперации.ИдентификаторЗапроса, "");
Выбытие = ?(ДанныеОперации.Свойство("Выбытие"), ДанныеОперации.Выбытие, Истина);
Если ПустаяСтрока(ИдентификаторЗапроса) Тогда
ОписаниеОшибки = НСтр("ru='Идентификатор запроса КМ не указан.'");
ЗаписатьОшибкуВЛог(ПараметрыПодключения, "ConfirmKM", ОписаниеОшибки);
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
Возврат РезультатВыполнения;
КонецЕсли;
Попытка
ТипПодтверждения = ?(Выбытие, 0, 1);
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "ConfirmKM", ВМассив(, ИдентификаторЗапроса, ТипПодтверждения));
РезультатВызова = Ждать ОбъектДрайвера.ПодтвердитьКМАсинх(ПараметрыПодключения.ИДУстройства, ИдентификаторЗапроса, ТипПодтверждения); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Если РезультатВызова.Значение Тогда
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
РезультатВыполнения.Вставить("ИдентификаторЗапроса", ИдентификаторЗапроса);
МенеджерОборудованияКлиент.УстановитьПроверкуКодаМаркировки(ПараметрыПодключения.ИдентификаторУстройства);
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("ПодтвердитьКМ", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Возврат РезультатВыполнения;
КонецФункции
// Получить результаты запроса КМ.
//
Асинх Функция РезультатыЗапросаКМ(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
Если НЕ ПараметрыПодключения.ТипыОборудования.ККТ Или ПараметрыПодключения.РевизияИнтерфейса < 3004 Тогда
ОписаниеОшибки = НСтр("ru='Драйвер не поддерживает операцию.'");
ЗаписатьОшибкуВЛог(ПараметрыПодключения, "GetProcessingKMResult", ОписаниеОшибки);
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
ПромежуточныйРезультат = МенеджерОборудованияКлиент.ПодключаемоеОборудование().ПромежуточныйРезультат;
РезультатВыполнения.Вставить("ЗапросКМ", ПромежуточныйРезультат.Получить("ЗапросКМ"));
ПромежуточныйРезультат.Удалить("ЗапросКМ");
Возврат РезультатВыполнения;
КонецЕсли;
СтатусЗапроса = 0;
РезультатОперацииXML = "";
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "GetProcessingKMResult");
РезультатВызова = Ждать ОбъектДрайвера.ПолучитьРезультатыЗапросаКМАсинх(ПараметрыПодключения.ИДУстройства, РезультатОперацииXML, СтатусЗапроса); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Если РезультатВызова.Значение Тогда
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
РезультатОперацииXML = РезультатВызова.Параметры[1];
СтатусЗапроса = РезультатВызова.Параметры[2];
ДанныеОперации.Вставить("РезультатXML", РезультатОперацииXML);
ДанныеОперации.Вставить("СтатусРезультатаКод", СтатусЗапроса);
Иначе
ДанныеОперации.Вставить("РезультатXML", "");
ДанныеОперации.Вставить("СтатусРезультатаКод", 0);
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("ПолучитьРезультатыЗапросаКМ", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Если РезультатВыполнения.Результат И (СтатусЗапроса = 0 Или СтатусЗапроса = 2) Тогда
ПромежуточныйРезультат = МенеджерОборудованияКлиент.ПодключаемоеОборудование().ПромежуточныйРезультат;
РезультатВыполнения.Вставить("ЗапросКМ", ПромежуточныйРезультат.Получить("ЗапросКМ"));
ПромежуточныйРезультат.Удалить("ЗапросКМ");
ИначеЕсли Не РезультатВыполнения.Результат Тогда
ПромежуточныйРезультат = МенеджерОборудованияКлиент.ПодключаемоеОборудование().ПромежуточныйРезультат;
РезультатВыполнения.Вставить("ЗапросКМ", ПромежуточныйРезультат.Получить("ЗапросКМ"));
ПромежуточныйРезультат.Удалить("ЗапросКМ");
КонецЕсли;
Возврат РезультатВыполнения;
КонецФункции
// Проверка КМ.
//
Асинх Функция ПроверкаКМ(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
Если НЕ ПараметрыПодключения.ТипыОборудования.ККТ Или ПараметрыПодключения.РевизияИнтерфейса < 3004 Тогда
ОписаниеОшибки = СтрШаблон(
НСтр("ru='Драйвер %1 (версия %2) (рев.%3) не поддерживает операцию проверки кода маркировки. Для корректной работы требуется обновить драйвер.'"),
ПараметрыПодключения.Наименование,
ПараметрыПодключения.ВерсияДрайвера,
ПараметрыПодключения.РевизияИнтерфейса);
ЗаписатьОшибкуВЛог(ПараметрыПодключения, "RequestKM", ОписаниеОшибки);
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
Возврат РезультатВыполнения;
КонецЕсли;
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
РезультатВыполнения.Вставить("ДлительнаяОперация", "ПроверкаКМ");
Возврат РезультатВыполнения;
КонецФункции
// Функция осуществляет фискализацию чека пакетом.
//
Асинх Функция ФискализацияЧекаПакетом(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
Если НЕ ПараметрыПодключения.ТипыОборудования.ККТ Или ПараметрыПодключения.РевизияИнтерфейса < 3004 Тогда
ОписаниеОшибки = НСтр("ru='Драйвер не поддерживает операцию.'");
ЗаписатьОшибкуВЛог(ПараметрыПодключения, "ProcessCheck", ОписаниеОшибки);
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
Возврат РезультатВыполнения;
КонецЕсли;
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "ProcessCheck", ВМассив(, Ложь, ДанныеОперации.ДанныеЧекаXML));
РезультатВызова = Ждать ОбъектДрайвера.СформироватьЧекАсинх(ПараметрыПодключения.ИДУстройства, Ложь, ДанныеОперации.ДанныеЧекаXML, ДанныеОперации.РезультатОперацииXML);; // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("СформироватьЧек", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
Возврат РезультатВыполнения;
КонецПопытки;
Если РезультатВызова.Значение Тогда
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Возврат РезультатВыполнения;
КонецФункции
#КонецОбласти
#Область ЭквайринговыеТерминалы
Функция РезультатЭквайринговойОперации(Результат, ОписаниеОшибки, ПараметрыПодключения) Экспорт
РезультатВыполнения = РезультатОперацииНаОборудовании(Результат, ОписаниеОшибки, ПараметрыПодключения.ИдентификаторУстройства);
РезультатВыполнения.Вставить("ВидОплатыНаТерминале");
РезультатВыполнения.Вставить("ВидОплатыНаТерминалеКод", 0);
РезультатВыполнения.Вставить("НомерМерчанта");
РезультатВыполнения.Вставить("НомерКарты");
РезультатВыполнения.Вставить("НомерЧекаЭТ");
РезультатВыполнения.Вставить("СсылочныйНомер");
РезультатВыполнения.Вставить("КодАвторизации");
РезультатВыполнения.Вставить("СтатусОперации");
РезультатВыполнения.Вставить("РеквизитыКартыQR");
РезультатВыполнения.Вставить("ИдентификаторКорзины");
РезультатВыполнения.Вставить("СуммаОперации");
РезультатВыполнения.Вставить("СуммаЭлектронногоСертификата");
РезультатВыполнения.Вставить("СуммаСобственныхСредств");
РезультатВыполнения.Вставить("ТекстСлипЧека");
РезультатВыполнения.Вставить("ХешНомерКарты");
РезультатВыполнения.Вставить("СсылкаНаПлатежныйСчет");
РезультатВыполнения.Вставить("ДатаВремя");
РезультатВыполнения.Вставить("КодЗавершения");
РезультатВыполнения.Вставить("ИдентификаторПлатежнойСистемы");
РезультатВыполнения.Вставить("ИдентификаторБанковскойТранзакции");
РезультатВыполнения.Вставить("ИдентификаторТерминала" , ПараметрыПодключения.ИдентификаторТерминала);
РезультатВыполнения.Вставить("ИдентификаторБанкаЭквайера", ПараметрыПодключения.ИдентификаторБанкаЭквайера);
Возврат РезультатВыполнения;
КонецФункции
// Процедура возвращает параметры терминале.
//
Асинх Функция ПараметрыТерминала(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
Если ПараметрыПодключения.РевизияИнтерфейса >= 3004 Тогда
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "TerminalParamters");
РезультатВызова = Ждать ОбъектДрайвера.ПараметрыТерминалаАсинх(ПараметрыПодключения.ИДУстройства, ""); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
РезультатОперацииXML = РезультатВызова.Параметры[1];
Если РезультатВызова.Значение Тогда
ПараметрыТерминала = ОбщегоНазначенияБПОКлиент.ПрочитатьКорневойЭлементXML(РезультатОперацииXML);
Если ПараметрыТерминала.Свойство("TerminalID") И Не ПустаяСтрока(ПараметрыТерминала.TerminalID) Тогда
ПараметрыПодключения.ИдентификаторТерминала = ПараметрыТерминала.TerminalID;
КонецЕсли;
Если ПараметрыТерминала.Свойство("AcquiringBankIdentifier") И Не ПустаяСтрока(ПараметрыТерминала.AcquiringBankIdentifier) Тогда
ПараметрыПодключения.ИдентификаторБанкаЭквайера = ПараметрыТерминала.AcquiringBankIdentifier;
КонецЕсли;
ПараметрыПодключения.ПечатьКвитанцийНаТерминале = ПараметрыТерминала.Свойство("PrintSlipOnTerminal") И ВРег(ПараметрыТерминала.PrintSlipOnTerminal) = "TRUE";
ПараметрыПодключения.КороткиеСлипЧеки = ПараметрыТерминала.Свойство("ShortSlip") И ВРег(ПараметрыТерминала.ShortSlip) = "TRUE";
ПараметрыПодключения.ВыдачиНаличныхДенежныхСредств = ПараметрыТерминала.Свойство("CashWithdrawal") И ВРег(ПараметрыТерминала.CashWithdrawal) = "TRUE";
ПараметрыПодключения.ОплатаЭлектроннымиСертификатами = ПараметрыТерминала.Свойство("ElectronicCertificates") И ВРег(ПараметрыТерминала.ElectronicCertificates) = "TRUE";
ПараметрыПодключения.ЧастичнаяОтмена = ПараметрыТерминала.Свойство("PartialCancellation") И ВРег(ПараметрыТерминала.PartialCancellation) = "TRUE";
ПараметрыПодключения.ConsumerPresentedQR = ПараметрыТерминала.Свойство("ConsumerPresentedQR") И ВРег(ПараметрыТерминала.ConsumerPresentedQR) = "TRUE";
ПараметрыПодключения.ПокупкаСЗачислениемНаКарту = ПараметрыТерминала.Свойство("PurchaseWithEnrollment") И ВРег(ПараметрыТерминала.PurchaseWithEnrollment) = "TRUE";
ПараметрыПодключения.СписокОперацийПоКартам = ПараметрыТерминала.Свойство("ListCardTransactions") И ВРег(ПараметрыТерминала.ListCardTransactions) = "TRUE";
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
КонецЕсли
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("ПараметрыТерминала", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Иначе
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "PrintSlipOnTerminal");
РезультатВызова = Ждать ОбъектДрайвера.ПечатьКвитанцийНаТерминалеАсинх(); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
ПараметрыПодключения.ПечатьКвитанцийНаТерминале = РезультатВызова.Значение;
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("ПечатьКвитанцийНаТерминале", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЕсли;
Возврат РезультатВыполнения;
КонецФункции
// Функция выполняет получение параметров карты.
//
Асинх Функция ПараметрыКарты(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
РевизияИнтерфейса = ПараметрыПодключения.РевизияИнтерфейса;
Если РевизияИнтерфейса > 3004 Тогда
ОтПоследнейОперации = Ложь;
НомерКарты = "";
ХешНомерКарты = "";
РеквизитыКартыQR = "";
СсылкаНаПлатежныйСчет = "";
ТипКарты = "";
СвояКарта = 0;
Попытка
Если РевизияИнтерфейса >= 4000 Тогда
РеквизитыКартыQR = ?(ДанныеОперации.Свойство("РеквизитыКартыQR"), ДанныеОперации.РеквизитыКартыQR, "");
Если Не ПустаяСтрока(РеквизитыКартыQR) И НЕ ПараметрыПодключения.ConsumerPresentedQR Тогда
ОписаниеОшибки = НСтр("ru='Consumer-Presented QR не поддерживается драйвером.'");
ЗаписатьОшибкуВЛог(ПараметрыПодключения, "GetCardParametrs", ОписаниеОшибки);
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
Возврат РезультатВыполнения;
КонецЕсли;
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "GetCardParametrs", ВМассив(, РеквизитыКартыQR, ОтПоследнейОперации));
РезультатВызова = Ждать ОбъектДрайвера.ПолучитьПараметрыКартыАсинх(ПараметрыПодключения.ИДУстройства, РеквизитыКартыQR, ОтПоследнейОперации, НомерКарты, ХешНомерКарты, СсылкаНаПлатежныйСчет, ТипКарты, СвояКарта); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
ИначеЕсли РевизияИнтерфейса >= 3007 Тогда
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "GetCardParametrs", ВМассив(,ОтПоследнейОперации));
РезультатВызова = Ждать ОбъектДрайвера.ПолучитьПараметрыКартыАсинх(ПараметрыПодключения.ИДУстройства, ОтПоследнейОперации, НомерКарты, ХешНомерКарты, СсылкаНаПлатежныйСчет, ТипКарты, СвояКарта); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Иначе
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "GetCardParametrs", ВМассив(,ОтПоследнейОперации));
РезультатВызова = Ждать ОбъектДрайвера.ПолучитьПараметрыКартыАсинх(ПараметрыПодключения.ИДУстройства, ОтПоследнейОперации, НомерКарты, ХешНомерКарты, ТипКарты, СвояКарта); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова, ", , НомерКарты, ХешНомерКарты, ТипКарты, СвояКарта");
КонецЕсли;
Если РезультатВызова.Значение Тогда
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
Если РевизияИнтерфейса >= 4000 Тогда
РеквизитыКартыQR = РезультатВызова.Параметры[1];
НомерКарты = РезультатВызова.Параметры[3];
ХешНомерКарты = РезультатВызова.Параметры[4];
СсылкаНаПлатежныйСчет = РезультатВызова.Параметры[5];
ТипКарты = РезультатВызова.Параметры[6];
СвояКарта = РезультатВызова.Параметры[7];
ИначеЕсли РевизияИнтерфейса >= 3007 Тогда
НомерКарты = РезультатВызова.Параметры[2];
ХешНомерКарты = РезультатВызова.Параметры[3];
СсылкаНаПлатежныйСчет = РезультатВызова.Параметры[4];
ТипКарты = РезультатВызова.Параметры[5];
СвояКарта = РезультатВызова.Параметры[6];
Иначе
НомерКарты = РезультатВызова.Параметры[2];
ХешНомерКарты = РезультатВызова.Параметры[3];
ТипКарты = РезультатВызова.Параметры[4];
СвояКарта = РезультатВызова.Параметры[5];
КонецЕсли;
РезультатВыполнения.Вставить("НомерКарты" , НомерКарты);
РезультатВыполнения.Вставить("ХешНомерКарты", ХешНомерКарты);
РезультатВыполнения.Вставить("СсылкаНаПлатежныйСчет", СсылкаНаПлатежныйСчет);
РезультатВыполнения.Вставить("РеквизитыКартыQR" , РеквизитыКартыQR);
РезультатВыполнения.Вставить("ТипКарты" , ТипКарты);
РезультатВыполнения.Вставить("СвояКарта" , СвояКарта);
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("ПолучитьПараметрыКарты", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Иначе
ОписаниеОшибки = НСтр("ru='Терминал не поддерживает данную операцию.'");
ЗаписатьОшибкуВЛог(ПараметрыПодключения, "GetCardParametrs", ОписаниеОшибки);
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
КонецЕсли;
Возврат РезультатВыполнения;
КонецФункции
// Процедура возвращает операции по картам.
//
Асинх Функция ОперацииПоКартам(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
Если ПараметрыПодключения.РевизияИнтерфейса < 4000 Тогда
ОписаниеОшибки = НСтр("ru='Команда не поддерживается драйвером.'");
ЗаписатьОшибкуВЛог(ПараметрыПодключения, "GetOperationByCards", ОписаниеОшибки);
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
Возврат РезультатВыполнения;
Иначе
Если НЕ ПараметрыПодключения.СписокОперацийПоКартам Тогда
ОписаниеОшибки = НСтр("ru='Терминал не поддерживает данную операцию.'");
ЗаписатьОшибкуВЛог(ПараметрыПодключения, "GetOperationByCards", ОписаниеОшибки);
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
Возврат РезультатВыполнения;
КонецЕсли;
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "GetOperationByCards");
РезультатВызова = Ждать ОбъектДрайвера.ПолучитьОперацииПоКартамАсинх(ПараметрыПодключения.ИДУстройства, ""); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Если РезультатВызова.Значение Тогда
РезультатОперацииXML = РезультатВызова.Параметры[1];
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
РезультатВыполнения.Вставить("РезультатОперацииXML", РезультатОперацииXML);
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("ПолучитьОперацииПоКартам", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЕсли;
Возврат РезультатВыполнения;
КонецФункции
// Функция осуществляет операцию на ЭТ.
//
Асинх Функция ЭквайринговаяОперация(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации, Команда)
РевизияИнтерфейса = ПараметрыПодключения.РевизияИнтерфейса;
РеквизитыКартыQR = ?(ДанныеОперации.РеквизитыКартыQR <> Неопределено, ДанныеОперации.РеквизитыКартыQR, "");
НомерМерчанта = ?(ДанныеОперации.НомерМерчанта <> Неопределено, ДанныеОперации.НомерМерчанта, 0);
НомерКарты = ?(ДанныеОперации.НомерКарты <> Неопределено, ДанныеОперации.НомерКарты, "");
НомерЧека = ?(ДанныеОперации.НомерЧека <> Неопределено, ДанныеОперации.НомерЧека, "");
СсылочныйНомер = ?(ДанныеОперации.СсылочныйНомер <> Неопределено, ДанныеОперации.СсылочныйНомер, "");
КодАвторизации = ?(ДанныеОперации.КодАвторизации <> Неопределено, ДанныеОперации.КодАвторизации, "");
СуммаОперации = ?(ДанныеОперации.СуммаОперации <> Неопределено, ДанныеОперации.СуммаОперации, 0);
СуммаНаличных = ?(ДанныеОперации.СуммаНаличных <> Неопределено, ДанныеОперации.СуммаНаличных, 0);
СуммаОригинальнойОперации = ?(ДанныеОперации.СуммаОригинальнойОперации <> Неопределено, ДанныеОперации.СуммаОригинальнойОперации, 0);
ТекстСлипЧека = "";
Попытка
Если РевизияИнтерфейса >= 4000 Тогда
Если Команда = "AuthorizeSales" Тогда
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "PayByPaymentCard",
ВМассив(,НомерМерчанта,РеквизитыКартыQR,СуммаОперации,НомерКарты,НомерЧека));
РезультатВызова = Ждать ОбъектДрайвера.ОплатитьПлатежнойКартойАсинх(ПараметрыПодключения.ИДУстройства, НомерМерчанта, РеквизитыКартыQR, СуммаОперации,
НомерКарты, НомерЧека, СсылочныйНомер, КодАвторизации, ТекстСлипЧека); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
ИначеЕсли Команда = "AuthorizeRefund" Тогда
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "ReturnPaymentByPaymentCard",
ВМассив(,НомерМерчанта,РеквизитыКартыQR,СуммаОперации,НомерКарты,НомерЧека,СсылочныйНомер,КодАвторизации));
РезультатВызова = Ждать ОбъектДрайвера.ВернутьПлатежПоПлатежнойКартеАсинх(ПараметрыПодключения.ИДУстройства, НомерМерчанта, РеквизитыКартыQR, СуммаОперации,
НомерКарты, НомерЧека, СсылочныйНомер, КодАвторизации, ТекстСлипЧека); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
ИначеЕсли Команда = "AuthorizeVoid" Тогда
Если СуммаОригинальнойОперации > 0 И НЕ ПараметрыПодключения.ЧастичнаяОтмена Тогда
ОписаниеОшибки = НСтр("ru='Частичная отмена не поддерживается драйвером.'");
ЗаписатьОшибкуВЛог(ПараметрыПодключения, "CancelPaymentByPaymentCard", ОписаниеОшибки);
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
Возврат РезультатВыполнения;
Иначе
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "ReturnPaymentByPaymentCard",
ВМассив(,НомерМерчанта,РеквизитыКартыQR,СуммаОперации,НомерКарты,НомерЧека,СсылочныйНомер,КодАвторизации));
РезультатВызова = Ждать ОбъектДрайвера.ОтменитьПлатежПоПлатежнойКартеАсинх(ПараметрыПодключения.ИДУстройства, НомерМерчанта, РеквизитыКартыQR, СуммаОперации,
СуммаОригинальнойОперации, НомерКарты, НомерЧека, СсылочныйНомер, КодАвторизации, ТекстСлипЧека); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
КонецЕсли;
ИначеЕсли Команда = "PayByPaymentCardWithCashWithdrawal" Тогда
Если ПараметрыПодключения.ВыдачиНаличныхДенежныхСредств Тогда
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "PayByPaymentCardWithCashWithdrawal",
ВМассив(,НомерМерчанта,РеквизитыКартыQR,СуммаОперации,СуммаНаличных));
РезультатВызова = Ждать ОбъектДрайвера.ОплатитьПлатежнойКартойCВыдачейНаличныхАсинх(ПараметрыПодключения.ИДУстройства, НомерМерчанта, РеквизитыКартыQR, СуммаОперации,
СуммаНаличных, НомерКарты, НомерЧека, СсылочныйНомер, КодАвторизации, ТекстСлипЧека); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Иначе
ОписаниеОшибки = НСтр("ru='Терминал не поддерживает данную операцию.'");
ЗаписатьОшибкуВЛог(ПараметрыПодключения, "PayByPaymentCardWithCashWithdrawal", ОписаниеОшибки);
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
Возврат РезультатВыполнения;
КонецЕсли;
Иначе
ОписаниеОшибки = НСтр("ru='Команда не поддерживается драйвером.'");
ЗаписатьОшибкуВЛог(ПараметрыПодключения, Команда, ОписаниеОшибки);
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
Возврат РезультатВыполнения;
КонецЕсли;
ИначеЕсли РевизияИнтерфейса >= 3005 Тогда
Если Команда = "AuthorizeSales" Тогда
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "PayByPaymentCard", ВМассив(, НомерМерчанта, СуммаОперации, НомерКарты, НомерЧека));
РезультатВызова = Ждать ОбъектДрайвера.ОплатитьПлатежнойКартойАсинх(ПараметрыПодключения.ИДУстройства, НомерМерчанта, СуммаОперации,
НомерКарты, НомерЧека, СсылочныйНомер, КодАвторизации, ТекстСлипЧека); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
ИначеЕсли Команда = "AuthorizeRefund" Тогда
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "ReturnPaymentByPaymentCard",
ВМассив(,НомерМерчанта,СуммаОперации,НомерКарты,НомерЧека,СсылочныйНомер,КодАвторизации));
РезультатВызова = Ждать ОбъектДрайвера.ВернутьПлатежПоПлатежнойКартеАсинх(ПараметрыПодключения.ИДУстройства, НомерМерчанта, СуммаОперации,
НомерКарты, НомерЧека, СсылочныйНомер, КодАвторизации, ТекстСлипЧека); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
ИначеЕсли Команда = "AuthorizeVoid" Тогда
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "CancelPaymentByPaymentCard",
ВМассив(,НомерМерчанта,СуммаОперации,НомерКарты,НомерЧека,СсылочныйНомер,КодАвторизации));
РезультатВызова = Ждать ОбъектДрайвера.ОтменитьПлатежПоПлатежнойКартеАсинх(ПараметрыПодключения.ИДУстройства, НомерМерчанта, СуммаОперации,
НомерКарты, НомерЧека, СсылочныйНомер, КодАвторизации, ТекстСлипЧека); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
ИначеЕсли РевизияИнтерфейса >= 3006 И Команда = "PayByPaymentCardWithCashWithdrawal" Тогда
Если ПараметрыПодключения.ВыдачиНаличныхДенежныхСредств Тогда
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "PayByPaymentCardWithCashWithdrawal",
ВМассив(,НомерМерчанта,СуммаОперации,СуммаНаличных));
РезультатВызова = Ждать ОбъектДрайвера.ОплатитьПлатежнойКартойCВыдачейНаличныхАсинх(ПараметрыПодключения.ИДУстройства, НомерМерчанта, СуммаОперации,
СуммаНаличных, НомерКарты, НомерЧека, СсылочныйНомер, КодАвторизации, ТекстСлипЧека); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова, ", , , НомерКарты, НомерЧека, СсылочныйНомер, КодАвторизации, ТекстСлипЧека");
Иначе
ОписаниеОшибки = НСтр("ru='Терминал не поддерживает данную операцию.'");
ЗаписатьОшибкуВЛог(ПараметрыПодключения, "PayByPaymentCardWithCashWithdrawal", ОписаниеОшибки);
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
Возврат РезультатВыполнения;
КонецЕсли;
Иначе
ОписаниеОшибки = НСтр("ru='Команда не поддерживается драйвером.'");
ЗаписатьОшибкуВЛог(ПараметрыПодключения, Команда, ОписаниеОшибки);
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
Возврат РезультатВыполнения;
КонецЕсли;
Иначе
Если Команда = "AuthorizeSales" Тогда
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "PayByPaymentCard", ВМассив(,НомерКарты, СуммаОперации, НомерЧека));
РезультатВызова = Ждать ОбъектДрайвера.ОплатитьПлатежнойКартойАсинх(ПараметрыПодключения.ИДУстройства, НомерКарты, СуммаОперации,
НомерЧека, СсылочныйНомер, КодАвторизации, ТекстСлипЧека); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
ИначеЕсли Команда = "AuthorizeRefund" Тогда
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "ReturnPaymentByPaymentCard",
ВМассив(,НомерКарты,СуммаОперации,НомерЧека,СсылочныйНомер,КодАвторизации));
РезультатВызова = Ждать ОбъектДрайвера.ВернутьПлатежПоПлатежнойКартеАсинх(ПараметрыПодключения.ИДУстройства, НомерКарты, СуммаОперации,
НомерЧека, СсылочныйНомер, КодАвторизации, ТекстСлипЧека); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
ИначеЕсли Команда = "AuthorizeVoid" Тогда
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "CancelPaymentByPaymentCard",
ВМассив(,НомерКарты,СуммаОперации,НомерЧека,СсылочныйНомер,КодАвторизации));
РезультатВызова = Ждать ОбъектДрайвера.ОтменитьПлатежПоПлатежнойКартеАсинх(ПараметрыПодключения.ИДУстройства, НомерКарты, СуммаОперации,
НомерЧека, СсылочныйНомер, КодАвторизации, ТекстСлипЧека); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Иначе
ОписаниеОшибки = НСтр("ru='Команда не поддерживается драйвером.'");
ЗаписатьОшибкуВЛог(ПараметрыПодключения, Команда, ОписаниеОшибки);
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
Возврат РезультатВыполнения;
КонецЕсли;
КонецЕсли;
Если РезультатВызова.Значение Тогда
Если РевизияИнтерфейса >= 4000 Тогда
НомерМерчанта = РезультатВызова.Параметры[1];
РеквизитыКартыQR = РезультатВызова.Параметры[2];
СуммаОперации = РезультатВызова.Параметры[3];
Если Команда = "AuthorizeVoid" Тогда
НомерКарты = РезультатВызова.Параметры[5];
НомерЧека = РезультатВызова.Параметры[6];
СсылочныйНомер = РезультатВызова.Параметры[7];
КодАвторизации = РезультатВызова.Параметры[8];
ТекстСлипЧека = РезультатВызова.Параметры[9];
ИначеЕсли Команда = "PayByPaymentCardWithCashWithdrawal" Тогда
СуммаНаличных = РезультатВызова.Параметры[4];
НомерКарты = РезультатВызова.Параметры[5];
НомерЧека = РезультатВызова.Параметры[6];
СсылочныйНомер = РезультатВызова.Параметры[7];
КодАвторизации = РезультатВызова.Параметры[8];
ТекстСлипЧека = РезультатВызова.Параметры[9];
Иначе
НомерКарты = РезультатВызова.Параметры[4];
НомерЧека = РезультатВызова.Параметры[5];
СсылочныйНомер = РезультатВызова.Параметры[6];
КодАвторизации = РезультатВызова.Параметры[7];
ТекстСлипЧека = РезультатВызова.Параметры[8];
КонецЕсли;
ИначеЕсли РевизияИнтерфейса >= 3005 Тогда
НомерМерчанта = РезультатВызова.Параметры[1];
СуммаОперации = РезультатВызова.Параметры[2];
Если Команда = "PayByPaymentCardWithCashWithdrawal" Тогда
СуммаНаличных = РезультатВызова.Параметры[3];
НомерКарты = РезультатВызова.Параметры[4];
НомерЧека = РезультатВызова.Параметры[5];
СсылочныйНомер = РезультатВызова.Параметры[6];
КодАвторизации = РезультатВызова.Параметры[7];
ТекстСлипЧека = РезультатВызова.Параметры[8];
Иначе
НомерКарты = РезультатВызова.Параметры[3];
НомерЧека = РезультатВызова.Параметры[4];
СсылочныйНомер = РезультатВызова.Параметры[5];
КодАвторизации = РезультатВызова.Параметры[6];
ТекстСлипЧека = РезультатВызова.Параметры[7];
КонецЕсли;
Иначе
НомерКарты = РезультатВызова.Параметры[1];
СуммаОперации = РезультатВызова.Параметры[2];
НомерЧека = РезультатВызова.Параметры[3];
СсылочныйНомер = РезультатВызова.Параметры[4];
КодАвторизации = РезультатВызова.Параметры[5];
ТекстСлипЧека = РезультатВызова.Параметры[6];
КонецЕсли;
РезультатВыполнения = РезультатЭквайринговойОперации(Истина, Неопределено, ПараметрыПодключения);
РезультатВыполнения.НомерМерчанта = НомерМерчанта;
РезультатВыполнения.НомерКарты = НомерКарты;
РезультатВыполнения.НомерЧекаЭТ = НомерЧека;
РезультатВыполнения.СсылочныйНомер = СсылочныйНомер;
РезультатВыполнения.КодАвторизации = КодАвторизации;
РезультатВыполнения.СуммаОперации = СуммаОперации;
РезультатВыполнения.РеквизитыКартыQR = РеквизитыКартыQR;
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
РезультатВыполнения.Вставить("ТекстСлипЧека" , ТекстСлипЧека);
ПодключаемоеОборудование = МенеджерОборудованияКлиент.ПодключаемоеОборудование();
ПодключаемоеОборудование.ПоследнийСлипЧек = ТекстСлипЧека;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера(Команда, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Возврат РезультатВыполнения;
КонецФункции
// Функция осуществляет операцию на ЭТ в XML режиме.
//
Асинх Функция ЭквайринговаяОперацияXML(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации, Команда)
Если ПараметрыПодключения.РевизияИнтерфейса < 4003 Тогда
ОписаниеОшибки = НСтр("ru='Команда не поддерживается драйвером.'");
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
Возврат РезультатВыполнения;
КонецЕсли;
РеквизитыКартыQR = ?(ДанныеОперации.РеквизитыКартыQR <> Неопределено, ДанныеОперации.РеквизитыКартыQR, "");
СуммаОперации = ?(ДанныеОперации.СуммаОперации <> Неопределено, ДанныеОперации.СуммаОперации, 0);
НомерМерчанта = ?(ДанныеОперации.НомерМерчанта <> Неопределено, ДанныеОперации.НомерМерчанта, 0);
СуммаОригинальнойОперации = ?(ДанныеОперации.СуммаОригинальнойОперации <> Неопределено, ДанныеОперации.СуммаОригинальнойОперации, 0);
ВходяшиеПараметрыXML = ?(ДанныеОперации.Свойство("ВходяшиеПараметрыXML"), ДанныеОперации.ВходяшиеПараметрыXML, "");
ТекстСлипЧека = "";
ИсходящиеПараметрыXML = "";
Попытка
Если Команда = "AuthorizeSales" Тогда
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "Pay", ВМассив(,ВходяшиеПараметрыXML));
РезультатВызова = Ждать ОбъектДрайвера.ОплатитьАсинх(ПараметрыПодключения.ИДУстройства, ВходяшиеПараметрыXML, ИсходящиеПараметрыXML, ТекстСлипЧека); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
ИначеЕсли Команда = "AuthorizeRefund" Тогда
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "ReturnPayment", ВМассив(,ВходяшиеПараметрыXML));
РезультатВызова = Ждать ОбъектДрайвера.ВернутьПлатежАсинх(ПараметрыПодключения.ИДУстройства, ВходяшиеПараметрыXML, ИсходящиеПараметрыXML, ТекстСлипЧека); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
ИначеЕсли Команда = "AuthorizeVoid" Тогда
Если СуммаОригинальнойОперации > 0 И НЕ ПараметрыПодключения.ЧастичнаяОтмена Тогда
ОписаниеОшибки = НСтр("ru='Частичная отмена не поддерживается драйвером.'");
ЗаписатьОшибкуВЛог(ПараметрыПодключения, "CancelPayment", ОписаниеОшибки);
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
Возврат РезультатВыполнения;
Иначе
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "CancelPayment", ВМассив(,ВходяшиеПараметрыXML));
РезультатВызова = Ждать ОбъектДрайвера.ОтменитьПлатежАсинх(ПараметрыПодключения.ИДУстройства, ВходяшиеПараметрыXML, ИсходящиеПараметрыXML, ТекстСлипЧека); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
КонецЕсли;
ИначеЕсли Команда = "PayByPaymentCardWithCashWithdrawal" Тогда
Если ПараметрыПодключения.ВыдачиНаличныхДенежныхСредств Тогда
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "PayWithCashWithdrawal", ВМассив(,ВходяшиеПараметрыXML));
РезультатВызова = Ждать ОбъектДрайвера.ОплатаCВыдачейНаличныхАсинх(ПараметрыПодключения.ИДУстройства, ВходяшиеПараметрыXML, ИсходящиеПараметрыXML, ТекстСлипЧека); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Иначе
ОписаниеОшибки = НСтр("ru='Терминал не поддерживает данную операцию.'");
ЗаписатьОшибкуВЛог(ПараметрыПодключения, "PayWithCashWithdrawal", ОписаниеОшибки);
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
Возврат РезультатВыполнения;
КонецЕсли;
ИначеЕсли Команда = "PurchaseWithEnrollment" Тогда
Если ПараметрыПодключения.ПокупкаСЗачислениемНаКарту Тогда
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "PurchaseWithEnrollment", ВМассив(,ВходяшиеПараметрыXML));
РезультатВызова = Ждать ОбъектДрайвера.ПокупкаСЗачислениемАсинх(ПараметрыПодключения.ИДУстройства, ВходяшиеПараметрыXML, ИсходящиеПараметрыXML, ТекстСлипЧека); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Иначе
ОписаниеОшибки = НСтр("ru='Терминал не поддерживает данную операцию.'");
ЗаписатьОшибкуВЛог(ПараметрыПодключения, "PurchaseWithEnrollment", ОписаниеОшибки);
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
Возврат РезультатВыполнения;
КонецЕсли;
ИначеЕсли Команда = "AuthorizePreSales" Тогда
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "Authorisation", ВМассив(,ВходяшиеПараметрыXML));
РезультатВызова = Ждать ОбъектДрайвера.ПреавторизацияАсинх(ПараметрыПодключения.ИДУстройства, ВходяшиеПараметрыXML, ИсходящиеПараметрыXML, ТекстСлипЧека); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
ИначеЕсли Команда = "AuthorizeCompletion" Тогда
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "AuthConfirmation", ВМассив(,ВходяшиеПараметрыXML));
РезультатВызова = Ждать ОбъектДрайвера.ЗавершитьПреавторизациюАсинх(ПараметрыПодключения.ИДУстройства, ВходяшиеПараметрыXML, ИсходящиеПараметрыXML, ТекстСлипЧека); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
ИначеЕсли Команда = "AuthorizeVoidPreSales" Тогда
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "CancelAuthorisation", ВМассив(,ВходяшиеПараметрыXML));
РезультатВызова = Ждать ОбъектДрайвера.ОтменитьПреавторизациюАсинх(ПараметрыПодключения.ИДУстройства, ВходяшиеПараметрыXML, ИсходящиеПараметрыXML, ТекстСлипЧека); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Иначе
ОписаниеОшибки = НСтр("ru='Команда не поддерживается драйвером.'");
ЗаписатьОшибкуВЛог(ПараметрыПодключения, Команда, ОписаниеОшибки);
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
Возврат РезультатВыполнения;
КонецЕсли;
Если РезультатВызова.Значение Тогда
РезультатВыполнения = РезультатЭквайринговойОперации(Истина, Неопределено, ПараметрыПодключения);
РезультатВыполнения.НомерМерчанта = НомерМерчанта;
РезультатВыполнения.СуммаОперации = СуммаОперации;
РезультатВыполнения.РеквизитыКартыQR = РеквизитыКартыQR;
ВходяшиеПараметрыXML = РезультатВызова.Параметры[1];
ИсходящиеПараметрыXML = РезультатВызова.Параметры[2];
РезультатВыполнения.Вставить("ВходяшиеПараметрыXML" , ВходяшиеПараметрыXML);
РезультатВыполнения.Вставить("ИсходящиеПараметрыXML" , ИсходящиеПараметрыXML);
ТекстСлипЧека = РезультатВызова.Параметры[3];
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
РезультатВыполнения.Вставить("ТекстСлипЧека" , ТекстСлипЧека);
ПодключаемоеОборудование = МенеджерОборудованияКлиент.ПодключаемоеОборудование();
ПодключаемоеОборудование.ПоследнийСлипЧек = ТекстСлипЧека;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера(Команда, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Возврат РезультатВыполнения;
КонецФункции
// Функция осуществляет операцию на ЭТ c электронным сертификатом.
//
Асинх Функция ЭквайринговаяОперацияСЭлектроннымСертификатом(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации, Команда)
Если ПараметрыПодключения.РевизияИнтерфейса < 3005 Тогда
ОписаниеОшибки = НСтр("ru='Команда не поддерживается драйвером.'");
ЗаписатьОшибкуВЛог(ПараметрыПодключения, Команда, ОписаниеОшибки);
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
Возврат РезультатВыполнения;
КонецЕсли;
РеквизитыКартыQR = ?(ДанныеОперации.РеквизитыКартыQR <> Неопределено, ДанныеОперации.РеквизитыКартыQR, "");
НомерМерчанта = ?(ДанныеОперации.НомерМерчанта <> Неопределено, ДанныеОперации.НомерМерчанта, 0);
НомерКарты = ?(ДанныеОперации.НомерКарты <> Неопределено, ДанныеОперации.НомерКарты, "");
НомерЧека = ?(ДанныеОперации.НомерЧека <> Неопределено, ДанныеОперации.НомерЧека, "");
СсылочныйНомер = ?(ДанныеОперации.СсылочныйНомер <> Неопределено, ДанныеОперации.СсылочныйНомер, "");
КодАвторизации = ?(ДанныеОперации.КодАвторизации <> Неопределено, ДанныеОперации.КодАвторизации, "");
ИдентификаторКорзины = ?(ДанныеОперации.ИдентификаторКорзины <> Неопределено, ДанныеОперации.ИдентификаторКорзины, "");
СуммаЭлектронногоСертификата = ?(ДанныеОперации.СуммаЭлектронногоСертификата <> Неопределено, ДанныеОперации.СуммаЭлектронногоСертификата, 0);
СуммаСобственныхСредств = ?(ДанныеОперации.СуммаСобственныхСредств <> Неопределено, ДанныеОперации.СуммаСобственныхСредств, 0);
ТекстСлипЧека = "";
СтатусОперации = 0;
Если НЕ ПараметрыПодключения.ОплатаЭлектроннымиСертификатами Тогда
ОписаниеОшибки = НСтр("ru='Терминал не поддерживает данную операцию.'");
ЗаписатьОшибкуВЛог(ПараметрыПодключения, Команда, ОписаниеОшибки);
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
Возврат РезультатВыполнения;
КонецЕсли;
Попытка
Если ПараметрыПодключения.РевизияИнтерфейса >= 4000 Тогда
Если Команда = "PayElectronicCertificate" Тогда
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "PayElectronicCertificate",
ВМассив(,НомерМерчанта, РеквизитыКартыQR, ИдентификаторКорзины, СуммаЭлектронногоСертификата, СуммаСобственныхСредств));
РезультатВызова = Ждать ОбъектДрайвера.ОплатитьЭлектроннымСертификатомАсинх(ПараметрыПодключения.ИДУстройства, НомерМерчанта, РеквизитыКартыQR, ИдентификаторКорзины,
СуммаЭлектронногоСертификата, СуммаСобственныхСредств, НомерКарты, НомерЧека,
СсылочныйНомер, КодАвторизации, СтатусОперации, ТекстСлипЧека); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
ИначеЕсли Команда = "ReturnElectronicCertificate" Тогда
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "PayElectronicCertificate",
ВМассив(,НомерМерчанта, РеквизитыКартыQR, ИдентификаторКорзины, СуммаЭлектронногоСертификата, СуммаСобственныхСредств, НомерКарты, НомерЧека, СсылочныйНомер));
РезультатВызова = Ждать ОбъектДрайвера.ВернутьЭлектроннымСертификатомАсинх(ПараметрыПодключения.ИДУстройства, НомерМерчанта, РеквизитыКартыQR, ИдентификаторКорзины,
СуммаЭлектронногоСертификата, СуммаСобственныхСредств, НомерКарты, НомерЧека,
СсылочныйНомер, КодАвторизации, СтатусОперации, ТекстСлипЧека); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Иначе
ОписаниеОшибки = НСтр("ru='Команда не поддерживается драйвером.'");
ЗаписатьОшибкуВЛог(ПараметрыПодключения, Команда, ОписаниеОшибки);
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
Возврат РезультатВыполнения;
КонецЕсли;
Иначе
Если Команда = "PayElectronicCertificate" Тогда
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "PayElectronicCertificate",
ВМассив(,НомерМерчанта, ИдентификаторКорзины, СуммаЭлектронногоСертификата, СуммаСобственныхСредств));
РезультатВызова = Ждать ОбъектДрайвера.ОплатитьЭлектроннымСертификатомАсинх(ПараметрыПодключения.ИДУстройства, НомерМерчанта, ИдентификаторКорзины,
СуммаЭлектронногоСертификата, СуммаСобственныхСредств, НомерКарты, НомерЧека,
СсылочныйНомер, КодАвторизации, СтатусОперации, ТекстСлипЧека); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
ИначеЕсли Команда = "ReturnElectronicCertificate" Тогда
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "PayElectronicCertificate",
ВМассив(,НомерМерчанта, ИдентификаторКорзины, СуммаЭлектронногоСертификата, СуммаСобственныхСредств, НомерКарты, НомерЧека, СсылочныйНомер));
РезультатВызова = Ждать ОбъектДрайвера.ВернутьЭлектроннымСертификатомАсинх(ПараметрыПодключения.ИДУстройства, НомерМерчанта, ИдентификаторКорзины,
СуммаЭлектронногоСертификата, СуммаСобственныхСредств, НомерКарты, НомерЧека,
СсылочныйНомер, КодАвторизации, СтатусОперации, ТекстСлипЧека); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Иначе
ОписаниеОшибки = НСтр("ru='Команда не поддерживается драйвером.'");
ЗаписатьОшибкуВЛог(ПараметрыПодключения, Команда, ОписаниеОшибки);
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
Возврат РезультатВыполнения;
КонецЕсли;
КонецЕсли;
Если РезультатВызова.Значение Тогда
Если ПараметрыПодключения.РевизияИнтерфейса >= 4000 Тогда
НомерМерчанта = РезультатВызова.Параметры[1];
РеквизитыКартыQR = РезультатВызова.Параметры[2];
ИдентификаторКорзины = РезультатВызова.Параметры[3];
СуммаЭлектронногоСертификата = РезультатВызова.Параметры[4];
СуммаСобственныхСредств = РезультатВызова.Параметры[5];
НомерКарты = РезультатВызова.Параметры[6];
НомерЧека = РезультатВызова.Параметры[7];
СсылочныйНомер = РезультатВызова.Параметры[8];
КодАвторизации = РезультатВызова.Параметры[9];
СтатусОперации = РезультатВызова.Параметры[10];
ТекстСлипЧека = РезультатВызова.Параметры[11];
Иначе
НомерМерчанта = РезультатВызова.Параметры[1];
ИдентификаторКорзины = РезультатВызова.Параметры[2];
СуммаЭлектронногоСертификата = РезультатВызова.Параметры[3];
СуммаСобственныхСредств = РезультатВызова.Параметры[4];
НомерКарты = РезультатВызова.Параметры[5];
НомерЧека = РезультатВызова.Параметры[6];
СсылочныйНомер = РезультатВызова.Параметры[7];
КодАвторизации = РезультатВызова.Параметры[8];
СтатусОперации = РезультатВызова.Параметры[9];
ТекстСлипЧека = РезультатВызова.Параметры[10];
КонецЕсли;
РезультатВыполнения = РезультатЭквайринговойОперации(Истина, Неопределено, ПараметрыПодключения);
РезультатВыполнения.НомерМерчанта = НомерМерчанта;
РезультатВыполнения.НомерКарты = НомерКарты;
РезультатВыполнения.НомерЧекаЭТ = НомерЧека;
РезультатВыполнения.СсылочныйНомер = СсылочныйНомер;
РезультатВыполнения.КодАвторизации = КодАвторизации;
РезультатВыполнения.СтатусОперации = СтатусОперации;
РезультатВыполнения.РеквизитыКартыQR = РеквизитыКартыQR;
РезультатВыполнения.ИдентификаторКорзины = ИдентификаторКорзины;
РезультатВыполнения.СуммаЭлектронногоСертификата = СуммаЭлектронногоСертификата;
РезультатВыполнения.СуммаСобственныхСредств = СуммаСобственныхСредств;
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
РезультатВыполнения.Вставить("ТекстСлипЧека" , ТекстСлипЧека);
ПодключаемоеОборудование = МенеджерОборудованияКлиент.ПодключаемоеОборудование();
ПодключаемоеОборудование.ПоследнийСлипЧек = ТекстСлипЧека;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера(Команда, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Возврат РезультатВыполнения;
КонецФункции
// Функция осуществляет аварийную отмену операции по карте.
//
Асинх Функция АварийнаяОтменаОперации(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "EmergencyReversal");
РезультатВызова = Ждать ОбъектДрайвера.АварийнаяОтменаОперацииАсинх(ПараметрыПодключения.ИДУстройства); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Если РезультатВызова.Значение Тогда
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("АварийнаяОтменаОперации", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Возврат РезультатВыполнения;
КонецФункции
// Функция осуществляет сверку итогов по картам.
//
Асинх Функция ИтогиДняПоКартам(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
ТекстСлипЧека = "";
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "Settlement");
РезультатВызова = Ждать ОбъектДрайвера.ИтогиДняПоКартамАсинх(ПараметрыПодключения.ИДУстройства, ТекстСлипЧека); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Если РезультатВызова.Значение Тогда
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
РезультатВыполнения.Вставить("ТекстСлипЧека", РезультатВызова.Параметры[1]);
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("ИтогиДняПоКартам", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Если ПараметрыПодключения.РевизияИнтерфейса > 4001 Тогда
Результат = Ждать УстановитьИнформациюПриложенияАсинх(ОбъектДрайвера, ПараметрыПодключения);
КонецЕсли;
Возврат РезультатВыполнения;
КонецФункции
// Функция осуществляет операцию на ЭТ c электронным сертификатом в XML режиме.
//
Асинх Функция ЭквайринговаяОперацияСЭлектроннымСертификатомXML(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации, Команда)
Если ПараметрыПодключения.РевизияИнтерфейса < 4003 Тогда
ОписаниеОшибки = НСтр("ru='Команда не поддерживается драйвером.'");
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
Возврат РезультатВыполнения;
КонецЕсли;
РеквизитыКартыQR = ?(ДанныеОперации.РеквизитыКартыQR <> Неопределено, ДанныеОперации.РеквизитыКартыQR, "");
НомерМерчанта = ?(ДанныеОперации.НомерМерчанта <> Неопределено, ДанныеОперации.НомерМерчанта, 0);
ИдентификаторКорзины = ?(ДанныеОперации.ИдентификаторКорзины <> Неопределено, ДанныеОперации.ИдентификаторКорзины, "");
СуммаЭлектронногоСертификата = ?(ДанныеОперации.СуммаЭлектронногоСертификата <> Неопределено, ДанныеОперации.СуммаЭлектронногоСертификата, 0);
СуммаСобственныхСредств = ?(ДанныеОперации.СуммаСобственныхСредств <> Неопределено, ДанныеОперации.СуммаСобственныхСредств, 0);
ВходяшиеПараметрыXML = ?(ДанныеОперации.Свойство("ВходяшиеПараметрыXML"), ДанныеОперации.ВходяшиеПараметрыXML, "");
ТекстСлипЧека = "";
ИсходящиеПараметрыXML = "";
Если НЕ ПараметрыПодключения.ОплатаЭлектроннымиСертификатами Тогда
ОписаниеОшибки = НСтр("ru='Терминал не поддерживает данную операцию.'");
ЗаписатьОшибкуВЛог(ПараметрыПодключения, Команда, ОписаниеОшибки);
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
Возврат РезультатВыполнения;
КонецЕсли;
Попытка
Если Команда = "PayElectronicCertificate" Тогда
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "PayElectronicCertificate", ВМассив(,ВходяшиеПараметрыXML));
РезультатВызова = Ждать ОбъектДрайвера.ОплатитьСертификатомАсинх(ПараметрыПодключения.ИДУстройства, ВходяшиеПараметрыXML, ИсходящиеПараметрыXML, ТекстСлипЧека); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
ИначеЕсли Команда = "ReturnElectronicCertificate" Тогда
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "ReturnElectronicCertificate", ВМассив(,ВходяшиеПараметрыXML));
РезультатВызова = Ждать ОбъектДрайвера.ВернутьСертификатомАсинх(ПараметрыПодключения.ИДУстройства, ВходяшиеПараметрыXML, ИсходящиеПараметрыXML, ТекстСлипЧека); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Иначе
ОписаниеОшибки = НСтр("ru='Команда не поддерживается драйвером.'");
ЗаписатьОшибкуВЛог(ПараметрыПодключения, Команда, ОписаниеОшибки);
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
Возврат РезультатВыполнения;
КонецЕсли;
Если РезультатВызова.Значение Тогда
РезультатВыполнения = РезультатЭквайринговойОперации(Истина, Неопределено, ПараметрыПодключения);
РезультатВыполнения.НомерМерчанта = НомерМерчанта;
РезультатВыполнения.РеквизитыКартыQR = РеквизитыКартыQR;
РезультатВыполнения.ИдентификаторКорзины = ИдентификаторКорзины;
РезультатВыполнения.СуммаЭлектронногоСертификата = СуммаЭлектронногоСертификата;
РезультатВыполнения.СуммаСобственныхСредств = СуммаСобственныхСредств;
ВходяшиеПараметрыXML = РезультатВызова.Параметры[1];
ИсходящиеПараметрыXML = РезультатВызова.Параметры[2];
РезультатВыполнения.Вставить("ВходяшиеПараметрыXML" , ВходяшиеПараметрыXML);
РезультатВыполнения.Вставить("ИсходящиеПараметрыXML" , ИсходящиеПараметрыXML);
ТекстСлипЧека = РезультатВызова.Параметры[3];
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
РезультатВыполнения.Вставить("ТекстСлипЧека" , ТекстСлипЧека);
ПодключаемоеОборудование = МенеджерОборудованияКлиент.ПодключаемоеОборудование();
ПодключаемоеОборудование.ПоследнийСлипЧек = ТекстСлипЧека;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера(Команда, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Возврат РезультатВыполнения;
КонецФункции
#КонецОбласти
#Область ДисплейПокупателя
// Функция возвращает параметры вывода на дисплей покупателя.
//
Асинх Функция ПараметрыВывода(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
Если ПараметрыПодключения.РевизияИнтерфейса >= 3004 Тогда
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "GetCustomerDisplayOptions");
РезультатВызова = Ждать ОбъектДрайвера.ПолучитьПараметрыДисплеяПокупателяАсинх(ПараметрыПодключения.ИДУстройства, ""); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
РезультатОперацииXML = РезультатВызова.Параметры[1];
Если РезультатВызова.Значение Тогда
ПараметрыДисплея = ОбщегоНазначенияБПОКлиент.ПрочитатьКорневойЭлементXML(РезультатОперацииXML);
Если ПараметрыДисплея.Свойство("Columns") И Не ПустаяСтрока(ПараметрыДисплея.Columns) Тогда
ПараметрыПодключения.СтолбцовНаДисплее = Число(ПараметрыДисплея.Columns);
КонецЕсли;
Если ПараметрыДисплея.Свойство("Rows") И Не ПустаяСтрока(ПараметрыДисплея.Rows) Тогда
ПараметрыПодключения.СтрокНаДисплее = Число(ПараметрыДисплея.Rows);
КонецЕсли;
ПараметрыПодключения.ДисплейОтображаетТекст = ПараметрыДисплея.Свойство("DisplayText") И ВРег(ПараметрыДисплея.DisplayText) = "TRUE";
ПараметрыПодключения.ДисплейОтображаетГрафику = ПараметрыДисплея.Свойство("DisplayGraphics") И ВРег(ПараметрыДисплея.DisplayGraphics) = "TRUE";
ПараметрыПодключения.ДисплейОтображаетQRКод = ПараметрыДисплея.Свойство("DisplayQRCode") И ВРег(ПараметрыДисплея.DisplayQRCode) = "TRUE";
ПараметрыПодключения.ДисплейОтображаетHTML = ПараметрыДисплея.Свойство("DisplayHTML") И ВРег(ПараметрыДисплея.DisplayHTML) = "TRUE";
ПараметрыПодключения.ДисплейОтображаетСтатус = ПараметрыДисплея.Свойство("DisplayStatus") И ВРег(ПараметрыДисплея.DisplayStatus) = "TRUE";
ПараметрыПодключения.ДисплейОтображаетСостоянияРМ = ПараметрыДисплея.Свойство("DisplayWorkplaceStatus") И ВРег(ПараметрыДисплея.DisplayWorkplaceStatus) = "TRUE";
ПараметрыПодключения.ДисплейОтрабатываетНажатия = ПараметрыДисплея.Свойство("DisplayInteractiveMode") И ВРег(ПараметрыДисплея.DisplayInteractiveMode) = "TRUE";
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
РезультатВыполнения.Вставить("СтолбцовНаДисплее", ПараметрыПодключения.СтолбцовНаДисплее);
РезультатВыполнения.Вставить("СтрокНаДисплее" , ПараметрыПодключения.СтрокНаДисплее);
РезультатВыполнения.Вставить("ДисплейОтображаетТекст" , ПараметрыПодключения.ДисплейОтображаетТекст);
РезультатВыполнения.Вставить("ДисплейОтображаетГрафику", ПараметрыПодключения.ДисплейОтображаетГрафику);
РезультатВыполнения.Вставить("ДисплейОтображаетQRКод" , ПараметрыПодключения.ДисплейОтображаетQRКод);
РезультатВыполнения.Вставить("ДисплейОтображаетHTML" , ПараметрыПодключения.ДисплейОтображаетHTML);
РезультатВыполнения.Вставить("ДисплейОтображаетСтатус" , ПараметрыПодключения.ДисплейОтображаетСтатус);
РезультатВыполнения.Вставить("ДисплейОтображаетСостоянияРМ", ПараметрыПодключения.ДисплейОтображаетСостоянияРМ);
РезультатВыполнения.Вставить("ДисплейОтрабатываетНажатия", ПараметрыПодключения.ДисплейОтрабатываетНажатия);
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("ПолучитьПараметрыДисплеяПокупателя", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Иначе
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "GetOutputOptions");
РезультатВызова = Ждать ОбъектДрайвера.ПолучитьПараметрыВыводаАсинх(ПараметрыПодключения.ИДУстройства, 20, 2); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Если РезультатВызова.Значение Тогда
ПараметрыПодключения.СтолбцовНаДисплее = Число(РезультатВызова.Параметры[1]);
ПараметрыПодключения.СтрокНаДисплее = Число(РезультатВызова.Параметры[2]);
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
РезультатВыполнения.Вставить("СтолбцовНаДисплее", ПараметрыПодключения.СтолбцовНаДисплее);
РезультатВыполнения.Вставить("СтрокНаДисплее" , ПараметрыПодключения.СтрокНаДисплее);
РезультатВыполнения.Вставить("ДисплейОтображаетТекст" , Истина);
РезультатВыполнения.Вставить("ДисплейОтображаетГрафику", Ложь);
РезультатВыполнения.Вставить("ДисплейОтображаетQRКод" , Ложь);
РезультатВыполнения.Вставить("ДисплейОтображаетHTML" , Ложь);
РезультатВыполнения.Вставить("ДисплейОтображаетСтатус" , Ложь);
РезультатВыполнения.Вставить("ДисплейОтображаетСостоянияРМ", Ложь);
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("ПолучитьПараметрыВывода", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЕсли;
Возврат РезультатВыполнения;
КонецФункции
// Функция осуществляет вывод списка строк на дисплей покупателя.
//
Асинх Функция ВывестиСтрокуНаДисплейПокупателя(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
СтрокиТекста = ?(ДанныеОперации.Свойство("СтрокиТекста"), ДанныеОперации.СтрокиТекста, НСтр("ru='Данные для вывода не указаны'"));
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "StringOutputOnCustomerDisplay", ВМассив(,СтрокиТекста));
РезультатВызова = Ждать ОбъектДрайвера.ВывестиСтрокуНаДисплейПокупателяАсинх(ПараметрыПодключения.ИДУстройства, СтрокиТекста); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Если РезультатВызова.Значение Тогда
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("ВывестиСтрокуНаДисплейПокупателя", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Возврат РезультатВыполнения;
КонецФункции
// Функция осуществляет вывод QR кода на дисплей покупателя.
//
Асинх Функция ВывестиQRКодНаДисплейПокупателя(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
ЗначениеQRКода = ?(ДанныеОперации.Свойство("ЗначениеQRКода"), ДанныеОперации.ЗначениеQRКода, "");
КартинкаQRКода = ?(ДанныеОперации.Свойство("КартинкаQRКода"), ДанныеОперации.КартинкаQRКода, "");
СтрокиТекста = ?(ДанныеОперации.Свойство("СтрокиТекста"), ДанныеОперации.СтрокиТекста, "");
Если Не ПустаяСтрока(СтрокиТекста) Тогда
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "StringOutputOnCustomerDisplay", ВМассив(,СтрокиТекста));
РезультатВызова = Ждать ОбъектДрайвера.ВывестиСтрокуНаДисплейПокупателяАсинх(ПараметрыПодключения.ИДУстройства, СтрокиТекста); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Если РезультатВызова.Значение Тогда
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
Возврат РезультатВыполнения;
КонецЕсли;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("ВывестиСтрокуНаДисплейПокупателя", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
Возврат РезультатВыполнения;
КонецПопытки;
КонецЕсли;
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "QRCodeOutputOnCustomerDisplay", ВМассив(,ЗначениеQRКода, КартинкаQRКода));
РезультатВызова = Ждать ОбъектДрайвера.ВывестиQRКодНаДисплейПокупателяАсинх(ПараметрыПодключения.ИДУстройства, ЗначениеQRКода, КартинкаQRКода); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Если РезультатВызова.Значение Тогда
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("ВывестиQRКодНаДисплейПокупателя", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Возврат РезультатВыполнения;
КонецФункции
// Функция осуществляет вывод HTML на дисплей покупателя.
//
Асинх Функция ВывестиHTMLНаДисплейПокупателя(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
ТекстHTML = ?(ДанныеОперации.Свойство("ТекстHTML"), ДанныеОперации.ТекстHTML, "");
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "OutputHTML", ВМассив(,ТекстHTML));
РезультатВызова = Ждать ОбъектДрайвера.ВывестиHTMLАсинх(ПараметрыПодключения.ИДУстройства, ТекстHTML); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Если РезультатВызова.Значение Тогда
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("ВывестиHTML", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Возврат РезультатВыполнения;
КонецФункции
// Функция осуществляет вывод информации на дисплей покупателя.
//
Асинх Функция ВывестиИнформациюНаДисплейПокупателя(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
Если ПараметрыПодключения.ДисплейОтображаетHTML Тогда
РезультатВыполнения = Ждать ВывестиHTMLНаДисплейПокупателя(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
Иначе
Если ПараметрыПодключения.ДисплейОтображаетТекст Тогда
РезультатВыполнения = Ждать ВывестиСтрокуНаДисплейПокупателя(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
КонецЕсли;
Если ПараметрыПодключения.ДисплейОтображаетQRКод Тогда
РезультатВыполнения = Ждать ВывестиQRКодНаДисплейПокупателя(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
КонецЕсли;
Если ПараметрыПодключения.ДисплейОтображаетСтатус Тогда
СтатусОперации = ?(ДанныеОперации.Свойство("СтатусОперации"), ДанныеОперации.СтатусОперации, 0);
Если СтатусОперации = 1 Или СтатусОперации = 2 Тогда
РезультатВыполнения = Ждать ВывестиСтатусНаДисплейПокупателя(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ПараметрыПодключения.ДисплейОтображаетСостоянияРМ Тогда
РезультатВыполнения = Ждать ВывестиСтатусРабочегоМестаНаДисплейПокупателя(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации);
КонецЕсли;
Возврат РезультатВыполнения;
КонецФункции
// Функция осуществляет вывод статуса на дисплей покупателя.
//
Асинх Функция ВывестиСтатусНаДисплейПокупателя(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
Если ПараметрыПодключения.РевизияИнтерфейса < 3009 Тогда
ОписаниеОшибки = НСтр("ru='Устройство не поддерживает данную операцию.'");
ЗаписатьОшибкуВЛог(ПараметрыПодключения, "DisplayOperationStatus", ОписаниеОшибки);
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
Возврат РезультатВыполнения;
КонецЕсли;
СтатусОперации = ?(ДанныеОперации.Свойство("КодСтатусОперации"), ДанныеОперации.КодСтатусОперации, 0);
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "DisplayOperationStatus", ВМассив(,СтатусОперации));
РезультатВызова = Ждать ОбъектДрайвера.ОтобразитьСтатусОперацииАсинх(ПараметрыПодключения.ИДУстройства, СтатусОперации); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Если РезультатВызова.Значение Тогда
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("ОтобразитьСтатусОперации", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Возврат РезультатВыполнения;
КонецФункции
// Функция осуществляет вывод статуса рабочего места на дисплей покупателя.
//
Асинх Функция ВывестиСтатусРабочегоМестаНаДисплейПокупателя(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
Если ПараметрыПодключения.РевизияИнтерфейса < 4001 Тогда
ОписаниеОшибки = НСтр("ru='Устройство не поддерживает данную операцию.'");
ЗаписатьОшибкуВЛог(ПараметрыПодключения, "DisplayWorkplaceStatus", ОписаниеОшибки);
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
Возврат РезультатВыполнения;
КонецЕсли;
СтатусРабочегоМеста = ?(ДанныеОперации.Свойство("КодСтатусаРабочегоМеста"), ДанныеОперации.КодСтатусаРабочегоМеста, 0);
ЗвуковойСигнал = ?(ДанныеОперации.Свойство("ЗвуковойСигнал"), ?(ДанныеОперации.ЗвуковойСигнал, 1, 0), 0);
Если ЗвуковойСигнал = 0
И ПараметрыПодключения.Свойство("КодТекущегоСтатусаРабочегоМеста")
И ПараметрыПодключения.КодТекущегоСтатусаРабочегоМеста = СтатусРабочегоМеста Тогда
Возврат РезультатОперацииНаОборудовании(Истина);
КонецЕсли;
ПараметрыПодключения.Вставить("КодТекущегоСтатусаРабочегоМеста", СтатусРабочегоМеста);
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "DisplayWorkplaceStatus", ВМассив(,СтатусРабочегоМеста, ЗвуковойСигнал));
РезультатВызова = Ждать ОбъектДрайвера.ОтобразитьСтатусРабочегоМестаАсинх(ПараметрыПодключения.ИДУстройства, СтатусРабочегоМеста, ЗвуковойСигнал); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Если РезультатВызова.Значение Тогда
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("ОтобразитьСтатусРабочегоМеста", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Возврат РезультатВыполнения;
КонецФункции
// Функция осуществляет очистку дисплея покупателя.
//
Асинх Функция ОчиститьДисплейПокупателя(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "ClearCustomerDisplay");
РезультатВызова = Ждать ОбъектДрайвера.ОчиститьДисплейПокупателяАсинх(ПараметрыПодключения.ИДУстройства); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Если РезультатВызова.Значение Тогда
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("ОчиститьДисплейПокупателя", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Возврат РезультатВыполнения;
КонецФункции
#КонецОбласти
#Область ЭлектронныеВесы
// Функция возвращает параметры события веса.
//
// Возвращаемое значение:
// Структура - Параметры события веса:
// * ИдентификаторУстройства - СправочникСсылка.ПодключаемоеОборудование
// * Вес - Число
// * Стабилизация - Булево -
// * ОшибкаРазмещения - Булево -
// * ЗонаПересечения - Массив из Число -
//
Функция ПараметрыСобытияВеса() Экспорт
Результат = Новый Структура();
Результат.Вставить("ИдентификаторУстройства");
Результат.Вставить("Вес");
Результат.Вставить("Стабилизация", Истина);
Результат.Вставить("ОшибкаРазмещения", Ложь);
Результат.Вставить("ЗонаПересечения" , Новый Массив());
Возврат Результат;
КонецФункции
// Функция возвращает параметры весов.
//
Асинх Функция ПараметрыВесов(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
Если ПараметрыПодключения.РевизияИнтерфейса >= 4000 Тогда
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "ScaleOptions");
РезультатВызова = Ждать ОбъектДрайвера.ПараметрыВесовАсинх(ПараметрыПодключения.ИДУстройства, ""); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
РезультатОперацииXML = РезультатВызова.Параметры[1];
Если РезультатВызова.Значение Тогда
ПараметрыВесов = ОбщегоНазначенияБПОКлиент.ПрочитатьКорневойЭлементXML(РезультатОперацииXML);
ПараметрыПодключения.ВесыПоддерживаютТарирование = ПараметрыВесов.Свойство("Calibrate") И ВРег(ПараметрыВесов.Calibrate) = "TRUE";
ПараметрыПодключения.СобытиеПолученииВеса = ПараметрыВесов.Свойство("WeighingEvent") И ВРег(ПараметрыВесов.WeighingEvent) = "TRUE";
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
РезультатВыполнения.Вставить("ВесыПоддерживаютТарирование", ПараметрыПодключения.ВесыПоддерживаютТарирование);
РезультатВыполнения.Вставить("СобытиеПолученииВеса" , ПараметрыПодключения.СобытиеПолученииВеса);
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("ПараметрыВесов", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Иначе
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
РезультатВыполнения.Вставить("ВесыПоддерживаютТарирование", Ложь);
РезультатВыполнения.Вставить("СобытиеПолученииВеса" , Ложь);
КонецЕсли;
Возврат РезультатВыполнения;
КонецФункции
// Функция осуществляет получение веса груза, расположенного на весах.
//
Асинх Функция ПолучитьВес(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
Вес = 0;
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "GetWeight");
РезультатВызова = Ждать ОбъектДрайвера.ПолучитьВесАсинх(ПараметрыПодключения.ИДУстройства, Вес); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Если РезультатВызова.Значение Тогда
Вес = Число(РезультатВызова.Параметры[1]);
Если Вес < 0 Тогда
Вес = 0;
КонецЕсли;
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
РезультатВыполнения.Вставить("Вес", Вес);
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("ПолучитьВес", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Возврат РезультатВыполнения;
КонецФункции
// Функция осуществляет установку веса тары на весах.
//
Асинх Функция Тарировать(ОбъектДрайвера, ПараметрыПодключения, ДанныеОперации)
Если ПараметрыПодключения.РевизияИнтерфейса >= 4001 И НЕ ПараметрыПодключения.ВесыПоддерживаютТарирование Тогда
ОписаниеОшибки = НСтр("ru='Оборудование не поддерживает данную операцию.'");
ЗаписатьОшибкуВЛог(ПараметрыПодключения, "Calibrate", ОписаниеОшибки);
РезультатВыполнения = РезультатОперацииНаОборудовании(Ложь, ОписаниеОшибки);
Возврат РезультатВыполнения;
КонецЕсли;
ВесТары = ?(ДанныеОперации.Свойство("ВесТары"), Число(ДанныеОперации.ВесТары), 0);
Попытка
ЗаписьЛога = НачатьЗаписьЛогаОперации(ПараметрыПодключения, "Calibrate", ВМассив(,ВесТары));
РезультатВызова = Ждать ОбъектДрайвера.УстановитьВесТарыАсинх(ПараметрыПодключения.ИДУстройства, ВесТары); // Структура
ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова);
Если РезультатВызова.Значение Тогда
РезультатВыполнения = РезультатОперацииНаОборудовании(Истина);
Иначе
РезультатВыполнения = Ждать ПолучитьОшибкуДрайвера(ОбъектДрайвера, ЗаписьЛога);
КонецЕсли;
Исключение
ТекстОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки);
РезультатВыполнения = ОшибкаВызоваДрайвера("УстановитьВесТары", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Возврат РезультатВыполнения;
КонецФункции
#КонецОбласти
#Область ЛогированиеОпераций
Функция НачатьЗаписьЛогаОперации(ПараметрыПодключения, Команда, ЗначенияПараметров = Неопределено, ИдентификаторыВходящихПараметров = "")
КонецФункции
Функция ЗавершитьЗаписьЛогаОперации(ЗаписьЛога, РезультатВызова, ИдентификаторыИсходящихПараметров = "")
КонецФункции
Функция ЗавершитьЗаписьЛогаИсключением(ЗаписьЛога, ТекстОшибки)
КонецФункции
Функция ЗаписатьОшибкуДрайвераВЛогОперации(ЗаписьЛога, РезультатВызова)
КонецФункции
Функция ЗаписатьОшибкуВЛог(ПараметрыПодключения, Команда, ОписаниеОшибки)
КонецФункции
Функция ВМассив(Параметр1, Параметр2=Null, Параметр3=Null, Параметр4=Null, Параметр5=Null, Параметр6=Null, Параметр7=Null, Параметр8=Null, Параметр9=Null)
Результат = Новый Массив();
Возврат Результат;
КонецФункции
Функция Экранировать(Знач Значение)
Значение = СтрЗаменить(Значение, ОбщегоНазначенияБПОКлиентСервер.РазделительGS1(), ОбщегоНазначенияБПОКлиентСервер.ЭкранированныйСимволGS1());
Значение = СтрЗаменить(Значение, ОбщегоНазначенияБПОКлиентСервер.РазделительEOT(), ОбщегоНазначенияБПОКлиентСервер.ЭкранированныйСимволEOT());
Значение = СтрЗаменить(Значение, ОбщегоНазначенияБПОКлиентСервер.РазделительRS(), ОбщегоНазначенияБПОКлиентСервер.ЭкранированныйСимволRS());
Значение = СтрЗаменить(Значение, Символ(0), "\n");
Возврат Значение;
КонецФункции
#КонецОбласти
#КонецОбласти