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

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

843 lines
59 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.

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2024, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
// Возвращает признак наличия ошибок отправки подтверждений НСПК.
//
// Возвращаемое значение:
// Булево - признак наличия ошибок отправки подтверждений НСПК.
//
Функция ЕстьОшибкиОтправкиПодтвержденийНСПК() Экспорт
УстановитьПривилегированныйРежим(Истина);
ТекстЗапроса =
"ВЫБРАТЬ
| ОшибкиПодтвержденияНСПК.ОснованиеФискальнойОперации КАК ОснованиеФискальнойОперации
|ИЗ
| РегистрСведений.ОшибкиПодтвержденияНСПК КАК ОшибкиПодтвержденияНСПК";
Запрос = Новый Запрос(ТекстЗапроса);
Результат = НЕ Запрос.Выполнить().Пустой();
Возврат Результат;
КонецФункции
// Возвращает представление ошибки операции НСПК.
//
// Параметры:
// ОснованиеФискальнойОперации - ОпределяемыйТип.ОснованиеФискальнойОперацииБПО.
//
// Возвращаемое значение:
// Строка - содержит представление ошибки НСПК.
//
Функция ПолучитьПредставлениеОшибкиНСПК(ОснованиеФискальнойОперации) Экспорт
УстановитьПривилегированныйРежим(Истина);
Результат = Неопределено;
ТекстЗапроса =
"ВЫБРАТЬ
| ОшибкиПодтвержденияНСПК.ОснованиеФискальнойОперации КАК ОснованиеФискальнойОперации,
| ОшибкиПодтвержденияНСПК.КодРезультата КАК КодРезультата,
| ОшибкиПодтвержденияНСПК.ОписаниеОшибки КАК ОписаниеОшибки
|ИЗ
| РегистрСведений.ОшибкиПодтвержденияНСПК КАК ОшибкиПодтвержденияНСПК
|ГДЕ
| ОшибкиПодтвержденияНСПК.ОснованиеФискальнойОперации = &ОснованиеФискальнойОперации";
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("ОснованиеФискальнойОперации", ОснованиеФискальнойОперации);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Результат = СтрШаблон(НСтр("ru='%1
|Код результата: %2
|Описание ошибки: %3'"),
Строка(ОснованиеФискальнойОперации),
Строка(Выборка.КодРезультата),
Строка(Выборка.ОписаниеОшибки));
КонецЕсли;
Возврат Результат;
КонецФункции
#Область УстаревшиеПроцедурыИФункции
// Устарела: используйте клиентскую версию компоненты.
// Возвращает версию ВК взаимодействия с НСПК
//
// Возвращаемое значение:
// Строка - Версия ВК.
//
Функция ВерсияВК() Экспорт
ВнешняяКомпонента = ПодготовитьКомпонентуИнтеграцииНСПК();
Версия = ВнешняяКомпонента.Версия();
Возврат Версия;
КонецФункции
// Устарела: используйте клиентскую версию компоненты.
// Тестовое подключение к НСПК
//
// Параметры:
// ПараметрыОперации - см.ЭлектронныеСертификатыНСПК.ПараметрыОперацииНСПК
//
// Возвращаемое значение:
// Структура:
// *Результат - Булево.
// *КодРезультата - Число.
// *ОписаниеОшибки - Строка.
// *ТоварныеПозиции - Массив.
// *ИдентификаторКорзины - Число.
// *СуммаСертификатами - Число.
//
Функция ТестовоеПодключение(ПараметрыОперации) Экспорт
ВнешняяКомпонента = ПодготовитьКомпонентуИнтеграцииНСПК(ПараметрыОперации);
ИдентификаторЗапроса = ПараметрыОперации.ИдентификаторЗапроса;
ИдентификаторКассы = ПараметрыОперации.ИдентификаторКассы;
ТестовоеСообщение = НСтр("ru = 'Тест 1С'");
ТекстРезультата = ВнешняяКомпонента.эхо(ИдентификаторЗапроса, ИдентификаторКассы, ТестовоеСообщение);
СписокОшибок = ВнешняяКомпонента.ПолучитьСписокОшибок();
РезультатВыполнения = ПрочитатьJSONРезультатОперации(ТекстРезультата, СписокОшибок);
Возврат РезультатВыполнения;
КонецФункции
// Устарела: используйте клиентскую версию компоненты.
// Предварительное одобрение использования сертификатов
//
// Параметры:
// ПараметрыОперации - см.ЭлектронныеСертификатыНСПК.ПараметрыОперацииНСПК
//
// Возвращаемое значение:
// Структура:
// *Результат - Булево.
// *КодРезультата - Число.
// *ОписаниеОшибки - Строка.
// *ТоварныеПозиции - Массив.
// *ИдентификаторКорзины - Число.
// *СуммаСертификатами - Число.
//
Функция ПредварительноеОдобрениеИспользования(ПараметрыОперации) Экспорт
РезультатВыполнения = ЭлектронныеСертификатыНСПККлиентСервер.ПроверитьПараметрыОперации(ПараметрыОперации, Истина);
Если НЕ РезультатВыполнения.Результат Тогда
Возврат РезультатВыполнения;
КонецЕсли;
ВнешняяКомпонента = ПодготовитьКомпонентуИнтеграцииНСПК(ПараметрыОперации);
ИдентификаторЗапроса = Строка(ПараметрыОперации.ИдентификаторЗапроса);
ИдентификаторКассы = ПараметрыОперации.ИдентификаторКассы;
ХешНомерКарты = ПараметрыОперации.ХешНомерКарты;
СсылкаНаПлатежныйСчет = ПараметрыОперации.СсылкаНаПлатежныйСчет;
ТоварныеПозицииJSON = ЭлектронныеСертификатыНСПККлиентСервер.ПолучитьJSONТоварныеПозиции(ПараметрыОперации.ТоварныеПозиции, Истина);
ТекстРезультата = ВнешняяКомпонента.ЗапросНаПредварительноеОдобрениеИспользования(
ИдентификаторЗапроса, // Строка
ИдентификаторКассы, // Строка
ХешНомерКарты, // Строка
СсылкаНаПлатежныйСчет, // Строка
ТоварныеПозицииJSON); // Строка
Параметры = ЭлектронныеСертификатыНСПККлиентСервер.ПараметрыВыполненияОперацииНаСервере();
Параметры.ТекстРезультата = ТекстРезультата;
Параметры.СписокОшибок = ВнешняяКомпонента.ПолучитьСписокОшибок();
Параметры.ПараметрыОперации = ПараметрыОперации;
Параметры.ТипПлатежнойОперации = ЭлектронныеСертификатыНСПККлиентСервер.ТипПлатежнойОперацииПредварительноеОдобрениеИспользованияЭС();
РезультатВыполнения = ЭлектронныеСертификатыНСПК.ОбработатьРезультатВыполненияНаСервере(Параметры);
Возврат РезультатВыполнения;
КонецФункции
// Устарела: используйте клиентскую версию компоненты.
// Предварительное одобрение возврата сертификатов
//
// Параметры:
// ПараметрыОперации - см.ЭлектронныеСертификатыНСПК.ПараметрыОперацииНСПК
//
// Возвращаемое значение:
// Структура:
// *Результат - Булево.
// *КодРезультата - Число.
// *ОписаниеОшибки - Строка.
// *ТоварныеПозиции - Массив.
// *ИдентификаторКорзины - Число.
// *СуммаСертификатами - Число.
//
Функция ПредварительноеОдобрениеВозврата(ПараметрыОперации) Экспорт
РезультатВыполнения = ЭлектронныеСертификатыНСПККлиентСервер.ПроверитьПараметрыОперации(ПараметрыОперации, Истина);
Если НЕ РезультатВыполнения.Результат Тогда
Возврат РезультатВыполнения;
КонецЕсли;
ВнешняяКомпонента = ПодготовитьКомпонентуИнтеграцииНСПК(ПараметрыОперации);
ИдентификаторЗапроса = Строка(ПараметрыОперации.ИдентификаторЗапроса);
ИдентификаторКассы = ПараметрыОперации.ИдентификаторКассы;
ХешНомерКарты = ПараметрыОперации.ХешНомерКарты;
СсылкаНаПлатежныйСчет = ПараметрыОперации.СсылкаНаПлатежныйСчет;
ИдентификаторКорзины = ПараметрыОперации.ИдентификаторКорзины;
ТоварныеПозицииJSON = ЭлектронныеСертификатыНСПККлиентСервер.ПолучитьJSONТоварныеПозиции(ПараметрыОперации.ТоварныеПозиции);
ТекстРезультата = ВнешняяКомпонента.ЗапросНаПредварительноеОдобрениеВозврата(
ИдентификаторЗапроса, // Строка
ИдентификаторКассы, // Строка
ИдентификаторКорзины, // Строка
ХешНомерКарты, // Строка
СсылкаНаПлатежныйСчет, // Строка
ТоварныеПозицииJSON); // Строка
Параметры = ЭлектронныеСертификатыНСПККлиентСервер.ПараметрыВыполненияОперацииНаСервере();
Параметры.ТекстРезультата = ТекстРезультата;
Параметры.СписокОшибок = ВнешняяКомпонента.ПолучитьСписокОшибок();
Параметры.ПараметрыОперации = ПараметрыОперации;
Параметры.ТипПлатежнойОперации = ЭлектронныеСертификатыНСПККлиентСервер.ТипПлатежнойОперацииПредварительноеОдобрениеВозвратаЭС();
РезультатВыполнения = ЭлектронныеСертификатыНСПК.ОбработатьРезультатВыполненияНаСервере(Параметры);
Возврат РезультатВыполнения;
КонецФункции
// Устарела: используйте клиентскую версию компоненты.
// Получение идентификатора корзины
//
// Параметры:
// ПараметрыОперации - см.ЭлектронныеСертификатыНСПК.ПараметрыОперацииНСПК
//
// Возвращаемое значение:
// Структура:
// *Результат - Булево.
// *КодРезультата - Число.
// *ОписаниеОшибки - Строка.
// *ИдентификаторКорзины - Число.
//
Функция ПолучениеИдентификатораКорзины(ПараметрыОперации) Экспорт
ВнешняяКомпонента = ПодготовитьКомпонентуИнтеграцииНСПК(ПараметрыОперации);
ИдентификаторЗапроса = ПараметрыОперации.ИдентификаторЗапроса;
ИдентификаторКассы = ПараметрыОперации.ИдентификаторКассы;
НомерФискальногоНакопителя = ПараметрыОперации.НомерФискальногоНакопителя;
ФискальныйПризнакЧека = ПараметрыОперации.ФискальныйПризнакЧека;
ФискальныйЧекНомер = ПараметрыОперации.ФискальныйЧекНомер;
Если НЕ ПустаяСтрока(ПараметрыОперации.QRКодЧекаККТ) Тогда
ДанныеШтрихкода = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.РасшифроватьQRКодЧекаККТ(ПараметрыОперации.QRКодЧекаККТ);
Если ДанныеШтрихкода.Расшифрован Тогда
НомерФискальногоНакопителя = ДанныеШтрихкода.НомерФискальногоНакопителя;
ФискальныйПризнакЧека = ДанныеШтрихкода.ФискальныйПризнак;
ФискальныйЧекНомер = ДанныеШтрихкода.НомерФискальногоДокумента;
КонецЕсли;
КонецЕсли;
ФискальныйПризнакЧека = Строка(ФискальныйПризнакЧека);
ФискальныйЧекНомер = Формат(Число(ФискальныйЧекНомер), "ЧГ=0");
ТекстРезультата = ВнешняяКомпонента.ЗапросНаПолучениеИдентификатораКорзиныОперацииПокупки(
ИдентификаторЗапроса, // Строка
ИдентификаторКассы, // Строка
НомерФискальногоНакопителя, // Строка
ФискальныйЧекНомер, // Строка
ФискальныйПризнакЧека); // Строка
Параметры = ЭлектронныеСертификатыНСПККлиентСервер.ПараметрыВыполненияОперацииНаСервере();
Параметры.ТекстРезультата = ТекстРезультата;
Параметры.СписокОшибок = ВнешняяКомпонента.ПолучитьСписокОшибок();
Параметры.ПараметрыОперации = ПараметрыОперации;
Параметры.ТипПлатежнойОперации = ЭлектронныеСертификатыНСПККлиентСервер.ТипПлатежнойОперацииПолучениеИдентификатораОперации();
РезультатВыполнения = ЭлектронныеСертификатыНСПК.ОбработатьРезультатВыполненияНаСервере(Параметры);
Возврат РезультатВыполнения;
КонецФункции
// Устарела: используйте клиентскую версию компоненты.
// Передача данных фискального чека
//
// Параметры:
// ПараметрыОперации - см.ЭлектронныеСертификатыНСПК.ПараметрыОперацииНСПК
//
// Возвращаемое значение:
// Структура:
// *Результат - Булево.
// *КодРезультата - Число.
// *ОписаниеОшибки - Строка.
// *ТоварныеПозиции - Массив.
// *ИдентификаторКорзины - Число.
// *СуммаСертификатами - Число.
//
Функция ПередачаДанныхФискальногоЧека(ПараметрыОперации) Экспорт
ВнешняяКомпонента = ПодготовитьКомпонентуИнтеграцииНСПК(ПараметрыОперации);
ИдентификаторЗапроса = ПараметрыОперации.ИдентификаторЗапроса;
ИдентификаторКассы = ПараметрыОперации.ИдентификаторКассы;
ИдентификаторКорзины = ПараметрыОперации.ИдентификаторКорзины;
НомерФискальногоНакопителя = Строка(ПараметрыОперации.НомерФискальногоНакопителя);
ФискальныйТипРасчета = Число(ОборудованиеЧекопечатающиеУстройстваКлиентСервер.КодРасчетаДенежнымиСредствами(ПараметрыОперации.ФискальныйТипРасчета));
ФискальныйПризнакЧека = Строка(ПараметрыОперации.ФискальныйПризнакЧека);
ФискальныйЧекНомер = Формат(Число(ПараметрыОперации.ФискальныйЧекНомер), "ЧГ=0");
ФискальныйЧекСумма = Формат(ПараметрыОперации.ФискальныйЧекСумма, "ЧГ=0;ЧДЦ=2;ЧРД=.");
ФискальныйМестоРасчетов = Строка(ПараметрыОперации.ФискальныйМестоРасчетов);
// АПК: 1367-выкл особенность локального законодательства
Если ПараметрыОперации.ПротоколОбмена = Перечисления.ПротоколОбменаФЭСНСПК.ВерсияV2 Тогда
ФискальныйЧекДатаВремя = Формат(ПараметрыОперации.ФискальныйЧекДатаВремя, "ДФ=""ггггММддTЧЧмм""");
Иначе
ФискальныйЧекДатаВремя = Формат(ПараметрыОперации.ФискальныйЧекДатаВремя, "ДФ=""ггггММддЧЧмм""");
КонецЕсли;
// АПК: 1367
ОснованиеФискальнойОперации = ПараметрыОперации.ОснованиеФискальнойОперации;
ТекстРезультата = ВнешняяКомпонента.ПередачаДанныхФискальногоЧека(
ИдентификаторЗапроса, // Строка
ИдентификаторКассы, // Строка
ИдентификаторКорзины, // Строка
НомерФискальногоНакопителя, // Строка
ФискальныйЧекНомер, // Строка
ФискальныйПризнакЧека, // Строка
ФискальныйЧекСумма, // Строка
ФискальныйЧекДатаВремя, // Строка
ФискальныйТипРасчета, // Число
ФискальныйМестоРасчетов); // Строка
Параметры = ЭлектронныеСертификатыНСПККлиентСервер.ПараметрыВыполненияОперацииНаСервере();
Параметры.ТекстРезультата = ТекстРезультата;
Параметры.СписокОшибок = ВнешняяКомпонента.ПолучитьСписокОшибок();
Параметры.ПараметрыОперации = ПараметрыОперации;
Параметры.ТипПлатежнойОперации = ЭлектронныеСертификатыНСПККлиентСервер.ТипПлатежнойОперацииПередачаДанныхФискальногоЧека();
Параметры.ОснованиеФискальнойОперации = ОснованиеФискальнойОперации;
РезультатВыполнения = ЭлектронныеСертификатыНСПК.ОбработатьРезультатВыполненияНаСервере(Параметры);
Возврат РезультатВыполнения;
КонецФункции
// Устарела: используйте клиентскую версию компоненты.
// Получение состава корзины
//
// Параметры:
// ПараметрыОперации - см.ЭлектронныеСертификатыНСПК.ПараметрыОперацииНСПК
//
// Возвращаемое значение:
// Структура:
// *Результат - Булево.
// *КодРезультата - Число.
// *ОписаниеОшибки - Строка.
// *ТоварныеПозиции - Массив.
// *ИдентификаторКорзины - Число.
// *СуммаСертификатами - Число.
//
Функция ПолучениеСоставаКорзины(ПараметрыОперации) Экспорт
ВнешняяКомпонента = ПодготовитьКомпонентуИнтеграцииНСПК(ПараметрыОперации);
ИдентификаторЗапроса = ПараметрыОперации.ИдентификаторЗапроса;
ИдентификаторКассы = ПараметрыОперации.ИдентификаторКассы;
ИдентификаторКорзины = ПараметрыОперации.ИдентификаторКорзины;
ТекстРезультата = ВнешняяКомпонента.ЗапросНаПолучениеСоставаКорзиныОригинальнойПокупки(
ИдентификаторЗапроса, // Строка
ИдентификаторКассы, // Строка
ИдентификаторКорзины); // Строка
Параметры = ЭлектронныеСертификатыНСПККлиентСервер.ПараметрыВыполненияОперацииНаСервере();
Параметры.ТекстРезультата = ТекстРезультата;
Параметры.СписокОшибок = ВнешняяКомпонента.ПолучитьСписокОшибок();
Параметры.ПараметрыОперации = ПараметрыОперации;
Параметры.ТипПлатежнойОперации = ЭлектронныеСертификатыНСПККлиентСервер.ТипПлатежнойОперацииПолучениеСоставаКорзины();
РезультатВыполнения = ЭлектронныеСертификатыНСПК.ОбработатьРезультатВыполненияНаСервере(Параметры);
Возврат РезультатВыполнения;
КонецФункции
// Устарела: используйте клиентскую версию компоненты.
// Получение списка сертификатов
//
// Параметры:
// ПараметрыОперации - см.ЭлектронныеСертификатыНСПК.ПараметрыОперацииНСПК
//
// Возвращаемое значение:
// Структура:
// *Результат - Булево.
// *КодРезультата - Число.
// *ОписаниеОшибки - Строка.
//
Функция ПолучениеСпискаСертификатов(ПараметрыОперации) Экспорт
РезультатВыполнения = ЭлектронныеСертификатыНСПККлиентСервер.ПроверитьПараметрыОперации(ПараметрыОперации, Истина);
Если НЕ РезультатВыполнения.Результат Тогда
Возврат РезультатВыполнения;
КонецЕсли;
ВнешняяКомпонента = ПодготовитьКомпонентуИнтеграцииНСПК(ПараметрыОперации);
ИдентификаторЗапроса = Строка(ПараметрыОперации.ИдентификаторЗапроса);
ИдентификаторКассы = ПараметрыОперации.ИдентификаторКассы;
ХешНомерКарты = ПараметрыОперации.ХешНомерКарты;
СсылкаНаПлатежныйСчет = ПараметрыОперации.СсылкаНаПлатежныйСчет;
ТекстРезультата = ВнешняяКомпонента.ЗапросНаПолучениеСпискаСертификатов(
ИдентификаторЗапроса, // Строка
ИдентификаторКассы, // Строка
ХешНомерКарты, // Строка
СсылкаНаПлатежныйСчет); // Строка
Параметры = ЭлектронныеСертификатыНСПККлиентСервер.ПараметрыВыполненияОперацииНаСервере();
Параметры.ТекстРезультата = ТекстРезультата;
Параметры.СписокОшибок = ВнешняяКомпонента.ПолучитьСписокОшибок();
Параметры.ПараметрыОперации = ПараметрыОперации;
Параметры.ТипПлатежнойОперации = ЭлектронныеСертификатыНСПККлиентСервер.ТипПлатежнойОперацииПолучениеСпискаСертификатов();
РезультатВыполнения = ЭлектронныеСертификатыНСПК.ОбработатьРезультатВыполненияНаСервере(Параметры);
Возврат РезультатВыполнения;
КонецФункции
// Устарела: используйте клиентскую версию компоненты.
// Получение списка идентификаторов корзин покупок ТСП
//
// Параметры:
// ПараметрыОперации - см.ЭлектронныеСертификатыНСПК.ПараметрыОперацииНСПК
//
// Возвращаемое значение:
// Структура:
// *Результат - Булево.
// *КодРезультата - Число.
// *ОписаниеОшибки - Строка.
//
Функция ПолучениеСпискаИдентификаторовКорзинПокупокТСП(ПараметрыОперации) Экспорт
РезультатВыполнения = ЭлектронныеСертификатыНСПККлиентСервер.ПроверитьПараметрыОперации(ПараметрыОперации);
Если НЕ РезультатВыполнения.Результат Тогда
Возврат РезультатВыполнения;
КонецЕсли;
ВнешняяКомпонента = ПодготовитьКомпонентуИнтеграцииНСПК(ПараметрыОперации);
ИдентификаторЗапроса = Строка(ПараметрыОперации.ИдентификаторЗапроса);
ИдентификаторКассы = ПараметрыОперации.ИдентификаторКассы;
ХешНомерКарты = ПараметрыОперации.ХешНомерКарты;
СсылкаНаПлатежныйСчет = ПараметрыОперации.СсылкаНаПлатежныйСчет;
КодТовараТРУ = ПараметрыОперации.КодТовараТРУ;
ТекстРезультата = ВнешняяКомпонента.ЗапросНаПолучениеСпискаИдентификаторовКорзинПокупокТСП(
ИдентификаторЗапроса, // Строка
ИдентификаторКассы, // Строка
КодТовараТРУ, // Строка
ХешНомерКарты, // Строка
СсылкаНаПлатежныйСчет); // Строка
Параметры = ЭлектронныеСертификатыНСПККлиентСервер.ПараметрыВыполненияОперацииНаСервере();
Параметры.ТекстРезультата = ТекстРезультата;
Параметры.СписокОшибок = ВнешняяКомпонента.ПолучитьСписокОшибок();
Параметры.ПараметрыОперации = ПараметрыОперации;
Параметры.ТипПлатежнойОперации = ЭлектронныеСертификатыНСПККлиентСервер.ТипПлатежнойОперацииПолучениеСпискаИдентификаторовКорзинПокупокТСП();
РезультатВыполнения = ЭлектронныеСертификатыНСПК.ОбработатьРезультатВыполненияНаСервере(Параметры);
Возврат РезультатВыполнения;
КонецФункции
// Устарела: используйте клиентскую версию компоненты.
// Выполняет подключение внешней компоненты.
//
// Возвращаемое значение:
// ОбъектВнешнейКомпоненты
// Неопределено - если компоненту не удалось загрузить.
//
Функция ПодключитьКомпонентуИнтеграцииНСПК() Экспорт
ОписаниеКомпоненты = ЭлектронныеСертификатыНСПККлиентСервер.ОписаниеКомпоненты();
ИмяОбъекта = ОписаниеКомпоненты.ИмяОбъекта;
ПолноеИмяМакета = ОписаниеКомпоненты.ПолноеИмяМакета;
Возврат ВнешниеКомпонентыБПО.ПодключитьКомпоненту(ИмяОбъекта, ПолноеИмяМакета);
КонецФункции
// Устарела: используйте клиентскую версию компоненты.
// Пустая структура для выполнения операции взаимодействия с сервером НСПК
//
// Возвращаемое значение:
// Структура:
// * АдресСервера - Строка - Endpoint
// * КлючДоступа - Строка - APIKey
// * КлючКассы - Строка - MACKey
//
Функция ПараметрыОперацииНСПК() Экспорт
Возврат ЭлектронныеСертификатыНСПККлиентСервер.ПараметрыОперацииНСПК();
КонецФункции
// Устарела: используйте клиентскую версию компоненты.
// Пустая структура для параметров товарной позиции
//
// Возвращаемое значение:
// Структура:
// * НомерПозиции - Строка - Порядковый номер позиции в корзине начиная с 1
// * Артикул - Строка - Артикул товара
// * КодТовараТРУ - Строка - Полный код товара, согласованный с перечнем ТРУ
// * Количество - Число - Количество единиц товара
// * Цена - Число - Цена за единицу товара в рублях
// * Сертификаты - Массив из см.ЭлектронныеСертификатыНСПК.ПараметрыСертификата
//
Функция ПараметрыТоварнойПозиции() Экспорт
Возврат ЭлектронныеСертификатыНСПККлиентСервер.ПараметрыТоварнойПозиции();
КонецФункции
// Устарела: используйте клиентскую версию компоненты.
// Пустая структура параметров сертификата
//
// Возвращаемое значение:
// Структура:
// * Идентификатор - Строка - Идентификатор сертификата
// * Количество - Число - Количество
// * Цена - Число - Цена
// * МаксимальнаяЦена - Число - Максимальная цена
//
Функция ПараметрыСертификата() Экспорт
Возврат ЭлектронныеСертификатыНСПККлиентСервер.ПараметрыСертификата();
КонецФункции
#КонецОбласти
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
// Выполняет обработку результата отправки подтверждения.
//
Процедура ОбработатьРезультатОтправкиПодтверждения(ОснованиеФискальнойОперации, РезультатВыполнения) Экспорт
УстановитьПривилегированныйРежим(Истина);
МенеджерЗаписи = РегистрыСведений.ОшибкиПодтвержденияНСПК.СоздатьМенеджерЗаписи();
МенеджерЗаписи.ОснованиеФискальнойОперации = ОснованиеФискальнойОперации;
Если РезультатВыполнения.Результат Тогда
МенеджерЗаписи.Удалить();
Иначе
МенеджерЗаписи.КодРезультата = РезультатВыполнения.КодРезультата;
МенеджерЗаписи.ОписаниеОшибки = РезультатВыполнения.ОписаниеОшибки;
МенеджерЗаписи.Записать();
КонецЕсли;
КонецПроцедуры
Функция ПрочитатьJSONРезультатОперации(СтрокаJSON, СписокОшибок = Неопределено, ОснованиеФискальнойОперации = Неопределено) Экспорт
ОписаниеОшибки = ?(ПустаяСтрока(СписокОшибок), "", СписокОшибок);
РезультатВыполнения = ЭлектронныеСертификатыНСПККлиентСервер.ПараметрыВыполненияОперации(Ложь, ОписаниеОшибки);
Если Не ПустаяСтрока(СтрокаJSON)
И Не СтрНачинаетсяС(СтрокаJSON, "<!DOCTYPE")
И Не СтрНачинаетсяС(СтрокаJSON, "<html>") Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
РезультатОперации = ПрочитатьJSON(ЧтениеJSON);
Если РезультатОперации.Свойство("result") Тогда
РезультатВыполнения.КодРезультата = Число(РезультатОперации.result.code);
РезультатВыполнения.Результат = РезультатВыполнения.КодРезультата = 0;
РезультатВыполнения.ОписаниеОшибки = РезультатОперации.result.description;
Если НЕ ПустаяСтрока(ОписаниеОшибки) Тогда
РезультатВыполнения.ОписаниеОшибки = РезультатВыполнения.ОписаниеОшибки = Символы.ПС + ОписаниеОшибки;
КонецЕсли;
КонецЕсли;
Если РезультатВыполнения.Результат И РезультатОперации.Свойство("purchaseBasketId") Тогда
РезультатВыполнения.ИдентификаторКорзины = РезультатОперации.purchaseBasketId;
КонецЕсли;
Если РезультатВыполнения.Результат И РезультатОперации.Свойство("basket") Тогда
Если РезультатОперации.basket.Свойство("purchaseBasketId") Тогда
РезультатВыполнения.ИдентификаторКорзины = РезультатОперации.basket.purchaseBasketId;
КонецЕсли;
Если РезультатОперации.basket.Свойство("returnBasketId") Тогда
РезультатВыполнения.ИдентификаторКорзины = РезультатОперации.basket.returnBasketId;
КонецЕсли;
Если РезультатОперации.basket.Свойство("totalCertAmount") И Число(РезультатОперации.basket.totalCertAmount) > 0 Тогда
РезультатВыполнения.СуммаСертификатами = Число(РезультатОперации.basket.totalCertAmount) / 100;
КонецЕсли;
Если РезультатОперации.basket.Свойство("article") Тогда
Для Каждого Позиция Из РезультатОперации.basket.article Цикл
ТоварнаяПозиция = ЭлектронныеСертификатыНСПККлиентСервер.ПараметрыТоварнойПозиции();
Если Позиция.Свойство("articleCode") Тогда
ТоварнаяПозиция.Артикул = Позиция.articleCode;
КонецЕсли;
Если Позиция.Свойство("articleNumber") Тогда
ТоварнаяПозиция.НомерПозиции = Позиция.articleNumber;
КонецЕсли;
Если Позиция.Свойство("price") Тогда
ТоварнаяПозиция.Цена = Число(Позиция.price) / 100;
КонецЕсли;
Если Позиция.Свойство("truCode") Тогда
ТоварнаяПозиция.КодТовараТРУ = Позиция.truCode;
КонецЕсли;
Если Позиция.Свойство("certificate") Тогда
Для Каждого Сертификат Из Позиция.certificate Цикл
СертификатСтрока = ЭлектронныеСертификатыНСПККлиентСервер.ПараметрыСертификата();
Если Сертификат.Свойство("certificateId") Тогда
СертификатСтрока.Идентификатор = Сертификат.certificateId;
КонецЕсли;
Если Сертификат.Свойство("certCount") Тогда
СертификатСтрока.Количество = Сертификат.certCount;
КонецЕсли;
Если Сертификат.Свойство("certPrice") Тогда
СертификатСтрока.Цена = Число(Сертификат.certPrice) / 100;
КонецЕсли;
Если Сертификат.Свойство("certMaxPrice") Тогда
СертификатСтрока.МаксимальнаяЦена = Число(Сертификат.certMaxPrice) / 100;
КонецЕсли;
ТоварнаяПозиция.Сертификаты.Добавить(СертификатСтрока);
КонецЦикла;
КонецЕсли;
РезультатВыполнения.ТоварныеПозиции.Добавить(ТоварнаяПозиция);
КонецЦикла;
КонецЕсли;
КонецЕсли;
Если РезультатВыполнения.Результат И РезультатОперации.Свойство("baskets") И ЗначениеЗаполнено(РезультатОперации.baskets) Тогда
Для Каждого ИдентификаторКорзины Из РезультатОперации.baskets Цикл
ИдентификаторКорзиныСтрока = ЭлектронныеСертификатыНСПККлиентСервер.ПараметрыИдентификаторовКорзинПокупокТСП();
Если ИдентификаторКорзины.Свойство("basketId") Тогда
ИдентификаторКорзиныСтрока.ИдентификаторКорзины = ИдентификаторКорзины.basketId;
КонецЕсли;
Если ИдентификаторКорзины.Свойство("authDate") Тогда
ИдентификаторКорзиныСтрока.ДатаАвторизации = XMLЗначение(Тип("Дата"), ИдентификаторКорзины.authDate);
КонецЕсли;
РезультатВыполнения.ИдентификаторыКорзинПокупок.Добавить(ИдентификаторКорзиныСтрока);
КонецЦикла;
КонецЕсли;
Если РезультатВыполнения.Результат И РезультатОперации.Свойство("certificates") Тогда
Для Каждого Сертификат Из РезультатОперации.certificates Цикл
СертификатСтрока = ЭлектронныеСертификатыНСПККлиентСервер.ПараметрыДоступногоСертификата();
Если Сертификат.Свойство("id") Тогда
СертификатСтрока.Идентификатор = Сертификат.id;
КонецЕсли;
Если Сертификат.Свойство("comment") Тогда
СертификатСтрока.Комментарий = Сертификат.comment;
КонецЕсли;
Если Сертификат.Свойство("balanceCount") И ЗначениеЗаполнено(Сертификат.balanceCount) Тогда
СертификатСтрока.БалансКоличество = Число(Сертификат.balanceCount);
КонецЕсли;
Если Сертификат.Свойство("balanceMoney") И ЗначениеЗаполнено(Сертификат.balanceMoney) Тогда
СертификатСтрока.БалансДенежныхСредств = Число(Сертификат.balanceMoney) / 100;
КонецЕсли;
Если Сертификат.Свойство("limitMoney") И ЗначениеЗаполнено(Сертификат.limitMoney) Тогда
СертификатСтрока.ЛимитДенежныхСредств = Число(Сертификат.limitMoney) / 100;
КонецЕсли;
Если Сертификат.Свойство("type") Тогда
СертификатСтрока.Тип = Сертификат.type;
КонецЕсли;
Если Сертификат.Свойство("startDate") И ЗначениеЗаполнено(Сертификат.startDate)Тогда
СертификатСтрока.ДатаНачалаДействия = XMLЗначение(Тип("Дата"), Сертификат.startDate);
КонецЕсли;
Если Сертификат.Свойство("expiryDate") И ЗначениеЗаполнено(Сертификат.expiryDate) Тогда
СертификатСтрока.ДатаЗавершенияДействия = XMLЗначение(Тип("Дата"), Сертификат.expiryDate);
КонецЕсли;
Если Сертификат.Свойство("tru") Тогда
Для Каждого КодТовараТРУ Из Сертификат.tru Цикл
СтрокаКодТовараТРУ = ЭлектронныеСертификатыНСПККлиентСервер.ПараметрыДоступногоКодТовараТРУ();
Если КодТовараТРУ.Свойство("truCode") Тогда
СтрокаКодТовараТРУ.КодТовараТРУ = КодТовараТРУ.truCode;
КонецЕсли;
Если КодТовараТРУ.Свойство("balanceCount") И ЗначениеЗаполнено(КодТовараТРУ.balanceCount) Тогда
СтрокаКодТовараТРУ.БалансКоличество = Число(КодТовараТРУ.balanceCount);
КонецЕсли;
Если КодТовараТРУ.Свойство("balanceMoney") И ЗначениеЗаполнено(КодТовараТРУ.balanceMoney) Тогда
СтрокаКодТовараТРУ.БалансДенежныхСредств = Число(КодТовараТРУ.balanceMoney) / 100;
КонецЕсли;
Если КодТовараТРУ.Свойство("limitMoney") И ЗначениеЗаполнено(КодТовараТРУ.limitMoney) Тогда
СтрокаКодТовараТРУ.ЛимитДенежныхСредств = Число(КодТовараТРУ.limitMoney) / 100;
КонецЕсли;
СертификатСтрока.КодыТоваровТРУ.Добавить(СтрокаКодТовараТРУ);
РезультатВыполнения.ТоварныеПозиции.Добавить(СтрокаКодТовараТРУ);
КонецЦикла;
КонецЕсли;
РезультатВыполнения.ДоступныеСертификаты.Добавить(СертификатСтрока);
КонецЦикла;
КонецЕсли;
ЧтениеJSON.Закрыть();
Иначе
РезультатВыполнения.ОписаниеОшибки = ?(ПустаяСтрока(ОписаниеОшибки), НСтр("ru = 'Ответ не получен'"), ОписаниеОшибки);
КонецЕсли;
Если ЗначениеЗаполнено(ОснованиеФискальнойОперации) Тогда
ЭлектронныеСертификатыНСПК.ОбработатьРезультатОтправкиПодтверждения(ОснованиеФискальнойОперации, РезультатВыполнения);
КонецЕсли;
Возврат РезультатВыполнения;
КонецФункции
Функция ОбработатьРезультатВыполненияНаСервере(Параметры) Экспорт
ТекстРезультата = Параметры.ТекстРезультата;
СписокОшибок = Параметры.СписокОшибок;
ОснованиеФискальнойОперации = Параметры.ОснованиеФискальнойОперации;
ПараметрыОперации = Параметры.ПараметрыОперации;
ТипПлатежнойОперации = Параметры.ТипПлатежнойОперации;
РезультатВыполнения = ПрочитатьJSONРезультатОперации(ТекстРезультата, СписокОшибок, ОснованиеФискальнойОперации);
ТипОперации = ТипПлатежнойОперацииПоКоманде(ТипПлатежнойОперации);
ЗаписатьИсториюПлатежнойОперации(ТипОперации, ПараметрыОперации, РезультатВыполнения, ТекстРезультата);
Возврат РезультатВыполнения;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
// Выполняет подготовка внешней компоненты.
//
// Возвращаемое значение:
// ОбъектВнешнейКомпоненты
// Неопределено - если компоненту не удалось загрузить.
//
Функция ПодготовитьКомпонентуИнтеграцииНСПК(ПараметрыОперации = Неопределено)
ВнешняяКомпонента = ПодключитьКомпонентуИнтеграцииНСПК();
Если ВнешняяКомпонента = Неопределено Тогда
ТекстСообщения = НСтр("ru = 'Ошибка подключения внешней компоненты НСПК.'");
ОбщегоНазначенияБПО.ЗаписатьОшибкуВЖурналРегистрации(
НСтр("ru = 'Ошибка компоненты НСПК'", ОбщегоНазначенияБПО.КодОсновногоЯзыка()),
ТекстСообщения);
ВызватьИсключение ТекстСообщения;
КонецЕсли;
Если ПараметрыОперации <> Неопределено Тогда
ПараметрыJSON = ЭлектронныеСертификатыНСПККлиентСервер.ПолучитьJSONПараметры(ПараметрыОперации);
ВнешняяКомпонента.УстановитьПараметры(ПараметрыJSON);
КонецЕсли;
Возврат ВнешняяКомпонента;
КонецФункции
Функция ТипПлатежнойОперацииПоКоманде(Команда)
ТипыОпераций = Новый Соответствие();
ТипыОпераций.Вставить(ЭлектронныеСертификатыНСПККлиентСервер.ТипПлатежнойОперацииПредварительноеОдобрениеИспользованияЭС(),
Перечисления.ТипыПлатежныхОпераций.ПредварительноеОдобрениеИспользованияЭС);
ТипыОпераций.Вставить(ЭлектронныеСертификатыНСПККлиентСервер.ТипПлатежнойОперацииПредварительноеОдобрениеВозвратаЭС(),
Перечисления.ТипыПлатежныхОпераций.ПредварительноеОдобрениеВозвратаЭС);
ТипыОпераций.Вставить(ЭлектронныеСертификатыНСПККлиентСервер.ТипПлатежнойОперацииПередачаДанныхФискальногоЧека(),
Перечисления.ТипыПлатежныхОпераций.ПередачаДанныхФискальногоЧека);
ТипыОпераций.Вставить(ЭлектронныеСертификатыНСПККлиентСервер.ТипПлатежнойОперацииПолучениеИдентификатораОперации(),
Перечисления.ТипыПлатежныхОпераций.ПолучениеИдентификатораОперации);
ТипыОпераций.Вставить(ЭлектронныеСертификатыНСПККлиентСервер.ТипПлатежнойОперацииПолучениеСоставаКорзины(),
Перечисления.ТипыПлатежныхОпераций.ПолучениеСоставаКорзины);
ТипыОпераций.Вставить(ЭлектронныеСертификатыНСПККлиентСервер.ТипПлатежнойОперацииПолучениеСпискаСертификатов(),
Перечисления.ТипыПлатежныхОпераций.ПолучениеСпискаЭС);
ТипыОпераций.Вставить(ЭлектронныеСертификатыНСПККлиентСервер.ТипПлатежнойОперацииПолучениеСпискаИдентификаторовКорзинПокупокТСП(),
Перечисления.ТипыПлатежныхОпераций.ПолучениеСпискаИдентификаторовКорзинПокупокТСП);
Возврат ТипыОпераций.Получить(Команда);
КонецФункции
Процедура ЗаписатьИсториюПлатежнойОперации(ТипОперации, ДанныеОперации, РезультатВыполнения, ТекстОтветаJSON)
СуммаОперации = 0;
Если ТипОперации = Перечисления.ТипыПлатежныхОпераций.ПередачаДанныхФискальногоЧека Тогда
СуммаОперации = ДанныеОперации.ФискальныйЧекСумма;
Иначе
Для Каждого ТоварнаяПозиция Из ДанныеОперации.ТоварныеПозиции Цикл
Если ТоварнаяПозиция.Цена <> Неопределено И ТоварнаяПозиция.Количество <> Неопределено Тогда
СуммаОперации = СуммаОперации + (ТоварнаяПозиция.Цена * ТоварнаяПозиция.Количество);
КонецЕсли;
КонецЦикла;
КонецЕсли;
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(, Символы.Таб);
ЧтениеJSON = Новый ЧтениеJSON();
ЗаписьJSON = Новый ЗаписьJSON();
ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписиJSON);
Сжатие = Новый СжатиеДанных(6);
ОтветBase64 = "";
Если Не ПустаяСтрока(ТекстОтветаJSON)
И Не СтрНачинаетсяС(ТекстОтветаJSON, "<!DOCTYPE")
И Не СтрНачинаетсяС(ТекстОтветаJSON, "<html>") Тогда
ЧтениеJSON.УстановитьСтроку(ТекстОтветаJSON);
ОтветJSON = ПрочитатьJSON(ЧтениеJSON);
Если ОтветJSON.Свойство("request", ОтветBase64) <> Неопределено Тогда
ОтветJSON.Удалить("request");
ЗаписатьJSON(ЗаписьJSON, ОтветJSON, , "ЗаписатьИсториюПлатежнойОперации_ПреобразованиеВJSON", ЭлектронныеСертификатыНСПК);
ТекстОтвета = ЗаписьJSON.Закрыть();
ТекстЗапроса = ПолучитьСтрокуИзДвоичныхДанных(Base64Значение(ОтветBase64));
Иначе
ЗаписатьJSON(ЗаписьJSON, ДанныеОперации, , "ЗаписатьИсториюПлатежнойОперации_ПреобразованиеВJSON", ЭлектронныеСертификатыНСПК);
ТекстЗапроса = ЗаписьJSON.Закрыть();
ТекстОтвета = ТекстОтветаJSON;
КонецЕсли;
Иначе
ТекстОтвета = ТекстОтветаJSON;
КонецЕсли;
ДанныеОперации.Вставить("ТекстЗапроса" , ТекстЗапроса);
ДанныеОперации.Вставить("ТекстОтвета" , ТекстОтвета);
ДанныеОперации.Вставить("СуммаОперации", СуммаОперации);
РезультатВыполнения.Вставить("ВидОплатыНаТерминале", Перечисления.ВидОплатыНаТерминале.Карта);
ОборудованиеПлатежныеСистемы.ЗаписатьПлатежнуюОперацию(ТипОперации, ДанныеОперации, РезультатВыполнения);
КонецПроцедуры
Функция ЗаписатьИсториюПлатежнойОперации_ПреобразованиеВJSON(Свойство, Значение, ДополнительныеПараметры, Отказ) Экспорт
Возврат Строка(Значение);
КонецФункции
#КонецОбласти