Skip to content
3 changes: 1 addition & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,8 @@ oscript v8files-extractor.os ?
Показ этого экрана
--git-precommit outputPath
Запустить чтение индекса из git и определить список файлов для разбора, разложить их и добавить исходники в индекс
--compile inputPath outputPath [--type TYPE] [--recursive]
--compile inputPath outputPath [--recursive]
Собрать внешний файл/обработку.
В параметре --type указывается тип файла для сборки (epf/erf). Значение по умолчанию - epf
Если указан параметр --recursive, скрипт будет рекурсивно искать исходные коды отчетов и обработок в указанном каталоге и собирать их, повторяя структуру каталога
```

Expand Down
86 changes: 71 additions & 15 deletions v8files-extractor.os
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,6 @@
Компилировать(
Аргументы.ЗначенияПараметров["ПутьВходящихДанных"],
Аргументы.ЗначенияПараметров["ВыходнойКаталог"],
Аргументы.ЗначенияПараметров["--type"],
Аргументы.ЗначенияПараметров["--recursive"]
);
КонецЕсли;
Expand Down Expand Up @@ -106,7 +105,6 @@
ОписаниеКоманды = Парсер.ОписаниеКоманды(ВозможныеКоманды().Компилировать);
Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "ПутьВходящихДанных");
Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "ВыходнойКаталог");
Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--type");
Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "--recursive");
Парсер.ДобавитьКоманду(ОписаниеКоманды);
КонецПроцедуры
Expand Down Expand Up @@ -277,9 +275,8 @@
Сообщить(" Показ этого экрана");
Сообщить(" --git-precommit outputPath");
Сообщить(" Запустить чтение индекса из git и определить список файлов для разбора, разложить их и добавить исходники в индекс");
Сообщить(" --compile inputPath outputPath [--type TYPE] [--recursive]");
Сообщить(" --compile inputPath outputPath [--recursive]");
Сообщить(" Собрать внешний файл/обработку.");
Сообщить(" В параметре --type указывается тип файла для сборки (epf/erf). Значение по умолчанию - epf");
Сообщить(" Если указан параметр --recursive, скрипт будет рекурсивно искать исходные коды отчетов и обработок в указанном каталоге и собирать их, повторяя структуру каталога");
КонецПроцедуры

Expand Down Expand Up @@ -433,7 +430,7 @@

КонецПроцедуры

Функция Компилировать(Знач Путь, Знач КаталогВыгрузки, Знач ТипФайла = "epf", Знач Рекурсивно = Ложь) Экспорт
Функция Компилировать(Знач Путь, Знач КаталогВыгрузки, Знач Рекурсивно = Ложь) Экспорт

ПутьКИсходникам = ОбъединитьПути(ТекущийКаталог(), Путь);

Expand All @@ -443,14 +440,14 @@
Ожидаем.Что(ПапкаИсходников.ЭтоКаталог(), "Путь " + ПутьКИсходникам + "должен быть каталогом").ЭтоИстина();

Если Рекурсивно Тогда
СобратьКаталог(ПутьКИсходникам, КаталогВыгрузки, ТипФайла);
СобратьКаталог(ПутьКИсходникам, КаталогВыгрузки);
Иначе
СобратьФайл(ПутьКИсходникам, КаталогВыгрузки, ТипФайла);
СобратьФайл(ПутьКИсходникам, КаталогВыгрузки);
КонецЕсли;

КонецФункции

Процедура СобратьКаталог(Знач ПутьКИсходникам, КаталогВыгрузки, Знач ТипФайла)
Процедура СобратьКаталог(Знач ПутьКИсходникам, КаталогВыгрузки)

СписокФайловВКаталоге = НайтиФайлы(ПутьКИсходникам);

Expand All @@ -465,25 +462,22 @@
КонецЕсли;

Если ЭтоПутьКИсходнымКодамОбработок(Файл.ПолноеИмя) Тогда
СобратьФайл(Файл.ПолноеИмя, КаталогВыгрузки, ТипФайла);
СобратьФайл(Файл.ПолноеИмя, КаталогВыгрузки);
Иначе
НовыйПутьВыгрузки = ОбъединитьПути(КаталогВыгрузки, Файл.Имя);
СобратьКаталог(Файл.ПолноеИмя, НовыйПутьВыгрузки, ТипФайла);
СобратьКаталог(Файл.ПолноеИмя, НовыйПутьВыгрузки);
КонецЕсли;

КонецЦикла;

КонецПроцедуры

Функция СобратьФайл(Знач ПутьКИсходникам, Знач КаталогВыгрузки, Знач ТипФайла)

Функция СобратьФайл(Знач ПутьКИсходникам, Знач КаталогВыгрузки)
Лог.Информация("Собираю исходники <"+ПутьКИсходникам+">");

ПапкаИсходников = Новый Файл(ПутьКИсходникам);

ИмяПапки = ПапкаИсходников.Имя;
ИмяФайлаОбъекта = ОбъединитьПути(ТекущийКаталог(), КаталогВыгрузки, ИмяПапки + "." + ТипФайла);

Переименования = ПолучитьСоответствиеПереименований(ПутьКИсходникам);

ВременныйКаталог = ВременныеФайлы.СоздатьКаталог();
Expand All @@ -508,6 +502,11 @@

КонецЦикла;

ТипФайла = ПолучитьТипФайлаПоКаталогуИсходников(ВременныйКаталог);

ИмяПапки = ПапкаИсходников.Имя;
ИмяФайлаОбъекта = ОбъединитьПути(ТекущийКаталог(), КаталогВыгрузки, ИмяПапки + "." + ТипФайла);

СобратьФайлИзИсходников(ВременныйКаталог, ИмяФайлаОбъекта);
Лог.Информация("Успешно собран файл "+ИмяФайлаОбъекта);

Expand All @@ -522,6 +521,63 @@

КонецФункции

Функция ПолучитьТипФайлаПоКаталогуИсходников(Знач КаталогИсходников)

ПутьКФайлуРут = ОбъединитьПути(КаталогИсходников, "root");
ФайлРут = Новый Файл(ПутьКФайлуРут);

Ожидаем.Что(ФайлРут.Существует(), "Файл <" + ПутьКФайлуРут + "> должен существовать").ЭтоИстина();
Ожидаем.Что(ФайлРут.ЭтоКаталог(), "<" + ПутьКФайлуРут + "> должен быть файлом").ЭтоЛожь();

ЧтениеТекста = Новый ЧтениеТекста(ПутьКФайлуРут);
СодержаниеРут = ЧтениеТекста.Прочитать();
ЧтениеТекста.Закрыть();
МассивСтрокРут = СтрРазделить(СодержаниеРут, ",");
Ожидаем.Что(МассивСтрокРут.Количество(), "Некорректный формат файла root").Больше(1);

ПутьКФайлуКорневойКонтейнер = ОбъединитьПути(КаталогИсходников, МассивСтрокРут[1]);
ФайлКорневойКонтейнер = Новый Файл(ПутьКФайлуКорневойКонтейнер);

Ожидаем.Что(ФайлКорневойКонтейнер.Существует(), "Файл <" + ПутьКФайлуКорневойКонтейнер + "> должен существовать").ЭтоИстина();
Ожидаем.Что(ФайлКорневойКонтейнер.ЭтоКаталог(), "<" + ПутьКФайлуКорневойКонтейнер + "> должен быть файлом").ЭтоЛожь();

ЧтениеТекста = Новый ЧтениеТекста(ПутьКФайлуКорневойКонтейнер);
СодержаниеКорневойКонтейнер = "";
Для сч = 1 По 7 Цикл
ПрочитаннаяСтрока = ЧтениеТекста.ПрочитатьСтроку();
Если ПрочитаннаяСтрока = Неопределено Тогда
Прервать;
КонецЕсли;

СодержаниеКорневойКонтейнер = СодержаниеКорневойКонтейнер + ПрочитаннаяСтрока;
КонецЦикла;
ЧтениеТекста.Закрыть();

МассивСтрокКорневойКонтейнер = СтрРазделить(СодержаниеКорневойКонтейнер, ",");
Ожидаем.Что(МассивСтрокКорневойКонтейнер.Количество(), "Некорректный формат файла корневого контейнера <" + ПутьКФайлуКорневойКонтейнер + ">").Больше(3);

ИдентификаторТипаОбъекта = СокрЛП(МассивСтрокКорневойКонтейнер[3]);
Если Лев(ИдентификаторТипаОбъекта, 1) = "{" Тогда
ИдентификаторТипаОбъекта = Прав(ИдентификаторТипаОбъекта, СтрДлина(ИдентификаторТипаОбъекта) - 1);
КонецЕсли;
Если Прав(ИдентификаторТипаОбъекта, 1) = "}" Тогда
ИдентификаторТипаОбъекта = Лев(ИдентификаторТипаОбъекта, СтрДлина(ИдентификаторТипаОбъекта) - 1);
КонецЕсли;

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Я бы здесь еще добавил строку

ИдентификаторТипаОбъекта = НРег(СокрЛП(ИдентификаторТипаОбъекта));

так как 1С допускает наличие пробельных символов между запятыми и значениями в своем формате сериализации. И идентификаторы тоже могут быть в верхнем регистре (в ранних версиях 8.0 так и было).

ИдентификаторТипаОбъекта = НРег(СокрЛП(ИдентификаторТипаОбъекта));

Если ИдентификаторТипаОбъекта = "c3831ec8-d8d5-4f93-8a22-f9bfae07327f" Тогда
ТипФайла = "epf";
ИначеЕсли ИдентификаторТипаОбъекта = "e41aff26-25cf-4bb6-b6c1-3f478a75f374" Тогда
ТипФайла = "erf";
Иначе
ВызватьИсключение("Некорректный идентификатор типа собираемого объекта <" + ИдентификаторТипаОбъекта + ">");
КонецЕсли;

Возврат ТипФайла;

КонецФункции

// Функция - Получает соответствие переименований файлов обработки на основе
// файла renames.txt
//
Expand Down