1
0
mirror of https://github.com/bia-technologies/precommit4onec.git synced 2024-11-28 08:48:45 +02:00

Merge branch 'master' into develop

# Conflicts:
#	src/Классы/КомандаВыполнитьСценарии.os
#	src/Классы/КомандаПрекоммит.os
#	src/Модули/МенеджерПриложения.os
This commit is contained in:
Max A Mazin 2022-07-22 12:52:11 +03:00
commit 21e9ff5db3
30 changed files with 20287 additions and 143 deletions

View File

@ -49,7 +49,8 @@
- `РазборОбычныхФормНаИсходники` - раскладывает файлы обычных форм (`Form.bin`) на исходные файлы с помощью инструмента `v8unpack`.
- `РазборОтчетОбработокРасширений` - раскладывает средствами платформы файлы внешних отчетов, обработок и расширений на исходные файлы. [См. подробнее](/docs/РазборОтчетОбработокРасширений.md)
- `СинхронизацияОбъектовМетаданныхИФайлов` - анализирует наличие файлов и объектов конфигурации. Поддерживается только файл описания конфигурации в формате выгрузки конфигуратора (`Configuration.xml`).
- `СортировкаДереваМетаданных` - упорядочивает объекты метаданных верхнего уровня по алфавиту в файле описания конфигурации (кроме подсистем). Поддерживается как файл в формате выгрузки конфигуратора (`Configuration.xml`), так и в формате EDT (`Configuration.mdo`).
- `СортировкаДереваМетаданных` - упорядочивает объекты метаданных верхнего уровня по алфавиту в файле описания конфигурации (кроме подсистем), удаляет дубли. Помещает объекты с префиксом в низ списка, если настроено. Поддерживается как файл в формате выгрузки конфигуратора (`Configuration.xml`), так и в формате EDT (`Configuration.mdo`).
- `СортировкаСоставаПодсистем` - упорядочивает объекты в подсистемах по алфавиту. Поддерживается как файл в формате выгрузки конфигуратора (`Configuration.xml`), так и в формате EDT (`Configuration.mdo`).
- `УдалениеДублейМетаданных` - удаляет дубли объектов метаданных в файле описания конфигурации (могут образоваться при объединениях). Поддерживается как файл в формате выгрузки конфигуратора (`Configuration.xml`), так и в формате EDT (`Configuration.mdo`)..
- `УдалениеЛишнихКонцевыхПробелов` - удаляет лишние пробелы и табы в конце не пустых строк в файлах модулей.
- `УдалениеЛишнихПустыхСтрок` - удаляет лишние пустые строки в модулях (лишними считаются 2 и более идущих подряд пустых строк).

View File

@ -0,0 +1,16 @@
# Сценарий `СортировкаДереваМетаданных`
Упорядочивает объекты метаданных верхнего уровня по алфавиту в файле описания конфигурации (кроме подсистем), удаляет дубли.
Помещает объекты с префиксом в низ списка.
```JSON
{
"Precommt4onecСценарии": {
"НастройкиСценариев": {
"СортировкаДереваМетаданных": {
"УчитываяПрефикс": ""
}
}
}
}
```

View File

@ -41,6 +41,7 @@ y
y
y
y
y
local
n
"""
@ -68,6 +69,7 @@ n
"РазборОтчетовОбработокРасширений.os",
"СинхронизацияОбъектовМетаданныхИФайлов.os",
"СортировкаДереваМетаданных.os",
"СортировкаСоставаПодсистем.os",
"УдалениеДублейМетаданных.os",
"УдалениеЛишнихКонцевыхПробелов.os",
"УдалениеЛишнихПустыхСтрок.os"

View File

@ -10,7 +10,7 @@
Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os configure -global"
Тогда Код возврата команды "oscript" равен 0
И Я сообщаю вывод команды "oscript"
И Вывод команды "oscript" содержит "precommit4onec v21.09"
И Вывод команды "oscript" содержит "precommit4onec v22.03"
И Вывод команды "oscript" содержит "Установленные настройки:"
И Вывод команды "oscript" содержит "ИспользоватьСценарииРепозитория ="
И Вывод команды "oscript" содержит "КаталогЛокальныхСценариев ="
@ -36,11 +36,11 @@
И Я сообщаю вывод команды "oscript"
И Вывод команды "oscript" содержит
"""
precommit4onec v21.09
precommit4onec v22.03
Установленные настройки: Базовые настройки
ИспользоватьСценарииРепозитория = Нет
КаталогЛокальныхСценариев =
ГлобальныеСценарии = ДобавлениеПробеловПередКлючевымиСловами.os,ДобавлениеТестовВРасширение.os,ЗапретИспользованияПерейти.os,ИсправлениеНеКаноническогоНаписания.os,КорректировкаXMLФорм.os,ОбработкаЮнитТестов.os,ОтключениеПолнотекстовогоПоиска.os,ОтключениеРазрешенияИзменятьФорму.os,ПроверкаДублейПроцедурИФункций.os,ПроверкаКорректностиИнструкцийПрепроцессора.os,ПроверкаКорректностиОбластей.os,ПроверкаНецензурныхСлов.os,РазборОбычныхФормНаИсходники.os,РазборОтчетовОбработокРасширений.os,СинхронизацияОбъектовМетаданныхИФайлов.os,СортировкаДереваМетаданных.os,УдалениеДублейМетаданных.os,УдалениеЛишнихКонцевыхПробелов.os,УдалениеЛишнихПустыхСтрок.os
ГлобальныеСценарии = ДобавлениеПробеловПередКлючевымиСловами.os,ДобавлениеТестовВРасширение.os,ЗапретИспользованияПерейти.os,ИсправлениеНеКаноническогоНаписания.os,КорректировкаXMLФорм.os,ОбработкаЮнитТестов.os,ОтключениеПолнотекстовогоПоиска.os,ОтключениеРазрешенияИзменятьФорму.os,ПроверкаДублейПроцедурИФункций.os,ПроверкаКорректностиИнструкцийПрепроцессора.os,ПроверкаКорректностиОбластей.os,ПроверкаНецензурныхСлов.os,РазборОбычныхФормНаИсходники.os,РазборОтчетовОбработокРасширений.os,СинхронизацияОбъектовМетаданныхИФайлов.os,СортировкаДереваМетаданных.os,СортировкаСоставаПодсистем.os,УдалениеДублейМетаданных.os,УдалениеЛишнихКонцевыхПробелов.os,УдалениеЛишнихПустыхСтрок.os
ОтключенныеСценарии =
НастройкиСценариев = Соответствие
ОтключениеПолнотекстовогоПоиска = Соответствие

View File

@ -14,7 +14,7 @@
Сценарий: Получение версии продукта
Когда Я выполняю команду "oscript" с параметрами "src/main.os version"
Тогда Я сообщаю вывод команды "oscript"
И Вывод команды "oscript" содержит "21.09"
И Вывод команды "oscript" содержит "22.03"
И Вывод команды "oscript" не содержит "precommit4onec v"
И Код возврата команды "oscript" равен 0
@ -22,7 +22,7 @@
Когда Я выполняю команду "oscript" с параметрами "src/main.os help"
Тогда Вывод команды "oscript" содержит
"""
precommit4onec v21.09
precommit4onec v22.03
Возможные команды:
help - Выводит справку по командам
version - Выводит версию приложения
@ -37,7 +37,7 @@
Когда Я выполняю команду "oscript" с параметрами "src/main.os"
Тогда Вывод команды "oscript" содержит
"""
precommit4onec v21.09
precommit4onec v22.03
Возможные команды:
help - Выводит справку по командам
version - Выводит версию приложения

View File

