From 7dd339b37cd11cea3656ebcf57c4d2c73034078e Mon Sep 17 00:00:00 2001
From: Dmitry <b4tm4n@mail.ru>
Date: Tue, 2 Aug 2022 11:55:56 +0300
Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82?=
 =?UTF-8?q?=D1=80=D1=8B=20=D0=B4=D0=BB=D1=8F=20=D0=B0=D0=BA=D1=82=D0=B8?=
 =?UTF-8?q?=D0=B2=D0=B0=D1=86=D0=B8=D0=B8=20=D0=BF=D0=B8=D0=BD=D0=BA=D0=BE?=
 =?UTF-8?q?=D0=B4=D0=B0=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20=D1=81=D0=BE?=
 =?UTF-8?q?=D0=BE=D1=82=D0=B2=D0=B5=D1=82=D1=81=D1=82=D0=B2=D0=B8=D0=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../Forms/Форма/Ext/Form/Module.bsl           | 84 +++++++++++++------
 .../Forms/ФормаАктивацииЛицензии/Ext/Form/Module.bsl | 76 ++++++++++++-----
 2 files changed, 111 insertions(+), 49 deletions(-)

diff --git a/src/ИнформацияОЛицензиях1С/Forms/Форма/Ext/Form/Module.bsl b/src/ИнформацияОЛицензиях1С/Forms/Форма/Ext/Form/Module.bsl
index 68ffeeb..f1b3f41 100644
--- a/src/ИнформацияОЛицензиях1С/Forms/Форма/Ext/Form/Module.bsl
+++ b/src/ИнформацияОЛицензиях1С/Forms/Форма/Ext/Form/Module.bsl
@@ -6,7 +6,7 @@
 	Попытка
 		СтрокаДата = Прав(СтрокаДата, 10);
 		МассивДата = Новый Массив;
-		МассивДата =  СтрРазделить(СтрокаДата, ".");
+		МассивДата =  СтрРазделить(СтрокаДата, ".", Ложь);
 		Возврат Дата(Строка(МассивДата[2]) + Строка(МассивДата[1]) + Строка(МассивДата[0]));
 	Исключение
 		Возврат Дата(1899, 12, 30);
@@ -47,7 +47,7 @@
             КонецЕсли;
 		КонецЕсли;
 
-		мПинЛицензия = СтрРазделить(ПинЛицензия, "-");
+		мПинЛицензия = СтрРазделить(ПинЛицензия, "-", Ложь);
 		Если мПинЛицензия.Количество() < 2 Тогда
 			Продолжить;
 		КонецЕсли;
@@ -108,11 +108,36 @@
     // общ
     Р.Вставить("License generation date:", "ДатаАктивации");
 	Р.Вставить("Distribution kit registration number:", "РегистрационныйНомер");
+    Р.Вставить("DistributionKitRegistrationNumber:", "РегистрационныйНомер");
 	Р.Вставить("Product code:", "КодПродукта");
+    Р.Вставить("ProductCode:", "КодПродукта");
     
 	Возврат Новый ФиксированноеСоответствие(Р);
 КонецФункции
 
+&НаСервереБезКонтекста
+Функция Соответсвие_АктивацияПинКода()
+    Р = Новый Соответствие;
+    Р.Вставить("Имя", "--first-name");
+    Р.Вставить("Отчество", "--middle-name");
+    Р.Вставить("Фамилия", "--last-name");
+    Р.Вставить("EMail", "--email");
+    Р.Вставить("Компания", "--company");
+    Р.Вставить("Страна", "--country");
+    Р.Вставить("Индекс", "--zip-code");
+    Р.Вставить("Город", "--town");
+    Р.Вставить("Регион", "--region");
+    Р.Вставить("Район", "--district");
+    Р.Вставить("Улица", "--street");
+    Р.Вставить("Дом", "--house");
+    Р.Вставить("Строение", "--building");
+    Р.Вставить("Квартира", "--apartment");
+    Р.Вставить("НомерЛицензии", "--serial");
+    Р.Вставить("НовыйПинКод", "--pin");
+    Р.Вставить("ПинКод", "--previous-pin");
+    Возврат Новый ФиксированноеСоответствие(Р);
+КонецФункции
+
 &НаСервере
 Функция ЗапросИнформацииОЛицезнии(ИмяЛицензии)
 	СтруктураОтвета = Новый Структура("Описание, Фамилия, Имя, Отчество, EMail, Компания, Страна, Индекс, Город, Регион, Район, Улица, Дом, Строение, Квартира, ДатаАктивации, РегистрационныйНомер, КодПродукта, ТекстоваяИнформация, КоличествоЛицензий");
