diff --git a/readme.md b/readme.md index f8064ab..fb433ab 100644 --- a/readme.md +++ b/readme.md @@ -9,6 +9,7 @@ + Поддержка разбора правил регистрации. * Сборка правил из файлов и папок. + Поддержка сборки правил обмена. + + Поддержка сборки правил регистрации. * Возможность запуска из консоли. **Пример использования Gitrules можно почтитать в статье на Infostart diff --git "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\267\320\276\320\261\321\200\320\260\321\202\321\214\320\237\321\200\320\260\320\262\320\270\320\273\320\260\320\236\320\261\320\274\320\265\320\275\320\260.os" "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\267\320\276\320\261\321\200\320\260\321\202\321\214\320\237\321\200\320\260\320\262\320\270\320\273\320\260\320\236\320\261\320\274\320\265\320\275\320\260.os" index 72fb3c4..b674037 100644 --- "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\267\320\276\320\261\321\200\320\260\321\202\321\214\320\237\321\200\320\260\320\262\320\270\320\273\320\260\320\236\320\261\320\274\320\265\320\275\320\260.os" +++ "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\267\320\276\320\261\321\200\320\260\321\202\321\214\320\237\321\200\320\260\320\262\320\270\320\273\320\260\320\236\320\261\320\274\320\265\320\275\320\260.os" @@ -65,6 +65,7 @@ Процедура РекурсивноРазобратьДеревоПравил(Элемент, ИмяЭлемента, ТекущийКаталог, МассивРеквизитовУзла = Неопределено) + НомерСтроки = 0; Для Каждого ТекущаяСтрока Из Элемент.Строки Цикл Если ТекущаяСтрока.ТипСтроки = "Атрибут" Тогда @@ -82,7 +83,7 @@ ИмяЭлементаСтроки = ТекущаяСтрока.Имя; Идентификатор = ?(Не ПустаяСтрока(ТекущаяСтрока.Идентификатор), ТекущаяСтрока.Идентификатор, ТекущаяСтрока.Имя); - + Если (ИмяЭлементаСтроки = "Параметры" И НЕ ТекущаяСтрока.Родитель.Имя = "Алгоритм") Или ИмяЭлементаСтроки = "Обработки" Или ИмяЭлементаСтроки = "ПравилаКонвертацииОбъектов" @@ -121,8 +122,16 @@ ИначеЕсли ИмяЭлементаСтроки = "Группа" Или ИмяЭлементаСтроки = "Свойства" Или ИмяЭлементаСтроки = "Значения" Тогда - МассивРеквизитовТекущегоУзла = Новый Массив; - Идентификатор = ?(Не ПустаяСтрока(ТекущаяСтрока.Идентификатор), ТекущаяСтрока.Идентификатор, ТекущаяСтрока.Имя); + МассивРеквизитовТекущегоУзла = Новый Массив; + + Если ИмяЭлементаСтроки = "Группа" И ЭтоПравилаРегистрации Тогда + НомерСтроки = НомерСтроки + 1; + Идентификатор = ТекущаяСтрока.Идентификатор; + Если ПустаяСтрока(Идентификатор) Тогда + Идентификатор = СтрШаблон("%1 -- %2", НомерСтроки, ТекущаяСтрока.Имя); + КонецЕсли; + КонецЕсли; + ОбщийФункционал.ЗаменитьВСтрокеЗапрещенныеСимволы(Идентификатор); ИмяКаталогаСтроки = ОбъединитьПути(ТекущийКаталог, Идентификатор); СоздатьКаталог(ИмяКаталогаСтроки); @@ -141,11 +150,19 @@ Или ИмяЭлементаСтроки = "Свойство" Или ИмяЭлементаСтроки = "Параметр" Или ИмяЭлементаСтроки = "Обработка" - Или ИмяЭлементаСтроки = "ЭлементОтбора" Или ИмяЭлементаСтроки = "Элемент" Тогда + Или ИмяЭлементаСтроки = "ЭлементОтбора" + Или ИмяЭлементаСтроки = "Элемент" Тогда МассивРеквизитовТекущегоУзла = Новый Массив; - Идентификатор = ?(Не ПустаяСтрока(ТекущаяСтрока.Идентификатор), ТекущаяСтрока.Идентификатор, ТекущаяСтрока.Имя); + Если ИмяЭлементаСтроки = "ЭлементОтбора" И ЭтоПравилаРегистрации Тогда + НомерСтроки = НомерСтроки + 1; + Идентификатор = ТекущаяСтрока.Идентификатор; + Если ПустаяСтрока(Идентификатор) Тогда + Идентификатор = СтрШаблон("%1 -- %2", НомерСтроки, ТекущаяСтрока.Имя); + КонецЕсли; + КонецЕсли; + ОбщийФункционал.ЗаменитьВСтрокеЗапрещенныеСимволы(Идентификатор); ИмяКаталогаСтроки = ОбъединитьПути(ТекущийКаталог, Идентификатор); СоздатьКаталог(ИмяКаталогаСтроки); diff --git "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\276\320\261\321\200\320\260\321\202\321\214\320\237\321\200\320\260\320\262\320\270\320\273\320\260\320\236\320\261\320\274\320\265\320\275\320\260.os" "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\276\320\261\321\200\320\260\321\202\321\214\320\237\321\200\320\260\320\262\320\270\320\273\320\260\320\236\320\261\320\274\320\265\320\275\320\260.os" index e6b9ef5..2a8854b 100644 --- "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\276\320\261\321\200\320\260\321\202\321\214\320\237\321\200\320\260\320\262\320\270\320\273\320\260\320\236\320\261\320\274\320\265\320\275\320\260.os" +++ "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\276\320\261\321\200\320\260\321\202\321\214\320\237\321\200\320\260\320\262\320\270\320\273\320\260\320\236\320\261\320\274\320\265\320\275\320\260.os" @@ -3,10 +3,13 @@ Перем ТекущийПорядок; Перем ИменаСобытийКонвертации; Перем ЕстьОшибки; // для остановки сборки, при возникновении ошибки +Перем ЭтоПравилаРегистрации; Процедура ВыполнитьСборку(Знач КаталогИсходников, Знач КаталогСборки) Экспорт ЕстьОшибки = Ложь; + ЭтоПравилаРегистрации = Ложь; + ИнициализироватьИмена(); ДеревоФайлов = ПолучитьДеревоФайловПоКаталогу(Новый Файл(КаталогИсходников)); ДеревоПравил = ЗагрузитьКаталогиВДеревоПравил(ДеревоФайлов.Строки[0]); @@ -68,28 +71,36 @@ КорневойУзел = СтрокаДерева; КонецЕсли; КонецЦикла; - + ИмяКорневогоУзла = СтрЗаменить(КорневойУзел.Имя, ".xml", ""); - Если ИмяКорневогоУзла = "ПравилаОбмена" Тогда - + Если ИмяКорневогоУзла = "ПравилаРегистрации" Тогда + ЭтоПравилаРегистрации = Истина; + КонецЕсли; + + Если ИмяКорневогоУзла = "ПравилаОбмена" Или ИмяКорневогоУзла = "ПравилаРегистрации" Тогда + УзелПравил = ДобавитьНовуюСтрокуДереваПравил(ДеревоПравил, ИмяКорневогоУзла); - Загрузить_РеквизитыКонвертации(КорневойУзел, УзелПравил); - Загрузить_СобытияКонвертации(ДеревоКаталогов, УзелПравил); + ЗагрузитьРеквизитыКонвертации(КорневойУзел, УзелПравил); + ЗагрузитьСобытияКонвертации(ДеревоКаталогов, УзелПравил); Для Каждого СтрокаДерева Из ДеревоКаталогов.Строки Цикл Если СтрокаДерева.Имя = "Параметры" Тогда - Загрузить_Параметры(СтрокаДерева, УзелПравил); + ЗагрузитьПараметры(СтрокаДерева, УзелПравил); ИначеЕсли СтрокаДерева.Имя = "Обработки" Тогда - Загрузить_Обработки(СтрокаДерева, УзелПравил); + ЗагрузитьОбработки(СтрокаДерева, УзелПравил); ИначеЕсли СтрокаДерева.Имя = "ПравилаКонвертацииОбъектов" Тогда - Загрузить_ПравилаКонвертацииОбъектов(СтрокаДерева, УзелПравил); + ЗагрузитьПравилаКонвертацииОбъектов(СтрокаДерева, УзелПравил); ИначеЕсли СтрокаДерева.Имя = "ПравилаВыгрузкиДанных" Тогда - Загрузить_ПравилаВыгрузкиДанных(СтрокаДерева, УзелПравил); + ЗагрузитьПравилаВыгрузкиДанных(СтрокаДерева, УзелПравил); ИначеЕсли СтрокаДерева.Имя = "ПравилаОчисткиДанных" Тогда - Загрузить_ПравилаОчисткиДанных(СтрокаДерева, УзелПравил); + ЗагрузитьПравилаОчисткиДанных(СтрокаДерева, УзелПравил); ИначеЕсли СтрокаДерева.Имя = "Алгоритмы" Тогда - Загрузить_Алгоритмы(СтрокаДерева, УзелПравил); + ЗагрузитьАлгоритмы(СтрокаДерева, УзелПравил); ИначеЕсли СтрокаДерева.Имя = "Запросы" Тогда - Загрузить_Запросы(СтрокаДерева, УзелПравил); + ЗагрузитьЗапросы(СтрокаДерева, УзелПравил); + ИначеЕсли СтрокаДерева.Имя = "СоставПланаОбмена" Тогда + ЗагрузитьСоставПланаОбмена(СтрокаДерева, УзелПравил); + ИначеЕсли СтрокаДерева.Имя = "ПравилаРегистрацииОбъектов" Тогда + ЗагрузитьПравилаРегистрацииОбъектов(СтрокаДерева, УзелПравил); Иначе Сообщить("Имя узла не поддерживается: " + СтрокаДерева.Имя); КонецЕсли; @@ -188,6 +199,9 @@ Структура.ГруппаПравило.Добавить("Порядок"); Структура.ГруппаПравило.Добавить("Описание"); Структура.ГруппаПравило.Добавить("Комментарий"); + Структура.ГруппаПравило.Добавить("ТипГруппы"); + Структура.ГруппаПравило.Добавить("Группа"); + Структура.ГруппаПравило.Добавить("Правило"); Структура.Вставить("ГруппаСвойство", Новый Массив); Структура.ГруппаСвойство.Добавить("Код"); @@ -205,14 +219,53 @@ Структура.ГруппаСвойство.Добавить("ПослеОбработкиВыгрузки"); Структура.ГруппаСвойство.Добавить("Свойство"); - + Структура.Вставить("ПравилаРегистрации", Новый Массив); + Структура.ПравилаРегистрации.Добавить("ВерсияФормата"); + Структура.ПравилаРегистрации.Добавить("Ид"); + Структура.ПравилаРегистрации.Добавить("Наименование"); + Структура.ПравилаРегистрации.Добавить("ДатаВремяСоздания"); + Структура.ПравилаРегистрации.Добавить("ПланОбмена"); + Структура.ПравилаРегистрации.Добавить("Конфигурация"); + Структура.ПравилаРегистрации.Добавить("СоставПланаОбмена"); + Структура.ПравилаРегистрации.Добавить("ПравилаРегистрацииОбъектов"); + + Структура.Вставить("ПравилоРегистрации", Новый Массив); + Структура.ПравилоРегистрации.Добавить("Код"); + Структура.ПравилоРегистрации.Добавить("Наименование"); + Структура.ПравилоРегистрации.Добавить("Описание"); + Структура.ПравилоРегистрации.Добавить("Комментарий"); + Структура.ПравилоРегистрации.Добавить("ОбъектНастройки"); + Структура.ПравилоРегистрации.Добавить("ОбъектМетаданныхИмя"); + Структура.ПравилоРегистрации.Добавить("ОбъектМетаданныхТип"); + Структура.ПравилоРегистрации.Добавить("ОтборПоСвойствамПланаОбмена"); + Структура.ПравилоРегистрации.Добавить("ОтборПоСвойствамОбъекта"); + Структура.ПравилоРегистрации.Добавить("ПередОбработкой"); + Структура.ПравилоРегистрации.Добавить("ПриОбработке"); + Структура.ПравилоРегистрации.Добавить("ПриОбработкеДополнительный"); + Структура.ПравилоРегистрации.Добавить("ПослеОбработки"); + + Структура.Вставить("ГруппаОтбор", Новый Массив); + Структура.ГруппаОтбор.Добавить("БулевоЗначениеГруппы"); + Структура.ГруппаОтбор.Добавить("ЭлементОтбора"); + + Структура.Вставить("ЭлементОтбора", Новый Массив); + Структура.ЭлементОтбора.Добавить("ЭтоСтрокаКонстанты"); + Структура.ЭлементОтбора.Добавить("ТипСвойстваОбъекта"); + Структура.ЭлементОтбора.Добавить("СвойствоПланаОбмена"); + Структура.ЭлементОтбора.Добавить("ВидСравнения"); + Структура.ЭлементОтбора.Добавить("СвойствоОбъекта"); + Структура.ЭлементОтбора.Добавить("Вид"); + Структура.ЭлементОтбора.Добавить("ЗначениеКонстанты"); + Структура.ЭлементОтбора.Добавить("ТаблицаСвойствОбъекта"); + Структура.ЭлементОтбора.Добавить("ТаблицаСвойствПланаОбмена"); + КорневойУзел = Дерево.Строки[0]; ОбработатьСортировкуРекурсивно(КорневойУзел, Структура); - КорневойУзел.Строки.Сортировать("Порядок Возвр", Истина); + КорневойУзел.Строки.Сортировать("Порядок Возр", Истина); КонецПроцедуры -Процедура Загрузить_РеквизитыКонвертации(ТекущийУзел, КорневойУзел) +Процедура ЗагрузитьРеквизитыКонвертации(ТекущийУзел, КорневойУзел) Дерево = ЧтениеXMLВДерево(ТекущийУзел.Путь); ТекущийПорядок = 1; @@ -220,7 +273,7 @@ КонецПроцедуры -Процедура Загрузить_СобытияКонвертации(ДеревоКаталогов, КорневойУзел) +Процедура ЗагрузитьСобытияКонвертации(ДеревоКаталогов, КорневойУзел) СтрокаУзлаСобытий = ДеревоКаталогов.Строки.Найти("Ext", "Имя"); Если СтрокаУзлаСобытий = Неопределено Тогда @@ -240,7 +293,7 @@ КонецПроцедуры -Процедура Загрузить_Параметры(ДеревоКаталогов, КорневойУзел) +Процедура ЗагрузитьПараметры(ДеревоКаталогов, КорневойУзел) ТекущийУзелДереваПравил = ДобавитьНовуюСтрокуДереваПравил(КорневойУзел, "Параметры"); @@ -260,7 +313,7 @@ КонецПроцедуры -Процедура Загрузить_Обработки(ДеревоКаталогов, КорневойУзел) +Процедура ЗагрузитьОбработки(ДеревоКаталогов, КорневойУзел) ТекущийУзелДереваПравил = ДобавитьНовуюСтрокуДереваПравил(КорневойУзел, "Обработки"); Для Каждого СтрокаДерева Из ДеревоКаталогов.Строки Цикл @@ -287,7 +340,7 @@ КонецПроцедуры -Процедура Загрузить_ПравилаКонвертацииОбъектов(ДеревоКаталогов, КорневойУзел) +Процедура ЗагрузитьПравилаКонвертацииОбъектов(ДеревоКаталогов, КорневойУзел) ТекущийУзелДереваПравил = ДобавитьНовуюСтрокуДереваПравил(КорневойУзел, "ПравилаКонвертацииОбъектов"); @@ -297,7 +350,7 @@ КонецПроцедуры -Процедура Загрузить_ПравилаВыгрузкиДанных(ДеревоКаталогов, КорневойУзел) +Процедура ЗагрузитьПравилаВыгрузкиДанных(ДеревоКаталогов, КорневойУзел) ТекущийУзелДереваПравил = ДобавитьНовуюСтрокуДереваПравил(КорневойУзел, "ПравилаВыгрузкиДанных"); @@ -307,7 +360,7 @@ КонецПроцедуры -Процедура Загрузить_ПравилаОчисткиДанных(ДеревоКаталогов, КорневойУзел) +Процедура ЗагрузитьПравилаОчисткиДанных(ДеревоКаталогов, КорневойУзел) ТекущийУзелДереваПравил = ДобавитьНовуюСтрокуДереваПравил(КорневойУзел, "ПравилаОчисткиДанных"); @@ -317,7 +370,7 @@ КонецПроцедуры -Процедура Загрузить_Алгоритмы(ДеревоКаталогов, КорневойУзел) +Процедура ЗагрузитьАлгоритмы(ДеревоКаталогов, КорневойУзел) УзелАлгоритмы = ДобавитьНовуюСтрокуДереваПравил(КорневойУзел, "Алгоритмы"); Для Каждого СтрокаДерева Из ДеревоКаталогов.Строки Цикл @@ -326,7 +379,7 @@ КонецПроцедуры -Процедура Загрузить_Запросы(ДеревоКаталогов, КорневойУзел) +Процедура ЗагрузитьЗапросы(ДеревоКаталогов, КорневойУзел) УзелЗапросы = ДобавитьНовуюСтрокуДереваПравил(КорневойУзел, "Запросы"); Для Каждого СтрокаДерева Из ДеревоКаталогов.Строки Цикл @@ -335,6 +388,60 @@ КонецПроцедуры +Процедура ЗагрузитьСоставПланаОбмена(ДеревоКаталогов, КорневойУзел) + + УзелСоставПланаОбмена = ДобавитьНовуюСтрокуДереваПравил(КорневойУзел, "СоставПланаОбмена"); + + Для Каждого СтрокаДерева Из ДеревоКаталогов.Строки Цикл + + СтрокаПоиска = СтрокаДерева.Строки.Найти("Элемент.xml", "Имя"); + Если СтрокаПоиска = Неопределено Тогда + Сообщить("Не нашли: " + СтрокаДерева.Имя); + Продолжить; + КонецЕсли; + + ИмяУзла = ОбщийФункционал.УбратьРасширениеИзИмени(СтрокаПоиска.Имя); + ТекущийУзел = ДобавитьНовуюСтрокуДереваПравил(УзелСоставПланаОбмена, ИмяУзла); + ЗаполнитьДанныеСвойствПриЗагрузке(ТекущийУзел, СтрокаПоиска.Путь); + + ТекущийУзел.Порядок = НРег(СтрокаДерева.Имя); + + КонецЦикла; + +КонецПроцедуры + +Процедура ЗагрузитьПравилаРегистрацииОбъектов(ДеревоКаталогов, КорневойУзел) + + ТекущийУзелДереваПравил = ДобавитьНовуюСтрокуДереваПравил(КорневойУзел, "ПравилаРегистрацииОбъектов"); + + Для Каждого СтрокаДерева Из ДеревоКаталогов.Строки Цикл + РекурсивноПрочитатьКаталогиГруппИПравил(ТекущийУзелДереваПравил, СтрокаДерева); + КонецЦикла; + +КонецПроцедуры + +Процедура ЗагрузитьТаблицаСвойств(ИмяТаблицы, ДеревоСвойств, КорневойУзел) + + СтрокаУзлаТаблицыСвойств = ДеревоСвойств.Строки.Найти(ИмяТаблицы, "Имя"); + Если Не СтрокаУзлаТаблицыСвойств = Неопределено Тогда + + УзелТаблицаСвойствОбъекта = ДобавитьНовуюСтрокуДереваПравил(КорневойУзел, ИмяТаблицы); + + Для Каждого СтрокаДерева Из СтрокаУзлаТаблицыСвойств.Строки Цикл + + СтрокаПоиска = СтрокаДерева.Строки.Найти("Свойство.xml", "Имя"); + Если Не СтрокаПоиска = Неопределено Тогда + НоваяСтрокаДерева = ДобавитьНовуюСтрокуДереваПравил(УзелТаблицаСвойствОбъекта, "Свойство"); + ЗаполнитьДанныеСвойствПриЗагрузке(НоваяСтрокаДерева, СтрокаПоиска.Путь); + Иначе + Сообщить("Не нашли: " + СтрокаДерева.Имя); + КонецЕсли; + + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + Процедура СортироватьДеревоПоПорядку(ДеревоПравил) ДеревоПравил.Строки.Сортировать("Порядок Возр", Истина); @@ -350,10 +457,18 @@ Если ТекущийУзел.Имя = "Группа" И ТекущийУзел.Родитель.Имя = "Свойства" Тогда ИмяПоиска = "ГруппаСвойство"; + ИначеЕсли ТекущийУзел.Имя = "Группа" И ОбщийФункционал.ПроверитьНаличиеПредкаВДереве(ТекущийУзел, "ОтборПоСвойствамПланаОбмена") Тогда + ИмяПоиска = "ГруппаОтбор"; + ИначеЕсли ТекущийУзел.Имя = "Группа" И ОбщийФункционал.ПроверитьНаличиеПредкаВДереве(ТекущийУзел, "ОтборПоСвойствамОбъекта") Тогда + ИмяПоиска = "ГруппаОтбор"; + ИначеЕсли ТекущийУзел.Имя = "Группа" И ОбщийФункционал.ПроверитьНаличиеПредкаВДереве(ТекущийУзел, "ПравилаРегистрацииОбъектов") Тогда + ИмяПоиска = "ГруппаПравило"; ИначеЕсли ТекущийУзел.Имя = "Правило" И ОбщийФункционал.ПроверитьНаличиеПредкаВДереве(ТекущийУзел, "ПравилаКонвертацииОбъектов") Тогда ИмяПоиска = "ПравилоПКО"; ИначеЕсли ТекущийУзел.Имя = "Правило" И ОбщийФункционал.ПроверитьНаличиеПредкаВДереве(ТекущийУзел, "ПравилаВыгрузкиДанных") Тогда ИмяПоиска = "ПравилоПВД"; + ИначеЕсли ТекущийУзел.Имя = "Правило" И ОбщийФункционал.ПроверитьНаличиеПредкаВДереве(ТекущийУзел, "ПравилаРегистрацииОбъектов") Тогда + ИмяПоиска = "ПравилоРегистрации"; КонецЕсли; МожноСортировать = СтруктураСортировки.Свойство(ИмяПоиска); @@ -361,12 +476,17 @@ Для Каждого СтрокаДерева Из ТекущийУзел.Строки Цикл Если МожноСортировать Тогда - Индекс = МассивПоиска.Найти(СтрокаДерева.Имя); - Если Индекс <> Неопределено Тогда - СтрокаДерева.Порядок = Индекс + 1; + Если ИмяПоиска = "ГруппаПравило" И СтрокаДерева.Имя = "Правило" Тогда + // Для сохранения исходной сортировки файла правил регистрации + СтрокаДерева.Порядок = "zzzzz" + СтрокаДерева.Порядок; + Иначе + Индекс = МассивПоиска.Найти(СтрокаДерева.Имя); + Если Индекс <> Неопределено Тогда + СтрокаДерева.Порядок = Индекс + 1; + КонецЕсли; КонецЕсли; КонецЕсли; - + Если (ТекущийУзел.Имя = "Свойство" Или (ТекущийУзел.Имя = "Группа" И ТекущийУзел.Родитель.Имя = "Свойства")) И СтрокаДерева.Имя = "Порядок" Тогда ТекущийУзел.Порядок = Число(СтрокаДерева.Значение); КонецЕсли; @@ -377,6 +497,38 @@ КонецПроцедуры +Процедура РекурсивноПрочитатьЭлементыИГруппыОтбораПоСвойствам(КорневойУзел, ТекущаяСтрокаДерева) + + СтрокаПоиска = ТекущаяСтрокаДерева.Строки.Найти("Группа.xml", "Имя"); + Если СтрокаПоиска = Неопределено Тогда + СтрокаПоиска = ТекущаяСтрокаДерева.Строки.Найти("ЭлементОтбора.xml", "Имя"); + КонецЕсли; + + Если СтрокаПоиска = Неопределено Тогда + Сообщить("Не нашли: " + ТекущаяСтрокаДерева.Имя); + Возврат; + КонецЕсли; + + ИмяУзла = СтрЗаменить(СтрокаПоиска.Имя, ".xml", ""); + ТекущийУзел = ДобавитьНовуюСтрокуДереваПравил(КорневойУзел, ИмяУзла); + ЗаполнитьДанныеСвойствПриЗагрузке(ТекущийУзел, СтрокаПоиска.Путь); + + ТекущийУзел.Порядок = ТекущаяСтрокаДерева.Имя; + + ЗагрузитьТаблицаСвойств("ТаблицаСвойствОбъекта", ТекущаяСтрокаДерева, ТекущийУзел); + ЗагрузитьТаблицаСвойств("ТаблицаСвойствПланаОбмена", ТекущаяСтрокаДерева, ТекущийУзел); + + Если ИмяУзла = "Группа" Тогда + Для Каждого СтрокаДерева Из ТекущаяСтрокаДерева.Строки Цикл + Если ОбщийФункционал.ЭтоXMLФайл(СтрокаДерева.Имя) Тогда + Продолжить; + КонецЕсли; + РекурсивноПрочитатьЭлементыИГруппыОтбораПоСвойствам(ТекущийУзел, СтрокаДерева); + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + Процедура РекурсивноПрочитатьКаталогиГруппИПравил(КорневойУзел, ТекущаяСтрокаДерева) СтрокаПоиска = ТекущаяСтрокаДерева.Строки.Найти("Группа.xml", "Имя"); @@ -393,6 +545,26 @@ ТекущийУзел = ДобавитьНовуюСтрокуДереваПравил(КорневойУзел, ИмяУзла); ЗаполнитьДанныеСвойствПриЗагрузке(ТекущийУзел, СтрокаПоиска.Путь); + Если ЭтоПравилаРегистрации Тогда + ТекущийУзел.Порядок = ТекущийУзел.Идентификатор; + КонецЕсли; + + СтрокаУзлаОтбораПоСвойствамПланаОбмена = ТекущаяСтрокаДерева.Строки.Найти("ОтборПоСвойствамПланаОбмена", "Имя"); + Если Не СтрокаУзлаОтбораПоСвойствамПланаОбмена = Неопределено Тогда + СтрокаДереваОтбор = ДобавитьНовуюСтрокуДереваПравил(ТекущийУзел, "ОтборПоСвойствамПланаОбмена"); + Для Каждого СтрокаДерева Из СтрокаУзлаОтбораПоСвойствамПланаОбмена.Строки Цикл + РекурсивноПрочитатьЭлементыИГруппыОтбораПоСвойствам(СтрокаДереваОтбор, СтрокаДерева); + КонецЦикла; + КонецЕсли; + + СтрокаУзлаОтбораПоСвойствамОбъекта = ТекущаяСтрокаДерева.Строки.Найти("ОтборПоСвойствамОбъекта", "Имя"); + Если Не СтрокаУзлаОтбораПоСвойствамОбъекта = Неопределено Тогда + СтрокаДереваОтбор = ДобавитьНовуюСтрокуДереваПравил(ТекущийУзел, "ОтборПоСвойствамОбъекта"); + Для Каждого СтрокаДерева Из СтрокаУзлаОтбораПоСвойствамОбъекта.Строки Цикл + РекурсивноПрочитатьЭлементыИГруппыОтбораПоСвойствам(СтрокаДереваОтбор, СтрокаДерева); + КонецЦикла; + КонецЕсли; + СтрокаУзлаСобытий = ТекущаяСтрокаДерева.Строки.Найти("Ext", "Имя"); Если Не СтрокаУзлаСобытий = Неопределено Тогда Для Каждого СтрокаДерева Из СтрокаУзлаСобытий.Строки Цикл @@ -416,7 +588,7 @@ КонецЦикла; КонецЕсли; - Если ИмяУзла = "Правило" И Не ОбщийФункционал.ПроверитьНаличиеПредкаВДереве(ТекущийУзел, "ПравилаВыгрузкиДанных") И Не ОбщийФункционал.ПроверитьНаличиеПредкаВДереве(ТекущийУзел, "ПравилаОчисткиДанных") Тогда + Если ИмяУзла = "Правило" И ОбщийФункционал.ПроверитьНаличиеПредкаВДереве(ТекущийУзел, "ПравилаКонвертацииОбъектов") Тогда СтрокаДереваСвойства = ДобавитьНовуюСтрокуДереваПравил(ТекущийУзел, "Свойства",,,,50); КаталогСвойства = ТекущаяСтрокаДерева.Строки.Найти("Свойства", "Имя"); diff --git a/tests/fixtures/fake-registration-rules.xml b/tests/fixtures/fake-registration-rules.xml new file mode 100644 index 0000000..4375c63 --- /dev/null +++ b/tests/fixtures/fake-registration-rules.xml @@ -0,0 +1,261 @@ +<ПравилаРегистрации> + <ВерсияФормата>2.01 + <Ид>1ebb854f-c2ee-11ec-80f0-f079592faacd + <Наименование>gitrules + <ДатаВремяСоздания>2022-04-23T13:17:12 + <ПланОбмена Имя="ОбменУправлениеПредприятиемДокументооборот20">ПланОбменаСсылка.ОбменУправлениеПредприятиемДокументооборот20 + <Конфигурация ВерсияПлатформы="8.2" ВерсияКонфигурации="2.5.7.298" СинонимКонфигурации="1С:ERP Управление предприятием 2">УправлениеПредприятием + <СоставПланаОбмена> + <Элемент> + <Тип>ПланВидовХарактеристикСсылка.ОбъектыАдресацииЗадач + <Авторегистрация>false + + <Элемент> + <Тип>РегистрСведенийЗапись.ДокументыФизическихЛиц + <Авторегистрация>false + + <Элемент> + <Тип>РегистрСведенийЗапись.ИсполнителиЗадач + <Авторегистрация>false + + <Элемент> + <Тип>РегистрСведенийЗапись.КурсыВалют + <Авторегистрация>false + + <Элемент> + <Тип>РегистрСведенийЗапись.РТ_СоответствиеПроектаНаправлениюДеятельностиДПК + <Авторегистрация>false + + <Элемент> + <Тип>РегистрСведенийЗапись.СоответствияОбъектовИнформационныхБаз + <Авторегистрация>false + + <Элемент> + <Тип>СправочникСсылка.БанковскиеСчетаКонтрагентов + <Авторегистрация>false + + <Элемент> + <Тип>СправочникСсылка.БанковскиеСчетаОрганизаций + <Авторегистрация>false + + <Элемент> + <Тип>СправочникСсылка.Валюты + <Авторегистрация>false + + <Элемент> + <Тип>СправочникСсылка.ВидыДокументовФизическихЛиц + <Авторегистрация>false + + <Элемент> + <Тип>СправочникСсылка.ВидыКонтактнойИнформации + <Авторегистрация>false + + <Элемент> + <Тип>СправочникСсылка.КлассификаторБанков + <Авторегистрация>false + + <Элемент> + <Тип>СправочникСсылка.КонтактныеЛицаПартнеров + <Авторегистрация>false + + <Элемент> + <Тип>СправочникСсылка.Контрагенты + <Авторегистрация>false + + <Элемент> + <Тип>СправочникСсылка.НаправленияДеятельности + <Авторегистрация>false + + <Элемент> + <Тип>СправочникСсылка.Номенклатура + <Авторегистрация>false + + <Элемент> + <Тип>СправочникСсылка.Организации + <Авторегистрация>false + + <Элемент> + <Тип>СправочникСсылка.Пользователи + <Авторегистрация>false + + <Элемент> + <Тип>СправочникСсылка.РолиИсполнителей + <Авторегистрация>false + + <Элемент> + <Тип>СправочникСсылка.СтатьиДвиженияДенежныхСредств + <Авторегистрация>false + + <Элемент> + <Тип>СправочникСсылка.СтруктураПредприятия + <Авторегистрация>false + + <Элемент> + <Тип>СправочникСсылка.ФизическиеЛица + <Авторегистрация>false + + + <ПравилаРегистрацииОбъектов> + <Группа Отключить="false"> + <Код>000000001 + <Наименование>Справочники + <Правило Отключить="false" Валидное="true"> + <Код>000000002 + <Наименование>Валюты + <ОбъектНастройки>СправочникСсылка.Валюты + <ОбъектМетаданныхИмя>Справочник.Валюты + <ОбъектМетаданныхТип>Справочник + <ОтборПоСвойствамПланаОбмена/> + <ОтборПоСвойствамОбъекта/> + <ПередОбработкой>Вася = "вася"; + <ПриОбработке>Вася = "вася"; + <ПриОбработкеДополнительный>Вася = "вася"; + <ПослеОбработки>Вася = "вася"; + + <Правило Отключить="false" Валидное="true"> + <Код>000000003 + <Наименование>Организации + <ОбъектНастройки>СправочникСсылка.Организации + <ОбъектМетаданныхИмя>Справочник.Организации + <ОбъектМетаданныхТип>Справочник + <ОтборПоСвойствамПланаОбмена> + <ЭлементОтбора> + <ЭтоСтрокаКонстанты>false + <ТипСвойстваОбъекта>Строка + <СвойствоПланаОбмена>Наименование + <ВидСравнения>Равно + <СвойствоОбъекта>ИНН + <ТаблицаСвойствОбъекта> + <Свойство> + <Наименование>ИНН + <Тип>Строка + <Вид>Реквизит + + + <ТаблицаСвойствПланаОбмена> + <Свойство> + <Наименование>Наименование + <Тип>Строка + <Вид>Свойство + + + + <Группа> + <БулевоЗначениеГруппы>И + <ЭлементОтбора> + <ЭтоСтрокаКонстанты>false + <ТипСвойстваОбъекта>Строка + <СвойствоПланаОбмена>Код + <ВидСравнения>Равно + <СвойствоОбъекта>КПП + <ТаблицаСвойствОбъекта> + <Свойство> + <Наименование>КПП + <Тип>Строка + <Вид>Реквизит + + + <ТаблицаСвойствПланаОбмена> + <Свойство> + <Наименование>Код + <Тип>Строка + <Вид>Свойство + + + + <ЭлементОтбора> + <ЭтоСтрокаКонстанты>true + <ТипСвойстваОбъекта>Строка + <СвойствоПланаОбмена>Наименование + <ВидСравнения>Равно + <СвойствоОбъекта>Вася + <ТаблицаСвойствПланаОбмена> + <Свойство> + <Наименование>Наименование + <Тип>Строка + <Вид>Свойство + + + + + + <ОтборПоСвойствамОбъекта> + <ЭлементОтбора> + <ТипСвойстваОбъекта>Булево + <ВидСравнения>Равно + <СвойствоОбъекта>КрупнейшийНалогоплательщик + <Вид>ЗначениеКонстанты + <ЗначениеКонстанты>true + <ТаблицаСвойствОбъекта> + <Свойство> + <Наименование>КрупнейшийНалогоплательщик + <Тип>Булево + <Вид>Реквизит + + + + <Группа> + <БулевоЗначениеГруппы>ИЛИ + <ЭлементОтбора> + <ТипСвойстваОбъекта>Строка + <ВидСравнения>Равно + <СвойствоОбъекта>ОГРН + <Вид>ЗначениеКонстанты + <ЗначениеКонстанты>11111111 + <ТаблицаСвойствОбъекта> + <Свойство> + <Наименование>ОГРН + <Тип>Строка + <Вид>Реквизит + + + + <ЭлементОтбора> + <ТипСвойстваОбъекта>Строка + <ВидСравнения>Равно + <СвойствоОбъекта>НаименованиеПолное + <Вид>АлгоритмЗначения + <ЗначениеКонстанты>Значение = "ООО ""Вася"""; + <ТаблицаСвойствОбъекта> + <Свойство> + <Наименование>НаименованиеПолное + <Тип>Строка + <Вид>Реквизит + + + + + + + + <Группа Отключить="false"> + <Код>000000005 + <Наименование>Регистры сведений + <ТипГруппы>РегистрСведений + <Правило Отключить="false" Валидное="true"> + <Код>000000004 + <Наименование>Курсы валют + <ОбъектНастройки>РегистрСведенийЗапись.КурсыВалют + <ОбъектМетаданныхИмя>РегистрСведений.КурсыВалют + <ОбъектМетаданныхТип>РегистрСведений + <ОтборПоСвойствамПланаОбмена/> + <ОтборПоСвойствамОбъекта> + <ЭлементОтбора> + <ТипСвойстваОбъекта>Число + <ВидСравнения>Равно + <СвойствоОбъекта>Курс + <Вид>ЗначениеКонстанты + <ЗначениеКонстанты>15 + <ТаблицаСвойствОбъекта> + <Свойство> + <Наименование>Курс + <Тип>Число + <Вид>Ресурс + + + + + + + + \ No newline at end of file diff --git "a/tests/\320\240\320\260\320\267\320\276\320\261\321\200\320\260\321\202\321\214\321\201\321\217\320\237\321\200\320\260\320\262\320\270\320\273\320\260\320\236\320\261\320\274\320\265\320\275\320\260_test.os" "b/tests/\320\242\320\265\321\201\321\202_\320\240\320\260\320\267\320\276\320\261\321\200\320\260\321\202\321\214\320\237\321\200\320\260\320\262\320\270\320\273\320\260\320\236\320\261\320\274\320\265\320\275\320\260.os" similarity index 58% rename from "tests/\320\240\320\260\320\267\320\276\320\261\321\200\320\260\321\202\321\214\321\201\321\217\320\237\321\200\320\260\320\262\320\270\320\273\320\260\320\236\320\261\320\274\320\265\320\275\320\260_test.os" rename to "tests/\320\242\320\265\321\201\321\202_\320\240\320\260\320\267\320\276\320\261\321\200\320\260\321\202\321\214\320\237\321\200\320\260\320\262\320\270\320\273\320\260\320\236\320\261\320\274\320\265\320\275\320\260.os" index 6bafa55..5428a0b 100644 --- "a/tests/\320\240\320\260\320\267\320\276\320\261\321\200\320\260\321\202\321\214\321\201\321\217\320\237\321\200\320\260\320\262\320\270\320\273\320\260\320\236\320\261\320\274\320\265\320\275\320\260_test.os" +++ "b/tests/\320\242\320\265\321\201\321\202_\320\240\320\260\320\267\320\276\320\261\321\200\320\260\321\202\321\214\320\237\321\200\320\260\320\262\320\270\320\273\320\260\320\236\320\261\320\274\320\265\320\275\320\260.os" @@ -13,8 +13,9 @@ ИменаТестов = Новый Массив; ИменаТестов.Добавить("ТестДолжен_ПроверитьРазборкуПравилОбмена"); - ИменаТестов.Добавить("ТестДолжен_ПроверитьРазборкуПравилОбменаССозданиеПараметровДляАлгоритмов"); - + ИменаТестов.Добавить("ТестДолжен_ПроверитьРазборкуПравилОбменаССозданиемПараметровДляАлгоритмов"); + ИменаТестов.Добавить("ТестДолжен_ПроверитьРазборкуПравилРегистрации"); + Возврат ИменаТестов; КонецФункции @@ -37,7 +38,21 @@ КонецПроцедуры -Процедура ТестДолжен_ПроверитьРазборкуПравилОбменаССозданиеПараметровДляАлгоритмов() Экспорт +Процедура ТестДолжен_ПроверитьРазборкуПравилРегистрации() Экспорт + + КаталогРаспаковки = ВременныеФайлы.СоздатьКаталог(); + ПутьКФайлуПравила = ТестовыеПравила("ПравилаРегистрации"); + + ОбработчикПравил = Новый ОбработкаПравил(); + ОбработчикПравил.РазложитьПравилаКонвертации(ПутьКФайлуПравила, КаталогРаспаковки); + + МассивФайлов = НайтиФайлы(КаталогРаспаковки, "*.*", Истина); + + Ожидаем.Что(МассивФайлов.Количество(), "Количество файлов должно быть больше 0").Больше(0); + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьРазборкуПравилОбменаССозданиемПараметровДляАлгоритмов() Экспорт Результат = Ложь; @@ -53,6 +68,11 @@ КонецПроцедуры -Функция ТестовыеПравила() - Возврат ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures","fake-rules.xml"); +Функция ТестовыеПравила(ТипПравил = "ПравилаОбмена") + // по умолчанию + Значение = ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures", "fake-rules.xml"); + Если ТипПравил = "ПравилаРегистрации" Тогда + Значение = ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures", "fake-registration-rules.xml"); + КонецЕсли; + Возврат Значение; КонецФункции \ No newline at end of file diff --git "a/tests/\320\242\320\265\321\201\321\202_\320\241\320\276\320\261\321\200\320\260\321\202\321\214\320\237\321\200\320\260\320\262\320\270\320\273\320\260\320\236\320\261\320\274\320\265\320\275\320\260.os" "b/tests/\320\242\320\265\321\201\321\202_\320\241\320\276\320\261\321\200\320\260\321\202\321\214\320\237\321\200\320\260\320\262\320\270\320\273\320\260\320\236\320\261\320\274\320\265\320\275\320\260.os" index 9e87512..4d60401 100644 --- "a/tests/\320\242\320\265\321\201\321\202_\320\241\320\276\320\261\321\200\320\260\321\202\321\214\320\237\321\200\320\260\320\262\320\270\320\273\320\260\320\236\320\261\320\274\320\265\320\275\320\260.os" +++ "b/tests/\320\242\320\265\321\201\321\202_\320\241\320\276\320\261\321\200\320\260\321\202\321\214\320\237\321\200\320\260\320\262\320\270\320\273\320\260\320\236\320\261\320\274\320\265\320\275\320\260.os" @@ -49,7 +49,31 @@ Процедура ТестДолжен_ПроверитьСборкуПравилРегистрации() Экспорт - //КаталогСборки = ПолучитьТестовыйКаталогДляСборки(); + БазовыйКаталог = ПолучитьТестовыйКаталогДляСборки(); + КаталогSRC = ОбъединитьПути(БазовыйКаталог, "src"); + ФС.ОбеспечитьПустойКаталог(КаталогSRC); + МенеджерПравил = Новый ОбработкаПравил(); + + //Подготовим разборку + Сообщить("Разборка.."); + ПутьКПравиламОбмена = ПолучитьТестовыеПравилаКонвертации("ПравилаРегистрации"); + ИмяПравилОбмена = ОбщийФункционал.ПолучитьИмяФайла(ПутьКПравиламОбмена); + МенеджерПравил.РазложитьПравилаКонвертации(ПутьКПравиламОбмена, КаталогSRC); + + КаталогИсходныхФайлов = ОбъединитьПути(КаталогSRC, ИмяПравилОбмена); + + МассивФайлов = НайтиФайлы(КаталогИсходныхФайлов, "*.*", Истина); + Ожидаем.Что(МассивФайлов.Количество(), "Количество файлов должно быть больше 0").Больше(0); + + //Сделаем сборку + Сообщить("Сборка.."); + МенеджерПравил.СобратьПравилаКонвертации(КаталогИсходныхФайлов, БазовыйКаталог); + + //Проверим что файл сборки создан + МассивФайлов = НайтиФайлы(БазовыйКаталог, ИмяПравилОбмена); + Ожидаем.Что(МассивФайлов.Количество(), "Файл со сборкой правил должен быть найден").Больше(0); + + УдалитьФайлы(БазовыйКаталог); КонецПроцедуры @@ -61,11 +85,9 @@ Функция ПолучитьТестовыеПравилаКонвертации(ТипПравил = "ПравилаОбмена") // по умолчанию - Значение = ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures","fake-rules.xml"); - Если ТипПравил = "ПравилаОбмена" Тогда - Значение = ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures","fake-rules.xml"); - ИначеЕсли ТипПравил = "ПравилаРегистрации" Тогда - Значение = ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures","fake-rules.xml"); + Значение = ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures", "fake-rules.xml"); + Если ТипПравил = "ПравилаРегистрации" Тогда + Значение = ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures", "fake-registration-rules.xml"); КонецЕсли; Возврат Значение; КонецФункции \ No newline at end of file