702 lines
38 KiB
Plaintext
702 lines
38 KiB
Plaintext
&НаСервере
|
||
Перем Кеш;
|
||
|
||
&НаСервере
|
||
Функция СтрокуВДату(СтрокаДата)
|
||
Попытка
|
||
СтрокаДата = Прав(СтрокаДата, 10);
|
||
МассивДата = Новый Массив;
|
||
МассивДата = СтрРазделить(СтрокаДата, ".", Ложь);
|
||
Возврат Дата(Строка(МассивДата[2]) + Строка(МассивДата[1]) + Строка(МассивДата[0]));
|
||
Исключение
|
||
Возврат Дата(1899, 12, 30);
|
||
КонецПопытки;
|
||
КонецФункции
|
||
|
||
&НаСервере
|
||
Процедура ПолучитьСписокЛицензийНаСервере()
|
||
Объект.СписокЛицензий.Очистить();
|
||
ФайлОтвет = "";
|
||
ФайлОшибок = "";
|
||
|
||
ИмяВременногоФайлаCMD = SPS_СоздатьСистемныйСкрипт("ring license list", ФайлОтвет, ФайлОшибок);
|
||
SPS_ЗапуститьСистемныйСкрипт(ИмяВременногоФайлаCMD);
|
||
|
||
SPS_ВыводФайлаОшибок(ФайлОшибок);
|
||
|
||
фФайлОтвет = Новый Файл(ФайлОтвет);
|
||
Если НЕ фФайлОтвет.Существует() Тогда
|
||
ВызватьИсключение "Ошибка чтения результата";
|
||
КонецЕсли;
|
||
|
||
Текст = Новый ЧтениеТекста;
|
||
Текст.Открыть(ФайлОтвет, SPS_КодировкаФайлаОтвета());
|
||
стр = "";
|
||
Пока стр <> Неопределено Цикл
|
||
стр = Текст.ПрочитатьСтроку();
|
||
|
||
ПозицияИмениФайла = СтрНайти(стр, "(file name:");
|
||
Если ПозицияИмениФайла > 0 Тогда
|
||
ПинЛицензия = Лев(стр, ПозицияИмениФайла - 1);
|
||
Иначе
|
||
ПозицияИмениФайла = СтрНайти(стр, "(имя файла:");
|
||
Если ПозицияИмениФайла > 0 Тогда
|
||
ПинЛицензия = Лев(стр, ПозицияИмениФайла - 1);
|
||
Иначе
|
||
ПинЛицензия = стр;
|
||
КонецЕсли;
|
||
КонецЕсли;
|
||
|
||
мПинЛицензия = СтрРазделить(ПинЛицензия, "-", Ложь);
|
||
Если мПинЛицензия.Количество() < 2 Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
ИмяФайлаЛицензии = Сред(стр, ПозицияИмениФайла + 13, 99);
|
||
ИмяФайлаЛицензии = СтрЗаменить(ИмяФайлаЛицензии, """)", "");
|
||
нСтр = Объект.СписокЛицензий.Добавить();
|
||
нСтр.ПинКод = мПинЛицензия[0];
|
||
нСтр.НомерЛицензии = мПинЛицензия[1];
|
||
нСтр.ИмяФайлаЛицензии = ИмяФайлаЛицензии;
|
||
нСтр.РучнойВвод = Ложь;
|
||
КонецЦикла;
|
||
Текст.Закрыть();
|
||
УдалитьФайлы(ФайлОтвет);
|
||
УдалитьФайлы(ИмяВременногоФайлаCMD);
|
||
КонецПроцедуры
|
||
|
||
&НаКлиенте
|
||
Процедура ПолучитьСписокЛицензий()
|
||
ПолучитьСписокЛицензийНаСервере();
|
||
КонецПроцедуры
|
||
|
||
&НаСервереБезКонтекста
|
||
Функция Соответствие_РазборИнформацииОЛицензии()
|
||
Р = Новый Соответствие;
|
||
|
||
// англ
|
||
Р.Вставить("First name:", "Имя");
|
||
Р.Вставить("Middle name:", "Отчество");
|
||
Р.Вставить("Last name:", "Фамилия");
|
||
Р.Вставить("Email:", "Email");
|
||
Р.Вставить("Company:", "Компания");
|
||
Р.Вставить("Country:", "Страна");
|
||
Р.Вставить("ZIP code:", "Индекс");
|
||
Р.Вставить("Region:", "Регион");
|
||
Р.Вставить("Town:", "Город");
|
||
Р.Вставить("District:", "Район");
|
||
Р.Вставить("Building:", "Строение");
|
||
Р.Вставить("Apartment:", "Квартира");
|
||
Р.Вставить("Street:", "Улица");
|
||
Р.Вставить("House:", "Дом");
|
||
Р.Вставить("Description:", "Описание");
|
||
|
||
// рус
|
||
Р.Вставить("Имя:", "Имя");
|
||
Р.Вставить("Отчество:", "Отчество");
|
||
Р.Вставить("Фамилия:", "Фамилия");
|
||
Р.Вставить("e-mail:", "Email");
|
||
Р.Вставить("Компания:", "Компания");
|
||
Р.Вставить("Страна:", "Страна");
|
||
Р.Вставить("Индекс:", "Индекс");
|
||
Р.Вставить("Регион/область:", "Регион");
|
||
Р.Вставить("Район:", "Район");
|
||
Р.Вставить("Город:", "Город");
|
||
Р.Вставить("Улица:", "Улица");
|
||
Р.Вставить("Дом:", "Дом");
|
||
Р.Вставить("Описание:", "Описание");
|
||
|
||
// общ
|
||
Р.Вставить("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, Компания, Страна, Индекс, Город, Регион, Район, Улица, Дом, Строение, Квартира, ДатаАктивации, РегистрационныйНомер, КодПродукта, ТекстоваяИнформация, КоличествоЛицензий");
|
||
ФайлОтвет = "";
|
||
ФайлОшибок = "";
|
||
ИмяВременногоФайлаCMD = SPS_СоздатьСистемныйСкрипт(СтрШаблон("call ring license info --name %1", ИмяЛицензии), ФайлОтвет, ФайлОшибок);
|
||
SPS_ЗапуститьСистемныйСкрипт(ИмяВременногоФайлаCMD);
|
||
|
||
SPS_ВыводФайлаОшибок(ФайлОшибок);
|
||
фФайлОтвет = Новый Файл(ФайлОтвет);
|
||
Если НЕ фФайлОтвет.Существует() Тогда
|
||
ВызватьИсключение "Ошибка чтения результата";
|
||
КонецЕсли;
|
||
|
||
Реквизиты = Соответствие_РазборИнформацииОЛицензии();
|
||
|
||
РазобранныеРеквизиты = Новый Соответствие;
|
||
|
||
Текст = Новый ЧтениеТекста;
|
||
Текст.Открыть(ФайлОтвет, SPS_КодировкаФайлаОтвета());
|
||
стр = "";
|
||
Пока стр <> Неопределено Цикл
|
||
стр = Текст.ПрочитатьСтроку();
|
||
|
||
ДлинаСтроки = СтрДлина(стр);
|
||
|
||
Для Каждого ТекРеквизит Из Реквизиты Цикл
|
||
Если Не Неопределено = РазобранныеРеквизиты.Получить(ТекРеквизит.Ключ) Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
|
||
Позиция_ТекРеквизит = СтрНайти(стр, ТекРеквизит.Ключ);
|
||
Если 0 = Позиция_ТекРеквизит Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
|
||
СтруктураОтвета[ТекРеквизит.Значение] = Прав(стр, ДлинаСтроки - Позиция_ТекРеквизит - СтрДлина(ТекРеквизит.Ключ));
|
||
СтруктураОтвета[ТекРеквизит.Значение] = СокрЛП(СтруктураОтвета[ТекРеквизит.Значение]);
|
||
РазобранныеРеквизиты.Вставить(ТекРеквизит.Ключ, Истина);
|
||
|
||
Прервать;
|
||
КонецЦикла;
|
||
КонецЦикла;
|
||
|
||
Позиция_РабМест = СтрНайти(СтруктураОтвета.Описание, " рабочих мест");
|
||
Если Позиция_РабМест > 0 Тогда
|
||
тСтр = Лев(СтруктураОтвета.Описание, Позиция_РабМест);
|
||
мСтр = СтрРазделить(СокрЛП(тСтр), " ", Ложь);
|
||
СтруктураОтвета.КоличествоЛицензий = Число(СокрЛП(мСтр[мСтр.Количество() - 1]));
|
||
КонецЕсли;
|
||
|
||
СтруктураОтвета.ДатаАктивации = СтрокуВДату(СтруктураОтвета.ДатаАктивации);
|
||
|
||
Текст.Закрыть();
|
||
УдалитьФайлы(ФайлОтвет);
|
||
УдалитьФайлы(ИмяВременногоФайлаCMD);
|
||
Возврат СтруктураОтвета;
|
||
КонецФункции
|
||
|
||
&НаСервере
|
||
Функция ЗапросВалидностиЛицезнии(ИмяЛицензии)
|
||
ФайлОтвет = "";
|
||
ФайлОшибок = "";
|
||
ИмяВременногоФайлаCMD = SPS_СоздатьСистемныйСкрипт("call ring license validate --name " + ИмяЛицензии, ФайлОтвет, ФайлОшибок);
|
||
SPS_ЗапуститьСистемныйСкрипт(ИмяВременногоФайлаCMD);
|
||
|
||
SPS_ВыводФайлаОшибок(ФайлОшибок);
|
||
фФайлОтвет = Новый Файл(ФайлОтвет);
|
||
Если НЕ фФайлОтвет.Существует() Тогда
|
||
ВызватьИсключение "Ошибка чтения результата";
|
||
КонецЕсли;
|
||
|
||
Текст = Новый ЧтениеТекста;
|
||
Текст.Открыть(ФайлОтвет, SPS_КодировкаФайлаОтвета());
|
||
стр = Текст.Прочитать();
|
||
СтруктураОтвета = Новый Структура("Активна, ТекстоваяИнформация");
|
||
Если СтрНайти(стр, "License check passed for the following license:") > 0 ИЛИ СтрНайти(стр, "выполнена успешно") > 0 Тогда
|
||
СтруктураОтвета.Активна = Истина;
|
||
Иначе
|
||
СтруктураОтвета.Активна = Ложь;
|
||
КонецЕсли;
|
||
СтруктураОтвета.ТекстоваяИнформация = стр;
|
||
Текст.Закрыть();
|
||
УдалитьФайлы(ФайлОтвет);
|
||
УдалитьФайлы(ИмяВременногоФайлаCMD);
|
||
Возврат СтруктураОтвета;
|
||
|
||
КонецФункции
|
||
&НаКлиенте
|
||
Процедура ПолучитьПолнуюИнформациюОЛицензии()
|
||
КоличествоЛицензий = Объект.СписокЛицензий.Количество();
|
||
значениеИндикатора = 0;
|
||
Счетчик = 1;
|
||
Для Каждого стр Из Объект.СписокЛицензий Цикл
|
||
ТекстСообщения = "Получение информации о лицензиях (" + Строка(КоличествоЛицензий) + " шт.)";
|
||
Пояснение = "Запрос информации о лицензии " + стр.НомерЛицензии + ". Всего: " + КоличествоЛицензий;
|
||
Картинка = БиблиотекаКартинок.Провести;
|
||
значениеИндикатора = 100 / (КоличествоЛицензий / Счетчик);
|
||
Состояние(ТекстСообщения, значениеИндикатора, Пояснение, Картинка);
|
||
СтруктураЗн = ЗапросИнформацииОЛицезнии(стр.ПинКод + "-" + стр.НомерЛицензии);
|
||
ЗаполнитьЗначенияСвойств(стр, СтруктураЗн);
|
||
Счетчик = Счетчик + 1;
|
||
|
||
КонецЦикла;
|
||
|
||
КонецПроцедуры
|
||
|
||
&НаКлиенте
|
||
Процедура ПроверкаВалидностиЛицензий()
|
||
КоличествоЛицензий = Объект.СписокЛицензий.Количество();
|
||
значениеИндикатора = 0;
|
||
Счетчик = 1;
|
||
Для Каждого стр Из Объект.СписокЛицензий Цикл
|
||
ТекстСообщения = "Получение информации о лицензиях (" + Строка(КоличествоЛицензий) + " шт.)";
|
||
Пояснение = "Запрос информации о лицензии " + стр.НомерЛицензии + ". Всего: " + КоличествоЛицензий;
|
||
Картинка = БиблиотекаКартинок.Провести;
|
||
значениеИндикатора = 100 / (КоличествоЛицензий / Счетчик);
|
||
Состояние(ТекстСообщения, значениеИндикатора, Пояснение, Картинка);
|
||
СтруктураЗн = ЗапросВалидностиЛицезнии(стр.ПинКод + "-" + стр.НомерЛицензии);
|
||
ЗаполнитьЗначенияСвойств(стр, СтруктураЗн);
|
||
Счетчик = Счетчик + 1;
|
||
КонецЦикла;
|
||
|
||
КонецПроцедуры
|
||
|
||
&НаСервере
|
||
Процедура ПовторнаяАктивацияЛицензииНаСервере(ПереданныеПараметры)
|
||
СтруктураПараметров = Новый Структура("НовыйПинКод, ПинКод, Описание, Фамилия, Имя, Отчество, EMail, Компания, Страна, Индекс, Город, Улица, Дом, ДатаАктивации, РегистрационныйНомер, КодПродукта, ТекстоваяИнформация, КоличествоЛицензий");
|
||
|
||
Кавычка = Символ(34);
|
||
|
||
Реквизиты = Соответсвие_АктивацияПинКода();
|
||
ОбязательныеРеквизиты = СтрРазделить("НомерЛицензии,ПинКод,НовыйПинКод", ",");
|
||
|
||
СтрокаПараметров = "";
|
||
Для Каждого ТекРеквизит Из Реквизиты Цикл
|
||
ЭтоОбязательный = Не Неопределено = ОбязательныеРеквизиты.Найти(ТекРеквизит.Ключ);
|
||
|
||
ЗначениеРеквизита = ПереданныеПараметры[ТекРеквизит.Ключ];
|
||
|
||
РеквизитЗаполнен = ЗначениеЗаполнено(ЗначениеРеквизита);
|
||
ВыводитьРеквизит = ЭтоОбязательный ИЛИ РеквизитЗаполнен;
|
||
|
||
Если НЕ ВыводитьРеквизит Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
|
||
Если НЕ ЭтоОбязательный Тогда
|
||
ЗначениеРеквизита = СтрШаблон("%1%2%1", Кавычка, ЗначениеРеквизита);
|
||
КонецЕсли;
|
||
|
||
СтрокаПараметров = СтрокаПараметров + СтрШаблон(" %1 %2", ТекРеквизит.Значение, ЗначениеРеквизита);
|
||
КонецЦикла;
|
||
|
||
ФайлОтвет = "";
|
||
ФайлОшибок = "";
|
||
ИмяВременногоФайлаCMD = SPS_СоздатьСистемныйСкрипт(СтрШаблон("call ring license activate %1 --validate", СтрокаПараметров), ФайлОтвет, ФайлОшибок);
|
||
SPS_ЗапуститьСистемныйСкрипт(ИмяВременногоФайлаCMD);
|
||
|
||
SPS_ВыводФайлаОшибок(ФайлОшибок);
|
||
фФайлОтвет = Новый Файл(ФайлОтвет);
|
||
Если НЕ фФайлОтвет.Существует() Тогда
|
||
ВызватьИсключение "Ошибка чтения результата";
|
||
КонецЕсли;
|
||
|
||
Текст = Новый ЧтениеТекста;
|
||
Текст.Открыть(ФайлОтвет, SPS_КодировкаФайлаОтвета());
|
||
стр = Текст.Прочитать();
|
||
Сообщить(стр);
|
||
Текст.Закрыть();
|
||
УдалитьФайлы(ФайлОтвет);
|
||
УдалитьФайлы(ИмяВременногоФайлаCMD);
|
||
КонецПроцедуры
|
||
|
||
&НаСервере
|
||
Процедура ПослеВводаСтрокиПинкода(ПолученноеЗначение, ПереданныеПараметры) Экспорт
|
||
ВведенныйКод = ПолученноеЗначение;
|
||
Если ПустаяСтрока(ВведенныйКод) Тогда
|
||
Отказ = Истина;
|
||
Иначе
|
||
ПереданныеПараметры.НовыйПинКод = ВведенныйКод;
|
||
ПовторнаяАктивацияЛицензииНаСервере(ПереданныеПараметры);
|
||
КонецЕсли;
|
||
КонецПроцедуры
|
||
|
||
&НаКлиенте
|
||
Процедура ПовторнаяАктивацияЛицензии(Команда)
|
||
ТекущаяСтрока = Элементы.СписокЛицензий.ТекущиеДанные;
|
||
СтруктураПараметров = Новый Структура(" НомерЛицензии,НовыйПинКод,ПинКод, Описание, Фамилия, Имя, Отчество, EMail, Компания, Страна, Индекс, Регион, Район,Город, Улица, Дом, Корпус, Квартира, Строение, ДатаАктивации, РегистрационныйНомер, КодПродукта, ТекстоваяИнформация, КоличествоЛицензий");
|
||
ЗаполнитьЗначенияСвойств(СтруктураПараметров, ТекущаяСтрока);
|
||
Оповещение = Новый ОписаниеОповещения("ПослеВводаСтрокиПинкода", ЭтотОбъект, СтруктураПараметров);
|
||
|
||
ПоказатьВводСтроки(
|
||
Оповещение, , // пропускаем начальное значение
|
||
|
||
"Введите пин-код для лицензии " + ТекущаяСтрока["НомерЛицензии"], 0, // (необ.) длина
|
||
|
||
Ложь // (необ.) многострочность
|
||
);
|
||
КонецПроцедуры
|
||
|
||
&НаСервере
|
||
Процедура УдалитьЛицензиюНаСервере(ИмяЛицензии)
|
||
ФайлОтвет = "";
|
||
ФайлОшибок = "";
|
||
ИмяВременногоФайлаCMD = SPS_СоздатьСистемныйСкрипт("call ring license remove --name " + ИмяЛицензии, ФайлОтвет, ФайлОшибок);
|
||
SPS_ЗапуститьСистемныйСкрипт(ИмяВременногоФайлаCMD);
|
||
|
||
SPS_ВыводФайлаОшибок(ФайлОшибок);
|
||
фФайлОтвет = Новый Файл(ФайлОтвет);
|
||
Если НЕ фФайлОтвет.Существует() Тогда
|
||
ВызватьИсключение "Ошибка чтения результата";
|
||
КонецЕсли;
|
||
|
||
Текст = Новый ЧтениеТекста;
|
||
Текст.Открыть(ФайлОтвет, SPS_КодировкаФайлаОтвета());
|
||
стр = Текст.Прочитать();
|
||
Сообщить(стр);
|
||
Текст.Закрыть();
|
||
УдалитьФайлы(ФайлОтвет);
|
||
УдалитьФайлы(ИмяВременногоФайлаCMD);
|
||
|
||
КонецПроцедуры
|
||
|
||
&НаКлиенте
|
||
Процедура УдалитьЛицензию(Команда)
|
||
ТекущаяСтрока = Элементы.СписокЛицензий.ТекущиеДанные;
|
||
УдалитьЛицензиюНаСервере(ТекущаяСтрока["ПинКод"] + "-" + ТекущаяСтрока["НомерЛицензии"]);
|
||
Объект.СписокЛицензий.Удалить(Элементы.СписокЛицензий.ТекущаяСтрока);
|
||
КонецПроцедуры
|
||
|
||
&НаКлиенте
|
||
Процедура ПриОткрытии(Отказ)
|
||
ПодключитьОбработчикОжидания("ЗагрузитьДанные", 1, Истина);
|
||
КонецПроцедуры
|
||
|
||
&НаКлиенте
|
||
Процедура ЗагрузитьДанные()
|
||
ПолучитьСписокЛицензий();
|
||
ПолучитьПолнуюИнформациюОЛицензии();
|
||
//ПроверкаВалидностиЛицензий();
|
||
КонецПроцедуры
|
||
|
||
&НаКлиенте
|
||
Процедура СписокЛицензийПриАктивизацииСтроки(Элемент)
|
||
Попытка
|
||
Элементы.ГруппаДанныеАктивации.ТолькоПросмотр = Элементы.СписокЛицензий.ТекущиеДанные["Активна"];
|
||
Элементы.СписокЛицензийАктивироватьЛицензию.Доступность = Не Элементы.СписокЛицензий.ТекущиеДанные["Активна"];
|
||
Исключение
|
||
КонецПопытки;
|
||
КонецПроцедуры
|
||
|
||
&НаКлиенте
|
||
Процедура СписокЛицензийПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
|
||
// Вставить содержимое обработчика.
|
||
КонецПроцедуры
|
||
|
||
&НаКлиенте
|
||
Процедура АктивироватьЛицензию(Команда)
|
||
ПараметрыОткрытия = Новый Структура("Фамилия, Имя, Отчество, EMail, Компания, Страна, Индекс, Регион, Район,Город, Улица, Дом, Корпус, Квартира, Строение");
|
||
ТекущаяСтрока = Элементы.СписокЛицензий.ТекущиеДанные;
|
||
ЗаполнитьЗначенияСвойств(ПараметрыОткрытия, ТекущаяСтрока);
|
||
ОткрытьФорму("ВнешняяОбработка.ИнформацияОЛицензиях1С.Форма.ФормаАктивацииЛицензии", ПараметрыОткрытия);
|
||
КонецПроцедуры
|
||
|
||
#Область Кеш
|
||
Функция Кеш_Установить(Ключ, Значение)
|
||
Если Неопределено = Кеш Тогда
|
||
Кеш = Новый Соответствие;
|
||
КонецЕсли;
|
||
Кеш[Ключ] = Значение;
|
||
Возврат Значение;
|
||
КонецФункции
|
||
|
||
Функция Кеш_Получить(Ключ)
|
||
Результат = Неопределено;
|
||
Если НЕ Неопределено = Кеш Тогда
|
||
Результат = Кеш.Получить(Ключ);
|
||
КонецЕсли;
|
||
Возврат Результат;
|
||
КонецФункции
|
||
#КонецОбласти
|
||
|
||
#Область Функциональщина
|
||
&НаКлиентеНаСервереБезКонтекста
|
||
Функция ВыполнитьФрагмент(Знач Код, Вход, ИмяВход = "Вход", ИмяВыход = "Выход", Инициализировать = Ложь, _ = Неопределено)
|
||
Выход = ?(Инициализировать, Вход, Неопределено);
|
||
|
||
Если НЕ "Вход" = ИмяВход Тогда
|
||
Код = СтрШаблон("%1=Вход;%2", ИмяВход, Код);
|
||
КонецЕсли;
|
||
Если НЕ "Выход" = ИмяВыход Тогда
|
||
Код = СтрШаблон("%1;Выход=%2", Код, ИмяВыход);
|
||
КонецЕсли;
|
||
|
||
Выполнить(Код);
|
||
|
||
Возврат Выход;
|
||
КонецФункции
|
||
&НаКлиентеНаСервереБезКонтекста
|
||
Функция Мап(Код, Коллекция, _ = Неопределено)
|
||
Результат = Новый Массив;
|
||
|
||
Для Каждого Элемент Из Коллекция Цикл
|
||
НовыйЭлемент = ВыполнитьФрагмент(Код, Элемент, "Элемент", "Результат", Истина, _);
|
||
Результат.Добавить(НовыйЭлемент);
|
||
КонецЦикла;
|
||
|
||
Возврат Результат;
|
||
КонецФункции
|
||
&НаКлиентеНаСервереБезКонтекста
|
||
Функция Фильтр(КодУсловия, Коллекция, _ = Неопределено)
|
||
Результат = Новый Массив;
|
||
|
||
Для Каждого Элемент Из Коллекция Цикл
|
||
Условие = ВыполнитьФрагмент(КодУсловия, Элемент, "Элемент", "Условие", , _);
|
||
Если Условие Тогда
|
||
Результат.Добавить(Элемент);
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
|
||
Возврат Результат;
|
||
КонецФункции
|
||
&НаКлиентеНаСервереБезКонтекста
|
||
Функция ВыполнитьФрагмент_ДляСвертки(Знач Код, Элемент, Знач Результат, _ = Неопределено)
|
||
Выполнить(Код);
|
||
Возврат Результат;
|
||
КонецФункции
|
||
&НаКлиентеНаСервереБезКонтекста
|
||
Функция Свернуть(Код, Коллекция, Знач Результат = Неопределено, _ = Неопределено)
|
||
Для Каждого Элемент Из Коллекция Цикл
|
||
Результат = ВыполнитьФрагмент_ДляСвертки(Код, Элемент, Результат, _);
|
||
КонецЦикла;
|
||
|
||
Возврат Результат;
|
||
КонецФункции
|
||
&НаКлиентеНаСервереБезКонтекста
|
||
Функция ВзятьНеБольше(Коллекция, Знач Количество)
|
||
Результат = Новый Массив;
|
||
Для Каждого ТекСтр Из Коллекция Цикл
|
||
Если 1 > Количество Тогда
|
||
Прервать;
|
||
КонецЕсли;
|
||
|
||
Результат.Добавить(ТекСтр);
|
||
|
||
Количество = Количество - 1;
|
||
КонецЦикла;
|
||
Возврат Результат;
|
||
КонецФункции
|
||
&НаКлиентеНаСервереБезКонтекста
|
||
Функция Пропустить(Коллекция, Знач Количество)
|
||
Результат = Новый Массив;
|
||
Для Каждого ТекСтр Из Коллекция Цикл
|
||
Если 0 < Количество Тогда
|
||
Количество = Количество - 1;
|
||
Продолжить;
|
||
КонецЕсли;
|
||
|
||
Результат.Добавить(ТекСтр);
|
||
КонецЦикла;
|
||
Возврат Результат;
|
||
КонецФункции
|
||
&НаКлиентеНаСервереБезКонтекста
|
||
Функция Обратить(Знач Коллекция)
|
||
Если 0 = Коллекция.Количество() Тогда
|
||
Возврат Коллекция;
|
||
КонецЕсли;
|
||
Результат = Новый Массив;
|
||
Для Смещение = 1 По Коллекция.Количество() Цикл
|
||
ТекИндекс = Коллекция.Количество() - Смещение;
|
||
Результат.Добавить(Коллекция[ТекИндекс]);
|
||
КонецЦикла;
|
||
Возврат Результат;
|
||
КонецФункции
|
||
&НаКлиентеНаСервереБезКонтекста
|
||
Функция Ключи(Знач КоллекцияКЗ)
|
||
Возврат Мап("Результат = Элемент.Ключ", КоллекцияКЗ);
|
||
КонецФункции
|
||
&НаКлиентеНаСервереБезКонтекста
|
||
Функция Значения(Знач КоллекцияКЗ)
|
||
Возврат Мап("Результат = Элемент.Значение", КоллекцияКЗ);
|
||
КонецФункции
|
||
&НаКлиентеНаСервереБезКонтекста
|
||
Функция СимволыВСтроке(Знач Стр)
|
||
Результат = Новый Массив;
|
||
Для Сч = 1 По СтрДлина(Стр) Цикл
|
||
Результат.Добавить(Сред(Стр, Сч, 1));
|
||
КонецЦикла;
|
||
Возврат Результат;
|
||
КонецФункции
|
||
&НаКлиентеНаСервереБезКонтекста
|
||
Функция МассивПоДиапазонуЧисел(Число_С, Число_По)
|
||
Результат = Новый Массив;
|
||
Для ТекЧисло = Число_С По Число_По Цикл
|
||
Результат.Добавить(ТекЧисло);
|
||
КонецЦикла;
|
||
Возврат Результат;
|
||
КонецФункции
|
||
&НаКлиентеНаСервереБезКонтекста
|
||
Функция ЭтоКоллекция(ЧтоТо)
|
||
Результат = Ложь;
|
||
Если Неопределено = ЧтоТо Тогда
|
||
Возврат Результат;
|
||
КонецЕсли;
|
||
|
||
Попытка
|
||
Для Каждого ТекСтр Из ЧтоТо Цикл
|
||
Прервать;
|
||
КонецЦикла;
|
||
Результат = Истина;
|
||
Исключение
|
||
;
|
||
КонецПопытки;
|
||
Возврат Результат;
|
||
КонецФункции
|
||
&НаКлиентеНаСервереБезКонтекста
|
||
Функция Транспонировать(МассивМассивов)
|
||
// аналог zip || транспонирует двумерный массив
|
||
Результат = Новый Массив;
|
||
МинКоличество = Неопределено;
|
||
|
||
Для Каждого ТекМассив Из МассивМассивов Цикл
|
||
Если Неопределено = МинКоличество Тогда
|
||
МинКоличество = ТекМассив.Количество();
|
||
Продолжить;
|
||
КонецЕсли;
|
||
МинКоличество = Мин(МинКоличество, ТекМассив.Количество());
|
||
КонецЦикла;
|
||
|
||
Если 0 = МинКоличество Тогда
|
||
Возврат Результат;
|
||
КонецЕсли;
|
||
|
||
Для Индекс = 0 По МинКоличество - 1 Цикл
|
||
Элемент = Новый Массив;
|
||
|
||
Для Каждого ТекМассив Из МассивМассивов Цикл
|
||
Элемент.Добавить(ТекМассив[Индекс]);
|
||
КонецЦикла;
|
||
|
||
Результат.Добавить(Элемент);
|
||
КонецЦикла;
|
||
|
||
Возврат Результат;
|
||
КонецФункции
|
||
&НаКлиентеНаСервереБезКонтекста
|
||
Функция ОбходДерева(Дерево, Знач КодСтроки = "", Знач ВШирину = Ложь)
|
||
Результат = Новый Массив;
|
||
|
||
Очередь = Новый Массив;
|
||
Очередь.Добавить(Дерево);
|
||
Пока Очередь.Количество() > 0 Цикл
|
||
Индекс_Следующий = ?(ВШирину, 0, Очередь.ВГраница());
|
||
Узел = Очередь.Получить(Индекс_Следующий);
|
||
Очередь.Удалить(Индекс_Следующий);
|
||
|
||
Результат.Добавить(Узел);
|
||
|
||
Строки = Неопределено;
|
||
// для массива массивов не нужно определять свойство где лежат строки
|
||
Если ПустаяСтрока(КодСтроки) Тогда
|
||
Строки = Узел;
|
||
Иначе
|
||
Строки = Вычислить(КодСтроки);
|
||
КонецЕсли;
|
||
|
||
Если НЕ ЭтоКоллекция(Строки) Тогда
|
||
Продолжить;
|
||
КонецЕсли;
|
||
|
||
Для Каждого ТекСтр Из Строки Цикл
|
||
Очередь.Добавить(ТекСтр);
|
||
КонецЦикла;
|
||
КонецЦикла;
|
||
Возврат Результат;
|
||
КонецФункции
|
||
#КонецОбласти
|
||
|
||
|
||
&НаКлиентеНаСервереБезКонтекста
|
||
Функция SPS_ЭтоWindows()
|
||
СистемнаяИнформация = Новый СистемнаяИнформация;
|
||
Возврат СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86
|
||
Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64;
|
||
КонецФункции
|
||
|
||
&НаКлиентеНаСервереБезКонтекста
|
||
Функция SPS_КодировкаФайлаОтвета()
|
||
Возврат ?(SPS_ЭтоWindows(), Неопределено, КодировкаТекста.UTF8);
|
||
КонецФункции
|
||
|
||
&НаКлиентеНаСервереБезКонтекста
|
||
Функция SPS_СоздатьСистемныйСкрипт(Знач Команда, ФайлОтвет="", ФайлОшибок="")
|
||
Это_Windows = SPS_ЭтоWindows();
|
||
ИмяФайлаСкрипта = ПолучитьИмяВременногоФайла(?(Это_Windows, "cmd", "sh"));
|
||
|
||
Если ПустаяСтрока(ФайлОтвет) Тогда
|
||
ФайлОтвет = ПолучитьИмяВременногоФайла("txt");
|
||
КонецЕсли;
|
||
Если ПустаяСтрока(ФайлОшибок) Тогда
|
||
ФайлОшибок = ПолучитьИмяВременногоФайла("log");
|
||
КонецЕсли;
|
||
|
||
ТекстСкрипта = Новый ЗаписьТекста;
|
||
ТекстСкрипта.Открыть(ИмяФайлаСкрипта, ?(Это_Windows, КодировкаТекста.ANSI, КодировкаТекста.UTF8));
|
||
|
||
Если НЕ Это_Windows Тогда
|
||
// добавление Шебанг
|
||
//ТекстСкрипта.ЗаписатьСтроку("#!/bin/sh");
|
||
//ТекстСкрипта.ЗаписатьСтроку("");
|
||
|
||
// выбор языка вывода (для парсинга)
|
||
ТекстСкрипта.ЗаписатьСтроку("export LC_ALL=en_US.UTF8");
|
||
|
||
// избавляемся от call
|
||
Команда = СтрЗаменить(Команда, "call ring", "ring");
|
||
КонецЕсли;
|
||
|
||
// добавляем перенаправления вывода
|
||
Команда = СтрШаблон("%1 >%2 2>%3", Команда, ФайлОтвет, ФайлОшибок);
|
||
|
||
ТекстСкрипта.ЗаписатьСтроку(Команда);
|
||
ТекстСкрипта.Закрыть();
|
||
|
||
Возврат ИмяФайлаСкрипта;
|
||
КонецФункции
|
||
|
||
&НаКлиентеНаСервереБезКонтекста
|
||
Процедура SPS_ЗапуститьСистемныйСкрипт(Знач ИмяФайлаСкрипта)
|
||
Это_Windows = SPS_ЭтоWindows();
|
||
|
||
// добавляем интерпретатор чтобы запускать скрипт без "chmod +x"
|
||
ИмяФайлаСкрипта = СтрШаблон(?(Это_Windows, "cmd.exe /c %1", "/bin/sh %1"), ИмяФайлаСкрипта);
|
||
|
||
ЗапуститьПриложение(ИмяФайлаСкрипта, КаталогВременныхФайлов(), Истина);
|
||
КонецПроцедуры
|
||
|
||
&НаКлиентеНаСервереБезКонтекста
|
||
Процедура SPS_ВыводФайлаОшибок(Знач ИмяФайлаОшибок)
|
||
фФайл = Новый Файл(ИмяФайлаОшибок);
|
||
Если НЕ фФайл.Существует() Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
Чтение = Новый ЧтениеТекста(ИмяФайлаОшибок, КодировкаТекста.ANSI);
|
||
Текст = Чтение.Прочитать();
|
||
Чтение.Закрыть();
|
||
|
||
Попытка
|
||
УдалитьФайлы(ИмяФайлаОшибок);
|
||
Исключение
|
||
;
|
||
КонецПопытки;
|
||
|
||
Если ПустаяСтрока(СокрЛП(Текст)) Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
Сообщить(СтрШаблон("Ошибки: %1%2", Символы.ПС, Текст));
|
||
КонецПроцедуры
|