@@ -160,8 +185,8 @@
     Позиция_РабМест = СтрНайти(СтруктураОтвета.Описание, " рабочих мест");
     Если Позиция_РабМест > 0 Тогда
         тСтр = Лев(СтруктураОтвета.Описание, Позиция_РабМест);
-        мСтр = СтрРазделить(тСтр, " ");
-        СтруктураОтвета.КоличествоЛицензий = Число(мСтр[мСтр.Количество() - 1]);
+        мСтр = СтрРазделить(СокрЛП(тСтр), " ", Ложь);
+        СтруктураОтвета.КоличествоЛицензий = Число(СокрЛП(мСтр[мСтр.Количество() - 1]));
     КонецЕсли;
     
     СтруктураОтвета.ДатаАктивации = СтрокуВДату(СтруктураОтвета.ДатаАктивации);
@@ -240,31 +265,36 @@
 
 &НаСервере
 Процедура ПовторнаяАктивацияЛицензииНаСервере(ПереданныеПараметры)
-	СтруктураПараметров = Новый Структура(" НовыйПинКод,ПинКод, Описание, Фамилия, Имя, Отчество, EMail, Компания, Страна, Индекс, Город, Улица, Дом, ДатаАктивации, РегистрационныйНомер, КодПродукта, ТекстоваяИнформация, КоличествоЛицензий");
-
+	СтруктураПараметров = Новый Структура("НовыйПинКод, ПинКод, Описание, Фамилия, Имя, Отчество, EMail, Компания, Страна, Индекс, Город, Улица, Дом, ДатаАктивации, РегистрационныйНомер, КодПродукта, ТекстоваяИнформация, КоличествоЛицензий");
+    
+    Кавычка = Символ(34);
+    
+    Реквизиты = Соответсвие_АктивацияПинКода();
+    ОбязательныеРеквизиты = СтрРазделить("НомерЛицензии,ПинКод,НовыйПинКод", ",");
+    
+    СтрокаПараметров = "";
+    Для Каждого ТекРеквизит Из Реквизиты Цикл
+        ЭтоОбязательный = Не Неопределено = ОбязательныеРеквизиты.Найти(ТекРеквизит.Ключ);
+        
+        ЗначениеРеквизита = ПереданныеПараметры[ТекРеквизит.Ключ];
+        
+        РеквизитЗаполнен = ЗначениеЗаполнено(ЗначениеРеквизита);
+        ВыводитьРеквизит = ЭтоОбязательный ИЛИ РеквизитЗаполнен;
+        
+        Если НЕ ВыводитьРеквизит Тогда
+            Продолжить;
+        КонецЕсли;
+        
+        Если НЕ ЭтоОбязательный Тогда
+            ЗначениеРеквизита = СтрШаблон("%1%2%1", Кавычка, ЗначениеРеквизита);
+        КонецЕсли;
+        
+        СтрокаПараметров = СтрокаПараметров + СтрШаблон(" %1 %2", ТекРеквизит.Значение, ЗначениеРеквизита);
+    КонецЦикла;
+    
 	ФайлОтвет = "";
     ФайлОшибок = "";