@ -18,7 +18,7 @@
Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os install rep1"
Тогда Код возврата команды "oscript" равен 0
И Я сообщаю вывод команды "oscript"
И Вывод команды "oscript" содержит "precommit4onec v21.09"
И Вывод команды "oscript" содержит "precommit4onec v22.03"
И Вывод команды "oscript" содержит "Pre-commit hook для rep1 создан"
И В каталоге ".git/hooks" репозитория "Репозиторий1" есть файл "pre-commit"
@ -28,14 +28,14 @@
И Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os install ./"
Тогда Код возврата команды "oscript" равен 0
И Я сообщаю вывод команды "oscript"
И Вывод команды "oscript" содержит "precommit4onec v21.09"
И Вывод команды "oscript" содержит "precommit4onec v22.03"
И Вывод команды "oscript" содержит "не является репозиторием git"
Сценарий: Установка precommit4onec во вложенные каталоги
Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os install ./ -r"
Тогда Код возврата команды "oscript" равен 0
И Я сообщаю вывод команды "oscript"
И Вывод команды "oscript" содержит "precommit4onec v21.09"
И Вывод команды "oscript" содержит "precommit4onec v22.03"
И В каталоге ".git/hooks" репозитория "Репозиторий1" есть файл "pre-commit"
И В каталоге ".git/hooks" репозитория "Репозиторий2" есть файл "pre-commit"
@ -51,6 +51,6 @@
И Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os install ./ -r"
Тогда Код возврата команды "oscript" равен 0
И Я сообщаю вывод команды "oscript"
И Вывод команды "oscript" содержит "precommit4onec v21.09"
И Вывод команды "oscript" содержит "precommit4onec v22.03"
И В каталоге ".git/hooks" репозитория "Репозиторий1" есть файл "pre-commit"
И В каталоге ".git/hooks" репозитория "Репозиторий2" есть файл "pre-commit"

View File

@ -7,7 +7,7 @@
// СписокЗначений - Список каталогов
// * Значение - Строка - Имя каталога
// * Представление - Срока - Имя типа метаданных
Функция КаталогиТиповМетаданных() Экспорт
Функция КаталогиТиповМетаданных(edt = Ложь) Экспорт
Если КаталогиТиповМетаданных = Неопределено Тогда
@ -43,7 +43,6 @@
КаталогиТиповМетаданных.Добавить("FunctionalOptionsParameters", "FunctionalOptionsParameter");
КаталогиТиповМетаданных.Добавить("HTTPServices", "HTTPService");
КаталогиТиповМетаданных.Добавить("InformationRegisters", "InformationRegister");
КаталогиТиповМетаданных.Добавить("Languages", "Language");
КаталогиТиповМетаданных.Добавить("Reports", "Report");
КаталогиТиповМетаданных.Добавить("Roles", "Role");
КаталогиТиповМетаданных.Добавить("ScheduledJobs", "ScheduledJob");
@ -58,6 +57,10 @@
КаталогиТиповМетаданных.Добавить("WSReferences", "WSReference");
КаталогиТиповМетаданных.Добавить("XDTOPackages", "XDTOPackage");
Если НЕ edt Тогда
КаталогиТиповМетаданных.Добавить("Languages", "Language");
КонецЕсли;
КонецЕсли;
Возврат КаталогиТиповМетаданных;
@ -97,3 +100,8 @@
Возврат КаталогиТиповМетаданныхДляТестов;
КонецФункции
Процедура СброситьКеш() Экспорт
КаталогиТиповМетаданныхДляТестов = Неопределено;
КаталогиТиповМетаданных = Неопределено;
КонецПроцедуры

View File

@ -22,7 +22,7 @@
//
Функция ВерсияПродукта() Экспорт
Возврат "21.09";
Возврат "22.03";
КонецФункции // ВерсияПродукта

View File

@ -1,8 +1,14 @@
Функция ПолучитьДочерниеЭлементыОписанияКонфигурации(Знач СодержимоеФайла) Экспорт
Функция ПолучитьДочерниеЭлементыОписанияКонфигурации(Знач СодержимоеФайла, ЭтоEDT) Экспорт
Элементы = Новый Структура("Количество,ДочерниеЭлементыСтрока,Совпадения", 0, "", Неопределено);
Если ЭтоEDT Тогда
Регексп = Новый РегулярноеВыражение("(<\/languages>\s+)^(?!.*languages)([\w\W]*)(<\/mdclass\:Configuration>)");
Иначе
Регексп = Новый РегулярноеВыражение("(<ChildObjects>\s+?)([\w\W]+?)(\s+<\/ChildObjects>)");
КонецЕсли;
Регексп.ИгнорироватьРегистр = Истина;
Регексп.Многострочный = Истина;
@ -13,7 +19,14 @@
Если НЕ Элементы.Количество = 0 Тогда // Если количество 0 вернется пустая коллекция
Элементы.ДочерниеЭлементыСтрока = ДочерниеЭлементы[0].Группы[2].Значение;
Если ЭтоEDT Тогда
РегекспМетаданные = Новый РегулярноеВыражение("^\s+<[\w]+>([a-zA-Z]+)\.([а-яa-zA-ZА-Я0-9_]+)<\/[\w]+>");
Иначе
РегекспМетаданные = Новый РегулярноеВыражение("^\s+<([\w]+)>([а-яa-zA-ZА-Я0-9_]+)<\/[\w]+>");
КонецЕсли;
РегекспМетаданные.ИгнорироватьРегистр = Истина;
РегекспМетаданные.Многострочный = Истина;
Элементы.Совпадения = РегекспМетаданные.НайтиСовпадения(Элементы.ДочерниеЭлементыСтрока);

View File

@ -253,6 +253,52 @@
КонецФункции
// ЭтоФайлОписанияПодсистемыEDT
// Возвращает истину, если файл является описанием подсистемы и в формате EDT
// Параметры:
// Файл - Файл - Полный путь к файлу
//
// Возвращаемое значение:
// Булево - Признак
//
Функция ЭтоФайлОписанияПодсистемыEDT(Файл) Экспорт
Если ПустаяСтрока(Файл.Расширение) Тогда
Возврат Ложь;
КонецЕсли;
ПутьКФайлу = НРег(Файл.Путь);
Возврат СтрСравнить(Файл.Расширение, ".mdo") = 0
И СтрНайти(ПутьКФайлу, СтрШаблон("%1subsystems%1", ПолучитьРазделительПути())) <> 0;
КонецФункции
// ЭтоФайлОписанияПодсистемыE
// Возвращает истину, если файл является описанием подсистемы
// Параметры:
// Файл - Файл - Полный путь к файлу
//
// Возвращаемое значение:
// Булево - Признак
//
Функция ЭтоФайлОписанияПодсистемы(Файл) Экспорт
Если ПустаяСтрока(Файл.Расширение) Тогда
Возврат Ложь;
КонецЕсли;
ПутьКФайлу = НРег(Файл.Путь);
Возврат СтрСравнить(Файл.Расширение, ".xml") = 0
И СтрНайти(ПутьКФайлу, СтрШаблон("%1subsystems%1", ПолучитьРазделительПути())) <> 0;
КонецФункции
// ЭтоМодульМенеджера
// Возвращает истину, если файл является модулем менеджера
// Параметры:

View File

