epf_LicenseInfo1C/src/ИнформацияОЛицензиях1С/Forms/Форма/Ext/Form/Module.bsl

702 lines
38 KiB
Plaintext
Raw 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.

&НаСервере
Перем Кеш;
&НаСервере
Функция СтрокуВДату(СтрокаДата)
Попытка
СтрокаДата = Прав(СтрокаДата, 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", Символы.ПС, Текст));
КонецПроцедуры