-	ИмяВременногоФайлаCMD = SPS_СоздатьСистемныйСкрипт(
-        "call ring license activate" + ?(ЗначениеЗаполнено(
-        ПереданныеПараметры.Имя), " --first-name " + ПереданныеПараметры.Имя, "") + ?(ЗначениеЗаполнено(
-        ПереданныеПараметры.Отчество), " --middle-name " + ПереданныеПараметры.Отчество, "") + ?(ЗначениеЗаполнено(
-        ПереданныеПараметры.Фамилия), " --last-name " + ПереданныеПараметры.Фамилия, "") + ?(ЗначениеЗаполнено(
-        ПереданныеПараметры.EMail), " --email " + ПереданныеПараметры.EMail, "") + ?(ЗначениеЗаполнено(
-        ПереданныеПараметры.Компания), " --company " + Символ(34) + СтрЗаменить(ПереданныеПараметры.Компания, Символ(
-        34), "") + Символ(34), "") + ?(ЗначениеЗаполнено(ПереданныеПараметры.Страна), " --country " + Символ(34)
-        + ПереданныеПараметры.Страна + Символ(34), "") + ?(ЗначениеЗаполнено(ПереданныеПараметры.Индекс),
-        " --zip-code " + ПереданныеПараметры.Индекс, "") + ?(ЗначениеЗаполнено(ПереданныеПараметры.Город), " --town "
-        + Символ(34) + ПереданныеПараметры.Город + Символ(34), "") + ?(ЗначениеЗаполнено(ПереданныеПараметры.Регион),
-        " --region " + Символ(34) + ПереданныеПараметры.Регион + Символ(34), "") + ?(ЗначениеЗаполнено(
-        ПереданныеПараметры.Район), " --district " + Символ(34) + ПереданныеПараметры.Район + Символ(34), "") + ?(
-        ЗначениеЗаполнено(ПереданныеПараметры.Улица), " --street " + Символ(34) + ПереданныеПараметры.Улица + Символ(
-        34), "") + ?(ЗначениеЗаполнено(ПереданныеПараметры.Дом), " --house " + Символ(34) + ПереданныеПараметры.Дом
-        + Символ(34), "") + ?(ЗначениеЗаполнено(ПереданныеПараметры.Строение), " --building " + Символ(34)
-        + ПереданныеПараметры.Строение + Символ(34), "") + ?(ЗначениеЗаполнено(ПереданныеПараметры.Квартира),
-        " --apartment " + Символ(34) + ПереданныеПараметры.Квартира + Символ(34), "") + " --serial "
-        + ПереданныеПараметры.НомерЛицензии + " --pin " + ПереданныеПараметры.НовыйПинКод + " --previous-pin "
-        + ПереданныеПараметры.ПинКод + " --validate", ФайлОтвет, ФайлОшибок
-    );
+	ИмяВременногоФайлаCMD = SPS_СоздатьСистемныйСкрипт(СтрШаблон("call ring license activate %1 --validate", СтрокаПараметров), ФайлОтвет, ФайлОшибок);
     SPS_ЗапуститьСистемныйСкрипт(ИмяВременногоФайлаCMD);
     
     SPS_ВыводФайлаОшибок(ФайлОшибок);
diff --git a/src/ИнформацияОЛицензиях1С/Forms/ФормаАктивацииЛицензии/Ext/Form/Module.bsl b/src/ИнформацияОЛицензиях1С/Forms/ФормаАктивацииЛицензии/Ext/Form/Module.bsl
index ac897a8..3a81972 100644
--- a/src/ИнформацияОЛицензиях1С/Forms/ФормаАктивацииЛицензии/Ext/Form/Module.bsl
+++ b/src/ИнформацияОЛицензиях1С/Forms/ФормаАктивацииЛицензии/Ext/Form/Module.bsl
@@ -1,22 +1,56 @@
-&НаСервере
-Функция АктивироватьНаСервере()
+&НаСервереБезКонтекста
+Функция Соответсвие_АктивацияПинКода()
+    Р = Новый Соответствие;
+    Р.Вставить("Имя", "--first-name");
+    Р.Вставить("Отчество", "--middle-name");
+    Р.Вставить("Фамилия", "--last-name");
+    Р.Вставить("EMail", "--email");
+    Р.Вставить("Компания", "--company");
+    Р.Вставить("Страна", "--country");
+    Р.Вставить("Индекс", "--zip-code");
+    Р.Вставить("Город", "--town");
+    Р.Вставить("Регион", "--region");
+    Р.Вставить("Район", "--district");
+    Р.Вставить("Улица", "--street");
+    Р.Вставить("Дом", "--house");
+    Р.Вставить("Строение", "--building");
+    Р.Вставить("Квартира", "--apartment");
+    Р.Вставить("НомерЛицензии", "--serial");
+    Р.Вставить("НовыйПинКод", "--pin");
+    Р.Вставить("ПинКод", "--previous-pin");
+    Возврат Новый ФиксированноеСоответствие(Р);
+КонецФункции
 