@ -38,11 +38,15 @@
Лог = ДополнительныеПараметры.Лог;
НастройкиСценария = ДополнительныеПараметры.Настройки.Получить(ИмяСценария());
Если АнализируемыйФайл.Существует() И ТипыФайлов.ЭтоФайлОписанияКонфигурации(АнализируемыйФайл) Тогда
ЭтоФайлОписанияКонфигурации = ТипыФайлов.ЭтоФайлОписанияКонфигурации(АнализируемыйФайл)
ИЛИ ТипыФайлов.ЭтоФайлОписанияКонфигурацииEDT(АнализируемыйФайл);
Если АнализируемыйФайл.Существует() И ЭтоФайлОписанияКонфигурации Тогда
Лог.Информация("Обработка файла '%1' по сценарию '%2'", АнализируемыйФайл.ПолноеИмя, ИмяСценария());
ЭтоEDT = ТипыФайлов.ЭтоФайлОписанияКонфигурацииEDT(АнализируемыйФайл);
Если СинхронизироватьМетаданныеИФайлы(АнализируемыйФайл.ПолноеИмя, ДополнительныеПараметры.ИзмененныеКаталоги) Тогда
Если СинхронизироватьМетаданныеИФайлы(АнализируемыйФайл.ПолноеИмя, ДополнительныеПараметры.ИзмененныеКаталоги, ЭтоEDT) Тогда
ДополнительныеПараметры.ИзмененныеКаталоги.Добавить(АнализируемыйФайл.ПолноеИмя);
@ -56,10 +60,10 @@
КонецФункции // ОбработатьФайл()
Функция СинхронизироватьМетаданныеИФайлы(Знач ИмяФайла, УдаленныеФайлы)
Функция СинхронизироватьМетаданныеИФайлы(Знач ИмяФайла, УдаленныеФайлы, ЭтоEDT)
СодержимоеФайла = ФайловыеОперации.ПрочитатьТекстФайла(ИмяФайла);
ДочерниеЭлементы = РегулярныеВыражения.ПолучитьДочерниеЭлементыОписанияКонфигурации(СодержимоеФайла);
ДочерниеЭлементы = РегулярныеВыражения.ПолучитьДочерниеЭлементыОписанияКонфигурации(СодержимоеФайла, ЭтоEDT);
Если ДочерниеЭлементы.Количество = 0 Тогда
Возврат Ложь;
@ -69,9 +73,10 @@
ОбъектыМетаданных = ПолучитьОбъектыМетаданных(ДочерниеЭлементы.Совпадения);
// Список базовых типов метаданных
СписокКаталогов = МетаданныеКонфигурации.КаталогиТиповМетаданных();
СписокКаталогов = МетаданныеКонфигурации.КаталогиТиповМетаданных(ЭтоEDT);
КорневойПуть = Новый Файл(ИмяФайла).Путь;
КорневойПуть = ?(ЭтоEDT, ОбъединитьПути(Новый Файл(ИмяФайла).Путь, ".."), Новый Файл(ИмяФайла).Путь);
СписокДляУдаления = Новый Массив;
ЕдиныйТекстОшибки = "";
ТекстОшибок = Новый Массив;
@ -84,8 +89,23 @@
Каталог = Новый Файл(ОбъединитьПути(КорневойПуть, КаталогСписка.Значение));
ВсеФайлыОбъектовТипа = Новый Массив;
// Проверка содержимого каталога
Если ЭтоEDT Тогда
Каталоги = ФайловыеОперации.НайтиКаталоги(Каталог.ПолноеИмя);
Для каждого Каталог Из Каталоги Цикл
Файлы = НайтиФайлы(Каталог.ПолноеИмя,"*.mdo", Ложь);
Для каждого Файл из Файлы Цикл
ВсеФайлыОбъектовТипа.Добавить(Файл);
КонецЦикла;
КонецЦикла;
Иначе
ВсеФайлыОбъектовТипа = НайтиФайлы(Каталог.ПолноеИмя, "*.xml");
КонецЕсли;
НадоПропустить = Новый ТаблицаЗначений;
НадоПропустить.Колонки.Добавить("Имя");
НадоПропустить.Колонки.Добавить("НормализованноеИмя");
@ -121,7 +141,7 @@
КонецЦикла;
ВсеФайлыОбъектовТипа = ФайловыеОперации.НайтиКаталоги(Каталог.ПолноеИмя);
ВсеФайлыОбъектовТипа = ФайловыеОперации.НайтиКаталоги(?(ЭтоEDT, Каталог.Путь, Каталог.ПолноеИмя));
Для Каждого ФайлОбъектаТипа Из ВсеФайлыОбъектовТипа Цикл

View File

