Skip to content

Instantly share code, notes, and snippets.

@VladFrost
Created January 9, 2018 13:29
Show Gist options
  • Save VladFrost/6ef97350b1f23744383c23b909d8d5ce to your computer and use it in GitHub Desktop.
Save VladFrost/6ef97350b1f23744383c23b909d8d5ce to your computer and use it in GitHub Desktop.
#Использовать v8runner
Перем Лог;
Процедура ПодготовитьОкружение()
Лог = Логирование.ПолучитьЛог("service-agent");
Лог.Отладка("Текущий каталог ""%1""", ТекущийКаталог());
Лог.Отладка("Удаляется каталог ""%1""", ИмяКаталогаСборки());
УдалитьФайлы(ИмяКаталогаСборки());
Лог.Отладка("Создается каталог ""%1""", ИмяКаталогаСборки());
СоздатьКаталог(ИмяКаталогаСборки());
Для Каждого ТекИмя Из ИменаСобираемыхОбработок() Цикл
СкопироватьИТрансформироватьФайлыОбработки(ТекИмя, ИмяКаталогаСборки());
КонвертироватьФайлыВОбработки(ТекИмя, ИмяКаталогаСборки());
КонецЦикла
КонецПроцедуры
Функция ИмяКаталогаСборки()
Возврат "build";
КонецФункции
Функция ИменаСобираемыхОбработок()
Результат = Новый Массив;
Результат.Добавить("ПроверкаКонфигурации");
Результат.Добавить("ИдентификаторыМетаданных");
Результат.Добавить("ИсточникОтчетаПотеряДанных");
Возврат Результат;
КонецФункции
// Копирует файлы обработки из каталога с исходниками в каталог сборки
//
// Параметры:
// ИмяОбработки - Строка - имя обработки без расширения
// ИмяКаталога - Строка - имя каталога сборки относительно каталога проекта
//
Процедура СкопироватьИТрансформироватьФайлыОбработки(ИмяОбработки, ИмяКаталога)
Лог.Отладка("Создается каталог ""%1""", КаталогИсходныхФайловОбработки(ИмяОбработки));
СоздатьКаталог(КаталогДляСборкиОбработки(ИмяОбработки, ИмяКаталога));
ТрансформироватьКорневойФайлВыгрузки(ИмяОбработки, ИмяКаталога);
НайденныеФайлы = НайтиФайлы(КаталогИсходныхФайловОбработки(ИмяОбработки), ПолучитьМаскуВсеФайлы());
Для Каждого ТекФайл Из НайденныеФайлы Цикл
СкопироватьИТрансформироватьРекурсивно(ТекФайл, КаталогДляСборкиОбработки(ИмяОбработки, ИмяКаталога), ИмяОбработки);
КонецЦикла;
КонецПроцедуры
Функция КаталогИсходныхФайловОбработки(ИмяОбработки)
КаталогОбработок = ОбъединитьПути("src", "DataProcessors");
Возврат ОбъединитьПути(КаталогОбработок, ИмяОбработки);
КонецФункции
Функция КаталогДляСборкиОбработки(ИмяОбработки, ИмяКаталога)
Возврат ОбъединитьПути(ИмяКаталога, ИмяОбработки);
КонецФункции
Процедура СкопироватьИТрансформироватьРекурсивно(Знач Файл, Знач Подкаталог, Знач ИмяОбработки)
Если Файл.ЭтоКаталог() Тогда
Подкаталог = ОбъединитьПути(Подкаталог, Файл.Имя);
Лог.Отладка(СтрШаблон("Создается каталог ""%1""", Подкаталог));
СоздатьКаталог(Подкаталог);
НайденныеФайлы = НайтиФайлы(Файл.ПолноеИмя, ПолучитьМаскуВсеФайлы());
Для Каждого ТекФайл Из НайденныеФайлы Цикл
СкопироватьИТрансформироватьРекурсивно(ТекФайл, Подкаталог, ИмяОбработки);
КонецЦикла;
Иначе
КопироватьТрансформироватьФайл(Файл, Подкаталог);
КонецЕсли
КонецПроцедуры
Процедура ТрансформироватьКорневойФайлВыгрузки(ИмяОбработки, ИмяКаталога)
Источник = Новый Файл(СтрШаблон("%1.xml", КаталогИсходныхФайловОбработки(ИмяОбработки)));
Назначение = Новый Файл(СтрШаблон("%1.xml", КаталогДляСборкиОбработки(ИмяОбработки, ИмяКаталога)));
Лог.Отладка(СтрШаблон("Трансформируется ""%1"" -> ""%2""", Источник.ПолноеИмя, Назначение.ПолноеИмя));
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(Источник.ПолноеИмя);
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(Назначение.ПолноеИмя);
ЗаписьXML.ЗаписатьОбъявлениеXML();
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Если ЧтениеXML.Имя = "DataProcessor" Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента("ExternalDataProcessor");
ИначеЕсли ЧтениеXML.Имя = ИмяКонтейнераВнутренняяИнформация() Тогда
ЗаписатьВнутреннююИнформацию(ЧтениеXML, ЗаписьXML, ИмяОбработки);
Продолжить;
ИначеЕсли ЧтениеXML.Имя = "DefaultForm" Тогда
ЗаписатьИмяФормы(ЧтениеXML, ЗаписьXML);
Продолжить;
ИначеЕсли СледуетИсключитьКонтейнер(ЧтениеXML.Имя) Тогда
ПромотатьККонцуЭлемента(ЧтениеXML, ЧтениеXML.Имя);
Продолжить;
Иначе
ЗаписьXML.ЗаписатьНачалоЭлемента(ЧтениеXML.Имя);
КонецЕсли;
Пока ЧтениеXML.ПрочитатьАтрибут() Цикл
Если ЧтениеXML.Имя = "version" И ЧтениеXML.Значение = "2.6" Тогда
ЗаписьXML.ЗаписатьАтрибут(ЧтениеXML.Имя, "2.4");
ИначеЕсли ЧтениеXML.Имя = "uuid" Тогда
ЗаписьXML.ЗаписатьАтрибут(ЧтениеXML.Имя, Новый УникальныйИдентификатор);
Иначе
ЗаписьXML.ЗаписатьАтрибут(ЧтениеXML.Имя, ЧтениеXML.Значение);
КонецЕсли
КонецЦикла;
КонецЕсли;
Если ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
ЗаписьXML.ЗаписатьТекст(ЧтениеXML.Значение);
КонецЕсли;
Если ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;
КонецЦикла;
ЧтениеXML.Закрыть();
ЗаписьXML.Закрыть();
КонецПроцедуры
Процедура КопироватьТрансформироватьФайл(Файл, Подкаталог)
Если Файл.Расширение = ".xml" Тогда
ТрансформироватьФайлФормы(Файл, Подкаталог);
Иначе
Лог.Отладка(СтрШаблон("Копируется ""%1"" -> ""%2""", Файл.ПолноеИмя, ОбъединитьПути(Подкаталог, Файл.Имя)));
КопироватьФайл(Файл.ПолноеИмя, ОбъединитьПути(Подкаталог, Файл.Имя));
КонецЕсли
КонецПроцедуры
Процедура ТрансформироватьФайлФормы(Файл, Подкаталог)
Лог.Отладка(СтрШаблон("Трансформируется ""%1"" -> ""%2""", Файл.ПолноеИмя, ОбъединитьПути(Подкаталог, Файл.Имя)));
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(Файл.ПолноеИмя);
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ОбъединитьПути(Подкаталог, Файл.Имя));
ЗаписьXML.ЗаписатьОбъявлениеXML();
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Если ЧтениеXML.Имя = "v8:Type" Тогда
ЗаписатьСсылкуНаОбработку(ЧтениеXML, ЗаписьXML);
Продолжить;
Иначе
ЗаписьXML.ЗаписатьНачалоЭлемента(ЧтениеXML.Имя);
КонецЕсли;
Пока ЧтениеXML.ПрочитатьАтрибут() Цикл
Если ЧтениеXML.Имя = "version" И ЧтениеXML.Значение = "2.6" Тогда
ЗаписьXML.ЗаписатьАтрибут(ЧтениеXML.Имя, "2.4");
ИначеЕсли ЧтениеXML.Имя = "uuid" Тогда
ЗаписьXML.ЗаписатьАтрибут(ЧтениеXML.Имя, Новый УникальныйИдентификатор);
Иначе
ЗаписьXML.ЗаписатьАтрибут(ЧтениеXML.Имя, ЧтениеXML.Значение);
КонецЕсли
КонецЦикла;
КонецЕсли;
Если ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
ЗаписьXML.ЗаписатьТекст(ЧтениеXML.Значение);
КонецЕсли;
Если ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;
КонецЦикла;
ЧтениеXML.Закрыть();
ЗаписьXML.Закрыть();
КонецПроцедуры
Процедура ЗаписатьВнутреннююИнформацию(ЧтениеXML, ЗаписьXML, ИмяОбработки)
ПромотатьККонцуЭлемента(ЧтениеXML, ИмяКонтейнераВнутренняяИнформация());
ЗаписьXML.ЗаписатьНачалоЭлемента(ИмяКонтейнераВнутренняяИнформация());
ЗаписьXML.ЗаписатьНачалоЭлемента("xr:ContainedObject");
ЗаписьXML.ЗаписатьНачалоЭлемента("xr:ClassId");
ЗаписьXML.ЗаписатьТекст("c3831ec8-d8d5-4f93-8a22-f9bfae07327f");
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьНачалоЭлемента("xr:ObjectId");
ЗаписьXML.ЗаписатьТекст(Новый УникальныйИдентификатор);
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьКонецЭлемента(); // "xr:ContainedObject
ЗаписьXML.ЗаписатьНачалоЭлемента("xr:GeneratedType");
ЗаписьXML.ЗаписатьАтрибут("name", СтрШаблон("ExternalDataProcessorObject.%1", ИмяОбработки));
ЗаписьXML.ЗаписатьАтрибут("category", "Object");
ЗаписьXML.ЗаписатьНачалоЭлемента("xr:TypeId");
ЗаписьXML.ЗаписатьТекст(Новый УникальныйИдентификатор);
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьНачалоЭлемента("xr:ValueId");
ЗаписьXML.ЗаписатьТекст(Новый УникальныйИдентификатор);
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьКонецЭлемента(); // xr:GeneratedType
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецПроцедуры
Функция ИмяКонтейнераВнутренняяИнформация()
Возврат "InternalInfo";
КонецФункции
Процедура ЗаписатьИмяФормы(ЧтениеXML, ЗаписьXML)
ЗаписьXML.ЗаписатьНачалоЭлемента(ЧтениеXML.Имя);
ЧтениеXML.Прочитать();
ЗаписьXML.ЗаписатьТекст(СтрШаблон("External%1", ЧтениеXML.Значение));
ЧтениеXML.Прочитать();
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецПроцедуры
Процедура ЗаписатьСсылкуНаОбработку(ЧтениеXML, ЗаписьXML)
ЗаписьXML.ЗаписатьНачалоЭлемента(ЧтениеXML.Имя);
ЧтениеXML.Прочитать();
Если СтрНачинаетсяС(ЧтениеXML.Значение, "cfg:DataProcessorObject") Тогда
ЗаписьXML.ЗаписатьТекст(СтрЗаменить(ЧтениеXML.Значение, "cfg:DataProcessorObject", "cfg:ExternalDataProcessorObject"));
Иначе
ЗаписьXML.ЗаписатьТекст(ЧтениеXML.Значение);
КонецЕсли;
ЧтениеXML.Прочитать();
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецПроцедуры
Функция СледуетИсключитьКонтейнер(ИмяЭлемента)
Возврат ИмяЭлемента = "UseStandardCommands"
Или ИмяЭлемента = "IncludeHelpInContents"
Или ИмяЭлемента = "ExtendedPresentation"
Или ИмяЭлемента = "Explanation";
КонецФункции
Процедура ПромотатьККонцуЭлемента(ЧтениеXML, ИмяЭлемента)
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.ТипУзла <> ТипУзлаXML.КонецЭлемента Тогда
Продолжить;
КонецЕсли;
Если ЧтениеXML.Имя <> ИмяЭлемента Тогда
Продолжить;
КонецЕсли;
Прервать;
КонецЦикла;
КонецПроцедуры
Процедура КонвертироватьФайлыВОбработки(ИмяОбработки, ИмяКаталога)
ФайлОбработки = Новый Файл(СтрШаблон("%1.epf", КаталогДляСборкиОбработки(ИмяОбработки, ИмяКаталога)));
Лог.Информация("Выполняется сборка ""%1""", ФайлОбработки.Имя);
КаталогСборки = Новый Файл(ИмяКаталогаСборки());
Конфигуратор = Новый УправлениеКонфигуратором;
Конфигуратор.УстановитьКонтекст(СтрШаблон("/F%1", ОбъединитьПути(КаталогСборки.ПолноеИмя, "ib")), "", "");
ПараметрыЗапуска = Конфигуратор.ПолучитьПараметрыЗапуска();
ПараметрыЗапуска.Добавить(
СтрШаблон("/LoadExternalDataProcessorOrReportFromFiles %1.xml %1.epf",
КаталогДляСборкиОбработки(ИмяОбработки, ИмяКаталога)));
Попытка
Конфигуратор.ВыполнитьКоманду(ПараметрыЗапуска);
Исключение
Сообщить(Конфигуратор.ВыводКоманды());
КонецПопытки;
Ожидаем.Что(ФайлОбработки.Существует(), СтрШаблон("Файл ""%1"" должен существовать", ФайлОбработки.ПолноеИмя)).ЭтоИстина();
КонецПроцедуры
ПодготовитьОкружение()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment