TSDZakazScladVasilek/CommonModules/ЭлектронныеСертификатыНСПККлиентСервер/Ext/Module.bsl

465 lines
32 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
///////////////////////////////////////////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
// Описание подключения внешней компоненты (FECNSPK).
//
// Возвращаемое значение:
// Структура:
// * ПолноеИмяМакета - Строка
// * ИмяОбъекта - Строка
//
Функция ОписаниеКомпоненты() Экспорт
Параметры = Новый Структура;
Параметры.Вставить("ИмяОбъекта", "FECNSPK");
Параметры.Вставить("ПолноеИмяМакета", "ОбщийМакет.КомпонентаИнтеграцииНСПК");
Параметры.Вставить("ВерсияМинимальная", "1.3.2.1");
Возврат Параметры;
КонецФункции
// Пустая структура для выполнения операции взаимодействия с сервером НСПК
//
// Возвращаемое значение:
// Структура:
// * АдресСервера - Строка - Endpoint
// * КлючДоступа - Строка - APIKey
// * КлючКассы - Строка - MACKey
// * ПроверятьКорневыеСертификаты - Булево - Проверка корневого сертификата сервера НСПК
// * ПротоколОбмена - Перечисление.ПротоколОбменаФЭСНСПК - Протокол обмена ФЭС НСПК
// * ИдентификаторЗапроса - Строка - Уникальный идентификатор запроса (нужно генерировать на прикладном коде в формате uuid).
// * ИдентификаторКассы - Строка - Идентификатор кассы.
// * ХешНомерКарты - Строка - Хешированный PAN карты.
// * СсылкаНаПлатежныйСчет - Строка - Payment Account Reference, Уникальный идентификатор для токенезированных (виртуальных) карт связанный с PAN конкретного держателя карты.
// * ИдентификаторКорзины - Строка - Идентификатор корзины.
// * ТоварныеПозиции - Массив - Структур - ПараметрыТоварнойПозиции()
// * КодТовараТРУ - Строка - Полный код товара, согласованный с перечнем ТРУ
// * НомерФискальногоНакопителя - Строка - Заводской номер фискального накопителя
// * ФискальныйТипРасчета - Перечисление.ТипыРасчетаДенежнымиСредствами - Признак расчета
// * ФискальныйПризнакЧека - Строка - Фискальный признак документа
// * ФискальныйЧекНомер - Число - Порядковый номер фискального документа
// * ФискальныйЧекДатаВремя - ДатаВремя - Дата и время осуществления расчета
// * ФискальныйЧекСумма - Число - Сумма расчета
// * ФискальныйМестоРасчетов - Строка - Место расчетов
// * QRКодЧекаККТ - Строка - QR код чека ККТ
// * ОснованиеФискальнойОперации - Ссылка - ОснованиеФискальнойОперацииБПО
//
Функция ПараметрыОперацииНСПК() Экспорт
ИнтернетПрокси = Новый Структура();
ИнтернетПрокси.Вставить("Сервер");
ИнтернетПрокси.Вставить("Порт");
ИнтернетПрокси.Вставить("Пользователь");
ИнтернетПрокси.Вставить("Пароль");
Параметры = Новый Структура();
Параметры.Вставить("АдресСервера"); // Endpoint
Параметры.Вставить("КлючДоступа"); // APIKey
Параметры.Вставить("КлючКассы"); // MACKey
Параметры.Вставить("ИнтернетПрокси", ИнтернетПрокси); // ИнтернетПрокси
Параметры.Вставить("ПроверятьКорневыеСертификаты", Истина); // Булево - Проверка корневого сертификата сервера НСПК
Параметры.Вставить("ПротоколОбмена", ПредопределенноеЗначение("Перечисление.ПротоколОбменаФЭСНСПК.ВерсияV1")); // Перечисление.ПротоколОбменаФЭСНСПК, Обязательно - Протокол обмена ФЭС НСПК.
Параметры.Вставить("ИдентификаторЗапроса"); // Строка - Уникальный идентификатор запроса (нужно генерировать на прикладном коде в формате uuid).
Параметры.Вставить("ИдентификаторКассы"); // Строка - Идентификатор кассы.
Параметры.Вставить("ХешНомерКарты"); // Строка - Хешированный PAN карты.
Параметры.Вставить("СсылкаНаПлатежныйСчет", ""); // Строка - Payment Account Reference, Уникальный идентификатор для токенезированных (виртуальных) карт связанный с PAN конкретного держателя карты.
Параметры.Вставить("ИдентификаторКорзины"); // Строка - Идентификатор корзины.
Параметры.Вставить("ТоварныеПозиции", Новый Массив()); // Массив - Структур - ПараметрыТоварнойПозиции()
Параметры.Вставить("КодТовараТРУ"); // Строка - Полный код товара, согласованный с перечнем ТРУ
Параметры.Вставить("НомерФискальногоНакопителя"); // Строка - Заводской номер фискального накопителя
Параметры.Вставить("ФискальныйТипРасчета", ПредопределенноеЗначение("Перечисление.ТипыРасчетаДенежнымиСредствами.ПриходДенежныхСредств")); // Перечисление.ТипыРасчетаДенежнымиСредствами - Признак расчета
Параметры.Вставить("ФискальныйПризнакЧека"); // Строка - Фискальный признак документа
Параметры.Вставить("ФискальныйЧекНомер"); // Число - Порядковый номер фискального документа
Параметры.Вставить("ФискальныйЧекДатаВремя"); // ДатаВремя - Дата и время осуществления расчета
Параметры.Вставить("ФискальныйЧекСумма"); // Число - Сумма расчета
Параметры.Вставить("ФискальныйМестоРасчетов"); // Строка - Место расчетов
Параметры.Вставить("QRКодЧекаККТ"); // Строка - QR код чека ККТ
Параметры.Вставить("ОснованиеФискальнойОперации"); // Ссылка - ОснованиеФискальнойОперацииБПО
Возврат Параметры;
КонецФункции
// Пустая структура для параметров товарной позиции
//
// Возвращаемое значение:
// Структура:
// * НомерПозиции - Строка - Порядковый номер позиции в корзине начиная с 1
// * Артикул - Строка - Артикул товара
// * КодТовараТРУ - Строка - Полный код товара, согласованный с перечнем ТРУ
// * Количество - Число - Количество единиц товара
// * Цена - Число - Цена за единицу товара в рублях
// * Сертификаты - Массив из см.ЭлектронныеСертификатыНСПК.ПараметрыСертификата
//
Функция ПараметрыТоварнойПозиции() Экспорт
Параметры = Новый Структура();
Параметры.Вставить("НомерПозиции"); // Строка - Порядковый номер позиции в корзине начиная с 1
Параметры.Вставить("НомерПозицииВозврата"); // Строка - Порядковый номер позиции в корзине покупки, которая содержит возвращаемый товар
Параметры.Вставить("СертификатПоследниеЦифры"); // Строка - Последние цифры (6 символов) сертификата для выбора
Параметры.Вставить("Артикул"); // Строка - Артикул товара
Параметры.Вставить("КодТовараТРУ"); // Строка - Полный код товара, согласованный с перечнем ТРУ
Параметры.Вставить("Количество"); // Число - Количество единиц товара
Параметры.Вставить("Цена"); // Число - Цена за единицу товара в рублях
Параметры.Вставить("Сертификаты", Новый Массив()); // Сертификаты
Возврат Параметры;
КонецФункции
// Пустая структура для параметров товарной позиции
//
// Возвращаемое значение:
// Структура:
// * КодТовараТРУ - Строка - Полный код товара, согласованный с перечнем ТРУ
// * БалансКоличество - Число - Доступное количество
// * БалансДенежныхСредств - Число - Баланс денежных средств
// * ЛимитДенежныхСредств - Число - Лимит денежных средств
//
Функция ПараметрыДоступногоКодТовараТРУ() Экспорт
Параметры = Новый Структура();
Параметры.Вставить("КодТовараТРУ"); // Строка - Полный код товара, согласованный с перечнем ТРУ
Параметры.Вставить("БалансКоличество"); // Число - Доступное количество
Параметры.Вставить("БалансДенежныхСредств"); // Число - Баланс денежных средств
Параметры.Вставить("ЛимитДенежныхСредств"); // Число - Лимит денежных средств
Возврат Параметры;
КонецФункции
// Пустая структура для параметров доступного сертификата
//
// Возвращаемое значение:
// Структура:
// * БалансКоличество - Число - Доступное количество
// * БалансДенежныхСредств - Число - Баланс денежных средств
// * Идентификатор - Строка - Идентификатор сертификата
// * Комментарий - Строка - Комментарий
// * ДатаНачалаДействия - ДатаВремя - Дата начала действия
// * ДатаЗавершенияДействия - ДатаВремя - Дата завершения действия
// * ЛимитДенежныхСредств - Число - Лимит денежных средств
// * Тип - Строка - Тип сертификата
// * КодыТоваровТРУ - Массив - Доступные для сертификата коды товаров ТРУ
//
Функция ПараметрыДоступногоСертификата() Экспорт
Параметры = Новый Структура();
Параметры.Вставить("БалансКоличество"); // Число - Доступное количество
Параметры.Вставить("БалансДенежныхСредств"); // Число - Баланс денежных средств
Параметры.Вставить("Идентификатор"); // Строка - Идентификатор сертификата
Параметры.Вставить("Комментарий"); // Строка - Комментарий
Параметры.Вставить("ДатаНачалаДействия"); // ДатаВремя - Дата начала действия
Параметры.Вставить("ДатаЗавершенияДействия"); // ДатаВремя - Дата завершения действия
Параметры.Вставить("ЛимитДенежныхСредств"); // Число - Лимит денежных средств
Параметры.Вставить("Тип"); // Строка - Тип сертификата
Параметры.Вставить("КодыТоваровТРУ", Новый Массив()); // Массив - Доступные для сертификата коды товаров ТРУ
Возврат Параметры;
КонецФункции
// Пустая структура параметров сертификата
//
// Возвращаемое значение:
// Структура:
// * Идентификатор - Строка - Идентификатор сертификата
// * Количество - Число - Количество
// * Цена - Число - Цена
// * МаксимальнаяЦена - Число - Максимальная цена
//
Функция ПараметрыСертификата() Экспорт
Параметры = Новый Структура();
Параметры.Вставить("Идентификатор"); // Идентификатор
Параметры.Вставить("Количество"); // Количество
Параметры.Вставить("Цена"); // Цена
Параметры.Вставить("МаксимальнаяЦена"); // Максимальная цена
Возврат Параметры;
КонецФункции
// Пустая структура параметров идентификаторов корзин покупок ТСП
//
// Возвращаемое значение:
// Структура:
// * ИдентификаторКорзины - Строка - Идентификатор сертификата
// * ДатаАвторизации - ДатаВремя - Дата авторизации
//
Функция ПараметрыИдентификаторовКорзинПокупокТСП() Экспорт
Параметры = Новый Структура();
Параметры.Вставить("ИдентификаторКорзины"); // Идентификатор корзины
Параметры.Вставить("ДатаАвторизации"); // Дата авторизации
Возврат Параметры;
КонецФункции
// Результат выполнения операции взаимодействия с сервером НСПК
//
// Параметры:
// Результат - Булево.
// ОписаниеОшибки - Строка.
//
// Возвращаемое значение:
// Структура:
// * Результат - Булево.
// * КодРезультата - Число.
// * ОписаниеОшибки - Строка.
// * ТоварныеПозиции - Массив.
// * ИдентификаторКорзины - Число.
// * СуммаСертификатами - Число.
//
Функция ПараметрыВыполненияОперации(Результат = Ложь, ОписаниеОшибки = Неопределено) Экспорт
РезультатВыполнения = Новый Структура();
РезультатВыполнения.Вставить("Результат" , Результат);
РезультатВыполнения.Вставить("КодРезультата" , 999);
РезультатВыполнения.Вставить("ОписаниеОшибки", ОписаниеОшибки);
РезультатВыполнения.Вставить("ТоварныеПозиции", Новый Массив());
РезультатВыполнения.Вставить("ДоступныеСертификаты", Новый Массив());
РезультатВыполнения.Вставить("ИдентификаторКорзины");
РезультатВыполнения.Вставить("СуммаСертификатами", 0);
РезультатВыполнения.Вставить("ИдентификаторыКорзинПокупок", Новый Массив());
Возврат РезультатВыполнения;
КонецФункции
// Результат выполнения операции взаимодействия с сервером НСПК
//
// Параметры:
// ПараметрыОперации - Структура -
// ПроверятьПлатежныйСчет - Булево -
// ПроверятьКорректностьТРУ - Булево -
//
// Возвращаемое значение:
// Структура
//
Функция ПроверитьПараметрыОперации(ПараметрыОперации, ПроверятьПлатежныйСчет = Ложь, ПроверятьКорректностьТРУ = Ложь) Экспорт
РезультатВыполнения = ПараметрыВыполненияОперации(Истина);
ПараметрыОперации.ИдентификаторЗапроса = Строка(ПараметрыОперации.ИдентификаторЗапроса);
Если ПустаяСтрока(ПараметрыОперации.ИдентификаторЗапроса) Или ПараметрыОперации.ИдентификаторЗапроса = "0" Тогда
ПараметрыОперации.ИдентификаторЗапроса = Строка(Новый УникальныйИдентификатор());
КонецЕсли;
Если СтрДлина(Строка(ПараметрыОперации.ИдентификаторЗапроса)) < 36 Тогда
РезультатВыполнения.ОписаниеОшибки = НСтр("ru = 'Необходим корректный идентификатор запроса (UUID).'");
РезультатВыполнения.Результат = Ложь;
Возврат РезультатВыполнения;
КонецЕсли;
Если ПроверятьКорректностьТРУ Тогда
// Полный код ТРУ указывается в запросе и имеет формат: NNNNNNNNN.NNNNNNNNNYYYYMMMMZZZ
Для Каждого ТоварнаяПозиция Из ПараметрыОперации.ТоварныеПозиции Цикл
КодТовараТРУ = СтрРазделить(ТоварнаяПозиция.КодТовараТРУ, ".");
КодКорректный = (КодТовараТРУ.Количество() = 2)
И СтрДлина(КодТовараТРУ[0]) = 9 И ОбщегоНазначенияБПОКлиентСервер.ТолькоЦифрыВСтроке(КодТовараТРУ[0])
И (СтрДлина(КодТовараТРУ[1]) = 20) И ОбщегоНазначенияБПОКлиентСервер.ТолькоЦифрыВСтроке(КодТовараТРУ[1]);
Если НЕ КодКорректный Тогда
РезультатВыполнения.ОписаниеОшибки = НСтр("ru = 'Код ТРУ указан некорректно. Код должен быть в формате NNNNNNNNN.NNNNNNNNNNNNNNNNNNNN'");
РезультатВыполнения.Результат = Ложь;
Возврат РезультатВыполнения;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ПроверятьПлатежныйСчет
И ПараметрыОперации.ПротоколОбмена = ПредопределенноеЗначение("Перечисление.ПротоколОбменаФЭСНСПК.ВерсияV2")
И ПустаяСтрока(ПараметрыОперации.СсылкаНаПлатежныйСчет) Тогда
РезультатВыполнения.ОписаниеОшибки = НСтр("ru = 'Ошибка проведения операции по протоколу ФЭС НСПК v2.'") + Символы.ПС +
НСтр("ru = 'Необходимо обязательное указание PAR (Payment Account Reference).'");
РезультатВыполнения.Результат = Ложь;
КонецЕсли;
Возврат РезультатВыполнения;
КонецФункции
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
Функция ПолучитьJSONПараметры(ПараметрыОперации) Экспорт
#Если ВебКлиент Тогда
Возврат ЭлектронныеСертификатыНСПКВызовСервера.ПолучитьJSONПараметры(ПараметрыОперации);
#Иначе
ПараметрыЗапись = Новый Структура();
Если ПараметрыОперации <> Неопределено Тогда
Если ПараметрыОперации.Свойство("АдресСервера") Тогда
АдресСервера = СокрЛП(ПараметрыОперации.АдресСервера);
Если Прав(АдресСервера, 1)="/" Или Прав(АдресСервера, 1)="\" Тогда
АдресСервера = Лев(АдресСервера, СтрДлина(АдресСервера)-1);
КонецЕсли;
ПараметрыЗапись.Вставить("Host", АдресСервера);
КонецЕсли;
Если ПараметрыОперации.Свойство("КлючДоступа") Тогда
ПараметрыЗапись.Вставить("ApiKey", СокрЛП(ПараметрыОперации.КлючДоступа));
КонецЕсли;
Если ПараметрыОперации.Свойство("КлючКассы") Тогда
ПараметрыЗапись.Вставить("MACKey", СокрЛП(ПараметрыОперации.КлючКассы));
КонецЕсли;
Если ПараметрыОперации.Свойство("ПроверятьКорневыеСертификаты") Тогда
ПараметрыЗапись.Вставить("CheckRootCertificates", ?(ПараметрыОперации.ПроверятьКорневыеСертификаты, "True", "False"));
КонецЕсли;
Если ПараметрыОперации.Свойство("ПротоколОбмена") Тогда
ВерсияАПИ = ?(ПараметрыОперации.ПротоколОбмена = ПредопределенноеЗначение("Перечисление.ПротоколОбменаФЭСНСПК.ВерсияV2"), 2, 1);
ПараметрыЗапись.Вставить("APIVersion", ВерсияАПИ);
КонецЕсли;
Если ПараметрыОперации.Свойство("ИнтернетПрокси") Тогда
ИнтернетПрокси = ПараметрыОперации.ИнтернетПрокси;
ПараметрыЗапись.Вставить("Proxy" , СокрЛП(ИнтернетПрокси.Сервер));
ПараметрыЗапись.Вставить("ProxyPort" , СокрЛП(ИнтернетПрокси.Порт));
ПараметрыЗапись.Вставить("ProxyUser" , СокрЛП(ИнтернетПрокси.Пользователь));
ПараметрыЗапись.Вставить("ProxyPassword", СокрЛП(ИнтернетПрокси.Пароль));
КонецЕсли;
КонецЕсли;
ЗаписьJSON = Новый ЗаписьJSON();
ЗаписьJSON.ПроверятьСтруктуру = Ложь;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ПараметрыЗапись);
Результат = ЗаписьJSON.Закрыть();
Возврат Результат;
#КонецЕсли
КонецФункции
// Обработать данные товарной позиции, формирование текста JSON
//
// Параметры:
// ТоварныеПозиции - Массив из Структура
// НормализоватьКодТРУ - Булево - Код товара ТРУ преобразовать к виду NNNNNNNNN.NNNNNNNNNYYYYMMMMZZZ
//
// Возвращаемое значение:
// Строка
//
Функция ПолучитьJSONТоварныеПозиции(ТоварныеПозиции, НормализоватьКодТРУ = Ложь) Экспорт
#Если ВебКлиент Тогда
Возврат ЭлектронныеСертификатыНСПКВызовСервера.ПолучитьJSONТоварныеПозиции(ТоварныеПозиции, НормализоватьКодТРУ);
#Иначе
ЗаписьJSON = Новый ЗаписьJSON();
ЗаписьJSON.ПроверятьСтруктуру = Ложь;
ЗаписьJSON.УстановитьСтроку();
Позиции = Новый Массив();
Для Каждого Позиция Из ТоварныеПозиции Цикл
Товар = Новый Структура();
Товар.Вставить("count" , Позиция.Количество);
Товар.Вставить("price" , Позиция.Цена * 100); // Цена за единицу товара в копейках
КодТовараТРУ = Позиция.КодТовараТРУ;
Если НормализоватьКодТРУ Тогда
КодТовараТРУ = СокрЛП(КодТовараТРУ);
КодТовараТРУ = СтрЗаменить(КодТовараТРУ, " ", "0");
Пока СтрДлина(КодТовараТРУ) < 30 Цикл
КодТовараТРУ = КодТовараТРУ + "0";
КонецЦикла;
КонецЕсли;
Товар.Вставить("truCode", КодТовараТРУ);
Если Позиция.Свойство("Артикул") Тогда
Товар.Вставить("articleCode", Позиция.Артикул);
КонецЕсли;
Товар.Вставить("articleNumber", Позиция.НомерПозиции);
Если Позиция.Свойство("НомерПозицииВозврата") Тогда
Товар.Вставить("originalArticleNumber", Позиция.НомерПозицииВозврата);
КонецЕсли;
Если Не ПустаяСтрока(Позиция.СертификатПоследниеЦифры) Тогда
ДополнительныйРеквизит = Новый Структура();
ДополнительныйРеквизит.Вставить("code", "certificateLastNumbers");
ДополнительныйРеквизит.Вставить("value", Лев(Позиция.СертификатПоследниеЦифры, 6));
МассивРеквизит = Новый Массив();
МассивРеквизит.Добавить(ДополнительныйРеквизит);
Товар.Вставить("additionalInfo", МассивРеквизит);
КонецЕсли;
Позиции.Добавить(Товар);
КонецЦикла;
ЗаписатьJSON(ЗаписьJSON, Позиции);
Результат = ЗаписьJSON.Закрыть();
Возврат Результат;
#КонецЕсли
КонецФункции
Функция ПараметрыВыполненияОперацииНаСервере() Экспорт
Результат = Новый Структура();
Результат.Вставить("ТекстРезультата", "");
Результат.Вставить("СписокОшибок", "");
Результат.Вставить("ОснованиеФискальнойОперации", Неопределено);
Результат.Вставить("ПараметрыОперации"); // Структура
Результат.Вставить("ТипПлатежнойОперации", "");
Возврат Результат;
КонецФункции
Функция ТипПлатежнойОперацииПредварительноеОдобрениеИспользованияЭС() Экспорт
Возврат "ПредварительноеОдобрениеИспользованияЭС"; // Не локализовывать
КонецФункции
Функция ТипПлатежнойОперацииПредварительноеОдобрениеВозвратаЭС() Экспорт
Возврат "ПредварительноеОдобрениеВозвратаЭС"; // Не локализовывать
КонецФункции
Функция ТипПлатежнойОперацииПередачаДанныхФискальногоЧека() Экспорт
Возврат "ПередачаДанныхФискальногоЧека"; // Не локализовывать
КонецФункции
Функция ТипПлатежнойОперацииПолучениеИдентификатораОперации() Экспорт
Возврат "ПолучениеИдентификатораОперации"; // Не локализовывать
КонецФункции
Функция ТипПлатежнойОперацииПолучениеСоставаКорзины() Экспорт
Возврат "ПолучениеСоставаКорзины"; // Не локализовывать
КонецФункции
Функция ТипПлатежнойОперацииПолучениеСпискаСертификатов() Экспорт
Возврат "ПолучениеСпискаСертификатов"; // Не локализовывать
КонецФункции
Функция ТипПлатежнойОперацииПолучениеСпискаИдентификаторовКорзинПокупокТСП() Экспорт
Возврат "ПолучениеСпискаИдентификаторовКорзинПокупокТСП"; // Не локализовывать
КонецФункции
#КонецОбласти