@ -16,6 +16,24 @@
КонецФункции // ИмяСценария()
// ПолучитьСтандартныеНастройкиСценария
// Возвращает структуру настроек сценария
//
// Возвращаемое значение:
// Структура - Структура с настройками сценария
// * ИмяСценария - Строка - Имя, с которым сохранятся настройки
// * Настройка - Соответствие - настройки
//
Функция ПолучитьСтандартныеНастройкиСценария() Экспорт
НастройкиСценария = Новый Соответствие;
// Пример возможных настроек
НастройкиСценария.Вставить("УчитываяПрефикс", "");
Возврат Новый Структура("ИмяСценария, Настройка", ИмяСценария(), НастройкиСценария);
КонецФункции
// ОбработатьФайл
// Выполняет обработку файла
//
@ -36,25 +54,24 @@
Лог = ДополнительныеПараметры.Лог;
НастройкиСценария = ДополнительныеПараметры.Настройки.Получить(ИмяСценария());
Если АнализируемыйФайл.Существует() Тогда
Если ТипыФайлов.ЭтоФайлОписанияКонфигурации(АнализируемыйФайл) Тогда
УчитываяПрефиксы = "";
Если ЗначениеЗаполнено(НастройкиСценария)
И ЗначениеЗаполнено(НастройкиСценария.Получить("УчитываяПрефикс")) Тогда
Лог.Информация("Обработка файла '%1' по сценарию '%2'", АнализируемыйФайл.ПолноеИмя, ИмяСценария());
Если ОтсортироватьДеревоМетаданных(АнализируемыйФайл.ПолноеИмя) Тогда
ДополнительныеПараметры.ИзмененныеКаталоги.Добавить(АнализируемыйФайл.ПолноеИмя);
УчитываяПрефиксы = НастройкиСценария.Получить("УчитываяПрефикс");
КонецЕсли;
Возврат Истина;
Если АнализируемыйФайл.Существует() Тогда
ИначеЕсли ТипыФайлов.ЭтоФайлОписанияКонфигурацииEDT(АнализируемыйФайл) Тогда
Если ТипыФайлов.ЭтоФайлОписанияКонфигурации(АнализируемыйФайл) ИЛИ
ТипыФайлов.ЭтоФайлОписанияКонфигурацииEDT(АнализируемыйФайл) Тогда
Лог.Информация("Обработка файла '%1' по сценарию '%2'", АнализируемыйФайл.ПолноеИмя, ИмяСценария());
ЭтоЕДТ = ТипыФайлов.ЭтоФайлОписанияКонфигурацииEDT(АнализируемыйФайл);
Если ОтсортироватьДеревоМетаданныхEDT(АнализируемыйФайл.ПолноеИмя) Тогда
Если ОтсортироватьДеревоМетаданных(АнализируемыйФайл.ПолноеИмя, УчитываяПрефиксы, ЭтоЕДТ) Тогда
ДополнительныеПараметры.ИзмененныеКаталоги.Добавить(АнализируемыйФайл.ПолноеИмя);
@ -70,14 +87,16 @@
КонецФункции // ОбработатьФайл()
Функция ОтсортироватьДеревоМетаданных(Знач ИмяФайла)
Функция ОтсортироватьДеревоМетаданных(Знач ИмяФайла, НастройкиСценария, ЭтоЕДТ)
СодержимоеФайла = ФайловыеОперации.ПрочитатьТекстФайла(ИмяФайла);
Регексп = Новый РегулярноеВыражение("(<ChildObjects>\s+?)([\w\W]+?)(\s+<\/ChildObjects>)");
Регексп.ИгнорироватьРегистр = ИСТИНА;
Регексп.Многострочный = ИСТИНА;
ПоискДочерних = ?(ЭтоЕДТ, "(<\/languages>\s+)^(?!.*languages)([\w\W]*)(<\/mdclass\:Configuration>)", "(<ChildObjects>\s+?)([\w\W]+?)(\s+<\/ChildObjects>)");
Регексп = Новый РегулярноеВыражение(ПоискДочерних);
Регексп.ИгнорироватьРегистр = Истина;
Регексп.Многострочный = Истина;
ПодчиненныеМетаданные = Регексп.НайтиСовпадения(СодержимоеФайла);
Если ПодчиненныеМетаданные.Количество() = 0 Тогда
Возврат Ложь;
@ -85,46 +104,47 @@
КонецЕсли;
ИсходнаяСтрока = ПодчиненныеМетаданные[0].Группы[2].Значение;
РегекспМетаданные = Новый РегулярноеВыражение("^\s+<([\w]+)>([а-яa-zA-ZА-Я0-9_]+)<\/[\w]+>");
РегекспМетаданные.ИгнорироватьРегистр = ИСТИНА;
ПоискМетаданных = ?(ЭтоЕДТ, "^\s*<([\w]+)>([a-zA-Z]+\.[а-яa-zA-ZА-Я0-9_]+)<\/[\w]+>", "^\s+<([\w]+)>([а-яa-zA-ZА-Я0-9_]+)<\/[\w]+>");
РегекспМетаданные = Новый РегулярноеВыражение(ПоискМетаданных);
РегекспМетаданные.ИгнорироватьРегистр = Истина;
РегекспМетаданные.Многострочный = Истина;
ОбъектыМетаданныхСтроки = РегекспМетаданные.НайтиСовпадения(ИсходнаяСтрока);
ОбъектыМетаданных = Новый СписокЗначений;
ПоследнийТип = "";
ОбъектыТипа = Новый СписокЗначений;
ОбъектыМетаданных = Новый Соответствие;
ОбъектыТипаПоПорядку = Новый СписокЗначений; // отдельный список с типами, нужен для того, чтобы сохранить порядок при обходе соответствия
Для Каждого ОбъектМетаданных Из ОбъектыМетаданныхСтроки Цикл
Если ПоследнийТип <> ОбъектМетаданных.Группы[1].Значение Тогда
Если ПоследнийТип <> "" Тогда
ОбъектыМетаданных.Добавить(ОбъектыТипа);
ОбъектыТипа = Новый СписокЗначений;
Если ОбъектыМетаданных.Получить(ОбъектМетаданных.Группы[1].Значение) = Неопределено Тогда
ОбъектыМетаданных.Вставить(ОбъектМетаданных.Группы[1].Значение, Новый СписокЗначений);
ОбъектыТипаПоПорядку.Добавить(ОбъектМетаданных.Группы[1].Значение);
КонецЕсли;
ПоследнийТип = ОбъектМетаданных.Группы[1].Значение;
Список = ОбъектыМетаданных.Получить(ОбъектМетаданных.Группы[1].Значение);
Если Список.НайтиПоЗначению(ОбъектМетаданных.Группы[0].Значение) = Неопределено Тогда
Список.Добавить(ОбъектМетаданных.Группы[0].Значение, ОбъектМетаданных.Группы[2].Значение);
КонецЕсли;
ОбъектыТипа.Добавить(ОбъектМетаданных.Группы[0].Значение, ОбъектМетаданных.Группы[2].Значение);
КонецЦикла;
ОбъектыМетаданных.Добавить(ОбъектыТипа);
СтрокаЗамены = "";
Для Каждого ОбъектМетаданных Из ОбъектыМетаданных Цикл
Подсистема = ?(ЭтоЕДТ, "subsystems>", "Subsystem>");
Если НЕ СтрЗаканчиваетсяНа(ОбъектМетаданных.Значение[0].Значение, "Subsystem>") Тогда
ОбъектМетаданных.Значение.СортироватьПоПредставлению(НаправлениеСортировки.Возр);
Для Каждого Тип Из ОбъектыТипаПоПорядку Цикл
ОбъектМетаданных = ОбъектыМетаданных.Получить(Тип.Значение);
Если НЕ СтрЗаканчиваетсяНа(ОбъектМетаданных[0].Значение, Подсистема) Тогда
СортироватьПоПредставлениюСУчетомПрефиксов(ОбъектМетаданных, НастройкиСценария, ЭтоЕДТ);
КонецЕсли;
СтрокаЗамены = СтрокаЗамены + ?(ПустаяСтрока(СтрокаЗамены), "", Символы.ПС)
+ СтрСоединить(ОбъектМетаданных.Значение.ВыгрузитьЗначения(), Символы.ПС);
+ СтрСоединить(ОбъектМетаданных.ВыгрузитьЗначения(), Символы.ПС);
КонецЦикла;
@ -134,83 +154,55 @@
КонецЕсли;
Если ЭтоЕДТ Тогда
СодержимоеФайла = Регексп.Заменить(СодержимоеФайла, "$1" + " " + СокрЛП(СтрокаЗамены) + Символы.ПС + "$3");
Иначе
СодержимоеФайла = Регексп.Заменить(СодержимоеФайла, "$1" + СтрокаЗамены + "$3");
КонецЕсли;
ФайловыеОперации.ЗаписатьТекстФайла(ИмяФайла, СодержимоеФайла);
Возврат Истина;
КонецФункции
Функция ОтсортироватьДеревоМетаданныхEDT(Знач ИмяФайла)
Процедура СортироватьПоПредставлениюСУчетомПрефиксов(Список, Префикс, ЭтоЕДТ)
Текст = Новый ЧтениеТекста();
Текст.Открыть(ИмяФайла, КодировкаТекста.UTF8NoBOM);
СодержимоеФайла = Текст.Прочитать();
Текст.Закрыть();
ОбъектыДорабатываемойКонфигурации = Новый СписокЗначений;
Регексп = Новый РегулярноеВыражение("(<\/languages>\s*)([\w\W]*)(<\/mdclass\:Configuration>)");
Регексп.ИгнорироватьРегистр = ИСТИНА;
Регексп.Многострочный = ИСТИНА;
ПодчиненныеМетаданные = Регексп.НайтиСовпадения(СодержимоеФайла);
Если ПодчиненныеМетаданные.Количество() = 0 Тогда
Возврат Ложь;
Если ЗначениеЗаполнено(Префикс) Тогда
Удаления = Новый Массив;
Для Каждого Объект Из Список Цикл
Представление = ?(ЭтоЕДТ, СтрРазделить(Объект.Представление, ".")[1], Объект.Представление);
Если СтрНачинаетсяС(Представление, Префикс) Тогда
ОбъектыДорабатываемойКонфигурации.Добавить(Объект.Значение, Объект.Представление);
Удаления.Добавить(Объект);
КонецЕсли;
ИсходнаяСтрока = ПодчиненныеМетаданные[0].Группы[2].Значение;
РегекспМетаданные = Новый РегулярноеВыражение("^\s*<([\w]+)>([a-zA-Z]+\.[а-яa-zA-ZА-Я0-9_]+)<\/[\w]+>");
РегекспМетаданные.ИгнорироватьРегистр = ИСТИНА;
РегекспМетаданные.Многострочный = Истина;
ОбъектыМетаданныхСтроки = РегекспМетаданные.НайтиСовпадения(ИсходнаяСтрока);
ОбъектыМетаданных = Новый СписокЗначений;
ПоследнийТип = "";
ОбъектыТипа = Новый СписокЗначений;
Для Каждого ОбъектМетаданных Из ОбъектыМетаданныхСтроки Цикл
Если ПоследнийТип <> ОбъектМетаданных.Группы[1].Значение Тогда
Если ПоследнийТип <> "" Тогда
ОбъектыМетаданных.Добавить(ОбъектыТипа);
ОбъектыТипа = Новый СписокЗначений;
КонецЕсли;
ПоследнийТип = ОбъектМетаданных.Группы[1].Значение;
КонецЕсли;
ОбъектыТипа.Добавить(ОбъектМетаданных.Группы[0].Значение, ОбъектМетаданных.Группы[2].Значение);
КонецЦикла;
ОбъектыМетаданных.Добавить(ОбъектыТипа);
СтрокаЗамены = "";
Для Каждого ОбъектМетаданных Из ОбъектыМетаданных Цикл
Если НЕ СтрЗаканчиваетсяНа(ОбъектМетаданных.Значение[0].Значение, "subsystems>") Тогда
ОбъектМетаданных.Значение.СортироватьПоПредставлению(НаправлениеСортировки.Возр);
Если Удаления.Количество() > 0 Тогда
Для каждого Элемент Из Удаления Цикл
Список.Удалить(Элемент);
КонецЦикла;
КонецЕсли;
СтрокаЗамены = СтрокаЗамены + ?(ПустаяСтрока(СтрокаЗамены), "", Символы.ПС)
+ СтрСоединить(ОбъектМетаданных.Значение.ВыгрузитьЗначения(), Символы.ПС);
ОбъектыДорабатываемойКонфигурации.СортироватьПоПредставлению(НаправлениеСортировки.Возр);
КонецЕсли;
Список.СортироватьПоПредставлению(НаправлениеСортировки.Возр);
Для Каждого ОбъектДорабатываемойКонфигурации Из ОбъектыДорабатываемойКонфигурации Цикл
Список.Добавить(ОбъектДорабатываемойКонфигурации.Значение, ОбъектДорабатываемойКонфигурации.Представление);
КонецЦикла;
Если СтрСравнить(ИсходнаяСтрока, СтрокаЗамены) = 0 Тогда
Возврат Ложь;
КонецЕсли;
СодержимоеФайла = Регексп.Заменить(СодержимоеФайла, "$1" + СокрЛП(СтрокаЗамены) + Символы.ПС + "$3");
ФайловыеОперации.ЗаписатьТекстФайла(ИмяФайла, СодержимоеФайла);
Возврат Истина;
КонецФункции
КонецПроцедуры

View File