+&НаСервере
+Функция АктивироватьНаСервере()
+    Кавычка = Символ(34);
+    
+    Реквизиты = Соответсвие_АктивацияПинКода();
+    ОбязательныеРеквизиты = СтрРазделить("НомерЛицензии,ПинКод,НовыйПинКод", ",");
+    
+    СтрокаПараметров = "";
+    Для Каждого ТекРеквизит Из Реквизиты Цикл
+        ЭтоОбязательный = Не Неопределено = ОбязательныеРеквизиты.Найти(ТекРеквизит.Ключ);
+        
+        ЗначениеРеквизита = ЭтаФорма[ТекРеквизит.Ключ];
+        
+        РеквизитЗаполнен = ЗначениеЗаполнено(ЗначениеРеквизита);
+        ВыводитьРеквизит = ЭтоОбязательный ИЛИ РеквизитЗаполнен;
+        
+        Если НЕ ВыводитьРеквизит Тогда
+            Продолжить;
+        КонецЕсли;
+        
+        Если НЕ ЭтоОбязательный Тогда
+            ЗначениеРеквизита = СтрШаблон("%1%2%1", Кавычка, ЗначениеРеквизита);
+        КонецЕсли;
+        
+        СтрокаПараметров = СтрокаПараметров + СтрШаблон(" %1 %2", ТекРеквизит.Значение, ЗначениеРеквизита);
+    КонецЦикла;
+    
 	ФайлОтвет = "";
     ФайлОшибок = "";
-	ИмяВременногоФайлаCMD = SPS_СоздатьСистемныйСкрипт(
-        "call ring license activate" + ?(ЗначениеЗаполнено(Имя),
-		" --first-name " + Имя, "") + ?(ЗначениеЗаполнено(Отчество), " --middle-name " + Отчество, "") + ?(
-		ЗначениеЗаполнено(Фамилия), " --last-name " + Фамилия, "") + " --email " + EMail + ?(ЗначениеЗаполнено(
-		Компания), " --company " + Символ(34) + СтрЗаменить(Компания, Символ(34), "") + Символ(34), "") + " --country "
-		+ Символ(34) + Страна + Символ(34) + " --zip-code " + Индекс + " --town " + Символ(34) + Город + Символ(34) + ?(
-		ЗначениеЗаполнено(Регион), " --region " + Символ(34) + Регион + Символ(34), "") + ?(ЗначениеЗаполнено(Район),
-		" --district " + Символ(34) + Район + Символ(34), "") + ?(ЗначениеЗаполнено(Улица), " --street " + Символ(34)
-		+ Улица + Символ(34), "") + ?(ЗначениеЗаполнено(Дом), " --house " + Символ(34) + Дом + Символ(34), "") + ?(
-		ЗначениеЗаполнено(Строение), " --building " + Символ(34) + Строение + Символ(34), "") + ?(ЗначениеЗаполнено(
-		Квартира), " --apartment " + Символ(34) + Квартира + Символ(34), "") + " --serial " + НомерЛицензии + " --pin "
-		+ ПинКод + ?(ЗначениеЗаполнено(ПредыдущийПинКод), " --previous-pin " + ПредыдущийПинКод, "") + " --validate", ФайлОтвет, ФайлОшибок
-    );
-    SPS_ЗапуститьСистемныйСкрипт(ИмяВременногоФайлаCMD);
+	ИмяВременногоФайлаCMD = SPS_СоздатьСистемныйСкрипт(СтрШаблон("call ring license activate %1 --validate", СтрокаПараметров), ФайлОтвет, ФайлОшибок);
     
     SPS_ВыводФайлаОшибок(ФайлОшибок);
     фФайлОтвет = Новый Файл(ФайлОтвет);
@@ -86,10 +120,10 @@
     
     Если НЕ Это_Windows Тогда
         // добавление Шебанг
-        ТекстСкрипта.ЗаписатьСтроку("#!/bin/sh");
-        ТекстСкрипта.ЗаписатьСтроку("");
+        //ТекстСкрипта.ЗаписатьСтроку("#!/bin/sh");
+        //ТекстСкрипта.ЗаписатьСтроку("");
         
-        // исправление кодировки вывода (для парсинга)
+        // выбор языка вывода (для парсинга)
         ТекстСкрипта.ЗаписатьСтроку("export LC_ALL=en_US.UTF8");
         
         // избавляемся от call
@@ -110,9 +144,7 @@
     Это_Windows = SPS_ЭтоWindows();
     
     // добавляем интерпретатор чтобы запускать скрипт без "chmod +x"
-    Если НЕ Это_Windows Тогда
-        ИмяФайлаСкрипта = СтрШаблон("/bin/sh %1", ИмяФайлаСкрипта);
-    КонецЕсли;
+    ИмяФайлаСкрипта = СтрШаблон(?(Это_Windows, "cmd.exe /c %1", "/bin/sh %1"), ИмяФайлаСкрипта);
     
     ЗапуститьПриложение(ИмяФайлаСкрипта, КаталогВременныхФайлов(), Истина);
 КонецПроцедуры