From 191583781270b6ade29896f29c0989dcaa8995d9 Mon Sep 17 00:00:00 2001 From: Maxmov Valery Date: Wed, 19 Sep 2018 13:43:40 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=D0=B0=20?= =?UTF-8?q?=D0=B4=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=BD=D1=8B=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6?= =?UTF-8?q?=D0=BA=D0=B8=20EDT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Модули/ТипыФайлов.os | 40 ++++++ .../ДобавлениеПробеловПередКлючевымиСловами.os | 4 +- .../ЗапретИспользованияПерейти.os | 2 +- src/СценарииОбработки/КорректировкаXMLФорм.os | 4 +- .../ПроверкаКорректностиОбластей.os | 2 +- .../СинхронизацияОбъектовМетаданныхИФайлов.os | 14 +- .../СортировкаДереваМетаданных.os | 117 ++++++++++++++--- .../УдалениеДублейМетаданных.os | 121 +++++++++++++++--- .../УдалениеЛишнихКонцевыхПробелов.os | 4 +- .../УдалениеЛишнихПустыхСтрок.os | 4 +- 10 files changed, 251 insertions(+), 61 deletions(-) diff --git a/src/Модули/ТипыФайлов.os b/src/Модули/ТипыФайлов.os index 51ee0d6..bdecc27 100644 --- a/src/Модули/ТипыФайлов.os +++ b/src/Модули/ТипыФайлов.os @@ -25,3 +25,43 @@ Возврат СтрСравнить(Файл.Расширение, ".bsl") = 0; КонецФункции + +// ЭтоФайлОписанияКонфигурации +// Возвращает истину, если файл является файлом описания конфигурации +// Параметры: +// Файл - Строка - Полный путь к файлу +// +// Возвращаемое значение: +// Булево - Признак +// +Функция ЭтоФайлОписанияКонфигурации(Файл) Экспорт + + Если ПустаяСтрока(Файл.Расширение) Тогда + + Возврат Ложь; + + КонецЕсли; + + Возврат СтрСравнить(Файл.Имя, "Configuration.xml") = 0; + +КонецФункции + +// ЭтоФайлОписанияКонфигурацииEDT +// Возвращает истину, если файл является файлом описания конфигурации в формате EDT +// Параметры: +// Файл - Строка - Полный путь к файлу +// +// Возвращаемое значение: +// Булево - Признак +// +Функция ЭтоФайлОписанияКонфигурацииEDT(Файл) Экспорт + + Если ПустаяСтрока(Файл.Расширение) Тогда + + Возврат Ложь; + + КонецЕсли; + + Возврат СтрСравнить(Файл.Имя, "Configuration.mdo") = 0; + +КонецФункции diff --git a/src/СценарииОбработки/ДобавлениеПробеловПередКлючевымиСловами.os b/src/СценарииОбработки/ДобавлениеПробеловПередКлючевымиСловами.os index e3e3e34..ed74c41 100644 --- a/src/СценарииОбработки/ДобавлениеПробеловПередКлючевымиСловами.os +++ b/src/СценарииОбработки/ДобавлениеПробеловПередКлючевымиСловами.os @@ -58,7 +58,7 @@ Функция ВставитьНужныеПробелы(Знач ИмяФайла) Текст = Новый ЧтениеТекста(); - Текст.Открыть(ИмяФайла, "utf-8"); + Текст.Открыть(ИмяФайла, КодировкаТекста.UTF8NoBOM); СодержимоеФайла = Текст.Прочитать(); Текст.Закрыть(); @@ -80,7 +80,7 @@ СодержимоеФайла = Регексп.Заменить(СодержимоеФайла, "$1 $2$3$4"); - ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла,,,, Символы.ПС); + ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8NoBOM,,, Символы.ПС); ЗаписьТекста.Записать(СодержимоеФайла); ЗаписьТекста.Закрыть(); diff --git a/src/СценарииОбработки/ЗапретИспользованияПерейти.os b/src/СценарииОбработки/ЗапретИспользованияПерейти.os index 9cc5555..eddf561 100644 --- a/src/СценарииОбработки/ЗапретИспользованияПерейти.os +++ b/src/СценарииОбработки/ЗапретИспользованияПерейти.os @@ -54,7 +54,7 @@ Процедура ПроверитьНаОтсутствиеПерейти(ПутьКФайлуМодуля) Текст = Новый ЧтениеТекста(); - Текст.Открыть(ПутьКФайлуМодуля, "utf-8"); + Текст.Открыть(ПутьКФайлуМодуля, КодировкаТекста.UTF8NoBOM); ТекстМодуля = Текст.Прочитать(); Текст.Закрыть(); diff --git a/src/СценарииОбработки/КорректировкаXMLФорм.os b/src/СценарииОбработки/КорректировкаXMLФорм.os index 8c68306..c7425c3 100644 --- a/src/СценарииОбработки/КорректировкаXMLФорм.os +++ b/src/СценарииОбработки/КорректировкаXMLФорм.os @@ -69,7 +69,7 @@ Функция ОбновитьИндексыЭлементовВФорме(Знач ИмяФайла) Текст = Новый ЧтениеТекста(); - Текст.Открыть(ИмяФайла, "utf-8"); + Текст.Открыть(ИмяФайла, КодировкаТекста.UTF8NoBOM); СодержимоеФайла = Текст.Прочитать(); Текст.Закрыть(); @@ -129,7 +129,7 @@ КонецЦикла; - ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла,,,, Символы.ПС); + ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8NoBOM,,, Символы.ПС); ЗаписьТекста.Записать(СодержимоеФайла); ЗаписьТекста.Закрыть(); diff --git a/src/СценарииОбработки/ПроверкаКорректностиОбластей.os b/src/СценарииОбработки/ПроверкаКорректностиОбластей.os index 051f0df..e7216dd 100644 --- a/src/СценарииОбработки/ПроверкаКорректностиОбластей.os +++ b/src/СценарииОбработки/ПроверкаКорректностиОбластей.os @@ -54,7 +54,7 @@ Процедура ПроверитьНаКорректностьОбластей(ПутьКФайлуМодуля) Текст = Новый ЧтениеТекста(); - Текст.Открыть(ПутьКФайлуМодуля, "utf-8"); + Текст.Открыть(ПутьКФайлуМодуля, КодировкаТекста.UTF8NoBOM); ТекстМодуля = Текст.Прочитать(); Текст.Закрыть(); diff --git a/src/СценарииОбработки/СинхронизацияОбъектовМетаданныхИФайлов.os b/src/СценарииОбработки/СинхронизацияОбъектовМетаданныхИФайлов.os index cfd5d66..036d02b 100644 --- a/src/СценарииОбработки/СинхронизацияОбъектовМетаданныхИФайлов.os +++ b/src/СценарииОбработки/СинхронизацияОбъектовМетаданныхИФайлов.os @@ -36,7 +36,7 @@ Лог = ДополнительныеПараметры.Лог; НастройкиСценария = ДополнительныеПараметры.УправлениеНастройками.Настройка("Precommt4onecСценарии\НастройкиСценариев").Получить(ИмяСценария()); - Если АнализируемыйФайл.Существует() И ЭтоФайлОписанияКонфигурации(АнализируемыйФайл) Тогда + Если АнализируемыйФайл.Существует() И ТипыФайлов.ЭтоФайлОписанияКонфигурации(АнализируемыйФайл) Тогда Лог.Информация("Обработка файла '%1' по сценарию '%2'", АнализируемыйФайл.ПолноеИмя, ИмяСценария()); @@ -54,18 +54,6 @@ КонецФункции // ОбработатьФайл() -Функция ЭтоФайлОписанияКонфигурации(Файл) - - Если ПустаяСтрока(Файл.Расширение) Тогда - - Возврат Ложь; - - КонецЕсли; - - Возврат СтрСравнить(Файл.Имя, "Configuration.xml") = 0; - -КонецФункции - Функция СинхронизироватьМетаданныеиФайлы(Знач ИмяФайла, УдаленныеФайлы) Текст = Новый ЧтениеТекста(); diff --git a/src/СценарииОбработки/СортировкаДереваМетаданных.os b/src/СценарииОбработки/СортировкаДереваМетаданных.os index 6575327..0f8dbd6 100644 --- a/src/СценарииОбработки/СортировкаДереваМетаданных.os +++ b/src/СценарииОбработки/СортировкаДереваМетаданных.os @@ -36,36 +36,40 @@ Лог = ДополнительныеПараметры.Лог; НастройкиСценария = ДополнительныеПараметры.УправлениеНастройками.Настройка("Precommt4onecСценарии\НастройкиСценариев").Получить(ИмяСценария()); - Если АнализируемыйФайл.Существует() И ЭтоФайлОписанияКонфигурации(АнализируемыйФайл) Тогда + Если АнализируемыйФайл.Существует() Тогда - Лог.Информация("Обработка файла '%1' по сценарию '%2'", АнализируемыйФайл.ПолноеИмя, ИмяСценария()); + Если ТипыФайлов.ЭтоФайлОписанияКонфигурации(АнализируемыйФайл) Тогда - Если ОтсортироватьДеревоМетаданных(АнализируемыйФайл.ПолноеИмя) Тогда + Лог.Информация("Обработка файла '%1' по сценарию '%2'", АнализируемыйФайл.ПолноеИмя, ИмяСценария()); - ДополнительныеПараметры.ИзмененныеКаталоги.Добавить(АнализируемыйФайл.ПолноеИмя); + Если ОтсортироватьДеревоМетаданных(АнализируемыйФайл.ПолноеИмя) Тогда + + ДополнительныеПараметры.ИзмененныеКаталоги.Добавить(АнализируемыйФайл.ПолноеИмя); + + КонецЕсли; + Возврат Истина; + + ИначеЕсли ТипыФайлов.ЭтоФайлОписанияКонфигурацииEDT(АнализируемыйФайл) Тогда + + Лог.Информация("Обработка файла '%1' по сценарию '%2'", АнализируемыйФайл.ПолноеИмя, ИмяСценария()); + + Если ОтсортироватьДеревоМетаданныхEDT(АнализируемыйФайл.ПолноеИмя) Тогда + + ДополнительныеПараметры.ИзмененныеКаталоги.Добавить(АнализируемыйФайл.ПолноеИмя); + + КонецЕсли; + + Возврат Истина; + КонецЕсли; - Возврат Истина; - КонецЕсли; Возврат ЛОЖЬ; КонецФункции // ОбработатьФайл() -Функция ЭтоФайлОписанияКонфигурации(Файл) - - Если ПустаяСтрока(Файл.Расширение) Тогда - - Возврат Ложь; - - КонецЕсли; - - Возврат СтрСравнить(Файл.Имя, "Configuration.xml") = 0; - -КонецФункции - Функция ОтсортироватьДеревоМетаданных(Знач ИмяФайла) Текст = Новый ЧтениеТекста(); @@ -142,3 +146,80 @@ Возврат Истина; КонецФункции + +Функция ОтсортироватьДеревоМетаданныхEDT(Знач ИмяФайла) + + Текст = Новый ЧтениеТекста(); + Текст.Открыть(ИмяФайла, КодировкаТекста.UTF8NoBOM); + СодержимоеФайла = Текст.Прочитать(); + Текст.Закрыть(); + + Регексп = Новый РегулярноеВыражение("(<\/languages>\s*?)([\w\W]*)(<\/mdclass\:Configuration>)"); + Регексп.ИгнорироватьРегистр = ИСТИНА; + Регексп.Многострочный = ИСТИНА; + ПодчиненныеМетаданные = Регексп.НайтиСовпадения(СодержимоеФайла); + Если ПодчиненныеМетаданные.Количество() = 0 Тогда + + Возврат Ложь; + + КонецЕсли; + + ИсходнаяСтрока = ПодчиненныеМетаданные[0].Группы[2].Значение; + РегекспМетаданные = Новый РегулярноеВыражение("^\s+<([\w]+)>([a-zA-Z]+\.[а-яa-zA-ZА-Я0-9_]+)<\/[\w]+>"); + РегекспМетаданные.ИгнорироватьРегистр = ИСТИНА; + РегекспМетаданные.Многострочный = Истина; + ОбъектыМетаданныхСтроки = РегекспМетаданные.НайтиСовпадения(ИсходнаяСтрока); + + ОбъектыМетаданных = Новый СписокЗначений; + ПоследнийТип = ""; + ОбъектыТипа = Новый СписокЗначений; + Для Каждого ОбъектМетаданных Из ОбъектыМетаданныхСтроки Цикл + + Если ПоследнийТип <> ОбъектМетаданных.Группы[1].Значение Тогда + + Если ПоследнийТип <> "" Тогда + + ОбъектыМетаданных.Добавить(ОбъектыТипа); + ОбъектыТипа = Новый СписокЗначений; + + КонецЕсли; + + ПоследнийТип = ОбъектМетаданных.Группы[1].Значение; + + КонецЕсли; + + ОбъектыТипа.Добавить(ОбъектМетаданных.Группы[0].Значение, ОбъектМетаданных.Группы[2].Значение); + + КонецЦикла; + + ОбъектыМетаданных.Добавить(ОбъектыТипа); + + СтрокаЗамены = ""; + Для Каждого ОбъектМетаданных Из ОбъектыМетаданных Цикл + + Если НЕ СтрЗаканчиваетсяНа(ОбъектМетаданных.Значение[0].Значение, "subsystems>") Тогда + + ОбъектМетаданных.Значение.СортироватьПоПредставлению(НаправлениеСортировки.Возр); + + КонецЕсли; + + СтрокаЗамены = СтрокаЗамены + ?(ПустаяСтрока(СтрокаЗамены), "", Символы.ПС) + + СтрСоединить(ОбъектМетаданных.Значение.ВыгрузитьЗначения(), Символы.ПС); + + КонецЦикла; + + Если СтрСравнить(ИсходнаяСтрока, СтрокаЗамены) = 0 Тогда + + Возврат Ложь; + + КонецЕсли; + + СодержимоеФайла = Регексп.Заменить(СодержимоеФайла, "$1" + СокрЛП(СтрокаЗамены) + Символы.ПС + "$3"); + ЗаписьТекста = Новый ЗаписьТекста; + ЗаписьТекста.Открыть(ИмяФайла, КодировкаТекста.UTF8NoBOM); + ЗаписьТекста.Записать(СодержимоеФайла); + ЗаписьТекста.Закрыть(); + + Возврат Истина; + +КонецФункции diff --git a/src/СценарииОбработки/УдалениеДублейМетаданных.os b/src/СценарииОбработки/УдалениеДублейМетаданных.os index 6b8a29f..4c690b9 100644 --- a/src/СценарииОбработки/УдалениеДублейМетаданных.os +++ b/src/СценарииОбработки/УдалениеДублейМетаданных.os @@ -36,37 +36,41 @@ Лог = ДополнительныеПараметры.Лог; НастройкиСценария = ДополнительныеПараметры.УправлениеНастройками.Настройка("Precommt4onecСценарии\НастройкиСценариев").Получить(ИмяСценария()); - Если АнализируемыйФайл.Существует() И ЭтоФайлОписанияКонфигурации(АнализируемыйФайл) Тогда + Если АнализируемыйФайл.Существует() Тогда - Лог.Информация("Обработка файла '%1' по сценарию '%2'", АнализируемыйФайл.ПолноеИмя, ИмяСценария()); - - Если ОтсортироватьДеревоМетаданных(АнализируемыйФайл.ПолноеИмя) Тогда + Если ТипыФайлов.ЭтоФайлОписанияКонфигурации(АнализируемыйФайл) Тогда - ДополнительныеПараметры.ИзмененныеКаталоги.Добавить(АнализируемыйФайл.ПолноеИмя); + Лог.Информация("Обработка файла '%1' по сценарию '%2'", АнализируемыйФайл.ПолноеИмя, ИмяСценария()); + + Если УдалитьДублиВМетаданных(АнализируемыйФайл.ПолноеИмя) Тогда + + ДополнительныеПараметры.ИзмененныеКаталоги.Добавить(АнализируемыйФайл.ПолноеИмя); + + КонецЕсли; + + Возврат Истина; + + ИначеЕсли ТипыФайлов.ЭтоФайлОписанияКонфигурацииEDT(АнализируемыйФайл) Тогда + + Лог.Информация("Обработка файла '%1' по сценарию '%2'", АнализируемыйФайл.ПолноеИмя, ИмяСценария()); + + Если УдалитьДублиВМетаданныхEDT(АнализируемыйФайл.ПолноеИмя) Тогда + + ДополнительныеПараметры.ИзмененныеКаталоги.Добавить(АнализируемыйФайл.ПолноеИмя); + + КонецЕсли; + + Возврат Истина; КонецЕсли; - Возврат Истина; - КонецЕсли; Возврат ЛОЖЬ; КонецФункции // ОбработатьФайл() -Функция ЭтоФайлОписанияКонфигурации(Файл) - - Если ПустаяСтрока(Файл.Расширение) Тогда - - Возврат Ложь; - - КонецЕсли; - - Возврат СтрСравнить(Файл.Имя, "Configuration.xml") = 0; - -КонецФункции - -Функция ОтсортироватьДеревоМетаданных(Знач ИмяФайла) +Функция УдалитьДублиВМетаданных(Знач ИмяФайла) Текст = Новый ЧтениеТекста(); Текст.Открыть(ИмяФайла, "utf-8"); @@ -143,3 +147,80 @@ Возврат Истина; КонецФункции + +Функция УдалитьДублиВМетаданныхEDT(Знач ИмяФайла) + Текст = Новый ЧтениеТекста(); + Текст.Открыть(ИмяФайла, КодировкаТекста.UTF8NoBOM); + СодержимоеФайла = Текст.Прочитать(); + Текст.Закрыть(); + + Регексп = Новый РегулярноеВыражение("(<\/languages>\s*?)([\w\W]*)(<\/mdclass\:Configuration>)"); + Регексп.ИгнорироватьРегистр = Истина; + Регексп.Многострочный = Истина; + ПодчиненныеМетаданные = Регексп.НайтиСовпадения(СодержимоеФайла); + Если ПодчиненныеМетаданные.Количество() = 0 Тогда + + Возврат Ложь; + + КонецЕсли; + + ИсходнаяСтрока = ПодчиненныеМетаданные[0].Группы[2].Значение; + РегекспМетаданные = Новый РегулярноеВыражение("^\s+<([\w]+)>([a-zA-Z]+\.[а-яa-zA-ZА-Я0-9_]+)<\/[\w]+>"); + РегекспМетаданные.ИгнорироватьРегистр = Истина; + РегекспМетаданные.Многострочный = Истина; + ОбъектыМетаданныхСтроки = РегекспМетаданные.НайтиСовпадения(ИсходнаяСтрока); + + ОбъектыМетаданных = Новый ТаблицаЗначений; + ОбъектыМетаданных.Колонки.Добавить("ТипМетаданных"); + ОбъектыМетаданных.Колонки.Добавить("ИмяМетаданных"); + ОбъектыМетаданных.Колонки.Добавить("СтрокаФайла"); + ОбъектыМетаданных.Колонки.Добавить("Количество"); + Для Каждого ОбъектМетаданных Из ОбъектыМетаданныхСтроки Цикл + + НоваяЗапись = ОбъектыМетаданных.Добавить(); + НоваяЗапись.ТипМетаданных = ОбъектМетаданных.Группы[1].Значение; + НоваяЗапись.ИмяМетаданных = ОбъектМетаданных.Группы[2].Значение; + НоваяЗапись.СтрокаФайла = ОбъектМетаданных.Группы[0].Значение; + НоваяЗапись.Количество = 1; + + КонецЦикла; + + ОбъектыМетаданных.Свернуть("ТипМетаданных, ИмяМетаданных, СтрокаФайла", "Количество"); + ОбъектыМетаданных.Сортировать("Количество УБЫВ"); + + СтрокаЗамены = ИсходнаяСтрока; + Пока ОбъектыМетаданных.Количество() Цикл + + Если ОбъектыМетаданных[0].Количество = 1 Тогда + + Прервать; + + КонецЕсли; + + ПозНачало = СтрНайти(СтрокаЗамены, ОбъектыМетаданных[0].СтрокаФайла); + СтрокаЗамены = Лев(СтрокаЗамены, ПозНачало - 1) + Сред(СтрокаЗамены, ПозНачало + СтрДлина(ОбъектыМетаданных[0].СтрокаФайла) + 1); + + ОбъектыМетаданных[0].Количество = ОбъектыМетаданных[0].Количество - 1; + Если ОбъектыМетаданных[0].Количество = 1 Тогда + + ОбъектыМетаданных.Удалить(0); + + КонецЕсли; + + КонецЦикла; + + Если СтрСравнить(ИсходнаяСтрока, СтрокаЗамены) = 0 Тогда + + Возврат Ложь; + + КонецЕсли; + + СодержимоеФайла = Регексп.Заменить(СодержимоеФайла, "$1" + СокрЛП(СтрокаЗамены) + Символы.ПС + "$3"); + ЗаписьТекста = Новый ЗаписьТекста; + ЗаписьТекста.Открыть(ИмяФайла, КодировкаТекста.UTF8NoBOM); + ЗаписьТекста.Записать(СодержимоеФайла); + ЗаписьТекста.Закрыть(); + + Возврат Истина; + +КонецФункции diff --git a/src/СценарииОбработки/УдалениеЛишнихКонцевыхПробелов.os b/src/СценарииОбработки/УдалениеЛишнихКонцевыхПробелов.os index 9b47718..ec0a8ed 100644 --- a/src/СценарииОбработки/УдалениеЛишнихКонцевыхПробелов.os +++ b/src/СценарииОбработки/УдалениеЛишнихКонцевыхПробелов.os @@ -57,7 +57,7 @@ Функция ИсправитьКонцевыеПробелы(Знач ИмяФайла) Текст = Новый ЧтениеТекста(); - Текст.Открыть(ИмяФайла, "utf-8"); + Текст.Открыть(ИмяФайла, КодировкаТекста.UTF8NoBOM); СодержимоеФайла = Текст.Прочитать(); Текст.Закрыть(); @@ -79,7 +79,7 @@ СодержимоеФайла = Регексп.Заменить(СодержимоеФайла, "$1"); - ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла,,,, Символы.ПС); + ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8NoBOM,,, Символы.ПС); ЗаписьТекста.Записать(СодержимоеФайла); ЗаписьТекста.Закрыть(); diff --git a/src/СценарииОбработки/УдалениеЛишнихПустыхСтрок.os b/src/СценарииОбработки/УдалениеЛишнихПустыхСтрок.os index a29328d..2d82e2b 100644 --- a/src/СценарииОбработки/УдалениеЛишнихПустыхСтрок.os +++ b/src/СценарииОбработки/УдалениеЛишнихПустыхСтрок.os @@ -57,7 +57,7 @@ Функция УдалитьЛишниеПустыеСтроки(Знач ИмяФайла) Текст = Новый ЧтениеТекста(); - Текст.Открыть(ИмяФайла, "utf-8"); + Текст.Открыть(ИмяФайла, КодировкаТекста.UTF8NoBOM); СодержимоеФайла = Текст.Прочитать(); Текст.Закрыть(); @@ -73,7 +73,7 @@ НовоеСодержимоеФайла = РегекспОчистка.Заменить(СодержимоеФайла, Символы.ПС); Если СтрСравнить(СодержимоеФайла, НовоеСодержимоеФайла) <> 0 Тогда - ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла, ,,, Символы.ПС); + ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8NoBOM,,, Символы.ПС); ЗаписьТекста.Записать(НовоеСодержимоеФайла); ЗаписьТекста.Закрыть(); Возврат Истина;