@ -0,0 +1,142 @@
///////////////////////////////////////////////////////////////////////////////
//
// Служебный модуль с реализацией сценариев обработки файлов <СортировкаДереваМетаданных>
//
///////////////////////////////////////////////////////////////////////////////
// ИмяСценария
// Возвращает имя сценария обработки файлов
//
// Возвращаемое значение:
// Строка - Имя текущего сценария обработки файлов
//
Функция ИмяСценария() Экспорт
Возврат "СортировкаСоставаПодсистем";
КонецФункции // ИмяСценария()
// ОбработатьФайл
// Выполняет обработку файла
//
// Параметры:
// АнализируемыйФайл - Файл - Файл из журнала git для анализа
// КаталогИсходныхФайлов - Строка - Каталог расположения исходных файлов относительно каталог репозитория
// ДополнительныеПараметры - Структура - Набор дополнительных параметров, которые можно использовать
// * Лог - Объект - Текущий лог
// * ИзмененныеКаталоги - Массив - Каталоги, которые необходимо добавить в индекс
// * КаталогРепозитория - Строка - Адрес каталога репозитория
// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образовавшиеся в результате работы сценария
// и которые необходимо дообработать
//
// Возвращаемое значение:
// Булево - Признак выполненной обработки файла
//
Функция ОбработатьФайл(АнализируемыйФайл, КаталогИсходныхФайлов, ДополнительныеПараметры) Экспорт
Лог = ДополнительныеПараметры.Лог;
НастройкиСценария = ДополнительныеПараметры.Настройки.Получить(ИмяСценария());
Если АнализируемыйФайл.Существует() Тогда
Если ТипыФайлов.ЭтоФайлОписанияПодсистемы(АнализируемыйФайл) ИЛИ
ТипыФайлов.ЭтоФайлОписанияПодсистемыEDT(АнализируемыйФайл) Тогда
Лог.Информация("Обработка файла '%1' по сценарию '%2'", АнализируемыйФайл.ПолноеИмя, ИмяСценария());
ЭтоЕДТ = ТипыФайлов.ЭтоФайлОписанияПодсистемыEDT(АнализируемыйФайл);
Если ОтсортироватьПодсистему(АнализируемыйФайл.ПолноеИмя, ЭтоЕДТ) Тогда
ДополнительныеПараметры.ИзмененныеКаталоги.Добавить(АнализируемыйФайл.ПолноеИмя);
КонецЕсли;
Возврат Истина;
КонецЕсли;
КонецЕсли;
Возврат ЛОЖЬ;
КонецФункции // ОбработатьФайл()
Функция ОтсортироватьПодсистему(Знач ИмяФайла, ЭтоЕДТ)
СодержимоеФайла = ФайловыеОперации.ПрочитатьТекстФайла(ИмяФайла);
ПоискДочерних = ?(ЭтоЕДТ, "(?:<content>)([\w\W]+)(?:<\/content>)", "(<Content>\s+)(<[\w\W]+>)(\s+<\/Content>)");
Регексп = Новый РегулярноеВыражение(ПоискДочерних);
Регексп.ИгнорироватьРегистр = ИСТИНА;
Регексп.Многострочный = ИСТИНА;
ПодчиненныеМетаданные = Регексп.НайтиСовпадения(СодержимоеФайла);
Если ПодчиненныеМетаданные.Количество() = 0 Тогда
Возврат Ложь;
КонецЕсли;
ИсходнаяСтрока = ПодчиненныеМетаданные[0].Группы[0].Значение;
//Тип.Объект или GUID
ПоискМетаданных = ?(ЭтоЕДТ, "^\s*<[\w]+>(?:([a-zA-Z]+)\.([а-яa-zA-ZА-Я0-9_]+)|(([a-zA-z0-9\-]+)))<\/[\w]+>", "^\s+<[\w:\s=""]+>(?:([a-zA-Z0-9_]+).([а-яa-zA-ZА-Я0-9_]+)|(([a-zA-z0-9\-]+)))<\/[\w:]+>");
РегекспМетаданные = Новый РегулярноеВыражение(ПоискМетаданных);
РегекспМетаданные.ИгнорироватьРегистр = Истина;
РегекспМетаданные.Многострочный = Истина;
ОбъектыМетаданныхСтроки = РегекспМетаданные.НайтиСовпадения(ИсходнаяСтрока);
ОбъектыТипаПоПорядку = Новый СписокЗначений; // отдельный список с типами, нужен для того, чтобы сохранить порядок при обходе соответствия
ОбъектыМетаданных = Новый Соответствие;
ПоследнийТип = "";
ОбъектыТипа = Новый СписокЗначений;
Для Каждого ОбъектМетаданных Из ОбъектыМетаданныхСтроки Цикл
Список = ОбъектыМетаданных.Получить(ОбъектМетаданных.Группы[1].Значение);
Если Список = Неопределено Тогда
Список = Новый СписокЗначений;
ОбъектыМетаданных.Вставить(ОбъектМетаданных.Группы[1].Значение, Список);
ОбъектыТипаПоПорядку.Добавить(ОбъектМетаданных.Группы[1].Значение);
КонецЕсли;
Если Список.НайтиПоЗначению(ОбъектМетаданных.Группы[0].Значение) = Неопределено Тогда
Список.Добавить(ОбъектМетаданных.Группы[0].Значение, ОбъектМетаданных.Группы[2].Значение);
КонецЕсли;
КонецЦикла;
СтрокаЗамены = "";
Для Каждого Тип Из ОбъектыТипаПоПорядку Цикл
ОбъектМетаданных = ОбъектыМетаданных.Получить(Тип.Значение);
ОбъектМетаданных.СортироватьПоПредставлению(НаправлениеСортировки.Возр);
СтрокаЗамены = СтрокаЗамены + ?(ПустаяСтрока(СтрокаЗамены), "", Символы.ПС)
+ СтрСоединить(ОбъектМетаданных.ВыгрузитьЗначения(), Символы.ПС);
КонецЦикла;
Если НЕ ЭтоЕДТ Тогда
СтрокаЗамены = ПодчиненныеМетаданные[0].Группы[1].Значение + СокрЛП(СтрокаЗамены) + ПодчиненныеМетаданные[0].Группы[3].Значение;
КонецЕсли;
Если СтрСравнить(ИсходнаяСтрока, СтрокаЗамены) = 0 Тогда
Возврат Ложь;
КонецЕсли;
Если ЭтоЕДТ Тогда
СодержимоеФайла = Регексп.Заменить(СодержимоеФайла, СокрЛП(СтрокаЗамены));
Иначе
СодержимоеФайла = Регексп.Заменить(СодержимоеФайла, СтрокаЗамены);
КонецЕсли;
ФайловыеОперации.ЗаписатьТекстФайла(ИмяФайла, СодержимоеФайла);
Возврат Истина;
КонецФункции

View File

@ -0,0 +1,113 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:WebService xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:core="http://g5.1c.ru/v8/dt/mcore" xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="2f4939de-be85-4d0a-a5f4-f4fdb55826b7">
<name>ancillary</name>
<synonym>
<key>ru</key>
<value>ancillary</value>
</synonym>
<comment>Служебного назначения</comment>
<namespace>http://local.dellin.ru/tech/</namespace>
<xdtoPackages xsi:type="core:ReferenceValue">
<value>XDTOPackage.bsp_ancillary</value>
</xdtoPackages>
<descriptorFileName>ancillary.1cws</descriptorFileName>
<sessionMaxAge>20</sessionMaxAge>
<operations uuid="642aec6c-1503-4ba5-a5a2-91c8aa83f9ca">
<name>ping</name>
<synonym>
<key>ru</key>
<value>Ping</value>
</synonym>
<xdtoReturningValueType>
<name>string</name>
<nsUri>http://www.w3.org/2001/XMLSchema</nsUri>
</xdtoReturningValueType>
<procedureName>ping</procedureName>
<dataLockControlMode>Managed</dataLockControlMode>
</operations>
<operations uuid="dbd3f82f-fc85-4ba1-8a0e-fd1409e5d2e2">
<name>getApdex</name>
<synonym>
<key>ru</key>
<value>Get apdex</value>
</synonym>
<xdtoReturningValueType>
<name>typeResponse</name>
<nsUri>http://global.dellin.ru/common/intergation/2013/1</nsUri>
</xdtoReturningValueType>
<procedureName>getApdex</procedureName>
<dataLockControlMode>Managed</dataLockControlMode>
<parameters uuid="c4ec45f3-e6b4-48c5-b775-6de31b8e836d">
<name>iParams</name>
<synonym>
<key>ru</key>
<value>I params</value>
</synonym>
<xdtoValueType>
<name>typeApdexInput</name>
<nsUri>http://local.dellin.ru/bsp/ancillary/2014/1</nsUri>
</xdtoValueType>
</parameters>
<parameters uuid="cc3784dc-1c73-4ece-ab43-a4307f37da97">
<name>oResult</name>
<synonym>
<key>ru</key>
<value>O result</value>
</synonym>
<xdtoValueType>
<name>typeApdexOutput</name>
<nsUri>http://local.dellin.ru/bsp/ancillary/2014/1</nsUri>
</xdtoValueType>
<transferDirection>Out</transferDirection>
</parameters>
</operations>
<operations uuid="96b39626-e82b-4bcc-af2e-2ede90f6a5de">
<name>getData</name>
<synonym>
<key>ru</key>
<value>Get data</value>
</synonym>
<xdtoReturningValueType>
<name>string</name>
<nsUri>http://www.w3.org/2001/XMLSchema</nsUri>
</xdtoReturningValueType>
<procedureName>getData</procedureName>
<dataLockControlMode>Managed</dataLockControlMode>
<parameters uuid="7d105e69-b427-494a-992d-e3313a08739a">
<name>Options</name>
<synonym>
<key>ru</key>
<value>Options</value>
</synonym>
<xdtoValueType>
<name>string</name>
<nsUri>http://www.w3.org/2001/XMLSchema</nsUri>
</xdtoValueType>
</parameters>
</operations>
<operations uuid="289c1432-cc3f-4913-b90d-785161be4836">
<name>aboutMe</name>
<synonym>
<key>ru</key>
<value>About me</value>
</synonym>
<xdtoReturningValueType>
<name>typeResponse</name>
<nsUri>http://global.dellin.ru/common/intergation/2013/1</nsUri>
</xdtoReturningValueType>
<procedureName>aboutMe</procedureName>
<dataLockControlMode>Managed</dataLockControlMode>
<parameters uuid="790a70cc-096e-4417-b3c9-0cb7e722098e">
<name>oResult</name>
<synonym>
<key>ru</key>
<value>O result</value>
</synonym>
<xdtoValueType>
<name>typeAboutMe</name>
<nsUri>http://local.dellin.ru/bsp/ancillary/2014/1</nsUri>
</xdtoValueType>
<transferDirection>Out</transferDirection>
</parameters>
</operations>
</mdclass:WebService>

