|
| 1 | +#Использовать cmdline |
| 2 | +#Использовать logos |
| 3 | +#Использовать tempfiles |
| 4 | +#Использовать asserts |
| 5 | +#Использовать v8runner |
| 6 | + |
| 7 | +Перем Лог; |
| 8 | +Перем КодВозврата; |
| 9 | + |
| 10 | +Функция ЗапускВКоманднойСтроке() |
| 11 | + |
| 12 | + КодВозврата = 0; |
| 13 | + |
| 14 | + Если ТекущийСценарий().Источник <> СтартовыйСценарий().Источник Тогда |
| 15 | + Возврат Ложь; |
| 16 | + КонецЕсли; |
| 17 | + |
| 18 | + Попытка |
| 19 | + |
| 20 | + Парсер = Новый ПарсерАргументовКоманднойСтроки(); |
| 21 | + |
| 22 | + ВозможныеКоманды = Новый Структура; |
| 23 | + ВозможныеКоманды.Вставить("Декомпилировать", "--decompile"); |
| 24 | + ВозможныеКоманды.Вставить("Помощь", "--help"); |
| 25 | + |
| 26 | + ОписаниеКоманды = Парсер.ОписаниеКоманды(ВозможныеКоманды.Декомпилировать); |
| 27 | + Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "ПутьВходящихДанных"); |
| 28 | + Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "ВыходнойКаталог"); |
| 29 | + Парсер.ДобавитьКоманду(ОписаниеКоманды); |
| 30 | + |
| 31 | + ОписаниеКоманды = Парсер.ОписаниеКоманды(ВозможныеКоманды.Помощь); |
| 32 | + Парсер.ДобавитьКоманду(ОписаниеКоманды); |
| 33 | + |
| 34 | + Аргументы = Парсер.РазобратьКоманду(АргументыКоманднойСтроки); |
| 35 | + |
| 36 | + Команда = Аргументы.Команда; |
| 37 | + Лог.Отладка("Передана команда: "+Команда); |
| 38 | + Для Каждого Параметр Из Аргументы.ЗначенияПараметров Цикл |
| 39 | + Лог.Отладка(Параметр.Ключ + " = " + Параметр.Значение); |
| 40 | + КонецЦикла; |
| 41 | + |
| 42 | + Если Команда = ВозможныеКоманды.Декомпилировать Тогда |
| 43 | + Декомпилировать(Аргументы.ЗначенияПараметров["ПутьВходящихДанных"], Аргументы.ЗначенияПараметров["ВыходнойКаталог"]); |
| 44 | + ИначеЕсли Команда = ВозможныеКоманды.Помощь Тогда |
| 45 | + ВывестиСправку(); |
| 46 | + КонецЕсли; |
| 47 | + |
| 48 | + Исключение |
| 49 | + Лог.Ошибка(ОписаниеОшибки()); |
| 50 | + КодВозврата = 1; |
| 51 | + КонецПопытки; |
| 52 | + |
| 53 | + Возврат Истина; |
| 54 | + |
| 55 | +КонецФункции |
| 56 | + |
| 57 | +Процедура Инициализация() |
| 58 | + Лог = Логирование.ПолучитьЛог("oscript.app.v8files-extractor"); |
| 59 | + Лог.УстановитьУровень(УровниЛога.Отладка); |
| 60 | +КонецПроцедуры |
| 61 | + |
| 62 | +Процедура Декомпилировать(Знач Путь, Знач КаталогВыгрузки) Экспорт |
| 63 | + Файл = Новый Файл(Путь); |
| 64 | + Если Файл.ЭтоКаталог() Тогда |
| 65 | + РазобратьКаталог(Файл.ПолноеИмя, КаталогВыгрузки); |
| 66 | + Иначе |
| 67 | + РазобратьФайл(Файл.ПолноеИмя, КаталогВыгрузки); |
| 68 | + КонецЕсли; |
| 69 | +КонецПроцедуры |
| 70 | + |
| 71 | +Процедура ВывестиСправку() |
| 72 | + Сообщить("Утилита сборки/разборки внешних файлов 1С"); |
| 73 | + Сообщить(" "); |
| 74 | + Сообщить("Параметры командной строки:"); |
| 75 | + Сообщить(" --decompile inputPath outputPath"); |
| 76 | + Сообщить(" Разбор файлов на исходники"); |
| 77 | + |
| 78 | + Сообщить(" --help"); |
| 79 | + Сообщить(" Показ этого экрана"); |
| 80 | +КонецПроцедуры |
| 81 | + |
| 82 | +Процедура РазобратьКаталог(Знач ПутьКаталога, Знач КаталогВыгрузки) Экспорт |
| 83 | + Лог.Информация("Подготовка выгрузки каталога "+ПутьКаталога+" в каталог " + КаталогВыгрузки); |
| 84 | + РазобратьКаталогВнутр(ПутьКаталога, КаталогВыгрузки); |
| 85 | + Лог.Информация("Завершена выгрузки каталога "+ПутьКаталога+" в каталог " + КаталогВыгрузки); |
| 86 | +КонецПроцедуры |
| 87 | + |
| 88 | +Процедура РазобратьФайл(Знач ПутьФайла, Знач КаталогВыгрузки) Экспорт |
| 89 | + Лог.Информация("Подготовка выгрузки файла "+ПутьФайла+" в каталог " + КаталогВыгрузки); |
| 90 | + |
| 91 | + РазобратьФайлВнутр(ПутьФайла, КаталогВыгрузки); |
| 92 | + |
| 93 | + Лог.Информация("Завершена выгрузка файла "+ПутьФайла+" в каталог " + КаталогВыгрузки); |
| 94 | +КонецПроцедуры |
| 95 | + |
| 96 | +Процедура РазобратьКаталогВнутр(Знач ПутьКаталога, Знач КаталогВыгрузки) |
| 97 | + ОбъектКаталога = Новый Файл(ПутьКаталога); |
| 98 | + ИмяКаталогаВыгрузки = Новый Файл(КаталогВыгрузки).Имя; |
| 99 | + Лог.Информация("Вошел в каталог "+ОбъектКаталога.Имя); |
| 100 | + |
| 101 | + Файлы = НайтиФайлы(ПутьКаталога, ПолучитьМаскуВсеФайлы()); |
| 102 | + Для Каждого Файл из Файлы Цикл |
| 103 | + Если Файл.ЭтоКаталог() Тогда |
| 104 | + РазобратьКаталогВнутр(Файл.ПолноеИмя, ОбъединитьПути(КаталогВыгрузки, Файл.Имя)); |
| 105 | + ИначеЕсли ТипФайлаПоддерживается(Файл) Тогда |
| 106 | + Лог.Информация("Подготовка выгрузки файла "+Файл.Имя+" в каталог " + ИмяКаталогаВыгрузки); |
| 107 | + РазобратьФайлВнутр(Файл.ПолноеИмя, КаталогВыгрузки); |
| 108 | + Лог.Информация("Завершена выгрузка файла "+Файл.Имя+" в каталог " + ИмяКаталогаВыгрузки); |
| 109 | + КонецЕсли; |
| 110 | + КонецЦикла; |
| 111 | + |
| 112 | + Лог.Информация("Вышел из каталога "+ОбъектКаталога.Имя); |
| 113 | +КонецПроцедуры |
| 114 | + |
| 115 | +Функция ТипФайлаПоддерживается(Файл) |
| 116 | + Возврат Найти(".epf,.erf,", Файл.Расширение+",") > 0; |
| 117 | +КонецФункции |
| 118 | + |
| 119 | +Процедура РазобратьФайлВнутр(Знач ПутьФайла, Знач КаталогВыгрузки) |
| 120 | + |
| 121 | + Файл = Новый Файл(ПутьФайла); |
| 122 | + Если Не ТипФайлаПоддерживается(Файл) Тогда |
| 123 | + ВызватьИсключение "Тип файла """+Файл.Расширение+""" не поддерживается"; |
| 124 | + КонецЕсли; |
| 125 | + |
| 126 | + Ожидаем.Что(Файл.Существует(), "Файл " + ПутьФайла + " должен существовать").ЭтоИстина(); |
| 127 | + |
| 128 | + ПапкаИсходников = Новый Файл(ОбъединитьПути(КаталогВыгрузки, Файл.ИмяБезРасширения)); |
| 129 | + ОбеспечитьПустойКаталог(ПапкаИсходников); |
| 130 | + ЗапуститьРаспаковку(Файл, ПапкаИсходников); |
| 131 | + |
| 132 | +КонецПроцедуры |
| 133 | + |
| 134 | +Процедура ЗапуститьРаспаковку(Знач Файл, Знач ПапкаИсходников) |
| 135 | + |
| 136 | + Лог.Отладка("Запускаем распаковку файла"); |
| 137 | + |
| 138 | + Конфигуратор = Новый УправлениеКонфигуратором(); |
| 139 | + КаталогВременнойИБ = ВременныеФайлы.СоздатьКаталог(); |
| 140 | + Конфигуратор.КаталогСборки(КаталогВременнойИБ); |
| 141 | + |
| 142 | + ЛогКонфигуратора = Логирование.ПолучитьЛог("oscript.lib.v8runner"); |
| 143 | + ЛогКонфигуратора.УстановитьУровень(Лог.Уровень()); |
| 144 | + |
| 145 | + Параметры = Конфигуратор.ПолучитьПараметрыЗапуска(); |
| 146 | + Параметры[0] = "ENTERPRISE"; |
| 147 | + |
| 148 | + ПутьV8Reader = ОбъединитьПути(ТекущийСценарий().Каталог, "v8Reader", "V8Reader.epf"); |
| 149 | + Лог.Отладка("Путь к V8Reader: " + ПутьV8Reader); |
| 150 | + Ожидаем.Что(Новый Файл(ПутьV8Reader).Существует()).ЭтоИстина(); |
| 151 | + |
| 152 | + КоманднаяСтрокаV8Reader = СтрЗаменить("/C""decompile;pathtocf;%1;pathout;%2;ЗавершитьРаботуПосле;""","%1", Файл.ПолноеИмя); |
| 153 | + КоманднаяСтрокаV8Reader = СтрЗаменить(КоманднаяСтрокаV8Reader,"%2", ПапкаИсходников.ПолноеИмя); |
| 154 | + |
| 155 | + Лог.Отладка("Командная строка V8Reader: " + КоманднаяСтрокаV8Reader); |
| 156 | + |
| 157 | + Параметры.Добавить("/RunModeOrdinaryApplication"); |
| 158 | + Параметры.Добавить("/Execute """ + ПутьV8Reader + """"); |
| 159 | + Параметры.Добавить(КоманднаяСтрокаV8Reader); |
| 160 | + |
| 161 | + Конфигуратор.ВыполнитьКоманду(Параметры); |
| 162 | + Лог.Отладка("Вывод 1С:Предприятия - " + Конфигуратор.ВыводКоманды()); |
| 163 | + Лог.Отладка("Очищаем каталог временной ИБ"); |
| 164 | + ВременныеФайлы.УдалитьФайл(КаталогВременнойИБ); |
| 165 | + |
| 166 | +КонецПроцедуры |
| 167 | + |
| 168 | +Процедура ОбеспечитьПустойКаталог(Знач ФайлОбъектКаталога) |
| 169 | + |
| 170 | + Если Не ФайлОбъектКаталога.Существует() Тогда |
| 171 | + Лог.Отладка("Создаем новый каталог " + ФайлОбъектКаталога.ПолноеИмя); |
| 172 | + СоздатьКаталог(ФайлОбъектКаталога.ПолноеИмя); |
| 173 | + ИначеЕсли ФайлОбъектКаталога.ЭтоКаталог() Тогда |
| 174 | + Лог.Отладка("Очищаем каталог " + ФайлОбъектКаталога.ПолноеИмя); |
| 175 | + УдалитьФайлы(ФайлОбъектКаталога.ПолноеИмя, ПолучитьМаскуВсеФайлы()); |
| 176 | + Иначе |
| 177 | + ВызватьИсключение "Путь " + ФайлОбъектКаталога.ПолноеИмя + " не является каталогом. Выгрузка невозможна"; |
| 178 | + КонецЕсли; |
| 179 | + |
| 180 | +КонецПроцедуры |
| 181 | + |
| 182 | +Инициализация(); |
| 183 | + |
| 184 | +Если ЗапускВКоманднойСтроке() Тогда |
| 185 | + ЗавершитьРаботу(КодВозврата); |
| 186 | +КонецЕсли; |
| 187 | + |
| 188 | + |
0 commit comments