View File

@ -0,0 +1,191 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:WebService xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:core="http://g5.1c.ru/v8/dt/mcore" xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="ef2d1795-02e8-4eeb-9027-281865acda2d">
<name>bus_DataReceiving</name>
<synonym>
<key>ru</key>
<value>Bus data receiving</value>
</synonym>
<namespace>http://global.dellin.ru/bus/data-receiving</namespace>
<xdtoPackages xsi:type="core:ReferenceValue">
<value>XDTOPackage.global_integration_general</value>
</xdtoPackages>
<xdtoPackages xsi:type="core:ReferenceValue">
<value>XDTOPackage.bus_data_receiving</value>
</xdtoPackages>
<descriptorFileName>data-receiving.1cws</descriptorFileName>
<sessionMaxAge>20</sessionMaxAge>
<operations uuid="400fe53e-4893-468d-b285-b28cce5847f7">
<name>ping</name>
<synonym>
<key>ru</key>
<value>Ping</value>
</synonym>
<xdtoReturningValueType>
<name>string</name>
<nsUri>http://www.w3.org/2001/XMLSchema</nsUri>
</xdtoReturningValueType>
<procedureName>ping</procedureName>
<dataLockControlMode>Managed</dataLockControlMode>
</operations>
<operations uuid="d9213aaf-2e16-4df5-aed9-b7b8d3044f53">
<name>getAdapterVersion</name>
<synonym>
<key>ru</key>
<value>Get adapter version</value>
</synonym>
<xdtoReturningValueType>
<name>string</name>
<nsUri>http://www.w3.org/2001/XMLSchema</nsUri>
</xdtoReturningValueType>
<procedureName>getAdapterVersion</procedureName>
<dataLockControlMode>Managed</dataLockControlMode>
</operations>
<operations uuid="6542a135-14a0-4d81-aba8-8e092bbb3b28">
<name>getBusDataHistory</name>
<synonym>
<key>ru</key>
<value>Get bus data history</value>
</synonym>
<xdtoReturningValueType>
<name>typeBusStatistics</name>
<nsUri>http://global.dellin.ru/bus/data-receiving</nsUri>
</xdtoReturningValueType>
<procedureName>getBusDataHistory</procedureName>
<dataLockControlMode>Managed</dataLockControlMode>
<parameters uuid="9eeb3d1c-6585-489f-971b-eb39a530f9e5">
<name>depth</name>
<synonym>
<key>ru</key>
<value>Depth</value>
</synonym>
<comment>Глубина</comment>
<xdtoValueType>
<name>integer</name>
<nsUri>http://www.w3.org/2001/XMLSchema</nsUri>
</xdtoValueType>
</parameters>
<parameters uuid="9f608eab-2cdb-43a3-a445-128c10335e42">
<name>periodName</name>
<synonym>
<key>ru</key>
<value>Period name</value>
</synonym>
<comment>имя периода</comment>
<xdtoValueType>
<name>string</name>
<nsUri>http://www.w3.org/2001/XMLSchema</nsUri>
</xdtoValueType>
</parameters>
<parameters uuid="1e261d37-c853-4c2c-9a00-d3ebaca7b592">
<name>groupByTypes</name>
<synonym>
<key>ru</key>
<value>Group by types</value>
</synonym>
<comment>Группировка по типам</comment>
<xdtoValueType>
<name>boolean</name>
<nsUri>http://www.w3.org/2001/XMLSchema</nsUri>
</xdtoValueType>
</parameters>
<parameters uuid="e8433497-2081-4b31-90fd-625cddf434dd">
<name>types</name>
<synonym>
<key>ru</key>
<value>Types</value>
</synonym>
<comment>Список типов в виде строки</comment>
<xdtoValueType>
<name>string</name>
<nsUri>http://www.w3.org/2001/XMLSchema</nsUri>
</xdtoValueType>
</parameters>
</operations>
<operations uuid="9da64aec-43ae-4153-ae99-d3e3b662f9ea">
<name>getBusRelatedMetadata</name>
<synonym>
<key>ru</key>
<value>Get bus related metadata</value>
</synonym>
<xdtoReturningValueType>
<name>typeBusRelatedMetadata</name>
<nsUri>http://global.dellin.ru/bus/data-receiving</nsUri>
</xdtoReturningValueType>
<procedureName>getBusRelatedMetadata</procedureName>
<dataLockControlMode>Managed</dataLockControlMode>
</operations>
<operations uuid="36137e10-3bc7-47d9-8f23-a64cbf86f9e9">
<name>getBusStatistics</name>
<synonym>
<key>ru</key>
<value>Get bus statistics</value>
</synonym>
<xdtoReturningValueType>
<name>typeBusStatistics</name>
<nsUri>http://global.dellin.ru/bus/data-receiving</nsUri>
</xdtoReturningValueType>
<procedureName>getBusStatistics</procedureName>
<dataLockControlMode>Managed</dataLockControlMode>
</operations>
<operations uuid="588e97df-8121-4ef8-b5c7-b8bbc113b549">
<name>getInfoBaseConnectionString</name>
<synonym>
<key>ru</key>
<value>Get info base connection string</value>
</synonym>
<xdtoReturningValueType>
<name>string</name>
<nsUri>http://www.w3.org/2001/XMLSchema</nsUri>
</xdtoReturningValueType>
<procedureName>getInfoBaseConnectionString</procedureName>
<dataLockControlMode>Managed</dataLockControlMode>
</operations>
<operations uuid="88d492e7-ed66-43e5-a053-4517f8bbd10e">
<name>receiveData</name>
<synonym>
<key>ru</key>
<value>Receive data</value>
</synonym>
<xdtoReturningValueType>
<name>typeResponse</name>
<nsUri>http://global.dellin.ru/integration/general/</nsUri>
</xdtoReturningValueType>
<procedureName>receiveData</procedureName>
<dataLockControlMode>Managed</dataLockControlMode>
<parameters uuid="8f06c8a6-0370-4e98-b8e7-4660e86f8324">
<name>iBusData</name>
<synonym>
<key>ru</key>
<value>In bus data</value>
</synonym>
<xdtoValueType>
<name>typeBusData</name>
<nsUri>http://global.dellin.ru/bus/data-receiving</nsUri>
</xdtoValueType>
</parameters>
</operations>
<operations uuid="316dee9b-6559-4375-9af4-3a916cc70b18">
<name>callService</name>
<synonym>
<key>ru</key>
<value>Call service</value>
</synonym>
<xdtoReturningValueType>
<name>typeProviderData</name>
<nsUri>http://global.dellin.ru/bus/data-receiving</nsUri>
</xdtoReturningValueType>
<procedureName>callService</procedureName>
<dataLockControlMode>Managed</dataLockControlMode>
<parameters uuid="5b6bdd31-4d0f-44df-83a0-2b5fbce19836">
<name>requestData</name>
<synonym>
<key>ru</key>
<value>Request data</value>
</synonym>
<xdtoValueType>
<name>typeRequestData</name>
<nsUri>http://global.dellin.ru/bus/data-receiving</nsUri>
</xdtoValueType>
</parameters>
</operations>
</mdclass:WebService>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4">
<Subsystem uuid="b3fd2876-4b85-4038-bc81-1eb600a9be18">
<Properties>
<Name>Интеграция</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Интеграция</v8:content>
</v8:item>
</Synonym>
<Comment/>
<IncludeHelpInContents>true</IncludeHelpInContents>
<IncludeInCommandInterface>true</IncludeInCommandInterface>
<Explanation>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Содержит подсистемы</v8:content>
</v8:item>
</Explanation>
<Picture/>
<Content>
<xr:Item xsi:type="xr:MDObjectRef">Enum.Енум1</xr:Item>
<xr:Item xsi:type="xr:MDObjectRef">Enum.Енум2</xr:Item>
<xr:Item xsi:type="xr:MDObjectRef">4308b2f2-9e92-486e-8c34-13c11fd5fb49</xr:Item>
<xr:Item xsi:type="xr:MDObjectRef">Enum.Енум7</xr:Item>
<xr:Item xsi:type="xr:MDObjectRef">Enum.Енум6</xr:Item>
</Content>
</Properties>
<ChildObjects>
<Subsystem>Файлы8</Subsystem>
<Subsystem>Файлы7</Subsystem>
<Subsystem>Файлы6</Subsystem>
<Subsystem>Файлы5</Subsystem>
<Subsystem>Файлы1</Subsystem>
<Subsystem>Файлы3</Subsystem>
<Subsystem>Файлы4</Subsystem>
<Subsystem>Файлы2</Subsystem>
</ChildObjects>
</Subsystem>
</MetaDataObject>

View File

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:Subsystem xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="e2edbdac-d85f-4cc3-8680-4a2ab5720cb0">
<name>ОбменСообщениями</name>
<synonym>
<key>ru</key>
<value>Обмен сообщениями</value>
</synonym>
<includeHelpInContents>true</includeHelpInContents>
<includeInCommandInterface>true</includeInCommandInterface>
<explanation>
<key>ru</key>
<value>Содержит подсистемы </value>
</explanation>
<subsystems>Подсистема1</subsystems>
<subsystems>Подсистема2</subsystems>
<subsystems>Подсистема3</subsystems>
<subsystems>Подсистема4</subsystems>
<subsystems>Подсистема5</subsystems>
<subsystems>AПодсистема5</subsystems>
<parentSubsystem>Subsystem.Подсистемы</parentSubsystem>
</mdclass:Subsystem>

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:Subsystem xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="4308b2f2-9e92-486e-8c34-13c11fd5fb49">
<name>Уведомления</name>
<synonym>
<key>ru</key>
<value>Уведомления</value>
</synonym>
<includeHelpInContents>true</includeHelpInContents>
<includeInCommandInterface>true</includeInCommandInterface>
<content>CommonModule.Уведомления</content>
<content>4308b2f2-9e92-486e-8c34-13c11fd5fb49</content>
<content>CommonModule.УведомленияСервер</content>
<content>Constant.АдресатыПолучения</content>
<content>CommonModule.УведомленияПереопределяемый</content>
<content>Catalog.ВидыУведомлений</content>
<content>CommonModule.УведомленияСерверПовтИсп</content>
<parentSubsystem>Subsystem.ПодсистемыБСП.Subsystem.ОбменСообщениями</parentSubsystem>
</mdclass:Subsystem>

View File

@ -15,7 +15,9 @@
юТест = ЮнитТестирование;
ВсеТесты = Новый Массив;
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСинхронизацияОбъектовМетаданныхВызываетИсключениеEDT");
ВсеТесты.Добавить("ТестДолжен_ПроверитьСортировкуСоставаМетаданных");
ВсеТесты.Добавить("ТестДолжен_ПроверитьСортировкуВПодсистемах");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийПроверкиДублейПроцедурВызываетИсключение");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийПроверкиДублейПроцедурОбработаетФайл");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийПроверкиДублейПроцедурНеОбработаетНесуществующийФайл");
@ -28,6 +30,7 @@
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийИсправлениеНеКаноническогоНаписанияНеИндексируетНеизмененные");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийИсправлениеНеКаноническогоНаписанияИсправляетТолькоНаписание");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСинхронизацияОбъектовМетаданныхВызываетИсключение");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЗагрузкуСценариевПоИмени");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийДобавлениеТестовВРасширениеОбрабатываетНегативныеКейсы");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийДобавлениеТестовВРасширениеДобавляетИДополняетМодулиТестов");
@ -57,6 +60,73 @@
КонецПроцедуры
#Область СортировкаСоставаМетаданных
Процедура ТестДолжен_ПроверитьСортировкуСоставаМетаданных() Экспорт
ОбъектСценария = ПолучитьСценарий("СортировкаДереваМетаданных.os");
Настройки = ПолучитьДополнительныеНастройки();
настр = Новый Соответствие;
настр.Вставить("УчитываяПрефиксы", "тн_");
Настройки.Настройки.Вставить("СортировкаДереваМетаданных", настр);
ИмяФайла = "СортировкаДереваМетаданных/Configuration.mdo";
Файл = ПодготовитьИзменяемыйТестовыйФайл(ИмяФайла, "Configuration.mdo");
Результат = ОбъектСценария.ОбработатьФайл(Файл, Файл.Путь, Настройки);
Ожидаем.Что(Результат, Истина).ЭтоИстина();
ИмяФайла = "СортировкаДереваМетаданных/Configuration.xml";
Файл = ПодготовитьИзменяемыйТестовыйФайл(ИмяФайла, "Configuration.xml");
Результат = ОбъектСценария.ОбработатьФайл(Файл, Файл.Путь, Настройки);
Ожидаем.Что(Результат, Истина).ЭтоИстина();
КонецПроцедуры
#КонецОбласти
#Область СортировкаСоставаМетаданных
Процедура ТестДолжен_ПроверитьСортировкуВПодсистемах() Экспорт
ОбъектСценария = ПолучитьСценарий("СортировкаСоставаПодсистем.os");
Настройки = ПолучитьДополнительныеНастройки();
ИмяФайла = "СортировкаОбъектовВПодсистемах/Интеграция.xml";
Файл = ПодготовитьИзменяемыйТестовыйФайл(ИмяФайла, "Интеграция.xml", "Subsystems");
ТекстДо = ФайловыеОперации.ПрочитатьТекстФайла(Файл.ПолноеИмя);
Результат = ОбъектСценария.ОбработатьФайл(Файл, Файл.Путь, Настройки);
Ожидаем.Что(Результат, Истина).ЭтоИстина();
ТекстПосле = ФайловыеОперации.ПрочитатьТекстФайла(Файл.ПолноеИмя);
Ожидаем.Что(ТекстДо, Истина).Не_().Равно(ТекстПосле);
ИмяФайла = "СортировкаОбъектовВПодсистемах/УведомленияПриИзмененииОбъектов.mdo";
Файл = ПодготовитьИзменяемыйТестовыйФайл(ИмяФайла, "УведомленияПриИзмененииОбъектов.mdo", "Subsystems");
ТекстДо = ФайловыеОперации.ПрочитатьТекстФайла(Файл.ПолноеИмя);
Результат = ОбъектСценария.ОбработатьФайл(Файл, Файл.Путь, Настройки);
Ожидаем.Что(Результат, Истина).ЭтоИстина();
ТекстПосле = ФайловыеОперации.ПрочитатьТекстФайла(Файл.ПолноеИмя);
Ожидаем.Что(ТекстДо, Истина).Не_().Равно(ТекстПосле);
ИмяФайла = "СортировкаОбъектовВПодсистемах/ОбменСообщениями.mdo";
Файл = ПодготовитьИзменяемыйТестовыйФайл(ИмяФайла, "ОбменСообщениями.mdo", "Subsystems");
ТекстДо = ФайловыеОперации.ПрочитатьТекстФайла(Файл.ПолноеИмя);
Результат = ОбъектСценария.ОбработатьФайл(Файл, Файл.Путь, Настройки);
Ожидаем.Что(Результат, Истина).ЭтоИстина();
ТекстПосле = ФайловыеОперации.ПрочитатьТекстФайла(Файл.ПолноеИмя);
Ожидаем.Что(ТекстДо, Истина).Равно(ТекстПосле);
КонецПроцедуры
#КонецОбласти
#Область ИсправлениеНеКаноническогоНаписания
Процедура ТестДолжен_ПроверитьЧтоСценарийИсправлениеНеКаноническогоНаписанияИсправляетФайл() Экспорт
@ -214,8 +284,10 @@
#Область СинхронизацияОбъектовМетаданныхИФайлов
Процедура ТестДолжен_ПроверитьЧтоСинхронизацияОбъектовМетаданныхВызываетИсключение() Экспорт
МетаданныеКонфигурации.СброситьКеш(); // Если не сбрасывать будет ошибка при кешировани каталогов для EDT и Конфигуратора
ОбъектСценария = ПолучитьСценарий("СинхронизацияОбъектовМетаданныхИФайлов.os");
Файл = Новый Файл(ОбъединитьПути(КаталогТестовыхФикстур(), "СинхронизацияОбъектовМетаданныхИФайлов\Configuration.xml"));
Файл = Новый Файл(ОбъединитьПути(КаталогТестовыхФикстур(), "СинхронизацияОбъектовМетаданныхИФайлов/Configuration.xml"));
// Переименование типа без переименования каталога
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Имя каталога Ancillary отличается от метаданного ancillary");
@ -273,6 +345,62 @@
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для ChartOfCharacteristicTypes.РасширенныеХарактеристикиОбъектов");
КонецПроцедуры
Процедура ТестДолжен_ПроверитьЧтоСинхронизацияОбъектовМетаданныхВызываетИсключениеEDT() Экспорт
ОбъектСценария = ПолучитьСценарий("СинхронизацияОбъектовМетаданныхИФайлов.os");
Файл = Новый Файл(ОбъединитьПути(КаталогТестовыхФикстур(), "СинхронизацияОбъектовМетаданныхИФайловEDT/Configuration/Configuration.mdo"));
// Переименование типа без переименования каталога
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Имя каталога Ancillary отличается от метаданного ancillary");
// удаление типа без удаления файлов
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Необходимо удалить файлы");
// базовые элементы
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог ChartsOfCharacteristicTypes");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог Catalogs");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог CommandGroups");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог CommonAttributes");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог CommonCommands");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог CommonForms");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог CommonModules");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог CommonPictures");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог CommonTemplates");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог Constants");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог DataProcessors");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог DefinedTypes");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог Documents");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог Enums");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог EventSubscriptions");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог FunctionalOptions");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог InformationRegisters");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог Reports");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог Roles");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог ScheduledJobs");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог SessionParameters");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог Subsystems");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствует каталог XDTOPackages");
// элементы метаданных
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для Subsystem.ПодсистемыБСП");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для CommonPicture.GUID");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для Role.Администратор");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для SessionParameter.ГруппыДоступаПользователя");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для CommonTemplate.SftpExtension");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для CommonModule.SFTPКлиентСервер");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для CommonAttribute.UID");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для XDTOPackage.bsp_ancillary");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для EventSubscription.ВерсионированиеПриЗаписи");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для ScheduledJob.РоботАвтоматическаяОбработкаИзмененийАдресногоКлассификатора");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для FunctionalOption.ВестиЖурналДействийПользователя");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для DefinedType.ТипUIDСтрока");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для CommonCommand.АудиторскийСлед");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для CommandGroup.Печать");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для Catalog.АдресаЭлектроннойПочты");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для Enum.ВариантХраненияФайлов");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для Report.АнализЖурналаРегистрации");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для DataProcessor.АктивныеПользователи");
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "Отсутствуют файлы для ChartOfCharacteristicTypes.ТипыЗначенийВидовПравДоступа");
КонецПроцедуры
#КонецОбласти
#Область ДобавлениеТестовВРасширение
@ -635,7 +763,7 @@
КонецПроцедуры
Функция КаталогТестовыхФикстур()
Возврат ОбъединитьПути(КаталогИсходников(), "tests\fixtures");
Возврат Норма(ОбъединитьПути(КаталогИсходников(), "tests/fixtures"));
КонецФункции
Функция Фикстура(ПутьВКаталогеФикстур)
@ -671,11 +799,26 @@
КонецФункции
Функция ПодготовитьИзменяемыйТестовыйФайл(Знач ИмяТестовогоФайла)
Функция ПодготовитьИзменяемыйТестовыйФайл(Знач ИмяТестовогоФайла, ЗаписатьКакИмя = "", ВДиректории = "")
ПутьКТесту = ОбъединитьПути(КаталогТестовыхФикстур(), ИмяТестовогоФайла);
ПутьКФайлу = МенеджерВременныхФайлов.СоздатьФайл(ИмяТестовогоФайла);
КопироватьФайл(ПутьКТесту, ПутьКФайлу);
ПутьКФайлу = МенеджерВременныхФайлов.СоздатьКаталог();
МенеджерВременныхФайлов.БазовыйКаталог = ПутьКФайлу;
Если ЗаписатьКакИмя <> "" Тогда
Если ВДиректории <> "" Тогда
ПутьКФайлу = МенеджерВременныхФайлов.СоздатьКаталог(Норма(ОбъединитьПути(ПутьКФайлу, ВДиректории)));
КонецЕсли;
ПутьКФайлу = ОбъединитьПути(ПутьКФайлу, ЗаписатьКакИмя);
Иначе
Путь = Норма(ОбъединитьПути(ПутьКФайлу, ИмяТестовогоФайла));
ПутьКФайлу = МенеджерВременныхФайлов.СоздатьФайл(Путь);
КонецЕсли;
КопироватьФайл(Норма(ПутьКТесту), ПутьКФайлу);
Файл = Новый Файл(ПутьКФайлу);
Возврат Файл;
@ -700,6 +843,18 @@
КонецФункции
Функция Норма(Путь)
СисИнфо = Новый СистемнаяИнформация();
ЭтоWindows = Найти(НРег(СисИнфо.ВерсияОС), "windows") > 0;
Если ЭтоWindows Тогда
Возврат СтрЗаменить(Путь, "/", "\");
Иначе
Возврат СтрЗаменить(Путь, "\", "/");
КонецЕсли;
КонецФункции
Процедура ИспользоватьТестовуюНастройку(КаталогРепозитория, ИмяФайлаНастройки)
КопироватьФайл(

View File

@ -102,6 +102,7 @@
ОжидаемыеСценарии.Добавить("РазборОтчетовОбработокРасширений.os");
ОжидаемыеСценарии.Добавить("СинхронизацияОбъектовМетаданныхИФайлов.os");
ОжидаемыеСценарии.Добавить("СортировкаДереваМетаданных.os");
ОжидаемыеСценарии.Добавить("СортировкаСоставаПодсистем.os");
ИменаЗагружаемыхСценариев = МенеджерНастроек.ИменаЗагружаемыхСценариев();

View File

@ -112,7 +112,7 @@
КонецПроцедуры
Функция КаталогТестовыхФикстур()
Возврат ОбъединитьПути(КаталогИсходников(), "tests\fixtures");
Возврат ОбъединитьПути(КаталогИсходников(), "tests/fixtures");
КонецФункции
Функция КаталогИсходников()

View File

@ -19,6 +19,7 @@
"РазборОтчетовОбработокРасширений.os",
"СинхронизацияОбъектовМетаданныхИФайлов.os",
"СортировкаДереваМетаданных.os",
"СортировкаСоставаПодсистем.os",
"УдалениеДублейМетаданных.os",
"УдалениеЛишнихКонцевыхПробелов.os",
"УдалениеЛишнихПустыхСтрок.os"
@ -40,6 +41,9 @@
"РазборОтчетовОбработокРасширений": {
"ИспользоватьНастройкиПоУмолчанию": true,
"ВерсияПлатформы": ""
},
"СортировкаДереваМетаданных": {
"УчитываяПрефикс": ""
}
}
}