diff --git a/Jenkinsfile b/Jenkinsfile index b9c60b4b..85f7d31b 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -44,19 +44,21 @@ node("slave") { } } - stage('BDD тестирование'){ + stage('BDD тестирование'){ def command = """opm run test"""; if(env.BRANCH_NAME == 'master' || env.BRANCH_NAME == 'develop') { command = """opm run coverage""" - } - + } + def errors = [] timestamps { - try{ - cmd(command, isUnix) - } catch (e) { - errors << "BDD status : ${e}" + timeout(15){ + try{ + cmd(command, isUnix) + } catch (e) { + errors << "BDD status : ${e}" + } } } @@ -65,7 +67,7 @@ node("slave") { for (int i = 0; i < errors.size(); i++) { echo errors[i] } - } + } step([$class: 'ArtifactArchiver', artifacts: '**/bdd-exec.xml', fingerprint: true]) step([$class: 'JUnitResultArchiver', testResults: '**/bdd*.xml']) @@ -79,16 +81,19 @@ node("slave") { } } - stage('Контроль технического долга'){ + stage('Контроль технического долга'){ if (env.QASONAR) { timestamps { println env.QASONAR; def sonarcommand = "@\"./../../tools/hudson.plugins.sonar.SonarRunnerInstallation/Main_Classic/bin/sonar-scanner\"" - withCredentials([[$class: 'StringBinding', credentialsId: env.SonarOAuthCredentianalID, variable: 'SonarOAuth']]) { - sonarcommand = sonarcommand + " -Dsonar.host.url=https://sonar.silverbulleters.org -Dsonar.login=${env.SonarOAuth}" + // withCredentials([[$class: 'StringBinding', credentialsId: env.SonarOAuthCredentianalID, variable: 'SonarOAuth']]) { + // sonarcommand = sonarcommand + " -Dsonar.host.url=https://sonar.silverbulleters.org -Dsonar.login=${env.SonarOAuth}" + // } + withCredentials([string(credentialsId: env.OpenSonarOAuthCredentianalID, variable: 'SonarOAuth')]) { + sonarcommand = sonarcommand + " -Dsonar.host.url=https://opensonar.silverbulleters.org -Dsonar.login=${SonarOAuth}" } - + // Get version - в модуле 'src/Модули/ПараметрыСистемы.os' должна быть строка формата Версия = "0.8.1"; def configurationText = readFile encoding: 'UTF-8', file: 'src/Модули/ПараметрыСистемы.os' def configurationVersion = (configurationText =~ /Версия\s*=\s*\"([^"]*)\"/)[0][1] @@ -97,20 +102,22 @@ node("slave") { def makeAnalyzis = true if (env.BRANCH_NAME == "develop") { echo 'Analysing develop branch' + } else if (env.BRANCH_NAME.startsWith("feature/")) { + echo "Analysing branch ${BRANCH_NAME}" } else if (env.BRANCH_NAME.startsWith("release/")) { sonarcommand = sonarcommand + " -Dsonar.branch=${BRANCH_NAME}" } else if (env.BRANCH_NAME.startsWith("PR-")) { - // Report PR issues + // Report PR issues def PRNumber = env.BRANCH_NAME.tokenize("PR-")[0] def gitURLcommand = 'git config --local remote.origin.url' def gitURL = "" - + if (isUnix()) { - gitURL = sh(returnStdout: true, script: gitURLcommand).trim() + gitURL = sh(returnStdout: true, script: gitURLcommand).trim() } else { - gitURL = bat(returnStdout: true, script: gitURLcommand).trim() + gitURL = bat(returnStdout: true, script: gitURLcommand).trim() } - + def repository = gitURL.tokenize("/")[2] + "/" + gitURL.tokenize("/")[3] repository = repository.tokenize(".")[0] withCredentials([[$class: 'StringBinding', credentialsId: env.GithubOAuthCredentianalID, variable: 'githubOAuth']]) { @@ -132,7 +139,7 @@ node("slave") { echo "QA runner not installed" } } - + } def cmd(command, isUnix) { diff --git a/README.md b/README.md index e36418b9..51ce04ba 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,7 @@ call runner help @call runner init-dev --storage --storage-name http:/repo-1c --storage-user %1 --storage-pwd %2 -@call runner run --command "ЗапуститьОбновлениеИнформационнойБазы;ЗавершитьРаботуСистемы;" --execute $runnerRoot\build\out\ЗакрытьПредприятие.epf +@call runner run --command "ЗапуститьОбновлениеИнформационнойБазы;ЗавершитьРаботуСистемы;" --execute $runnerRoot\epf\ЗакрытьПредприятие.epf @call runner vanessa --settings tools/vrunner.first.json @@ -136,14 +136,14 @@ call runner help В случае необходимости переопределения параметров запуска используется схема приоритетов. Приоритет в порядке возрастания (от минимального до максимального приоритета) -+ `env.json(в корне проекта)` -+ `--settings ../env.json(указание файла настроек вручную)` ++ `env.json (в корне проекта)` ++ `--settings ../env.json (указание файла настроек вручную)` + `RUNNER_* (из переменных окружения)` + `--* (ключи командной строки)` Описание: + На первоначальном этапе читаются настройки из файла настроек, указанного в ключе команды ```--settings tools/vrunner.json``` -+ Потом, если настройка есть в переменной окружения, тогда берем из еe. ++ Потом, если настройка есть в переменной окружения, тогда берем из неe. + Если же настройка есть, как в файле json, так и в переменной окружения и непосредственно в командной строке, то берем настройку из командной строки. Например: @@ -163,7 +163,7 @@ call runner help set RUNNER_DBUSER=Иванов set RUNNER_DBUSER= ``` - в данном случаи установлено полностью пустое значение и имя пользователя будет взято из tools/vrunner.json, если оно там есть. + в данном случае установлено полностью пустое значение и имя пользователя будет взято из tools/vrunner.json, если оно там есть. 3. Установка пустого значения: ```cmd diff --git "a/epf/\320\227\320\260\320\272\321\200\321\213\321\202\321\214\320\237\321\200\320\265\320\264\320\277\321\200\320\270\321\217\321\202\320\270\320\265/\320\227\320\260\320\272\321\200\321\213\321\202\321\214\320\237\321\200\320\265\320\264\320\277\321\200\320\270\321\217\321\202\320\270\320\265/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl" "b/epf/\320\227\320\260\320\272\321\200\321\213\321\202\321\214\320\237\321\200\320\265\320\264\320\277\321\200\320\270\321\217\321\202\320\270\320\265/\320\227\320\260\320\272\321\200\321\213\321\202\321\214\320\237\321\200\320\265\320\264\320\277\321\200\320\270\321\217\321\202\320\270\320\265/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl" index 4573fd59..e68cf445 100644 --- "a/epf/\320\227\320\260\320\272\321\200\321\213\321\202\321\214\320\237\321\200\320\265\320\264\320\277\321\200\320\270\321\217\321\202\320\270\320\265/\320\227\320\260\320\272\321\200\321\213\321\202\321\214\320\237\321\200\320\265\320\264\320\277\321\200\320\270\321\217\321\202\320\270\320\265/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl" +++ "b/epf/\320\227\320\260\320\272\321\200\321\213\321\202\321\214\320\237\321\200\320\265\320\264\320\277\321\200\320\270\321\217\321\202\320\270\320\265/\320\227\320\260\320\272\321\200\321\213\321\202\321\214\320\237\321\200\320\265\320\264\320\277\321\200\320\270\321\217\321\202\320\270\320\265/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl" @@ -35,6 +35,8 @@ ПодключитьОбработчикОжидания("ПроверитьНеобходимостьЗавершенияПрограммы", 10, Истина); ПодключитьОбработчикОжидания("ПроверитьЛегальностьОбновления", 2); + ПроверитьНеобходимостьЗавершенияПрограммы(); + ПроверитьЛегальностьОбновления(); КонецПроцедуры &НаКлиенте diff --git "a/features/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\241\320\270\320\275\321\202\320\260\320\272\321\201\320\270\321\201\320\260.feature" "b/features/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\241\320\270\320\275\321\202\320\260\320\272\321\201\320\270\321\201\320\260.feature" index 9159e7e1..214681ae 100644 --- "a/features/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\241\320\270\320\275\321\202\320\260\320\272\321\201\320\270\321\201\320\260.feature" +++ "b/features/\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\241\320\270\320\275\321\202\320\260\320\272\321\201\320\270\321\201\320\260.feature" @@ -37,7 +37,7 @@ # И Я сообщаю вывод команды "oscript" И Файл "junit.xml" содержит """ - + """ И Файл "junit.xml" содержит 'status="passed"' И Код возврата команды "oscript" равен 0 @@ -56,7 +56,7 @@ # И Я сообщаю вывод команды "oscript" И Файл "junit.xml" содержит """ - + """ И Файл "junit.xml" содержит 'status="passed"' И Код возврата команды "oscript" равен 0 @@ -79,9 +79,9 @@ И файл "junit.xml" существует И Файл "junit.xml" содержит """ - + """ - И Файл "junit.xml" содержит 'status="failure"' + И Файл "junit.xml" содержит ' + """ - И Файл "junit.xml" содержит 'status="failure"' + И Файл "junit.xml" содержит ' + """ И Файл "junit.xml" содержит 'status="passed"' diff --git "a/features/\320\237\321\200\320\276\321\201\321\202\321\213\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.feature" "b/features/\320\237\321\200\320\276\321\201\321\202\321\213\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.feature" index bb3109d1..4339712b 100644 --- "a/features/\320\237\321\200\320\276\321\201\321\202\321\213\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.feature" +++ "b/features/\320\237\321\200\320\276\321\201\321\202\321\213\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.feature" @@ -20,7 +20,7 @@ Когда Я выполняю команду "oscript" с параметрами "src/main.os help" И Вывод команды "oscript" содержит "vanessa-runner v" И Вывод команды "oscript" содержит "Вывод справки по параметрам" - И Вывод команды "oscript" содержит "Выводить версию приложения" + И Вывод команды "oscript" содержит "Вывод версии приложения" И Код возврата команды "oscript" равен 0 Сценарий: Вызов исполняемого файла без параметров diff --git a/packagedef b/packagedef index 84ff1d2a..8086314b 100644 --- a/packagedef +++ b/packagedef @@ -52,9 +52,9 @@ .ЗависитОт("json", "1.1.0") .ЗависитОт("1commands", "1.3.5") .ЗависитОт("1bdd", "1.7.0") - .ЗависитОт("fs", "0.5.0") + .ЗависитОт("fs", "1.0.0") .ЗависитОт("ParserFileV8i", "0.0.5") - // .ЗависитОт("add") + .ЗависитОт("add", "6.0.0") .ЗависитОт("v8storage", "0.6.5") .ЗависитОт("v8unpack", "1.0.1") .ЗависитОт("opm", "0.14.4") diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Version.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Version.os" index b13fd0f1..8cdfa895 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Version.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260Version.os" @@ -9,7 +9,7 @@ Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт - ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, "Выводить версию приложения"); + ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, " Вывод версии приложения."); Парсер.ДобавитьКоманду(ОписаниеКоманды); КонецПроцедуры // ЗарегистрироватьКоманду diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\263\321\200\321\203\320\267\320\270\321\202\321\214\320\230\320\275\321\204\320\276\320\261\320\260\320\267\321\203\320\222\320\244\320\260\320\271\320\273.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\263\321\200\321\203\320\267\320\270\321\202\321\214\320\230\320\275\321\204\320\276\320\261\320\260\320\267\321\203\320\222\320\244\320\260\320\271\320\273.os" index d8874b48..7e3015c4 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\263\321\200\321\203\320\267\320\270\321\202\321\214\320\230\320\275\321\204\320\276\320\261\320\260\320\267\321\203\320\222\320\244\320\260\320\271\320\273.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\263\321\200\321\203\320\267\320\270\321\202\321\214\320\230\320\275\321\204\320\276\320\261\320\260\320\267\321\203\320\222\320\244\320\260\320\271\320\273.os" @@ -22,7 +22,7 @@ Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт ТекстОписания = - " Выгружает информационную базу в файл + " Выгрузка информационной базы в файл. | "; ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\263\321\200\321\203\320\267\320\270\321\202\321\214\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\321\216\320\222\320\244\320\260\320\271\320\273.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\263\321\200\321\203\320\267\320\270\321\202\321\214\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\321\216\320\222\320\244\320\260\320\271\320\273.os" index 72159a2c..97e81482 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\263\321\200\321\203\320\267\320\270\321\202\321\214\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\321\216\320\222\320\244\320\260\320\271\320\273.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\263\321\200\321\203\320\267\320\270\321\202\321\214\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\321\216\320\222\320\244\320\260\320\271\320\273.os" @@ -22,7 +22,7 @@ Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт ТекстОписания = - " Выгружает файл конфигурации из ИБ + " Выгрузка файла конфигурации из ИБ. | "; ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\263\321\200\321\203\320\267\320\270\321\202\321\214\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\320\265\320\222\320\244\320\260\320\271\320\273.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\263\321\200\321\203\320\267\320\270\321\202\321\214\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\320\265\320\222\320\244\320\260\320\271\320\273.os" index 01e6cdbd..7b6044ae 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\263\321\200\321\203\320\267\320\270\321\202\321\214\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\320\265\320\222\320\244\320\260\320\271\320\273.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\222\321\213\320\263\321\200\321\203\320\267\320\270\321\202\321\214\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\320\265\320\222\320\244\320\260\320\271\320\273.os" @@ -22,7 +22,7 @@ Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт ТекстОписания = - " Выгружает файл расширения из ИБ + " Выгрузка файла расширения из ИБ. | "; ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\320\263\321\200\321\203\320\267\320\270\321\202\321\214\320\244\320\260\320\271\320\273\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\320\263\321\200\321\203\320\267\320\270\321\202\321\214\320\244\320\260\320\271\320\273\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" index 3df62004..84ec017d 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\320\263\321\200\321\203\320\267\320\270\321\202\321\214\320\244\320\260\320\271\320\273\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\320\263\321\200\321\203\320\267\320\270\321\202\321\214\320\244\320\260\320\271\320\273\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" @@ -23,7 +23,7 @@ Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт ТекстОписания = - " Загрузить cf файл в базу + " Загрузка cf файла в базу. | "; ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\320\277\321\203\321\201\321\202\320\270\321\202\321\214\320\222\320\240\320\265\320\266\320\270\320\274\320\265\320\237\321\200\320\265\320\264\320\277\321\200\320\270\321\217\321\202\320\270\321\217.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\320\277\321\203\321\201\321\202\320\270\321\202\321\214\320\222\320\240\320\265\320\266\320\270\320\274\320\265\320\237\321\200\320\265\320\264\320\277\321\200\320\270\321\217\321\202\320\270\321\217.os" index b5137764..4e6e3eda 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\320\277\321\203\321\201\321\202\320\270\321\202\321\214\320\222\320\240\320\265\320\266\320\270\320\274\320\265\320\237\321\200\320\265\320\264\320\277\321\200\320\270\321\217\321\202\320\270\321\217.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\320\277\321\203\321\201\321\202\320\270\321\202\321\214\320\222\320\240\320\265\320\266\320\270\320\274\320\265\320\237\321\200\320\265\320\264\320\277\321\200\320\270\321\217\321\202\320\270\321\217.os" @@ -3,10 +3,10 @@ // Выполнение команды/действия в 1С:Предприятие в режиме тонкого/толстого клиента с передачей запускаемых обработок и параметров // // TODO добавить фичи для проверки команды -// +// // Служебный модуль с набором методов работы с командами приложения // -// Структура модуля реализована в соответствии с рекомендациями +// Структура модуля реализована в соответствии с рекомендациями // oscript-app-template (C) EvilBeaver // /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -27,29 +27,29 @@ // Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт - ТекстОписания = - " Выполнение команды/действия в 1С:Предприятие в режиме тонкого/толстого клиента с передачей запускаемых обработок и параметров + ТекстОписания = + " Выполнение команды/действия в 1С:Предприятие в режиме тонкого/толстого клиента с передачей запускаемых обработок и параметров. | "; - ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, + ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, ТекстОписания); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--command", "Строка, передаваемая в ПараметрыЗапуска /C''"); - Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--execute", + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--execute", "Путь внешней обработки 1С для запуска в предприятии"); - Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--additional", + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--additional", "Дополнительные параметры для запуска предприятия."); - Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "--no-wait", + Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "--no-wait", "Не ожидать завершения запущенной команды/действия"); - Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "--online-file", + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--online-file", "Путь к файлу с online-записью выполнения"); Парсер.ДобавитьКоманду(ОписаниеКоманды); - + КонецПроцедуры // ЗарегистрироватьКоманду // Выполняет логику команды -// +// // Параметры: // ПараметрыКоманды - Соответствие - Соответствие ключей командной строки и их значений // ДополнительныеПараметры - Соответствие - дополнительные параметры (необязательно) @@ -61,13 +61,13 @@ // TODO отрефакторить получение ЗапускатьТолстыйКлиент ЗапускатьТолстыйКлиент = ОбщиеМетоды.УказанПараметрТолстыйКлиент(ПараметрыКоманды["--ordinaryapp"], Лог); ДанныеПодключения = ПараметрыКоманды["ДанныеПодключения"]; - + МенеджерКонфигуратора = Новый МенеджерКонфигуратора; ПутьОбработки1С = ПараметрыКоманды["--execute"]; ПутьОбработки1С = Заменить_runnerRoot_на_КаталогVanessaRunner(ПутьОбработки1С); ПутьОбработки1С = ОбщиеМетоды.ПолныйПуть(ПутьОбработки1С); - + ОжидатьЗавершения = Не ПараметрыКоманды["--no-wait"]; МенеджерКонфигуратора.Инициализация( @@ -87,10 +87,10 @@ ПутьЛогаВыполнения = ПараметрыКоманды["--online-file"]; Попытка МенеджерКонфигуратора.ЗапуститьВРежимеПредприятияСПроверкойВыполнения( - "ЗапускВРежимеПредприятия", + "ЗапускВРежимеПредприятия", КомандаЗапуска, ПутьОбработки1С, - ЗапускатьТолстыйКлиент, ПараметрыКоманды["--additional"], - ОжидатьЗавершения, + ЗапускатьТолстыйКлиент, ПараметрыКоманды["--additional"], + ОжидатьЗавершения, ПутьЛогаВыполнения ) Исключение diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\321\205\320\262\320\260\321\202\320\270\321\202\321\214\320\222\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\321\205\320\262\320\260\321\202\320\270\321\202\321\214\320\222\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265.os" index c15c0240..0c3c4be9 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\321\205\320\262\320\260\321\202\320\270\321\202\321\214\320\222\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\321\205\320\262\320\260\321\202\320\270\321\202\321\214\320\222\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265.os" @@ -26,7 +26,7 @@ ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, ТекстОписания); - Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-name", "Строка подключения к хранилище"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-name", "Строка подключения к хранилищу"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-user", "Пользователь хранилища"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-pwd", "Пароль"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--objects", "Имя файла со списком объектов. diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\230\320\275\320\270\321\206\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217\320\236\320\272\321\200\321\203\320\266\320\265\320\275\320\270\321\217.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\230\320\275\320\270\321\206\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217\320\236\320\272\321\200\321\203\320\266\320\265\320\275\320\270\321\217.os" index 9d68d080..2a6839ed 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\230\320\275\320\270\321\206\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217\320\236\320\272\321\200\321\203\320\266\320\265\320\275\320\270\321\217.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\230\320\275\320\270\321\206\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217\320\236\320\272\321\200\321\203\320\266\320\265\320\275\320\270\321\217.os" @@ -20,10 +20,10 @@ Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт ТекстОписания = - " инициализируем базу данных для выполнения необходимых тестов. - | указываем путь к исходниками с конфигурацией, - | указываем версию платформы, которую хотим использовать, - | и получаем по пути build\ib готовую базу для тестирования."; + " Инициализация базы данных для выполнения необходимых тестов. + | Указываем путь к исходникам с конфигурацией, + | указываем версию платформы, которую хотим использовать, + | и получаем по пути build\ib готовую базу для тестирования."; ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, ТекстОписания); @@ -31,7 +31,7 @@ Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--dt", "Путь к файлу с dt выгрузкой"); Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "--dev", "Признак dev режима, создаем и загружаем автоматом структуру конфигурации"); Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "--storage", "Признак обновления из хранилища"); - Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-name", "Строка подключения к хранилище"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-name", "Строка подключения к хранилищу"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-user", "Пользователь хранилища"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-pwd", "Пароль"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-ver", "Номер версии, по умолчанию берем последнюю"); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\236\320\261\320\275\320\276\320\262\320\270\321\202\321\214\320\230\320\267\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\236\320\261\320\275\320\276\320\262\320\270\321\202\321\214\320\230\320\267\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260.os" index 1cf59bab..812b43dd 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\236\320\261\320\275\320\276\320\262\320\270\321\202\321\214\320\230\320\267\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\236\320\261\320\275\320\276\320\262\320\270\321\202\321\214\320\230\320\267\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260.os" @@ -27,7 +27,7 @@ ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, ТекстОписания); - Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-name", "Строка подключения к хранилище"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-name", "Строка подключения к хранилищу"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-user", "Пользователь хранилища"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-pwd", "Пароль"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-ver", "Номер версии, по умолчанию берем последнюю"); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\236\320\261\320\275\320\276\320\262\320\270\321\202\321\214\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\321\216.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\236\320\261\320\275\320\276\320\262\320\270\321\202\321\214\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\321\216.os" index d8d00430..9bf8007b 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\236\320\261\320\275\320\276\320\262\320\270\321\202\321\214\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\321\216.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\236\320\261\320\275\320\276\320\262\320\270\321\202\321\214\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\321\216.os" @@ -22,8 +22,8 @@ Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт ТекстОписания = - " Обновить конфигурацию, находящуюся на поддержке - | или объединить конфигурацию с файлом (с использованием файла настроек). + " Обновление конфигурации, находящейся на поддержке, + | или объединение конфигурации с файлом (с использованием файла настроек). | "; ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, @@ -59,7 +59,6 @@ Исключение Лог = Логирование.ПолучитьЛог(ПараметрыСистемы.ИмяЛогаСистемы()); КонецПопытки; - Лог.УстановитьУровень(УровниЛога.Отладка); Лог.Информация("Начинаю объединение конфигураций"); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270\320\221\320\224.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270\320\221\320\224.os" index 46f14795..498cda94 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270\320\221\320\224.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270\320\221\320\224.os" @@ -19,7 +19,7 @@ Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт ТекстОписания = - " Обновление конфигурации базы данных в режиме Конфигуратора + " Обновление конфигурации базы данных в режиме Конфигуратора. | "; ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265\320\236\320\272\321\200\321\203\320\266\320\265\320\275\320\270\321\217.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265\320\236\320\272\321\200\321\203\320\266\320\265\320\275\320\270\321\217.os" index 705239c6..50dbdc2a 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265\320\236\320\272\321\200\321\203\320\266\320\265\320\275\320\270\321\217.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265\320\236\320\272\321\200\321\203\320\266\320\265\320\275\320\270\321\217.os" @@ -16,10 +16,10 @@ Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт ТекстОписания = - " обновляет базу данных для выполнения необходимых тестов. - | указываем путь к исходниками с конфигурацией, - | указываем версию платформы, которую хотим использовать, - | и получаем по пути build\ib готовую базу для тестирования."; + " Обновление базы данных для выполнения необходимых тестов. + | Указываем путь к исходникам с конфигурацией, + | указываем версия платформы, которую хотим использовать, + | и получаем по пути build\ib готовую базу для тестирования."; ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, ТекстОписания); @@ -27,7 +27,7 @@ Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--dt", "Путь к файлу с dt выгрузкой"); Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "--dev", "Признак dev режима, создаем и загружаем автоматом структуру конфигурации"); Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "--storage", "Признак обновления из хранилища"); - Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-name", "Строка подключения к хранилище"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-name", "Строка подключения к хранилищу"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-user", "Пользователь хранилища"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-pwd", "Пароль"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-ver", "Номер версии, по умолчанию берем последнюю"); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\320\271.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\320\271.os" index 4aab23f8..3969204b 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\320\271.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\320\271.os" @@ -18,7 +18,7 @@ Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт ТекстОписания = - " обновляем расширение в ИБ + " Обновление расширения в ИБ. | "; ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, ТекстОписания); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\236\320\261\321\212\320\265\320\264\320\270\320\275\320\270\321\202\321\214\320\241\320\244\320\260\320\271\320\273\320\276\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\236\320\261\321\212\320\265\320\264\320\270\320\275\320\270\321\202\321\214\320\241\320\244\320\260\320\271\320\273\320\276\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" index a161c579..0cb2e3d1 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\236\320\261\321\212\320\265\320\264\320\270\320\275\320\270\321\202\321\214\320\241\320\244\320\260\320\271\320\273\320\276\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\236\320\261\321\212\320\265\320\264\320\270\320\275\320\270\321\202\321\214\320\241\320\244\320\260\320\271\320\273\320\276\320\274\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" @@ -21,7 +21,7 @@ Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт ТекстОписания = - " Объединить cf-файл c конфигурацией из инф.базы. + " Объединение cf-файла c конфигурацией из инф.базы. | "; ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\270\321\202\321\214\321\201\321\217\320\232\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\321\203.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\270\321\202\321\214\321\201\321\217\320\232\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\321\203.os" index b2226491..9037cdaf 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\270\321\202\321\214\321\201\321\217\320\232\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\321\203.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\270\321\202\321\214\321\201\321\217\320\232\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\321\203.os" @@ -67,7 +67,7 @@ ); ИгнорироватьНаличиеПодключеннойБД = ПараметрыКоманды["--BindAlreadyBindedUser"]; - ЗаменитьКонфигурациюБД = ПараметрыКоманды["--NotReplaceCfg"]; + ЗаменитьКонфигурациюБД = Не ПараметрыКоманды["--NotReplaceCfg"]; Попытка МенеджерКонфигуратора.ПодключитьсяКХранилищу( diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\320\276\320\274\320\265\321\201\321\202\320\270\321\202\321\214\320\222\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\320\276\320\274\320\265\321\201\321\202\320\270\321\202\321\214\320\222\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265.os" index 03e06038..2ba5812c 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\320\276\320\274\320\265\321\201\321\202\320\270\321\202\321\214\320\222\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\320\276\320\274\320\265\321\201\321\202\320\270\321\202\321\214\320\222\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\265.os" @@ -26,7 +26,7 @@ ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, ТекстОписания); - Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-name", "Строка подключения к хранилище"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-name", "Строка подключения к хранилищу"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-user", "Пользователь хранилища"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-pwd", "Пароль"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--objects", "Имя файла со списком объектов. @@ -37,7 +37,7 @@ | Подробнее о формате файла см в документации http://its.1c.ru/db/v838doc#bookmark:adm:TI000000564"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--comment", "Текст комментария"); Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "--keepLocked", "Оставлять захват для помещенных объектов"); - Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "--force", "если опция используется, при обнаружении ссылок на удаленные объекты будет выполнена попытка их очистить. + Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "--force", "Если опция используется, при обнаружении ссылок на удаленные объекты будет выполнена попытка их очистить. | Если опция не указана, при обнаружении ссылок на удаленные объекты будет выдана ошибка"); Парсер.ДобавитьКоманду(ОписаниеКоманды); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\237\321\200\320\276\320\265\320\272\321\202\320\260EDT.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\237\321\200\320\276\320\265\320\272\321\202\320\260EDT.os" index 523239f0..38bef28d 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\237\321\200\320\276\320\265\320\272\321\202\320\260EDT.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\237\321\200\320\276\320\265\320\272\321\202\320\260EDT.os" @@ -4,32 +4,15 @@ #Использовать json Перем Лог; -Перем ПарсерJSON; - -Перем РабочаяОбласть; -Перем СписокПапокСПроектами; -Перем СписокИменПроектов; -Перем ВерсияEDT; - -Перем КаталогОтчетов; -Перем ПутьКФайламПроекта; - -Перем ИмяФайлаРезультата; -Перем УдалятьФайлРезультата; -Перем ИмяПредыдущегоФайлаРезультата; -Перем ИсключенияВОшибках; -Перем ПропускиВОшибках; - -Перем кэш; - /////////////////////////////////////////////////////////////////////////////////////////////////// // Прикладной интерфейс Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт - ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, "Проверка проекта EDT"); - Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--allure-results", - "Путь к каталогу результатов Allure"); + ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, " Проверка проекта EDT."); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--junitpath", "Путь отчета в формате JUnit"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--allure-results", "Путь к каталогу сохранения результатов тестирования в формате Allure (xml)"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--allure-results2", "Путь к каталогу сохранения результатов тестирования в формате Allure2 (json)"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--exception-file", "Путь файла с указанием пропускаемых ошибок. Необязательный аргумент. | Формат файла: в каждой строке файла указан текст пропускаемого исключения или его часть @@ -89,65 +72,31 @@ Лог = ДополнительныеПараметры.Лог; - ИнициализацияПараметров( ПараметрыКоманды ); - - Если ЗначениеЗаполнено( ИмяПредыдущегоФайлаРезультата ) Тогда - - тзРезультатПред = ПрочитатьТаблицуИзФайлаРезультата( ИмяПредыдущегоФайлаРезультата ); - + ПутьОтчетаВФорматеJUnitxml = ПараметрыКоманды["--junitpath"]; + Если ПутьОтчетаВФорматеJUnitxml = Неопределено Тогда + ПутьОтчетаВФорматеJUnitxml = ""; КонецЕсли; - Успешно = ВыполнитьПроверкуEDT(); - - тзРезультат = ПрочитатьТаблицуИзФайлаРезультата( ИмяФайлаРезультата ); - - УдалитьФайлРезультатовПриНеобходимости(); - - Если ЗначениеЗаполнено( ИмяПредыдущегоФайлаРезультата ) Тогда - - тзРезультат = РазностнаяТаблицаРезультатов( тзРезультатПред, тзРезультат ); - + ПутьОтчетаВФорматеAllure = ПараметрыКоманды["--allure-results"]; + Если ПутьОтчетаВФорматеAllure = Неопределено Тогда + ПутьОтчетаВФорматеAllure = ""; КонецЕсли; - - СоздатьФайлыПоТаблицеПроверки(тзРезультат); - - РезультатыКоманд = МенеджерКомандПриложения.РезультатыКоманд(); - - Возврат ?(Успешно, РезультатыКоманд.Успех, РезультатыКоманд.ОшибкаВремениВыполнения); - -КонецФункции -// { приватная часть - -Процедура ИнициализацияПараметров( Знач ПараметрыКоманды ) - - Лог.Отладка("Чтение параметров"); - - КаталогОтчетов = ПараметрыКоманды["--allure-results"]; - - Если КаталогОтчетов = Неопределено Тогда - - КаталогОтчетов = ""; - Лог.Отладка(" Каталог отчетов (--allure-results) не задан."); - - Иначе - - Лог.Отладка(" Каталог отчетов (--allure-results): %1", КаталогОтчетов); - + ПутьОтчетаВФорматеAllure2 = ПараметрыКоманды["--allure-results2"]; + Если ПутьОтчетаВФорматеAllure2 = Неопределено Тогда + ПутьОтчетаВФорматеAllure2 = ""; КонецЕсли; + СохранятьОтчетВФайл = ЗначениеЗаполнено(ПутьОтчетаВФорматеJUnitxml) + ИЛИ ЗначениеЗаполнено(ПутьОтчетаВФорматеAllure) + ИЛИ ЗначениеЗаполнено(ПутьОтчетаВФорматеAllure2); + ВерсияEDT = ПараметрыКоманды["--EDTversion"]; РабочаяОбласть = ПараметрыКоманды["--workspace-location"]; СписокПапокСПроектами = ПараметрыКоманды["--project-list"]; СписокИменПроектов = ПараметрыКоманды["--project-name-list"]; ПутьКФайламПроекта = ПараметрыКоманды["--project-url"]; - Лог.Отладка(" Версия EDT (--EDTversion): %1", Строка( ВерсияEDT ) ); - Лог.Отладка(" Рабочая область (--workspace-location): %1", Строка( РабочаяОбласть ) ); - Лог.Отладка(" Список папок с проектами (--project-list): %1", Строка( СписокПапокСПроектами ) ); - Лог.Отладка(" Список имен проектов (--project-name-list): %1", Строка( СписокИменПроектов ) ); - Лог.Отладка(" Путь к файлам проекта (--project-url): %1", Строка( ПутьКФайламПроекта ) ); - ИмяФайлаРезультата = ПараметрыКоманды["--validation-result"]; УдалятьФайлРезультата = Ложь; @@ -155,37 +104,72 @@ ИмяФайлаРезультата = ПолучитьИмяВременногоФайла("out"); УдалятьФайлРезультата = Истина; - Лог.Отладка(" Файл результата не задан (--validation-result). Будет использован временный файл."); КонецЕсли; - Лог.Отладка(" Файл результата (--validation-result): %1", ИмяФайлаРезультата); - + ИмяФайлаИсключенийОшибок = ПараметрыКоманды["--exception-file"]; + ИмяПредыдущегоФайлаРезультата = ПараметрыКоманды["--prev-validation-result"]; - Лог.Отладка(" Файл предыдущего результата (--prev-validation-result): %1", Строка( ИмяПредыдущегоФайлаРезультата )); + ДатаНачала = ТекущаяДата(); + Успешно = ВыполнитьПроверкуEDT(РабочаяОбласть, ИмяФайлаРезультата, СписокПапокСПроектами, СписокИменПроектов, ВерсияEDT); - ИсключенияВОшибках = ИсключаемыеОшибки(); - ПропускиВОшибках = СодержимоеФайлаПропускаемыхОшибок( ПараметрыКоманды["--exception-file"] ); + Если СохранятьОтчетВФайл Тогда + + РезультатТестирования = ОбработатьЛогОшибок(ДатаНачала, ИмяФайлаРезультата, ИмяФайлаИсключенийОшибок, ИмяПредыдущегоФайлаРезультата); + ОшибокНет = РезультатТестирования.Количество() = 0; + Если ЗначениеЗаполнено(ПутьОтчетаВФорматеAllure) Тогда + + Лог.Информация("Генерация отчета Allure"); + ГенерацияОтчетов.СформироватьОтчетВФорматеAllure(ОшибокНет, РезультатТестирования.ДатаНачала, РезультатТестирования, ПутьОтчетаВФорматеAllure, "EDT"); + + КонецЕсли; + + Если ЗначениеЗаполнено(ПутьОтчетаВФорматеAllure2) Тогда + + Лог.Информация("Генерация отчета Allure2"); + ГенерацияОтчетов.СформироватьОтчетВФорматеAllure2(ОшибокНет, РезультатТестирования.ДатаНачала, РезультатТестирования, ПутьОтчетаВФорматеAllure2, "EDT", ПутьКФайламПроекта); + + КонецЕсли; + + Если ЗначениеЗаполнено(ПутьОтчетаВФорматеJUnitxml) Тогда + + Лог.Информация("Генерация отчета JUnit"); + ГенерацияОтчетов.СформироватьОтчетВФорматеJUnit(ОшибокНет, РезультатТестирования, ПутьОтчетаВФорматеJUnitxml, "edt"); + + КонецЕсли; + + КонецЕсли; - ПарсерJSON = Новый ПарсерJSON(); + Если УдалятьФайлРезультата Тогда + + ОбщиеМетоды.УдалитьФайлЕслиОнСуществует(ИмяФайлаРезультата); + + КонецЕсли; + + РезультатыКоманд = МенеджерКомандПриложения.РезультатыКоманд(); + Возврат ?(Успешно, РезультатыКоманд.Успех, РезультатыКоманд.ОшибкаВремениВыполнения); -КонецПроцедуры +КонецФункции -Функция ВыполнитьПроверкуEDT() +/////////////////////////////////////////////////////////////////////////////////////////////////// + +Функция ВыполнитьПроверкуEDT(Знач РабочаяОбласть, ИмяФайлаРезультата, СписокПапокСПроектами, СписокИменПроектов, ВерсияEDT) - Если Не ЗначениеЗаполнено( РабочаяОбласть ) Тогда - - Лог.Информация( "Рабочая область (--workspace-location) не указана. Проверка проекта пропущена." ); + Если Не ЗначениеЗаполнено(РабочаяОбласть) Тогда + Лог.Информация("Рабочая область (--workspace-location) не указана. Проверка проекта пропущена."); Возврат Истина; КонецЕсли; - Если Не ЗначениеЗаполнено( СписокПапокСПроектами ) - И Не ЗначениеЗаполнено( СписокИменПроектов ) Тогда + ФайлРабочаяОбласть = Новый Файл(РабочаяОбласть); + РабочаяОбласть = ФайлРабочаяОбласть.ПолноеИмя; + + Если Не ЗначениеЗаполнено(СписокПапокСПроектами) + И Не ЗначениеЗаполнено(СписокИменПроектов) Тогда - Лог.Информация( "Проекты к проверке (--project-list или project-name-list) не указаны. Проверка проекта пропущена." ); + Лог.Информация("Проекты к проверке (--project-list или project-name-list) не указаны. Проверка проекта пропущена."); Возврат Истина; @@ -194,43 +178,31 @@ Попытка // Для EDT критично, чтобы файла не существовало - ОбщиеМетоды.УдалитьФайлЕслиОнСуществует( ИмяФайлаРезультата ); + ОбщиеМетоды.УдалитьФайлЕслиОнСуществует(ИмяФайлаРезультата); Команда = Новый Команда; + Команда.УстановитьСтрокуЗапуска(СтрШаблон("ring edt%1 workspace validate", ?(ПустаяСтрока(ВерсияEDT), "", "@" + ВерсияEDT))); + Команда.УстановитьКодировкуВывода(КодировкаТекста.ANSI); + Команда.ДобавитьПараметр("--workspace-location " + ОбщиеМетоды.ОбернутьПутьВКавычки(РабочаяОбласть)); + Команда.ДобавитьПараметр("--file " + ОбщиеМетоды.ОбернутьПутьВКавычки(ИмяФайлаРезультата)); - Если ЗначениеЗаполнено( ВерсияEDT ) Тогда - - строкаЗапуска = СтрШаблон( "ring edt@%1 workspace validate", ВерсияEDT ); - - Иначе - - строкаЗапуска = "ring edt workspace validate"; - - КонецЕсли; - - Команда.УстановитьСтрокуЗапуска( строкаЗапуска ); - Команда.УстановитьКодировкуВывода( КодировкаТекста.ANSI ); - Команда.ДобавитьПараметр( "--workspace-location " + ОбщиеМетоды.ОбернутьПутьВКавычки( РабочаяОбласть ) ); - Команда.ДобавитьПараметр( "--file " + ОбщиеМетоды.ОбернутьПутьВКавычки( ИмяФайлаРезультата ) ); - - Если ЗначениеЗаполнено( СписокПапокСПроектами ) Тогда - Команда.ДобавитьПараметр("--project-list " + ОбщиеМетоды.ОбернутьПутьВКавычки( СписокПапокСПроектами ) ); + Если ЗначениеЗаполнено(СписокПапокСПроектами) Тогда + Команда.ДобавитьПараметр("--project-list " + ОбщиеМетоды.ОбернутьПутьВКавычки(СписокПапокСПроектами)); КонецЕсли; - Если ЗначениеЗаполнено( СписокИменПроектов ) Тогда - Команда.ДобавитьПараметр("--project-name-list " + ОбщиеМетоды.ОбернутьПутьВКавычки( СписокИменПроектов ) ); + Если ЗначениеЗаполнено(СписокИменПроектов) Тогда + Команда.ДобавитьПараметр("--project-name-list " + ОбщиеМетоды.ОбернутьПутьВКавычки(СписокИменПроектов)); КонецЕсли; - Лог.Информация( "Начало проверки EDT-проекта" ); - началоЗамера = ТекущаяДата(); + Лог.Информация("Начало проверки EDT-проекта"); + НачалоЗамера = ТекущаяДата(); КодВозврата = Команда.Исполнить(); - Лог.Информация( "Проверка EDT-проекта завершена за %1с", Окр( ТекущаяДата() - началоЗамера ) ); + Лог.Информация("Проверка EDT-проекта завершена за %1с", Окр(ТекущаяДата() - НачалоЗамера)); Исключение - УдалитьФайлРезультатовПриНеобходимости(); ВызватьИсключение ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; @@ -239,58 +211,32 @@ КонецФункции -Процедура УдалитьФайлРезультатовПриНеобходимости() +Функция ОбработатьЛогОшибок(ДатаНачала, ПутьКФайлуЛогаОшибок, ИмяФайлаИсключенийОшибок, ИмяПредыдущегоФайлаРезультата) - Если УдалятьФайлРезультата Тогда - - ОбщиеМетоды.УдалитьФайлЕслиОнСуществует(ИмяФайлаРезультата); - - КонецЕсли; + РезультатТестирования = Новый Структура; + РезультатТестирования.Вставить("Ошибки", Новый Соответствие); + РезультатТестирования.Вставить("ВсеОшибки", ""); + РезультатТестирования.Вставить("ДатаНачала", ДатаНачала); + РезультатТестирования.Вставить("КоличествоПроверок", 0); + РезультатТестирования.Вставить("КоличествоПропущено", 0); + РезультатТестирования.Вставить("КоличествоУпало", 0); -КонецПроцедуры - -Функция СодержимоеФайлаПропускаемыхОшибок( Знач ИмяФайлаПропускаемыхОшибок ) - - Результат = Новый Массив; - - Если Не ЗначениеЗаполнено( ИмяФайлаПропускаемыхОшибок ) Тогда - Лог.Информация( "Файл пропускаемых ошибок (--exception-file) не указан. Пропуски не используются." ); - Возврат Результат; - КонецЕсли; - - Файл = Новый Файл( ИмяФайлаПропускаемыхОшибок ); + Файл = Новый Файл(ПутьКФайлуЛогаОшибок); Если Не Файл.Существует() Тогда - // Отсутствие этого файла не критично, поэтому обойдемся без исключений - - Лог.Предупреждение( "Файл пропускаемых ошибок (--exception-file) %1 не найден.", ИмяФайлаПропускаемыхОшибок ); + // Файла может не быть если + // 1) Нет ошибок (EDT просто не создает файл результата) + // 2) EDT вернул ошибку + // 3) Проверка EDT не запускалась, выполняется только построение отчета Аллюр - Возврат Результат; + Возврат РезультатТестирования; КонецЕсли; - - Лог.Отладка( "Чтение файла пропускаемых ошибок из %1", ИмяФайлаПропускаемыхОшибок ); - - ЧтениеТекста = Новый ЧтениеТекста( ИмяФайлаПропускаемыхОшибок, КодировкаТекста.UTF8 ); - ПрочитаннаяСтрока = ЧтениеТекста.ПрочитатьСтроку(); - Пока ПрочитаннаяСтрока <> Неопределено Цикл - Если Не ПустаяСтрока(ПрочитаннаяСтрока) Тогда - пропуск = СокрЛП(НРег(ПрочитаннаяСтрока)); - Результат.Добавить(пропуск); - Лог.Отладка("Добавлено в пропуски: %1", пропуск); - КонецЕсли; - ПрочитаннаяСтрока = ЧтениеТекста.ПрочитатьСтроку(); - КонецЦикла; - - ЧтениеТекста.Закрыть(); - - Лог.Отладка("Прочитано пропусков: %1", Результат.Количество()); - - Возврат Результат; - -КонецФункции -Функция ИсключаемыеОшибки() + ФайлЛога = Новый ТекстовыйДокумент(); + ФайлЛога.Прочитать(ПутьКФайлуЛогаОшибок, КодировкаТекста.UTF8); + + ЛогПроверкиИзКонфигуратора = ФайлЛога.ПолучитьТекст(); // Определяем строки для исключения из ошибок // См. стандарт "Обработчики событий модуля формы, подключаемые из кода" @@ -298,116 +244,49 @@ МассивСтрокИсключений = Новый Массив(); МассивСтрокИсключений.Добавить(Нрег("Неиспользуемый метод ""Подключаемый_")); МассивСтрокИсключений.Добавить(Нрег("Пустой обработчик: ""Подключаемый_")); + МассивСтрокИсключений.Добавить(Нрег("Empty handler: ""Attachable_")); - Возврат МассивСтрокИсключений; - -КонецФункции - - -// Создание таблицы результата -Функция ПрочитатьТаблицуИзФайлаРезультата( Знач пПутьКФайлу ) - - Лог.Отладка( "Чтение файла результата %1", пПутьКФайлу ); + ПропускаемыеОшибки = СодержимоеФайлаИсключенийОшибок(ИмяФайлаИсключенийОшибок); + СтарыеОшибки = СодержимоеПрошлогоОтчетаОбОшибках(ИмяПредыдущегоФайлаРезультата); - тз = Новый ТаблицаЗначений; - тз.Колонки.Добавить( "ДатаОбнаружения" ); - тз.Колонки.Добавить( "Тип" ); - тз.Колонки.Добавить( "Проект" ); - тз.Колонки.Добавить( "Метаданные" ); - тз.Колонки.Добавить( "Положение" ); - тз.Колонки.Добавить( "Описание" ); - - Файл = Новый Файл( пПутьКФайлу ); - Если Не Файл.Существует() Тогда - - // Файла может не быть если - // 1) Это первый запуск получение разностной таблицы - // 2) Нет ошибок (EDT просто не создает файл результата) - // 3) EDT вернул ошибку - // 4) Проверка EDT не запускалась, выполняется только построение отчета Аллюр - // По пунктам 1-3 стоит вернуть пустую таблицу, - // по 4 не все так однозначно, но если и вызывать исключение, то при инициализации параметров - - Лог.Информация( "Файл отчета об ошибках %1 не найден.", пПутьКФайлу ); - - Возврат тз; + Для Каждого ТекСтрока Из СтрРазделить(ЛогПроверкиИзКонфигуратора, Символы.ПС) Цикл - КонецЕсли; - - - ЧтениеТекста = Новый ЧтениеТекста( пПутьКФайлу, КодировкаТекста.UTF8 ); - - ПрочитаннаяСтрока = ЧтениеТекста.ПрочитатьСтроку(); - - Пока Не ПрочитаннаяСтрока = Неопределено Цикл - - Если ПустаяСтрока( ПрочитаннаяСтрока ) Тогда - - Продолжить; - - КонецЕсли; - - Если СтрокаВходитВМассив( ПрочитаннаяСтрока, ИсключенияВОшибках ) Тогда - ПрочитаннаяСтрока = ЧтениеТекста.ПрочитатьСтроку(); + СтарыеОшибки.Удалить(ТекСтрока); // оставим только разницу + Если ИсключитьСтроку(ТекСтрока, МассивСтрокИсключений) Тогда Продолжить; КонецЕсли; - компонентыСтроки = СтрРазделить( ПрочитаннаяСтрока, " " ); - - новСтрока = тз.Добавить(); - - Для ц = 0 По 4 Цикл - - новСтрока[ц] = компонентыСтроки[ц]; - - КонецЦикла; - - // В описании могут быть и табы, по которым делим + РезультатТестирования.ВсеОшибки = РезультатТестирования.ВсеОшибки + ТекСтрока + Символы.ПС; + + ОписаниеОшибки = ПолучитьОписаниеОшибки(ТекСтрока); + ДополнитьРезультатТекстомОшибки(РезультатТестирования, ОписаниеОшибки, ПропускаемыеОшибки, ТекСтрока); - Для ц = 5 По компонентыСтроки.ВГраница() Цикл - - Если ЗначениеЗаполнено( новСтрока.Описание ) Тогда - - новСтрока.Описание = новСтрока.Описание + " "; - - Иначе - - новСтрока.Описание = ""; - - КонецЕсли; - - новСтрока.Описание = новСтрока.Описание + компонентыСтроки[ц]; - - КонецЦикла; + КонецЦикла; + + // старые ошибки пометим как исправленные + Для Каждого ТекСтрока Из СтарыеОшибки Цикл - Если СтрокаВходитВМассив( ПрочитаннаяСтрока, ПропускиВОшибках ) Тогда - - новСтрока.Тип = ТипОшибки_Пропущено(); - + Если ИсключитьСтроку(ТекСтрока.Ключ, МассивСтрокИсключений) Тогда + Продолжить; КонецЕсли; - ПрочитаннаяСтрока = ЧтениеТекста.ПрочитатьСтроку(); + ОписаниеОшибки = ПолучитьОписаниеОшибки(ТекСтрока.Ключ, "Исправлено"); + ДополнитьРезультатТекстомОшибки(РезультатТестирования, ОписаниеОшибки); КонецЦикла; - - ЧтениеТекста.Закрыть(); - - Лог.Отладка("Из файла %1 прочитано %2 строк", пПутьКФайлу, тз.Количество()); - - Возврат тз; - + + Возврат РезультатТестирования; + КонецФункции -//Проверяет вхождение строк из массива в проверямой строке. -//Параметры: -// ПроверяемаяСтрока - Строка - строка для проверки. -// МассивСтрокИсключений - Массив - массив строк, для проверки. -// -//Возвращаемое значение: -// Булево - Истина, в проверяемой строке содежрится один из элементов массив. -// Ложь, не нашли -Функция СтрокаВходитВМассив( Знач ПроверяемаяСтрока, Знач МассивСтрокИсключений ) +Функция ИсключитьСтроку(Знач ПроверяемаяСтрока, Знач МассивСтрокИсключений) + Если ПустаяСтрока(ПроверяемаяСтрока) Тогда + + Возврат Истина; + + КонецЕсли; + Для Каждого СтрИсключения Из МассивСтрокИсключений Цикл Если СтрНайти(Нрег(ПроверяемаяСтрока), СтрИсключения) > 0 Тогда @@ -422,464 +301,143 @@ КонецФункции -Функция РазностнаяТаблицаРезультатов( Знач пТЗ_пред, Знач пТЗ_нов ) - - тз_стар = пТЗ_пред.Скопировать(); - тз_стар.Колонки.Добавить("Изменение"); - тз_стар.ЗаполнитьЗначения(1, "Изменение" ); - - тз = пТЗ_нов.Скопировать(); - тз.Колонки.Добавить("Изменение"); - тз.ЗаполнитьЗначения( - 1, "Изменение" ); - - Для Каждого цСтрока Из тз_стар Цикл - - ЗаполнитьЗначенияСвойств( тз.Добавить(), цСтрока ); - - КонецЦикла; - - тз.Свернуть( "Тип,Проект,Метаданные,Положение,Описание" , "Изменение" ); +Функция ПолучитьОписаниеОшибки(Знач СтрокаЛога, Знач ТипОшибки = "") - Для Каждого цСтрока Из тз Цикл - - Если цСтрока.Изменение = 0 Тогда - - // есть и в старой и в новой таблице - цСтрока.Тип = ТипОшибки_Пропущено(); - - ИначеЕсли цСтрока.Изменение > 0 Тогда - - // есть только в старой - цСтрока.Тип = ТипОшибки_Исправлено(); - - Иначе - - // Внесли новую ошибку - - КонецЕсли; - - КонецЦикла; - - Возврат тз; - -КонецФункции - -Функция ТипОшибки_Пропущено() - Возврат "Пропущено"; -КонецФункции - -Функция ТипОшибки_Исправлено() - Возврат "Исправлено"; -КонецФункции - -// Создание файлов для отчета Allure - -Процедура СоздатьФайлыПоТаблицеПроверки(Знач пТаблицаПроверки) - - Если Не ЗначениеЗаполнено( КаталогОтчетов ) Тогда - - Лог.Отладка("Каталог отчетов (--allure-results) не указан. Создание отчета Allure пропущено."); - - Возврат; - + АнализируемаяСтрока = СокрЛП(СтрокаЛога); + ЭлементыСтроки = СтрРазделить(АнализируемаяСтрока, Символы.Таб); + Если Не ЗначениеЗаполнено(ТипОшибки) Тогда + ТипОшибки = ЭлементыСтроки.Получить(1); КонецЕсли; - началоЗамера = ТекущаяДата(); - - Лог.Отладка("Создание файлов в каталоге %1.", КаталогОтчетов); - Лог.Отладка(" Очистка каталога %1.", КаталогОтчетов); - - УдалитьФайлы( КаталогОтчетов, "*.json" ); - - Лог.Отладка(" Создание файлов json по таблице проверки в каталоге %1.", КаталогОтчетов); - - количествоСозданныхФайлов = 0; - - Для Каждого цСтрока Из пТаблицаПроверки Цикл - - СтруктураВыгрузки = ПолучитьОписаниеСценарияАллюр2(); - СтруктураВыгрузки.name = цСтрока.Метаданные + ". " + цСтрока.Положение + ": " + цСтрока.Описание; - СтруктураВыгрузки.fullName = СтруктураВыгрузки.name; - СтруктураВыгрузки.historyId = цСтрока.Метаданные + ". " + цСтрока.Положение + ": " + цСтрока.Описание; - СтруктураВыгрузки.Вставить( "description", цСтрока.Описание ); - - Если цСтрока.Тип = "Ошибка" Тогда - - СтруктураВыгрузки.status = "failed"; - - ИначеЕсли цСтрока.Тип = "Предупреждение" Тогда - - СтруктураВыгрузки.status = "broken"; - - ИначеЕсли цСтрока.Тип = "Пропущено" Тогда - - СтруктураВыгрузки.status = "skipped"; - - ИначеЕсли цСтрока.Тип = "Исправлено" Тогда - - СтруктураВыгрузки.status = "passed"; - - КонецЕсли; - - структ = Новый Структура( "name,value", "package", цСтрока.Метаданные ); - СтруктураВыгрузки.labels.Добавить( структ ); - - Для Каждого цКонтекст Из ПолучитьКонтексты( цСтрока.Описание ) Цикл - - структ = Новый Структура( "name,value", "tag", цКонтекст ); - СтруктураВыгрузки.labels.Добавить( структ ); - - КонецЦикла; - - структ = Новый Структура( "name,value", "story", ОписаниеФункциональности( цСтрока.Описание ) ); - СтруктураВыгрузки.labels.Добавить( структ ); - - ссылкаНаСтроку = ПолучитьСсылкуНаСтроку( цСтрока.Метаданные, цСтрока.Положение ); - - Если ЗначениеЗаполнено( ссылкаНаСтроку ) Тогда - - ОписаниеСсылки = Новый Структура("name,url,type"); - ОписаниеСсылки.name = "Перейти на строку с ошибкой"; - ОписаниеСсылки.url = ссылкаНаСтроку; - ОписаниеСсылки.type = ""; - - СтруктураВыгрузки.links.Добавить( ОписаниеСсылки ); - - КонецЕсли; - - РеальноеИмяФайла = ОбъединитьПути( КаталогОтчетов, "" + СтруктураВыгрузки.uuid + "-result.json" ); + ИмяГруппы = ЭлементыСтроки.Получить(3); + НомерСтроки = СокрЛП(СтрЗаменить(ЭлементыСтроки.Получить(4), "строка", "")); + Для Ит = 0 По 4 Цикл - ЗаписатьФайлJSON( РеальноеИмяФайла, СтруктураВыгрузки); - - количествоСозданныхФайлов = количествоСозданныхФайлов + 1; + ЭлементыСтроки.Удалить(0); КонецЦикла; - - лог.Отладка( " Созданы файлы отчетов (%1) в каталоге %2 за %3с", количествоСозданныхФайлов, КаталогОтчетов, Окр( ТекущаяДата() - началоЗамера )); - - СоздатьФайлКатегорий(); - -КонецПроцедуры -Процедура СоздатьФайлКатегорий() - - имяФайлаКатегорий = ОбъединитьПути( КаталогОтчетов, "categories.json" ); + ТекстОшибки = СокрЛП(СтрСоединить(ЭлементыСтроки, Символы.Таб)); + Возврат ШаблонОписанияОшибки(ИмяГруппы, ТекстОшибки, НомерСтроки, ТипОшибки); - Лог.Отладка(" Создание файла категорий %1.", имяФайлаКатегорий); - - категории = Новый Массив; - - категории.Добавить( ОписаниеКатегории( "Ошибка", "failed" ) ); - категории.Добавить( ОписаниеКатегории( "Предупреждение", "broken" ) ); - категории.Добавить( ОписаниеКатегории( "Пропущено", "skipped" ) ); - категории.Добавить( ОписаниеКатегории( "Исправлено", "passed" ) ); - - ЗаписатьФайлJSON( имяФайлаКатегорий, категории); - -КонецПроцедуры +КонецФункции -Функция ОписаниеКатегории( Знач пНаименование, Знач пСтатус ) +Функция ШаблонОписанияОшибки(ИмяПоУмолчанию = "", ТекстОшибки = "", НомерСтроки = 0, ТипОшибки = "Ошибка") - массивСтатусов = Новый Массив; - массивСтатусов.Добавить( пСтатус ); - Возврат Новый Структура( "name,matchedStatuses", пНаименование, массивСтатусов ); + Возврат Новый Структура("ТекстОшибки, ИмяГруппы, НомерСтроки, ТипОшибки", ТекстОшибки, ИмяПоУмолчанию, НомерСтроки, ТипОшибки); КонецФункции -Функция ПолучитьКонтексты( Знач пОписание ) - - начало = СтрНайти( пОписание, "[" ); - конец = СтрНайти( пОписание, "]", НаправлениеПоиска.СКонца ); +Процедура ДополнитьРезультатТекстомОшибки(Результат, ОписаниеОшибки, Знач ПропускаемыеОшибки = Неопределено, СтрокаЛога = "") - Если начало < конец - И конец > 0 Тогда - - стрКонтексты = Сред( пОписание, начало + 1, конец - начало - 1 ); - - Возврат СтрРазделить( стрКонтексты, "," ); - - Иначе + Если СледуетПропуститьОшибку(СтрокаЛога, ПропускаемыеОшибки) Тогда - Возврат Новый Массив; + ОписаниеОшибки.ТипОшибки = "Пропущено"; КонецЕсли; - -КонецФункции -Функция ОписаниеФункциональности( Знач пОписание ) - - начало = СтрНайти( пОписание, "[" ); + ОшибкиГруппы = Результат.Ошибки.Получить(ОписаниеОшибки.ИмяГруппы); - Если начало > 0 Тогда - - описаниеБезКонтекста = Лев( пОписание, начало - 1 ); - - Иначе + Если ОшибкиГруппы = Неопределено Тогда - описаниеБезКонтекста = пОписание; + ОшибкиГруппы = Новый Соответствие(); КонецЕсли; - ПозицияКавычки = СтрНайти( описаниеБезКонтекста, """" ); - - Пока ПозицияКавычки > 0 Цикл - - ПозицияЗакрывающейКавычки = СтрНайти( Сред( описаниеБезКонтекста, ПозицияКавычки + 1 ), """" ) + ПозицияКавычки; + ОшибкиПоТипу = ОшибкиГруппы.Получить(ОписаниеОшибки.ТипОшибки); + Если ОшибкиПоТипу = Неопределено Тогда - Если ПозицияЗакрывающейКавычки = 0 Тогда - - Прервать; - + Результат.КоличествоПроверок = Результат.КоличествоПроверок + 1; + Если ОписаниеОшибки.ТипОшибки = "Ошибка" Тогда + Результат.КоличествоУпало = Результат.КоличествоУпало + 1; + Иначе + Результат.КоличествоПропущено = Результат.КоличествоПропущено + 1; КонецЕсли; - описаниеБезКонтекста = Лев( описаниеБезКонтекста, ПозицияКавычки - 1 ) + "<>" + Сред( описаниеБезКонтекста, ПозицияЗакрывающейКавычки + 1 ); - ПозицияКавычки = СтрНайти( описаниеБезКонтекста, """" ); + ОшибкиПоТипу = Новый Массив(); - КонецЦикла; + КонецЕсли; - ПозицияКавычки = СтрНайти( описаниеБезКонтекста, "'" ); + ОшибкиПоТипу.Добавить(ОписаниеОшибки); + ОшибкиГруппы.Вставить(ОписаниеОшибки.ТипОшибки, ОшибкиПоТипу); + Результат.Ошибки.Вставить(ОписаниеОшибки.ИмяГруппы, ОшибкиГруппы); - Пока ПозицияКавычки > 0 Цикл +КонецПроцедуры + +Функция СледуетПропуститьОшибку(Знач СтрокаСОшибкой, Знач ПропускаемыеОшибки) + + Если НЕ ЗначениеЗаполнено(ПропускаемыеОшибки) ИЛИ НЕ ЗначениеЗаполнено(СтрокаСОшибкой) Тогда - ПозицияЗакрывающейКавычки = СтрНайти( Сред( описаниеБезКонтекста, ПозицияКавычки + 1 ), "'" ) + ПозицияКавычки; + Возврат Ложь; - Если ПозицияЗакрывающейКавычки = 0 Тогда + КонецЕсли; + + Для Каждого ТекИсключение Из ПропускаемыеОшибки Цикл + Если СтрНайти(НормализованныйТекстОшибки(СтрокаСОшибкой), ТекИсключение) > 0 Тогда - Прервать; + Возврат Истина; КонецЕсли; - - описаниеБезКонтекста = Лев( описаниеБезКонтекста, ПозицияКавычки - 1 ) + "<>" + Сред( описаниеБезКонтекста, ПозицияЗакрывающейКавычки + 1 ); - ПозицияКавычки = СтрНайти( описаниеБезКонтекста, "'" ); - КонецЦикла; - начало = СтрНайти( пОписание, ":", НаправлениеПоиска.СКонца ); - - Если начало > 0 Тогда - - описаниеБезКонтекста = СокрЛП( Лев( описаниеБезКонтекста, начало - 1 ) ); - - КонецЕсли; - - Возврат СокрЛП( описаниеБезКонтекста ); + Возврат Ложь; КонецФункции -Функция ПолучитьОписаниеСценарияАллюр2() - - СтруктураРезультата = Новый Структура(); - СтруктураРезультата.Вставить( "uuid", Строка( Новый УникальныйИдентификатор() ) ); - СтруктураРезультата.Вставить( "historyId", Неопределено ); - СтруктураРезультата.Вставить( "name", Неопределено ); - СтруктураРезультата.Вставить( "fullName", Неопределено ); - СтруктураРезультата.Вставить( "start", Неопределено ); - СтруктураРезультата.Вставить( "stop", Неопределено ); - СтруктураРезультата.Вставить( "statusDetails", Новый Структура( "known, muted,flaky", Ложь, Ложь, Ложь ) ); - СтруктураРезультата.Вставить( "status", Неопределено ); - СтруктураРезультата.Вставить( "stage", "finished" ); - СтруктураРезультата.Вставить( "steps", Новый Массив ); - СтруктураРезультата.Вставить( "parameters", Новый Массив ); - СтруктураРезультата.Вставить( "labels", Новый Массив ); - СтруктураРезультата.Вставить( "links", Новый Массив ); - СтруктураРезультата.Вставить( "attachments", Новый Массив ); - СтруктураРезультата.Вставить( "description", Неопределено ); - - Возврат СтруктураРезультата; +Функция НормализованныйТекстОшибки(Знач ТекстОшибки) + + Возврат СокрЛП(НРег(ТекстОшибки)); КонецФункции -Функция ПолучитьСсылкуНаСтроку( Знач пМетаданные, Знач пСтрока ) - - Если Не ЗначениеЗаполнено( ПутьКФайламПроекта ) Тогда - - Возврат ""; - - КонецЕсли; - - Если Не ЗначениеЗаполнено( пСтрока ) Тогда - - Возврат ""; - - КонецЕсли; - - компоненты = СтрРазделить( пМетаданные, "." ); - - Если компоненты.Количество() = 0 Тогда - - Возврат ""; - - КонецЕсли; - - компонентыСсылки = Новый Массив; - компонентыСсылки.Добавить( ПутьКФайламПроекта ); - - // Тип метаданных - - Если кэш = Неопределено Тогда - - кэш = Новый Структура; - - кэш.Вставить( "Метаданные", СоответствиеМетаданнымКаталогам() ); - кэш.Вставить( "Модули", СоответствиеМодулейФайлам() ); - - КонецЕсли; +Функция СодержимоеФайлаИсключенийОшибок(Знач ИмяФайлаПропускаемыхОшибок) - имяМетаданных = ВРег( компоненты[0] ); - - каталог = кэш.Метаданные[ имяМетаданных ]; + Результат = Новый Массив; - Если Не ЗначениеЗаполнено( каталог ) Тогда - - Возврат ""; - + Если Не ЗначениеЗаполнено(ИмяФайлаПропускаемыхОшибок) Тогда + Возврат Результат; КонецЕсли; - Если компоненты.Количество() < 3 Тогда - - Возврат ""; - + Файл = Новый Файл(ИмяФайлаПропускаемыхОшибок); + Если Не Файл.Существует() Тогда + Возврат Результат; КонецЕсли; - компонентыСсылки.Добавить( каталог ); - - // Имя объекта - - компонентыСсылки.Добавить( компоненты[1] ); - - типОбъекта = ВРег( компоненты[2] ); - - имяФайла = кэш.Модули[типОбъекта]; - - Если ЗначениеЗаполнено( имяФайла ) Тогда - - компонентыСсылки.Добавить( имяФайла ); - - ИначеЕсли типОбъекта = "ФОРМА" Тогда - - компонентыСсылки.Добавить( "Forms" ); - - Если компоненты.Количество() > 3 Тогда - - компонентыСсылки.Добавить( компоненты[3] ); - - КонецЕсли; - - Если компоненты.Количество() > 5 Тогда - - Если ВРег( компоненты[4] ) = "ФОРМА" - И ВРег( компоненты[5] ) = "МОДУЛЬ" Тогда - - компонентыСсылки.Добавить( "Module.bsl" ); - - КонецЕсли; - - КонецЕсли; - - ИначеЕсли типОбъекта = "КОМАНДА" Тогда - - компонентыСсылки.Добавить( "Commands" ); - - Если компоненты.Количество() > 3 Тогда - - компонентыСсылки.Добавить( компоненты[3] ); - - КонецЕсли; - - Если компоненты.Количество() > 4 Тогда - - Если ВРег( компоненты[4] ) = "МОДУЛЬКОМАНДЫ" Тогда - - компонентыСсылки.Добавить( "CommandModule.bsl" ); - - КонецЕсли; - + ЧтениеТекста = Новый ЧтениеТекста(ИмяФайлаПропускаемыхОшибок, КодировкаТекста.UTF8); + ПрочитаннаяСтрока = ЧтениеТекста.ПрочитатьСтроку(); + Пока ПрочитаннаяСтрока <> Неопределено Цикл + Если Не ПустаяСтрока(ПрочитаннаяСтрока) Тогда + Результат.Добавить(НормализованныйТекстОшибки(ПрочитаннаяСтрока)); КонецЕсли; - - КонецЕсли; - - Возврат СтрСоединить( компонентыСсылки, "/" ) + "#L" + СтрЗаменить( ВРег( пСтрока ), "СТРОКА ", "" ); - -КонецФункции - -Функция СоответствиеМетаданнымКаталогам() - - Соответствие = Новый Соответствие(); - - Соответствие.Вставить( "РегистрБухгалтерии", "AccountingRegisters" ); - Соответствие.Вставить( "РегистрНакопления", "AccumulationRegisters" ); - Соответствие.Вставить( "БизнесПроцесс", "BusinessProcesses" ); - Соответствие.Вставить( "РегистрРасчета", "CalculationRegisters" ); - Соответствие.Вставить( "Справочник", "Catalogs" ); - Соответствие.Вставить( "ПланСчетов", "ChartsOfAccounts" ); - Соответствие.Вставить( "ПланВидовРасчета", "ChartsOfCalculationTypes" ); - Соответствие.Вставить( "ПланВидовХарактеристик", "ChartsOfCharacteristicTypes" ); - Соответствие.Вставить( "ОбщаяГруппа", "CommandGroups" ); - Соответствие.Вставить( "ОбщийРеквизит", "CommonAttributes" ); - Соответствие.Вставить( "ОбщаяКоманда", "CommonCommands" ); - Соответствие.Вставить( "ОбщаяФорма", "CommonForms" ); - Соответствие.Вставить( "ОбщийМодуль", "CommonModules" ); - Соответствие.Вставить( "ОбщаяКартинка", "CommonPictures" ); - Соответствие.Вставить( "ОбщийМакет", "CommonTemplates" ); - Соответствие.Вставить( "Константа", "Constants" ); - Соответствие.Вставить( "Обработка", "DataProcessors" ); - Соответствие.Вставить( "ОпределяемыйТип", "DefinedTypes" ); - Соответствие.Вставить( "ЖурналДокумента", "DocumentJournals" ); - Соответствие.Вставить( "Нумератор", "DocumentNumerators" ); - Соответствие.Вставить( "Документ", "Documents" ); - Соответствие.Вставить( "Перечисление", "Enums" ); - Соответствие.Вставить( "ПодпискаНаСобытие", "EventSubscriptions" ); - Соответствие.Вставить( "ПланОбмена", "ExchangePlans" ); - Соответствие.Вставить( "ВнешнийИсточник", "ExternalDataSources" ); - Соответствие.Вставить( "КритерийОтбора", "FilterCriteria" ); - Соответствие.Вставить( "ФункциональнаяОпция", "FunctionalOptions" ); - Соответствие.Вставить( "ПарамертФункциональыхОпций", "FunctionalOptionsParameters" ); - Соответствие.Вставить( "HTTPСервис", "HTTPServices" ); - Соответствие.Вставить( "РегистрСведений", "InformationRegisters" ); - Соответствие.Вставить( "Язык", "Languages" ); - Соответствие.Вставить( "Отчет", "Reports" ); - Соответствие.Вставить( "Роль", "Roles" ); - Соответствие.Вставить( "РегламентноеЗадание", "ScheduledJobs" ); - Соответствие.Вставить( "Последовательность", "Sequences" ); - Соответствие.Вставить( "ПарамертСеанса", "SessionParameters" ); - Соответствие.Вставить( "ХранилищеНастроек", "SettingsStorages" ); - Соответствие.Вставить( "ЭлементСтиля", "StyleItems" ); - Соответствие.Вставить( "Подсистема", "Subsystems" ); - Соответствие.Вставить( "Задача", "Tasks" ); - Соответствие.Вставить( "WebСервис", "WebServices" ); - Соответствие.Вставить( "XDTOПакет", "XDTOPackages" ); - - соотВРег = Новый Соответствие; - - Для Каждого цЭлемент Из Соответствие Цикл - - соотВРег.Вставить( ВРег( цЭлемент.Ключ ), цЭлемент.Значение ); - + ПрочитаннаяСтрока = ЧтениеТекста.ПрочитатьСтроку(); КонецЦикла; - Возврат соотВРег; + ЧтениеТекста.Закрыть(); + Возврат Результат; КонецФункции -Функция СоответствиеМодулейФайлам() +Функция СодержимоеПрошлогоОтчетаОбОшибках(Знач ИмяФайла) - Соответствие = Новый Соответствие(); + Результат = Новый Соответствие(); - Соответствие.Вставить( "МОДУЛЬОБЪЕКТА", "ObjectModule.bsl" ); - Соответствие.Вставить( "МОДУЛЬ", "Module.bsl" ); - Соответствие.Вставить( "МОДУЛЬМЕНЕДЖЕРА", "ManagerModule.bsl" ); - Соответствие.Вставить( "МОДУЛЬНАБОРАЗАПИСЕЙ", "RecordSetModule.bsl" ); + Если Не ЗначениеЗаполнено(ИмяФайла) Тогда + Возврат Результат; + КонецЕсли; - Возврат Соответствие; + Файл = Новый Файл(ИмяФайла); + Если Не Файл.Существует() Тогда + Возврат Результат; + КонецЕсли; -КонецФункции - -Процедура ЗаписатьФайлJSON(Знач ИмяФайла, Знач пЗначение) + ЧтениеТекста = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8); + ПрочитаннаяСтрока = ЧтениеТекста.ПрочитатьСтроку(); + Пока ПрочитаннаяСтрока <> Неопределено Цикл + Результат.Вставить(ПрочитаннаяСтрока, "1"); + ПрочитаннаяСтрока = ЧтениеТекста.ПрочитатьСтроку(); + КонецЦикла; - Запись = Новый ЗаписьТекста; - Запись.Открыть(ИмяФайла); - Запись.Записать(ПарсерJSON.ЗаписатьJSON(пЗначение)); - Запись.Закрыть(); + ЧтениеТекста.Закрыть(); + Возврат Результат; -КонецПроцедуры - +КонецФункции diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\241\320\270\320\275\321\202\320\260\320\272\321\201\320\270\321\201\320\260.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\241\320\270\320\275\321\202\320\260\320\272\321\201\320\270\321\201\320\260.os" index 8f884dc8..cefb7466 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\241\320\270\320\275\321\202\320\260\320\272\321\201\320\270\321\201\320\260.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260\320\241\320\270\320\275\321\202\320\260\320\272\321\201\320\270\321\201\320\260.os" @@ -8,11 +8,13 @@ Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт - ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, "Централизованная проверка конфигурации, - | в т.ч. полная проверка синтаксиса конфигурации"); - Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--junitpath", "Путь отчета в формате JUnit.xml"); - Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "--groupbymetadata", - "Группировать проверки в junit по метаданным конфигурации"); + ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, " Централизованная проверка конфигурации, + | в т.ч. полная проверка синтаксиса конфигурации."); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--junitpath", "Путь отчета в формате JUnit"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--allure-results", "Путь к каталогу сохранения результатов тестирования в формате Allure (xml)"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--allure-results2", "Путь к каталогу сохранения результатов тестирования в формате Allure2 (json)"); + Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "--groupbymetadata", "Группировать проверки в по метаданным конфигурации"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--exception-file", "Путь файла с указанием пропускаемых исключений | Формат файла: в каждой строке файла указан текст пропускаемого исключения или его часть @@ -60,6 +62,7 @@ |ВНИМАНИЕ, ВАЖНО: этот параметр --MODE должен быть последним среди параметров!"); Парсер.ДобавитьКоманду(ОписаниеКоманды); + КонецПроцедуры // Выполняет логику команды @@ -71,344 +74,324 @@ Функция ВыполнитьКоманду(Знач ПараметрыКоманды, Знач ДополнительныеПараметры = Неопределено) Экспорт Лог = ДополнительныеПараметры.Лог; - // Лог.УстановитьУровень(УровниЛога.Отладка); - + ПутьОтчетаВФорматеJUnitxml = ПараметрыКоманды["--junitpath"]; Если ПутьОтчетаВФорматеJUnitxml = Неопределено Тогда ПутьОтчетаВФорматеJUnitxml = ""; КонецЕсли; + ПутьОтчетаВФорматеAllure = ПараметрыКоманды["--allure-results"]; + Если ПутьОтчетаВФорматеAllure = Неопределено Тогда + ПутьОтчетаВФорматеAllure = ""; + КонецЕсли; + + ПутьОтчетаВФорматеAllure2 = ПараметрыКоманды["--allure-results2"]; + Если ПутьОтчетаВФорматеAllure2 = Неопределено Тогда + ПутьОтчетаВФорматеAllure2 = ""; + КонецЕсли; + + СохранятьОтчетВФайл = ЗначениеЗаполнено(ПутьОтчетаВФорматеJUnitxml) + ИЛИ ЗначениеЗаполнено(ПутьОтчетаВФорматеAllure) + ИЛИ ЗначениеЗаполнено(ПутьОтчетаВФорматеAllure2); + КоллекцияПроверок = ПараметрыКоманды["--mode"]; - ГруппироватьПоМетаданным = ПараметрыКоманды["--groupbymetadata"]; + ГруппироватьПоМетаданным = ПараметрыКоманды["--groupbymetadata"]; ИмяФайлаИсключенийОшибок = ПараметрыКоманды["--exception-file"]; ЛогПроверкиИзКонфигуратора = ""; - ДатаНачала = ТекущаяДата(); ДанныеПодключения = ПараметрыКоманды["ДанныеПодключения"]; МенеджерКонфигуратора = Новый МенеджерКонфигуратора; - МенеджерКонфигуратора.Инициализация( - ДанныеПодключения.СтрокаПодключения, ДанныеПодключения.Пользователь, ДанныеПодключения.Пароль, - ПараметрыКоманды["--v8version"], ПараметрыКоманды["--uccode"], - ДанныеПодключения.КодЯзыка -); + МенеджерКонфигуратора.Инициализация( + ДанныеПодключения.СтрокаПодключения, ДанныеПодключения.Пользователь, ДанныеПодключения.Пароль, + ПараметрыКоманды["--v8version"], ПараметрыКоманды["--uccode"], + ДанныеПодключения.КодЯзыка + ); -Попытка - Успешно = МенеджерКонфигуратора.ВыполнитьСинтаксическийКонтроль( - КоллекцияПроверок, - ЛогПроверкиИзКонфигуратора); -Исключение - МенеджерКонфигуратора.Деструктор(); - ВызватьИсключение ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); -КонецПопытки; + Лог.Информация("Начало проверки проекта"); + ДатаНачала = ТекущаяДата(); + Попытка + ОшибокНет = МенеджерКонфигуратора.ВыполнитьСинтаксическийКонтроль( + КоллекцияПроверок, + ЛогПроверкиИзКонфигуратора); + Исключение + + МенеджерКонфигуратора.Деструктор(); + ВызватьИсключение ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + + КонецПопытки; -МенеджерКонфигуратора.Деструктор(); -Если ЗначениеЗаполнено(ПутьОтчетаВФорматеJUnitxml) Тогда - Лог.Отладка("Путь к лог-файлу проверки %1", ПутьОтчетаВФорматеJUnitxml); - - ФайлОтчетаВФорматеJUnitxml = Новый Файл(ОбъединитьПути(ТекущийКаталог(), ПутьОтчетаВФорматеJUnitxml)); - Лог.Отладка("Полный путь к лог-файлу проверки %1", ФайлОтчетаВФорматеJUnitxml.ПолноеИмя); - Лог.Отладка("Каталог лог-файла проверки %1", ФайлОтчетаВФорматеJUnitxml.Путь); - ФС.ОбеспечитьКаталог(ФайлОтчетаВФорматеJUnitxml.Путь); - УдалитьФайлы(ФайлОтчетаВФорматеJUnitxml.ПолноеИмя); - - ВывестиОтчетПроверкиКонфигурацииВФорматеJUnitXML(ПутьОтчетаВФорматеJUnitxml, ЛогПроверкиИзКонфигуратора, - Успешно, ДатаНачала, ГруппироватьПоМетаданным, ИмяФайлаИсключенийОшибок); + Лог.Информация("Проверка проекта завершена за %1с", Окр(ТекущаяДата() - ДатаНачала)); + МенеджерКонфигуратора.Деструктор(); - Лог.Информация("Сформированы результаты проверки в формате JUnit.xml - %1", ПутьОтчетаВФорматеJUnitxml); -КонецЕсли; + Если СохранятьОтчетВФайл Тогда + Если НРег(СокрЛП(ЛогПроверкиИзКонфигуратора)) = "ошибок не обнаружено" Тогда + ЛогПроверкиИзКонфигуратора = ""; + КонецЕсли; + РезультатТестирования = ОбработатьЛогОшибок(ДатаНачала, ЛогПроверкиИзКонфигуратора, ГруппироватьПоМетаданным, ИмяФайлаИсключенийОшибок); + Если ЗначениеЗаполнено(ПутьОтчетаВФорматеAllure) Тогда + + Лог.Информация("Генерация отчета Allure"); + ГенерацияОтчетов.СформироватьОтчетВФорматеAllure(ОшибокНет, РезультатТестирования.ДатаНачала, РезультатТестирования, ПутьОтчетаВФорматеAllure, "Конфигуратор"); + + КонецЕсли; -РезультатыКоманд = МенеджерКомандПриложения.РезультатыКоманд(); + Если ЗначениеЗаполнено(ПутьОтчетаВФорматеAllure2) Тогда + + Лог.Информация("Генерация отчета Allure2"); + ГенерацияОтчетов.СформироватьОтчетВФорматеAllure2(ОшибокНет, РезультатТестирования.ДатаНачала, РезультатТестирования, ПутьОтчетаВФорматеAllure2, "Конфигуратор"); + + КонецЕсли; + + Если ЗначениеЗаполнено(ПутьОтчетаВФорматеJUnitxml) Тогда + + Лог.Информация("Генерация отчета JUnit"); + ГенерацияОтчетов.СформироватьОтчетВФорматеJUnit(ОшибокНет, РезультатТестирования, ПутьОтчетаВФорматеJUnitxml, "base"); + + КонецЕсли; + + КонецЕсли; -Возврат ?(Успешно, РезультатыКоманд.Успех, РезультатыКоманд.ОшибкаВремениВыполнения); + РезультатыКоманд = МенеджерКомандПриложения.РезультатыКоманд(); + + Возврат ?(ОшибокНет, РезультатыКоманд.Успех, РезультатыКоманд.ОшибкаВремениВыполнения); КонецФункции -// { приватная часть +/////////////////////////////////////////////////////////////////////////////////////////////////// -Процедура ВывестиОтчетПроверкиКонфигурацииВФорматеJUnitXML(Знач ПутьОтчетаВФорматеJUnitxml, - Знач ЛогПроверкиИзКонфигуратора, Знач НетОшибок, Знач ДатаНачала, Знач ГруппироватьПоМетаданным = Ложь, - Знач ИмяФайлаИсключенийОшибок = Неопределено) +Функция ОбработатьЛогОшибок(ДатаНачала, ЛогПроверкиИзКонфигуратора, ГруппироватьПоМетаданным, ИмяФайлаИсключенийОшибок) - ПредставлениеНабораТестов = ПредставлениеНабораТестов(ПутьОтчетаВФорматеJUnitxml); + РезультатТестирования = Новый Структура; + РезультатТестирования.Вставить("Ошибки", Новый Соответствие); + РезультатТестирования.Вставить("ВсеОшибки", ""); + РезультатТестирования.Вставить("ДатаНачала", ДатаНачала); + РезультатТестирования.Вставить("КоличествоПроверок", 0); + РезультатТестирования.Вставить("КоличествоПропущено", 0); + РезультатТестирования.Вставить("КоличествоУпало", 0); - ИсключенияОшибок = СодержимоеФайлаИсключенийОшибок(ИмяФайлаИсключенийОшибок); + ПропускаемыеОшибки = СодержимоеФайлаИсключенийОшибок(ИмяФайлаИсключенийОшибок); + ОбработанныйЛог = СтрЗаменить(ЛогПроверкиИзКонфигуратора, Символы.ВК + Символы.Таб, Символы.Таб); + ОбработанныйЛог = СтрЗаменить(ОбработанныйЛог, Символы.ПС + Символы.Таб, Символы.Таб); - Лог.Отладка("НетОшибок <%1>", НетОшибок); - Если НетОшибок Тогда - - ЗаписьXML = НачатьЗаписьОтчета(ПредставлениеНабораТестов, 0, 0, ДатаНачала); - ЗаписьXML.ЗаписатьКонецЭлемента(); // testcase - - Иначе - - ТестовыеСлучаи = СтруктурироватьЛог(ЛогПроверкиИзКонфигуратора, ГруппироватьПоМетаданным, ИсключенияОшибок); - - ЗаписьXML = НачатьЗаписьОтчета( - ПредставлениеНабораТестов, - ТестовыеСлучаи.Ошибки.Количество(), - ТестовыеСлучаи.Пропуски.Количество(), - ДатаНачала); + ИмяТестСценарияПредыдущаяСтрока = "Синтаксическая проверка конфигурации"; + + Если НЕ ГруппироватьПоМетаданным Тогда - // Если есть ошибки, добавим в отчет текст всех ошибок без группировки - Если ТестовыеСлучаи.Ошибки.Количество() > 0 Тогда - ЗаписьXML.ЗаписатьНачалоЭлемента("failure"); - ЗаписьXML.ЗаписатьАтрибут("message", XMLСтрока(ЛогПроверкиИзКонфигуратора)); - ЗаписьXML.ЗаписатьКонецЭлемента(); // failure + Если Не ПустаяСтрока(ОбработанныйЛог) Тогда + ОписаниеОшибкиТеста = ШаблонОписанияОшибки("Синтаксическая проверка конфигурации", ОбработанныйЛог); + ДополнитьРезультатТекстомОшибки(РезультатТестирования, ОписаниеОшибкиТеста); КонецЕсли; - - ЗаписьXML.ЗаписатьКонецЭлемента(); // testcase summary - - Для Каждого ТекТестовыйСлучай Из ТестовыеСлучаи.Ошибки Цикл - ЗаписьXML.ЗаписатьНачалоЭлемента("testcase"); - ЗаписьXML.ЗаписатьАтрибут("classname", СтрШаблон("%1.Ошибки", XMLСтрока(ПредставлениеНабораТестов))); - ЗаписьXML.ЗаписатьАтрибут("name", XMLСтрока(ТекТестовыйСлучай.Ключ)); - ЗаписьXML.ЗаписатьАтрибут("status", "failure"); - - ЗаписьXML.ЗаписатьНачалоЭлемента("failure"); - ЗаписьXML.ЗаписатьАтрибут("message", XMLСтрока(ТекТестовыйСлучай.Значение)); - ЗаписьXML.ЗаписатьКонецЭлемента(); // failure - - ЗаписьXML.ЗаписатьКонецЭлемента(); // testcase errors - КонецЦикла; - - Для Каждого ТекТестовыйСлучай Из ТестовыеСлучаи.Пропуски Цикл - ЗаписьXML.ЗаписатьНачалоЭлемента("testcase"); - ЗаписьXML.ЗаписатьАтрибут("classname", СтрШаблон("%1.Пропуски", XMLСтрока(ПредставлениеНабораТестов))); - ЗаписьXML.ЗаписатьАтрибут("name", XMLСтрока(ТекТестовыйСлучай.Ключ)); - ЗаписьXML.ЗаписатьАтрибут("status", "skipped"); - ЗаписьXML.ЗаписатьНачалоЭлемента("skipped"); - ЗаписьXML.ЗаписатьКонецЭлемента(); // skipped - ЗаписьXML.ЗаписатьКонецЭлемента(); // testcase - КонецЦикла; + Возврат РезультатТестирования; КонецЕсли; - ЗаписьXML.ЗаписатьКонецЭлемента(); // testsuite - - ЗаписьXML.ЗаписатьКонецЭлемента(); // testsuites - - СтрокаХМЛ = ЗаписьXML.Закрыть(); - - ЗаписьXML = Новый ЗаписьXML; - ЗаписьXML.ОткрытьФайл(ПутьОтчетаВФорматеJUnitxml); - ЗаписьXML.ЗаписатьБезОбработки(СтрокаХМЛ);// таким образом файл будет записан всего один раз, и не будет проблем с обработкой на билд-сервере TeamCity - ЗаписьXML.Закрыть(); - - Лог.Отладка("СтрокаХМЛ %1", СтрокаХМЛ); + // Определяем строки для исключения из ошибок + // См. стандарт "Обработчики событий модуля формы, подключаемые из кода" + // https://its.1c.ru/db/v8std#content:-2145783155:hdoc + МассивСтрокИсключений = Новый Массив(); + МассивСтрокИсключений.Добавить(Нрег("Не обнаружено ссылок на процедуру: ""Подключаемый_")); + МассивСтрокИсключений.Добавить(Нрег("Не обнаружено ссылок на функцию: ""Подключаемый_")); + МассивСтрокИсключений.Добавить(Нрег("Пустой обработчик: ""Подключаемый_")); + МассивСтрокИсключений.Добавить(Нрег("No links to function found: ""Attachable_")); + МассивСтрокИсключений.Добавить(Нрег("No links to procedure found: ""Attachable_")); + МассивСтрокИсключений.Добавить(Нрег("Empty handler: ""Attachable_")); -КонецПроцедуры + МассивСтрокОшибок = СтрРазделить(ОбработанныйЛог, Символы.ПС); + Для Ит = 0 По МассивСтрокОшибок.Количество() - 1 Цикл + + ТекСтрока = МассивСтрокОшибок[Ит]; + Если СтрНачинаетсяС(ТекСтрока, "{") И НЕ (СтрНайти(ТекСтрока, " (Проверка ") ИЛИ СтрНайти(ТекСтрока, " (Проверка:"))Тогда + ВтораяСтрока = СокрЛП(МассивСтрокОшибок[Ит + 1]); + Если СтрНайти(ВтораяСтрока, " (Проверка") Тогда + ТекСтрока = ТекСтрока + " #> " + СокрЛП(ВтораяСтрока); + Ит = Ит + 1; + КонецЕсли; + КонецЕсли; -Функция ПредставлениеНабораТестов(Знач ПутьОтчетаВФорматеJUnitxml) - - Если Не ЗначениеЗаполнено(ПутьОтчетаВФорматеJUnitxml) Тогда - Возврат "CheckConfig"; - КонецЕсли; - - Файл = Новый Файл(ПутьОтчетаВФорматеJUnitxml); - Возврат СтрШаблон("CheckConfig.%1", Файл.ИмяБезРасширения); + Если ИсключитьСтроку(ТекСтрока, МассивСтрокИсключений) Тогда + Продолжить; + КонецЕсли; + + РезультатТестирования.ВсеОшибки = РезультатТестирования.ВсеОшибки + ТекСтрока + Символы.ПС; + + ОписаниеОшибки = ПолучитьОписаниеОшибки(ТекСтрока, ИмяТестСценарияПредыдущаяСтрока); + ДополнитьРезультатТекстомОшибки(РезультатТестирования, ОписаниеОшибки, ПропускаемыеОшибки, ТекСтрока); + КонецЦикла; + Возврат РезультатТестирования; КонецФункции +/////////////////////////////////////////////////////////////////////////////////////////////////// + Функция СодержимоеФайлаИсключенийОшибок(Знач ИмяФайлаИсключенийОшибок) Результат = Новый Массив; Если Не ЗначениеЗаполнено(ИмяФайлаИсключенийОшибок) Тогда + Возврат Результат; + КонецЕсли; + Файл = Новый Файл(ИмяФайлаИсключенийОшибок); + Если Не Файл.Существует() Тогда + Возврат Результат; + КонецЕсли; + Лог.Отладка("Чтение файла исключений ошибок из %1", ИмяФайлаИсключенийОшибок); ЧтениеТекста = Новый ЧтениеТекста(ИмяФайлаИсключенийОшибок, КодировкаТекста.UTF8); ПрочитаннаяСтрока = ЧтениеТекста.ПрочитатьСтроку(); Пока ПрочитаннаяСтрока <> Неопределено Цикл + Если Не ПустаяСтрока(ПрочитаннаяСтрока) Тогда + ДобавляемоеИсключение = НормализованныйТекстОшибки(ПрочитаннаяСтрока); Результат.Добавить(ДобавляемоеИсключение); Лог.Отладка("Добавлено в исключения: %1", ДобавляемоеИсключение); + КонецЕсли; + ПрочитаннаяСтрока = ЧтениеТекста.ПрочитатьСтроку(); + КонецЦикла; - Лог.Отладка("Прочитано исключений: %1", Результат.Количество()); - + Лог.Отладка("Прочитано исключений: %1", Результат.Количество()); Возврат Результат; КонецФункции -Функция НормализованныйТекстОшибки(Знач ТекстОшибки) - - Возврат СокрЛП(НРег(ТекстОшибки)); - -КонецФункции - -Функция НачатьЗаписьОтчета(Знач ПредставлениеНабораТестов, Знач КоличествоОшибок, Знач КоличествоПропусков, - Знач ДатаНачала) - - Лог.Отладка("ПредставлениеНабораТестов <%1>", ПредставлениеНабораТестов); - Лог.Отладка("КоличествоОшибок <%1>", КоличествоОшибок); - Лог.Отладка("КоличествоПропусков <%1>", КоличествоПропусков); - - Результат = Новый ЗаписьXML; - Результат.УстановитьСтроку("UTF-8"); - Результат.ЗаписатьОбъявлениеXML(); - - ВремяВыполнения = ТекущаяДата() - ДатаНачала; +Функция ИсключитьСтроку(Знач ПроверяемаяСтрока, Знач МассивСтрокИсключений) - Результат.ЗаписатьНачалоЭлемента("testsuites"); - Результат.ЗаписатьАтрибут("name", XMLСтрока(ПредставлениеНабораТестов)); - - КоличествоТестов = КоличествоОшибок + КоличествоПропусков; - Если КоличествоТестов = 0 Тогда - КоличествоТестов = 1; + Если НЕ ЗначениеЗаполнено(ПроверяемаяСтрока) Тогда + + Возврат ИСТИНА; + КонецЕсли; - Результат.ЗаписатьАтрибут("tests", XMLСтрока(КоличествоТестов)); - Результат.ЗаписатьАтрибут("failures", XMLСтрока(КоличествоОшибок)); - Результат.ЗаписатьАтрибут("skipped", XMLСтрока(КоличествоПропусков)); - Результат.ЗаписатьАтрибут("time", XMLСтрока(ВремяВыполнения)); - - Результат.ЗаписатьНачалоЭлемента("testsuite"); - Результат.ЗаписатьАтрибут("name", XMLСтрока(ПредставлениеНабораТестов)); - Результат.ЗаписатьНачалоЭлемента("properties"); - Результат.ЗаписатьКонецЭлемента(); // properties - - Результат.ЗаписатьНачалоЭлемента("testcase"); - Результат.ЗаписатьАтрибут("classname", XMLСтрока(ПредставлениеНабораТестов)); - Результат.ЗаписатьАтрибут("name", XMLСтрока("Все сообщения")); - Результат.ЗаписатьАтрибут("time", XMLСтрока(ВремяВыполнения)); - Если КоличествоОшибок = 0 Тогда - Результат.ЗаписатьАтрибут("status", "passed"); - Иначе - Результат.ЗаписатьАтрибут("status", "failure"); - КонецЕсли; + Для Каждого СтрИсключения Из МассивСтрокИсключений Цикл + + Если СтрНайти(НормализованныйТекстОшибки(ПроверяемаяСтрока), СтрИсключения) > 0 Тогда + + Возврат Истина; + + КонецЕсли; + + КонецЦикла; - Возврат Результат; + Возврат Ложь; КонецФункции -Функция СтруктурироватьЛог(Знач ЛогПроверкиИзКонфигуратора, Знач ГруппироватьПоМетаданным = Ложь, Знач ИсключенияОшибок = Неопределено) - - Результат = Новый Структура; - Результат.Вставить("Ошибки", Новый Соответствие); - Результат.Вставить("Пропуски", Новый Соответствие); +Функция ПолучитьОписаниеОшибки(Знач СтрокаЛога, ИмяПоУмолчанию) - ОбработанныйЛог = СтрЗаменить(ЛогПроверкиИзКонфигуратора, Символы.ВК + Символы.Таб, Символы.Таб); - ОбработанныйЛог = СтрЗаменить(ОбработанныйЛог , Символы.ПС + Символы.Таб, Символы.Таб); - ИмяТестСценарияПредыдущаяСтрока = "Синтаксическая проверка конфигурации"; - - Если НЕ ГруппироватьПоМетаданным Тогда - Результат.Ошибки.Вставить("Синтаксическая проверка конфигурации", XMLСтрока(ОбработанныйЛог)); - Возврат Результат; + Результат = ШаблонОписанияОшибки(ИмяПоУмолчанию); + ЧастиСтрокиЛога = СтрРазделить(СокрЛП(СтрокаЛога), " ", Ложь); + Если ЧастиСтрокиЛога.Количество() Тогда + + Результат.ИмяГруппы = ЧастиСтрокиЛога[0]; + ЧастиСтрокиЛога.Удалить(0); + Результат.ТекстОшибки = СтрСоединить(ЧастиСтрокиЛога, " "); + КонецЕсли; - // Определяем строки для исключения из ошибок - // См. стандарт "Обработчики событий модуля формы, подключаемые из кода" - // https://its.1c.ru/db/v8std#content:-2145783155:hdoc - МассивСтрокИсключений = Новый Массив(); - МассивСтрокИсключений.Добавить(Нрег("Не обнаружено ссылок на процедуру: ""Подключаемый_")); - МассивСтрокИсключений.Добавить(Нрег("Не обнаружено ссылок на функцию: ""Подключаемый_")); - МассивСтрокИсключений.Добавить(Нрег("Пустой обработчик: ""Подключаемый_")); - МассивСтрокИсключений.Добавить(Нрег("No links to function found: ""Attachable_")); - МассивСтрокИсключений.Добавить(Нрег("No links to procedure found: ""Attachable_")); - МассивСтрокИсключений.Добавить(Нрег("Empty handler: ""Attachable_")); - - Для Каждого ТекСтрока Из СтрРазделить(ОбработанныйЛог, Символы.ПС) Цикл - - Если ИсключитьСтроку(ТекСтрока, МассивСтрокИсключений) Тогда - Продолжить; - КонецЕсли; + Если СтрНачинаетсяС(СтрокаЛога, "{") Тогда - ИмяТестСценария = ИмяТестСценария(ТекСтрока); + СтрокаЛога = СтрЗаменить(СтрокаЛога, "{", ""); + СтрокаЛога = СтрЗаменить(СтрокаЛога, "}", ""); + ПозицияСкобки = СтрНайти(СтрокаЛога, "("); - Если ПустаяСтрока(ИмяТестСценария) Тогда - ИмяТестСценария = ИмяТестСценарияПредыдущаяСтрока; + Если ПозицияСкобки > 1 Тогда + + Результат.ИмяГруппы = Сред(СтрокаЛога, 1, ПозицияСкобки - 1); + ПозицияВторойСкобки = СтрНайти(СтрокаЛога, ")", , ПозицияСкобки); + Результат.НомерСтроки = Сред(СтрокаЛога, ПозицияСкобки + 1, ПозицияВторойСкобки - ПозицияСкобки - 1); + Результат.ТекстОшибки = Сред(СтрокаЛога, ПозицияВторойСкобки + 3); + Если НЕ СтрНайти(Результат.ТекстОшибки, " #> ") Тогда + ПозСкобки = СтрНайти(Результат.ТекстОшибки, ")"); + Если ПозСкобки Тогда + Результат.ТекстОшибки = Лев(Результат.ТекстОшибки, ПозСкобки) + " #> " + СокрЛП(Сред(Результат.ТекстОшибки, ПозСкобки + 1)); + КонецЕсли; + КонецЕсли; + Иначе + + Результат.ИмяГруппы = ИмяПоУмолчанию; + Результат.ТекстОшибки = СтрокаЛога; + КонецЕсли; - ДополнитьРезультатТекстомОшибки(Результат, ТекСтрока, ИмяТестСценария, ИсключенияОшибок); - - КонецЦикла; + КонецЕсли; Возврат Результат; КонецФункции -//Проверяет вхождение строк из массива в проверямой строке. -//Параметры: -// ПроверяемаяСтрока - Строка - строка для проверки. -// МассивСтрокИсключений - Массив - массив строк, для проверки. -// -//Возвращаемое значение: -// Булево - Истина, в проверяемой строке содежрится один из элементов массив. -// Ложь, не нашли -Функция ИсключитьСтроку(Знач ПроверяемаяСтрока, Знач МассивСтрокИсключений) - Для каждого СтрИсключения Из МассивСтрокИсключений Цикл - Если СтрНайти(Нрег(ПроверяемаяСтрока), СтрИсключения) > 0 Тогда - Возврат Истина; - КонецЕсли; - КонецЦикла; - Возврат Ложь; +Функция ШаблонОписанияОшибки(ИмяПоУмолчанию, ТекстОшибки = "", НомерСтроки = 0, ТипОшибки = "Ошибка") + + Возврат Новый Структура("ТекстОшибки, ИмяГруппы, НомерСтроки, ТипОшибки", ТекстОшибки, ИмяПоУмолчанию, НомерСтроки, ТипОшибки); + КонецФункции -Функция ИмяТестСценария(Знач СтрокаЛога) - - Результат = ""; +Функция СледуетПропуститьОшибку(Знач СтрокаСОшибкой, Знач ПропускаемыеОшибки) - ЧастиСтрокиЛога = СтрРазделить(СокрЛП(СтрокаЛога), " ", Ложь); - Если ЗначениеЗаполнено(ЧастиСтрокиЛога) Тогда - РезультатСтрока = ЧастиСтрокиЛога[0]; + Если НЕ ЗначениеЗаполнено(ПропускаемыеОшибки) ИЛИ НЕ ЗначениеЗаполнено(СтрокаСОшибкой) Тогда + + Возврат Ложь; + КонецЕсли; - Если СтрНачинаетсяС(РезультатСтрока, "{") Тогда - - РезультатСтрока = СтрЗаменить(РезультатСтрока, "{", ""); - РезультатСтрока = СтрЗаменить(РезультатСтрока, "}", ""); - ПозицияСкобки = СтрНайти(РезультатСтрока, "("); - Если ПозицияСкобки > 1 Тогда - Результат = Сред(РезультатСтрока, 1, ПозицияСкобки - 1); + Для Каждого ТекИсключение Из ПропускаемыеОшибки Цикл + Если СтрНайти(НормализованныйТекстОшибки(СтрокаСОшибкой), ТекИсключение) > 0 Тогда + + Возврат Истина; + КонецЕсли; - ИначеЕсли ЧастиСтрокиЛога.Количество() > 0 Тогда - Результат = РезультатСтрока; - КонецЕсли; + КонецЦикла; - Возврат Результат; + Возврат Ложь; КонецФункции -Процедура ДополнитьРезультатТекстомОшибки(Знач Результат, Знач ТекСтрока, Знач ИмяТестСценария, Знач ИсключенияОшибок) +Функция НормализованныйТекстОшибки(Знач ТекстОшибки) - Если СледуетПропуститьОшибку(ТекСтрока, ИсключенияОшибок) Тогда - Раздел = "Пропуски"; - Иначе - Раздел = "Ошибки"; - КонецЕсли; + Возврат СокрЛП(НРег(ТекстОшибки)); + +КонецФункции + +Процедура ДополнитьРезультатТекстомОшибки(Результат, ОписаниеОшибки, Знач ПропускаемыеОшибки = Неопределено, СтрокаЛога = "") - Если Результат[Раздел][ИмяТестСценария] = Неопределено Тогда - Результат[Раздел][ИмяТестСценария] = СокрЛП(ТекСтрока); - Иначе - Результат[Раздел][ИмяТестСценария] = СтрШаблон( - "%1 - |%2", - Результат[Раздел][ИмяТестСценария], - СокрЛП(ТекСтрока)); + Если СледуетПропуститьОшибку(СтрокаЛога, ПропускаемыеОшибки) Тогда + + ОписаниеОшибки.ТипОшибки = "Пропущено"; + КонецЕсли; -КонецПроцедуры - -Функция СледуетПропуститьОшибку(Знач ТекстОшибки, Знач ИсключенияОшибок) + ОшибкиГруппы = Результат.Ошибки.Получить(ОписаниеОшибки.ИмяГруппы); - Если Не ЗначениеЗаполнено(ИсключенияОшибок) Тогда - Возврат Ложь; + Если ОшибкиГруппы = Неопределено Тогда + + ОшибкиГруппы = Новый Соответствие(); + КонецЕсли; - Для Каждого ТекИсключение Из ИсключенияОшибок Цикл - Если СтрНайти(НормализованныйТекстОшибки(ТекстОшибки), ТекИсключение) > 0 Тогда - Возврат Истина; + ОшибкиПоТипу = ОшибкиГруппы.Получить(ОписаниеОшибки.ТипОшибки); + Если ОшибкиПоТипу = Неопределено Тогда + + Результат.КоличествоПроверок = Результат.КоличествоПроверок + 1; + Если ОписаниеОшибки.ТипОшибки = "Ошибка" Тогда + Результат.КоличествоУпало = Результат.КоличествоУпало + 1; + Иначе + Результат.КоличествоПропущено = Результат.КоличествоПропущено + 1; КонецЕсли; - КонецЦикла; + + ОшибкиПоТипу = Новый Массив(); + + КонецЕсли; - Возврат Ложь; + ОшибкиПоТипу.Добавить(ОписаниеОшибки); + ОшибкиГруппы.Вставить(ОписаниеОшибки.ТипОшибки, ОшибкиПоТипу); + Результат.Ошибки.Вставить(ОписаниеОшибки.ИмяГруппы, ОшибкиГруппы); -КонецФункции +КонецПроцедуры diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\240\320\260\320\267\320\261\320\276\321\200\320\272\320\260\320\222\320\275\320\265\321\210\320\275\320\270\321\205\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\276\320\272.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\240\320\260\320\267\320\261\320\276\321\200\320\272\320\260\320\222\320\275\320\265\321\210\320\275\320\270\321\205\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\276\320\272.os" index 86725734..dab17674 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\240\320\260\320\267\320\261\320\276\321\200\320\272\320\260\320\222\320\275\320\265\321\210\320\275\320\270\321\205\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\276\320\272.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\240\320\260\320\267\320\261\320\276\321\200\320\272\320\260\320\222\320\275\320\265\321\210\320\275\320\270\321\205\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\276\320\272.os" @@ -13,9 +13,9 @@ Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт ТекстОписания = - " разбираем внешние обработки на исходники штатно через выгрузку 1С 8.3 - | В каталоге выгрузки создается отдельный подкаталог для каждой внешней обработки - | Сохраняется структура подкаталогов, если выгружаем каталог"; + " Разборка внешних обработок на исходники штатно через выгрузку 1С 8.3. + | В каталоге выгрузки создается отдельный подкаталог для каждой внешней обработки. + | Сохраняется структура подкаталогов, если выгружается каталог."; ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, ТекстОписания); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\240\320\260\320\267\320\261\320\276\321\200\320\272\320\260\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\240\320\260\320\267\320\261\320\276\321\200\320\272\320\260\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" index 1c2a66a8..bf625286 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\240\320\260\320\267\320\261\320\276\321\200\320\272\320\260\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\240\320\260\320\267\320\261\320\276\321\200\320\272\320\260\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" @@ -17,7 +17,7 @@ Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт ТекстОписания = - " Разбираем конфигурацию в исходники + " Разборка конфигурации в исходники. | "; ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, ТекстОписания); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\240\320\260\320\267\320\261\320\276\321\200\320\272\320\260\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\320\271.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\240\320\260\320\267\320\261\320\276\321\200\320\272\320\260\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\320\271.os" index 8f8a22e5..a9dd01f5 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\240\320\260\320\267\320\261\320\276\321\200\320\272\320\260\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\320\271.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\240\320\260\320\267\320\261\320\276\321\200\320\272\320\260\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\320\271.os" @@ -17,7 +17,7 @@ Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт ТекстОписания = - " разбираем расширение из конфигурации в исходники + " Разборка расширения из конфигурации в исходники. | "; ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, ТекстОписания); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\261\320\276\321\200\320\272\320\260\320\222\320\275\320\265\321\210\320\275\320\270\321\205\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\276\320\272.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\261\320\276\321\200\320\272\320\260\320\222\320\275\320\265\321\210\320\275\320\270\321\205\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\276\320\272.os" index fd0df69a..327e53a6 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\261\320\276\321\200\320\272\320\260\320\222\320\275\320\265\321\210\320\275\320\270\321\205\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\276\320\272.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\261\320\276\321\200\320\272\320\260\320\222\320\275\320\265\321\210\320\275\320\270\321\205\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\276\320\272.os" @@ -13,9 +13,9 @@ Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт ТекстОписания = - " собираем внешние обработки из исходников штатно через выгрузку 1С 8.3 + " Сборка внешних обработок из исходников штатно через выгрузку 1С 8.3. | В каталоге выгрузки создается отдельный подкаталог для каждой внешней обработки - | Сохраняется структура подкаталогов, если выгружаем каталог"; + | Сохраняется структура подкаталогов, если выгружается каталог."; ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, ТекстОписания); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\261\320\276\321\200\320\272\320\260\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\320\271.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\261\320\276\321\200\320\272\320\260\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\320\271.os" index d5abb202..023a8479 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\261\320\276\321\200\320\272\320\260\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\320\271.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\261\320\276\321\200\320\272\320\260\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\320\271.os" @@ -18,7 +18,7 @@ Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт ТекстОписания = - " загружаем расширение в конфигурацию из папки исходников + " Загрузка расширения в конфигурацию из папки исходников. | "; ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, ТекстОписания); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\320\261\321\200\320\260\321\202\321\214\320\230\320\267\320\230\321\201\321\205\320\276\320\264\320\275\320\270\320\272\320\276\320\262.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\320\261\321\200\320\260\321\202\321\214\320\230\320\267\320\230\321\201\321\205\320\276\320\264\320\275\320\270\320\272\320\276\320\262.os" index 3398c0b5..d28238dc 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\320\261\321\200\320\260\321\202\321\214\320\230\320\267\320\230\321\201\321\205\320\276\320\264\320\275\320\270\320\272\320\276\320\262.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\320\261\321\200\320\260\321\202\321\214\320\230\320\267\320\230\321\201\321\205\320\276\320\264\320\275\320\270\320\272\320\276\320\262.os" @@ -23,7 +23,7 @@ Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт ТекстОписания = - " Собрать из исходников cf файл + " Сборка cf файла из исходников. | "; ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\320\261\321\200\320\260\321\202\321\214\320\230\320\267\320\230\321\201\321\205\320\276\320\264\320\275\320\270\320\272\320\276\320\262\320\244\320\260\320\271\320\273\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\321\217.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\320\261\321\200\320\260\321\202\321\214\320\230\320\267\320\230\321\201\321\205\320\276\320\264\320\275\320\270\320\272\320\276\320\262\320\244\320\260\320\271\320\273\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\321\217.os" index d3092cb2..2e301091 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\320\261\321\200\320\260\321\202\321\214\320\230\320\267\320\230\321\201\321\205\320\276\320\264\320\275\320\270\320\272\320\276\320\262\320\244\320\260\320\271\320\273\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\321\217.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\320\261\321\200\320\260\321\202\321\214\320\230\320\267\320\230\321\201\321\205\320\276\320\264\320\275\320\270\320\272\320\276\320\262\320\244\320\260\320\271\320\273\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\321\217.os" @@ -23,7 +23,7 @@ Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт ТекстОписания = - " Собрать из исходников cfe файл + " Сборка cfe файла из исходников. | "; ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\320\267\320\264\320\260\321\202\321\214\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\265\320\271\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\320\267\320\264\320\260\321\202\321\214\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\265\320\271\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260.os" index ecada53b..c4bd241a 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\320\267\320\264\320\260\321\202\321\214\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\265\320\271\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\320\267\320\264\320\260\321\202\321\214\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\265\320\271\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260.os" @@ -3,10 +3,10 @@ // Подключение ИБ к хранилищу конфигурации 1С. // // TODO добавить фичи для проверки команды -// +// // Служебный модуль с набором методов работы с командами приложения // -// Структура модуля реализована в соответствии с рекомендациями +// Структура модуля реализована в соответствии с рекомендациями // oscript-app-template (C) EvilBeaver // /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -21,23 +21,23 @@ Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт ТекстОписания = - " Подключение ИБ к хранилищу конфигурации 1С. + " Создание пользователя хранилища конфигурации 1С. | "; - ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, + ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, ТекстОписания); - - Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "ПутьПодключаемогоХранилища", + + Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "ПутьПодключаемогоХранилища", "Строка подключения к хранилищу | (возможно указание как файлового пути, так и пути через http или tcp)"); Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "ЛогинАдминистратора", "Логин администратора хранилища 1С"); Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "ПарольАдминистратора", "Пароль администратора хранилища 1С"); - - Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-user", "Пользователь хранилища. + + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-user", "Пользователь хранилища. | Обязательный параметр"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-pwd", "Пароль. | Обязательный параметр"); - + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-role", "Назначаемая роль. Возможные варианты: | ReadOnly — право на просмотр, | LockObjects — право на захват объектов, @@ -47,11 +47,11 @@ |Обязательный параметр"); Парсер.ДобавитьКоманду(ОписаниеКоманды); - + КонецПроцедуры // ЗарегистрироватьКоманду // Выполняет логику команды -// +// // Параметры: // ПараметрыКоманды - Соответствие - Соответствие ключей командной строки и их значений // ДополнительныеПараметры - Соответствие - дополнительные параметры (необязательно) @@ -66,15 +66,15 @@ Ожидаем.Что(ЛогинПользователя, " не задан логин создаваемого пользователя хранилища").Заполнено(); Ожидаем.Что(ПарольПользователя, " не задан пароль создаваемого пользователя хранилища").Заполнено(); - Ожидаем.Что(РольПользователя, + Ожидаем.Что(РольПользователя, "Не заполнены роли пользователя. Они должны быть заданы через параметр ком.строки --storage-role").Заполнено(); - + ДанныеПодключения = ПараметрыКоманды["ДанныеПодключения"]; СтрокаПодключения = ДанныеПодключения.СтрокаПодключения; Если Не ЗначениеЗаполнено(СтрокаПодключения) Тогда СтрокаПодключения = "/F"; КонецЕсли; - + МенеджерКонфигуратора = Новый МенеджерКонфигуратора; МенеджерКонфигуратора.Инициализация( @@ -85,7 +85,7 @@ Попытка МенеджерКонфигуратора.СоздатьПользователяХранилища( - ПараметрыКоманды["ПутьПодключаемогоХранилища"], ПараметрыКоманды["ЛогинАдминистратора"], + ПараметрыКоманды["ПутьПодключаемогоХранилища"], ПараметрыКоманды["ЛогинАдминистратора"], ПараметрыКоманды["ПарольАдминистратора"], ЛогинПользователя, ПарольПользователя, РольПользователя); Исключение diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\321\205\321\200\320\260\320\275\320\270\321\202\321\214\320\222\320\265\321\200\321\201\320\270\321\216\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\222\320\244\320\260\320\271\320\273.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\321\205\321\200\320\260\320\275\320\270\321\202\321\214\320\222\320\265\321\200\321\201\320\270\321\216\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\222\320\244\320\260\320\271\320\273.os" index c621764f..5092ab7c 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\321\205\321\200\320\260\320\275\320\270\321\202\321\214\320\222\320\265\321\200\321\201\320\270\321\216\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\222\320\244\320\260\320\271\320\273.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\276\321\205\321\200\320\260\320\275\320\270\321\202\321\214\320\222\320\265\321\200\321\201\320\270\321\216\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260\320\222\320\244\320\260\320\271\320\273.os" @@ -21,13 +21,13 @@ Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт ТекстОписания = - " Выгрузить файл конфигурации определенной версии из хранилища 1С. + " Выгрузка файла конфигурации определенной версии из хранилища 1С. | "; ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, ТекстОписания); - Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-name", "Строка подключения к хранилище"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-name", "Строка подключения к хранилищу"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-user", "Пользователь хранилища"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-pwd", "Пароль"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-ver", "Номер версии, по умолчанию берем последнюю"); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\277\321\200\320\260\320\262\320\272\320\260\320\237\320\276\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\260\320\274.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\277\321\200\320\260\320\262\320\272\320\260\320\237\320\276\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\260\320\274.os" index 9675e42b..57707bd3 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\277\321\200\320\260\320\262\320\272\320\260\320\237\320\276\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\260\320\274.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\277\321\200\320\260\320\262\320\272\320\260\320\237\320\276\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\260\320\274.os" @@ -9,7 +9,7 @@ Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт - ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, "Вывод справки по параметрам"); + ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, " Вывод справки по параметрам."); Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "Команда", "Имя команды, для которой выводится справка"); Парсер.ДобавитьКоманду(ОписаниеКоманды); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265_xUnitFor1C.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265_xUnitFor1C.os" index 4ac443f7..232c4fea 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265_xUnitFor1C.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265_xUnitFor1C.os" @@ -1,18 +1,15 @@ /////////////////////////////////////////////////////////////////////////////////////////////////// // -// Запуск тестирования через фреймворк xUnitFor1C +// Запуск тестирования через фреймворк Vanessa-ADD // -// oscript src/main.os xunit C:\projects\xUnitFor1C\Tests\Smoke --pathxunit C:\projects\xUnitFor1C\xddTestRunner.epf -// --reportsxunit "ГенераторОтчетаJUnitXML{build/junit.xml};ГенераторОтчетаAllureXML{build/allure.xml}" +// oscript src/main.os xunit C:\projects\add\tests\smoke +// --reportsxunit "ГенераторОтчетаJUnitXML{build/junit.xml};ГенераторОтчетаAllureXMLВерсия2{build/allure.xml}" // --reportsxunit "GenerateReportJUnitXML{build/junit.xml};GenerateReportAllureXML{build/allure.xml}" // -// TODO добавить фичи для проверки команды тестирования xUnitFor1C +// TODO добавить фичи для проверки команды тестирования Vanessa-ADD // // Служебный модуль с набором методов работы с командами приложения // -// Структура модуля реализована в соответствии с рекомендациями -// oscript-app-template (C) EvilBeaver -// /////////////////////////////////////////////////////////////////////////////////////////////////// #Использовать logos @@ -32,7 +29,7 @@ НастройкиДля1С.ДобавитьШаблоннуюПеременную("addRoot", add.КаталогИнструментов()); ТекстОписания = - " Запуск тестирования через фреймворк ADD.xUnitFor1C + " Запуск тестирования через фреймворк Vanessa-ADD. | "; ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, @@ -48,7 +45,7 @@ Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--workspace", " - |[env RUNNER_WORKSPACE] путь к папке, относительно которой будут определятся макросы $workspace. + |[env RUNNER_WORKSPACE] путь к папке, относительно которой будут определяться макросы $workspace. | по умолчанию текущий."); Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "--config-tests", diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\237\320\276\320\262\320\265\320\264\320\265\320\275\320\270\321\217.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\237\320\276\320\262\320\265\320\264\320\265\320\275\320\270\321\217.os" index f74b0309..86ba2692 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\237\320\276\320\262\320\265\320\264\320\265\320\275\320\270\321\217.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\237\320\276\320\262\320\265\320\264\320\265\320\275\320\270\321\217.os" @@ -1,17 +1,12 @@ /////////////////////////////////////////////////////////////////////////////////////////////////// // -// Запуск тестирования через фреймворк vanessa-behavior +// Запуск проверки поведения через фреймворк Vanessa-ADD // // Пример строки запуска: -// oscript src/main.os vanessa --pathvanessa ".\vanessa-behavior\vanessa-behavior.epf" --ibconnection /F./build/ib --vanessasettings ./examples\.vb-conf.json -// -// TODO добавить фичи для проверки команды +// oscript src/main.os vanessa --ibconnection /F./build/ib --vanessasettings ./examples\.vb-conf.json // // Служебный модуль с набором методов работы с командами приложения // -// Структура модуля реализована в соответствии с рекомендациями -// oscript-app-template (C) EvilBeaver -// /////////////////////////////////////////////////////////////////////////////////////////////////// #Использовать logos @@ -31,7 +26,7 @@ НастройкиДля1С.ДобавитьШаблоннуюПеременную("addRoot", add.КаталогИнструментов()); ТекстОписания = - " Запуск тестирования через фреймворк ADD.vanessa-behavior + " Запуск проверки поведения через фреймворк Vanessa-ADD. | "; ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, @@ -119,9 +114,9 @@ // ПутьКФичам - <Строка> - Путь к фичам, может быть пустым // РабочийКаталогПроекта - <Строка> - Путь к каталогу с проектом, по умолчанию каталог ./ // ПутьКНастройкам - <Строка> - Путь к файлу настроек запуска тестов -// ПутьКИнструментам - <Строка> - пут Булево, Неопределеноь к инструментам, по умолчанию ./vendor/vanessa-behavior +// ПутьКИнструментам - <Строка> - пут Булево, Неопределено к инструментам, по умолчанию add.ПутьИнструментаБДД() // ТолстыйКлиент - Булево, Неопределено - признак запуска толстого клиента -// ОжидатьЗавершения - <Булево> - признак запуска ожидания, пока 1С завершиться, +// ОжидатьЗавершения - <Булево> - признак запуска ожидания, пока 1С завершится, // для разработки освобождения командной строки надо ставить Ложь; // ДопПараметры - <Строка> - дополнительные параметры для передачи в параметры запуска 1с, например /DebugURLtcp://localhost // @@ -131,7 +126,6 @@ Знач ОжидатьЗавершения = Истина, Знач ДопПараметры="") Лог.Информация("Тестирую поведение с помощью фреймворка ADD"); - // Лог.УстановитьУровень(УровниЛога.Отладка); Лог.Отладка("РабочийКаталогПроекта <%1>", РабочийКаталогПроекта); Если РабочийКаталогПроекта = Неопределено Тогда diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\241\320\265\320\260\320\275\321\201\320\260\320\274\320\270.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\241\320\265\320\260\320\275\321\201\320\260\320\274\320\270.os" index dfface44..a7bcb00e 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\241\320\265\320\260\320\275\321\201\320\260\320\274\320\270.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\241\320\265\320\260\320\275\321\201\320\260\320\274\320\270.os" @@ -63,7 +63,12 @@ "--with-nolock", "Не блокировать сеансы (y/n). Может применяться для действия kill, т.к. по умолчанию, при его выполнении автоматически блокируется начало сеансов. |Пример: ... kill --with-nolock ..."); - + + Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, + "--lockendclear", + "Очищать дату окончания блокировки (y/n). Может применяться для действия lock. + |Пример: ... lock --with-nolock ..."); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--filter", "Фильтр поиска сеансов. Предполагает возможность указания множественных вариантов фильтрации. Задается в формате '[filter1]|[filter2]|...|[filterN]'. @@ -93,15 +98,15 @@ Если мЭтоПолучениеИнформацииИБ Тогда ТекстОписанияКоманды = " Получение информации о базе данных (выводится в консоль выполнения скрипта). - | Может применяться для проверки работы RAS/RAC. + | Может применяться для проверки работы RAS/RAC. | "; ИначеЕсли мЭтоУправлениеРегламентнымиЗаданиями Тогда ТекстОписанияКоманды = - " Управление возможностью работы регламентных заданий + " Управление возможностью работы регламентных заданий. | "; ИначеЕсли мЭтоУправлениеСеансами Тогда ТекстОписанияКоманды = - " Управление сеансами информационной базы + " Управление сеансами информационной базы. | "; КонецЕсли; @@ -114,7 +119,6 @@ Исключение Лог = Логирование.ПолучитьЛог(ПараметрыСистемы.ИмяЛогаСистемы()); КонецПопытки; - Лог.УстановитьУровень(УровниЛога.Отладка); ПрочитатьПараметры(ПараметрыКоманды); @@ -175,6 +179,7 @@ мНастройки.Вставить("ВремяСтартаБлокировки", ПараметрыКоманды["--lockstart"]); мНастройки.Вставить("ВремяСтартаБлокировкиЧерез", ПараметрыКоманды["--lockstartat"]); мНастройки.Вставить("ЧислоПопыток", ПараметрыКоманды["--try"]); + мНастройки.Вставить("ОчищатьВремяОкончанияБлокировки", ПараметрыКоманды["--lockendclear"]); мНастройки.Вставить("НеБлокироватьСеансы", ПараметрыКоманды["--with-nolock"]); мНастройки.Вставить("ФильтрСеансов", ПолучитьСоставляющиеФильтра(ПараметрыКоманды["--filter"])); @@ -302,8 +307,13 @@ ВремяБлокировки = Формат(ТекущаяДата() + Секунды, "ДФ='yyyy-MM-ddTHH:mm:ss'"); КонецЕсли; + + СтрокаОкончанияБлокировки = ""; + Если мНастройки.ОчищатьВремяОкончанияБлокировки Тогда + СтрокаОкончанияБлокировки = " --denied-to="""""; + КонецЕсли; - КомандаВыполнения = СтрокаЗапускаКлиента() + СтрШаблон("infobase update --infobase=""%3""%4 --cluster=""%1""%2 --sessions-deny=%5 --denied-message=""%6"" --denied-from=""%8"" --permission-code=""%7""", + КомандаВыполнения = СтрокаЗапускаКлиента() + СтрШаблон("infobase update --infobase=""%3""%4 --cluster=""%1""%2 --sessions-deny=%5 --denied-message=""%6"" --denied-from=""%8""%9 --permission-code=""%7""", ИдентификаторКластера, КлючиАвторизацииВКластере(), ИдентификаторБазы, @@ -311,7 +321,8 @@ ?(Блокировать, "on", "off"), мНастройки.СообщениеОблокировке, КлючРазрешенияЗапуска, - ВремяБлокировки) + " "+мНастройки.АдресСервераАдминистрирования; + ВремяБлокировки, + СтрокаОкончанияБлокировки) + " "+мНастройки.АдресСервераАдминистрирования; Для Сч = 1 По мНастройки.ЧислоПопыток Цикл Попытка @@ -542,7 +553,15 @@ Лог.Информация(СтрШаблон("Отключаю сеанс: %1 [%2] (%3)", Сеанс.НомерСеанса, Сеанс.Пользователь, Сеанс.Приложение)); - ЗапуститьПроцесс(СтрокаВыполнения); + Попытка + ЗапуститьПроцесс(СтрокаВыполнения); + Исключение + ТекстОшибки = ОписаниеОшибки(); + Если СтрНайти(ВРег(ТекстОшибки), ВРег("Сеанс отсутствует или удален")) = 0 + И СтрНайти(ВРег(ТекстОшибки), ВРег("Сеанс с указанным идентификатором не найден")) = 0 Тогда + ВызватьИсключение ОписаниеОшибки(); + КонецЕсли; + КонецПопытки; КонецПроцедуры diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\202\320\276\321\200\320\260.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\202\320\276\321\200\320\260.os" index 4d065ef8..dba8f81e 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\202\320\276\321\200\320\260.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\202\320\276\321\200\320\260.os" @@ -517,8 +517,12 @@ // Ожидаем.Что(ПутьХранилища, ТекущаяПроцедура+" не задана строка подключения к хранилищу").Заполнено(); // Ожидаем.Что(ЛогинАдминистратора, ТекущаяПроцедура+" не задан пользователь хранилища").Заполнено(); - УправлениеКонфигуратором.СоздатьФайловуюБазу(КаталогВременнойИБ); - УправлениеКонфигуратором.УстановитьКонтекст("/F " + КаталогВременнойИБ, "", ""); + КонтекстБД = УправлениеКонфигуратором.ПолучитьКонтекст(); + Если Не ЗначениеЗаполнено(КонтекстБД.КлючСоединенияСБазой) Тогда + Лог.Предупреждение("При подключении к хранилищу не определена БД, подключаем временную БД"); + УправлениеКонфигуратором.СоздатьФайловуюБазу(КаталогВременнойИБ); + УправлениеКонфигуратором.УстановитьКонтекст("/F " + КаталогВременнойИБ, "", ""); + КонецЕсли; ХранилищеКонфигурации = Новый МенеджерХранилищаКонфигурации(); ХранилищеКонфигурации.УстановитьУправлениеКонфигуратором(УправлениеКонфигуратором); diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\321\217\320\236\321\202\321\207\320\265\321\202\320\276\320\262.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\321\217\320\236\321\202\321\207\320\265\321\202\320\276\320\262.os" new file mode 100644 index 00000000..cbcd9b2e --- /dev/null +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\321\217\320\236\321\202\321\207\320\265\321\202\320\276\320\262.os" @@ -0,0 +1,746 @@ + +#Использовать JSON + +Перем КэшМетаданных; + +// СформироватьОтчетВФорматеJUnit +// Создает отчет об ошибках в формате JUnit +// Параметры: +// ОшибокНет - Булево - Признак наличия ошибок +// РезультатТестирования - Структура - Набор параметров результата тестирования +// ПутьОтчетаВФорматеJUnitxml - Строка - Путь к создаваемому файлу отчета +// РасширениеНабора - Строка - Базовая часть набора тестов +// +Процедура СформироватьОтчетВФорматеJUnit(ОшибокНет, РезультатТестирования, ПутьОтчетаВФорматеJUnitxml, РасширениеНабора = "") Экспорт + + ПредставлениеНабораТестов = "CheckConfig"; + Если ЗначениеЗаполнено(РасширениеНабора) Тогда + + ПредставлениеНабораТестов = СтрШаблон("%2.%1", РасширениеНабора, ПредставлениеНабораТестов); + + КонецЕсли; + + ПредставлениеНабораТестовXML = XMLСтрока(ПредставлениеНабораТестов); + + ЗаписьXML = Новый ЗаписьXML; + ЗаписьXML.УстановитьСтроку("UTF-8"); + ЗаписьXML.ЗаписатьОбъявлениеXML(); + + ВремяВыполнения = ТекущаяДата() - РезультатТестирования.ДатаНачала; + + ЗаписьXML.ЗаписатьНачалоЭлемента("testsuites"); + ЗаписьXML.ЗаписатьАтрибут("name", ПредставлениеНабораТестовXML); + + КоличествоТестов = РезультатТестирования.КоличествоПроверок; + Если КоличествоТестов = 0 Тогда + КоличествоТестов = 1; + КонецЕсли; + + ЗаписьXML.ЗаписатьАтрибут("tests", XMLСтрока(КоличествоТестов)); + ЗаписьXML.ЗаписатьАтрибут("failures", XMLСтрока(РезультатТестирования.КоличествоУпало)); + ЗаписьXML.ЗаписатьАтрибут("skipped", XMLСтрока(РезультатТестирования.КоличествоПропущено)); + ЗаписьXML.ЗаписатьАтрибут("time", XMLСтрока(ВремяВыполнения)); + + ЗаписьXML.ЗаписатьНачалоЭлемента("testsuite"); + ЗаписьXML.ЗаписатьАтрибут("name", ПредставлениеНабораТестовXML); + ЗаписьXML.ЗаписатьНачалоЭлемента("properties"); + ЗаписьXML.ЗаписатьКонецЭлемента(); // properties + + Если НЕ РезультатТестирования.Ошибки.Количество() Тогда + + ЗаписьXML.ЗаписатьНачалоЭлемента("testcase"); + ЗаписьXML.ЗаписатьАтрибут("classname", ПредставлениеНабораТестовXML); + ЗаписьXML.ЗаписатьАтрибут("name", XMLСтрока("Все сообщения")); + ЗаписьXML.ЗаписатьАтрибут("time", XMLСтрока(ВремяВыполнения)); + Если РезультатТестирования.КоличествоУпало = 0 Тогда + + ЗаписьXML.ЗаписатьАтрибут("status", "passed"); + + Иначе + + ЗаписьXML.ЗаписатьАтрибут("status", "failure"); + + КонецЕсли; + + Если НЕ ОшибокНет Тогда + + ЗаписьXML.ЗаписатьНачалоЭлемента("failure"); + ЗаписьXML.ЗаписатьАтрибут("message", XMLСтрока(РезультатТестирования.ВсеОшибки)); + ЗаписьXML.ЗаписатьКонецЭлемента(); // failure + + КонецЕсли; + + Иначе + + Для Каждого ГруппыОбъектов Из РезультатТестирования.Ошибки Цикл + + Для Каждого ГруппыТипов Из ГруппыОбъектов.Значение Цикл + + ЗаписьXML.ЗаписатьНачалоЭлемента("testcase"); + ЗаписьXML.ЗаписатьАтрибут("classname", СтрШаблон("%1.%2", ПредставлениеНабораТестовXML, ГруппыТипов.Ключ)); + ЗаписьXML.ЗаписатьАтрибут("name", XMLСтрока(ГруппыОбъектов.Ключ)); + ТекстОшибки = ""; + Для Каждого ТестовыйСлучай Из ГруппыТипов.Значение Цикл + ТекстОшибки = ТекстОшибки + ?(ПустаяСтрока(ТекстОшибки), "", Символы.ПС) + + ?(ЗначениеЗаполнено(ТестовыйСлучай.НомерСтроки), "Строка " + ТестовыйСлучай.НомерСтроки + ": ", "") + ТестовыйСлучай.ТекстОшибки; + КонецЦикла; + + Если ГруппыТипов.Ключ = "Пропущено" Тогда + + ЗаписьXML.ЗаписатьНачалоЭлемента("skipped"); + ЗаписьXML.ЗаписатьКонецЭлемента(); + ЗаписьXML.ЗаписатьНачалоЭлемента("system-out"); + ЗаписьXML.ЗаписатьТекст(XMLСтрока(ТекстОшибки)); + ЗаписьXML.ЗаписатьКонецЭлемента(); + + Иначе + + ЗаписьXML.ЗаписатьНачалоЭлемента("failure"); + Если ГруппыТипов.Ключ = "Ошибка" Тогда + + ЗаписьXML.ЗаписатьАтрибут("type", "ERROR"); + + Иначе + + ЗаписьXML.ЗаписатьАтрибут("type", "WARNING"); + + КонецЕсли; + + ЗаписьXML.ЗаписатьАтрибут("message", XMLСтрока(ТекстОшибки)); + ЗаписьXML.ЗаписатьКонецЭлемента(); // failure + + КонецЕсли; + + ЗаписьXML.ЗаписатьКонецЭлемента(); + + КонецЦикла; + + КонецЦикла; + + КонецЕсли; + + ЗаписьXML.ЗаписатьКонецЭлемента(); // testsuite + ЗаписьXML.ЗаписатьКонецЭлемента(); // testsuites + + СтрокаХМЛ = ЗаписьXML.Закрыть(); + + ЗаписьXML = Новый ЗаписьXML; + ЗаписьXML.ОткрытьФайл(ПутьОтчетаВФорматеJUnitxml); + ЗаписьXML.ЗаписатьБезОбработки(СтрокаХМЛ); // таким образом файл будет записан всего один раз, и не будет проблем с обработкой на билд-сервере TeamCity + ЗаписьXML.Закрыть(); + +КонецПроцедуры + +// СформироватьОтчетВФорматеAllure +// Создает отчет об ошибках в формате Allure +// Параметры: +// ОшибокНет - Булево - Признак наличия ошибок +// ДатаНачала - ДатаВремя - Дата начала формирования отчета +// РезультатТестирования - Структура - Набор параметров результата тестирования +// КаталогОтчетовAllure - Строка - Путь к каталогу отчетов +// РасширениеНабора - Строка - Базовая часть набора тестов +// +Процедура СформироватьОтчетВФорматеAllure(ОшибокНет, ДатаНачала, РезультатТестирования, КаталогОтчетовAllure, РасширениеНабора = "") Экспорт + + Если НЕ РезультатТестирования.Ошибки.Количество() Тогда + + Возврат; + + КонецЕсли; + + ФайлКаталога = Новый Файл(КаталогОтчетовAllure); + Если НЕ ФайлКаталога.Существует() Тогда + + СоздатьКаталог(ФайлКаталога.ПолноеИмя); + + КонецЕсли; + + ВремяСтарта = РезультатТестирования.ДатаНачала; + ВремяОкончания = ТекущаяДата(); + + ПредставлениеНабораТестов = "Синтаксическая проверка конфигурации"; + Если ЗначениеЗаполнено(РасширениеНабора) Тогда + + ПредставлениеНабораТестов = СтрШаблон("%2. %1", РасширениеНабора, ПредставлениеНабораТестов); + + КонецЕсли; + + ЗаписьXML = Новый ЗаписьXML; + ЗаписьXML.УстановитьСтроку("UTF-8"); + ЗаписьXML.ЗаписатьОбъявлениеXML(); + ЗаписьXML.ЗаписатьНачалоЭлемента("test-suite", ""); + ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("", "urn:model.allure.qatools.yandex.ru"); + ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xs", "http://www.w3.org/2001/XMLSchema"); + ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance"); + ЗаписьXML.ЗаписатьНачалоЭлемента("name"); + ЗаписьXML.ЗаписатьТекст(XMLСтрока(ПредставлениеНабораТестов)); + ЗаписьXML.ЗаписатьКонецЭлемента(); + + ЗаписьXML.ЗаписатьНачалоЭлемента("test-cases"); + ВажностьНабора = "minor"; + + Для Каждого ГруппыОбъектов Из РезультатТестирования.Ошибки Цикл + + Для Каждого ГруппыТипов Из ГруппыОбъектов.Значение Цикл + + ТекстОшибки = ""; + ВажностьТекстКейса = "minor"; + КонтекстыОшибки = Новый Соответствие(); + Для Каждого ТестовыйСлучай Из ГруппыТипов.Значение Цикл + + ТекстОшибки = ТекстОшибки + ?(ПустаяСтрока(ТекстОшибки), "", Символы.ПС) + + ?(ЗначениеЗаполнено(ТестовыйСлучай.НомерСтроки), "Строка " + ТестовыйСлучай.НомерСтроки + ": ", "") + ТестовыйСлучай.ТекстОшибки; + + ЗаполнитьКонтекстыОшибки(КонтекстыОшибки, ТестовыйСлучай.ТекстОшибки); + + КонецЦикла; + + ЗаписьXML.ЗаписатьНачалоЭлемента("test-case"); + ЗаписьXML.ЗаписатьАтрибут("start", ДатаВLong(ВремяСтарта)); + ЗаписьXML.ЗаписатьАтрибут("stop", ДатаВLong(ВремяОкончания)); + + Статус = "skipped"; + Если ГруппыТипов.Ключ = "Ошибка" Тогда + + Статус = "failed"; + ВажностьНабора = "critical"; + ВажностьТекстКейса = "critical"; + + ИначеЕсли ГруппыТипов.Ключ = "Предупреждение" Тогда + + Статус = "broken"; + + ИначеЕсли ГруппыТипов.Ключ = "Пропущено" Тогда + + Статус = "skipped"; + + ИначеЕсли ГруппыТипов.Ключ = "Исправлено" Тогда + + Статус = "passed"; + + КонецЕсли; + ЗаписьXML.ЗаписатьАтрибут("status", Статус); + ЗаписьXML.ЗаписатьНачалоЭлемента("name"); + ЗаписьXML.ЗаписатьТекст(XMLСтрока(ГруппыОбъектов.Ключ + "." + ГруппыТипов.Ключ)); + ЗаписьXML.ЗаписатьКонецЭлемента(); + + Если Статус = "failed" ИЛИ Статус = "broken" Тогда + ЗаписьXML.ЗаписатьНачалоЭлемента("failure"); + ЗаписьXML.ЗаписатьНачалоЭлемента("message"); + ЗаписьXML.ЗаписатьТекст(XMLСтрока(ТекстОшибки)); + ЗаписьXML.ЗаписатьКонецЭлемента(); + ЗаписьXML.ЗаписатьКонецЭлемента(); + КонецЕсли; + + ЗаписьXML.ЗаписатьНачалоЭлемента("labels"); + ЗаписьXML.ЗаписатьНачалоЭлемента("label"); + ЗаписьXML.ЗаписатьАтрибут("name", "package"); + ЗаписьXML.ЗаписатьАтрибут("value", XMLСтрока(ГруппыОбъектов.Ключ)); + ЗаписьXML.ЗаписатьКонецЭлемента(); + + Для Каждого КонтекстОшибки Из КонтекстыОшибки Цикл + ЗаписьXML.ЗаписатьНачалоЭлемента("label"); + ЗаписьXML.ЗаписатьАтрибут("name", "tag"); + ЗаписьXML.ЗаписатьАтрибут("value", КонтекстОшибки.Ключ); + ЗаписьXML.ЗаписатьКонецЭлемента(); + КонецЦикла; + + Для Каждого ТестовыйСлучай Из ГруппыТипов.Значение Цикл + + ЗаписьXML.ЗаписатьНачалоЭлемента("label"); + ЗаписьXML.ЗаписатьАтрибут("name", "story"); + ЗаписьXML.ЗаписатьАтрибут("value", XMLСтрока(ОписаниеФункциональности(ТестовыйСлучай.ТекстОшибки))); + ЗаписьXML.ЗаписатьКонецЭлемента(); + + КонецЦикла; + + ЗаписьXML.ЗаписатьНачалоЭлемента("label"); + ЗаписьXML.ЗаписатьАтрибут("name", "severity"); + ЗаписьXML.ЗаписатьАтрибут("value", ВажностьТекстКейса); + ЗаписьXML.ЗаписатьКонецЭлемента(); + ЗаписьXML.ЗаписатьКонецЭлемента(); + ЗаписьXML.ЗаписатьКонецЭлемента(); + + КонецЦикла; + + КонецЦикла; + + ЗаписьXML.ЗаписатьКонецЭлемента(); + ЗаписьXML.ЗаписатьНачалоЭлемента("labels"); + ЗаписьXML.ЗаписатьНачалоЭлемента("label"); + ЗаписьXML.ЗаписатьАтрибут("name", "severity"); + ЗаписьXML.ЗаписатьАтрибут("value", ВажностьНабора); + ЗаписьXML.ЗаписатьКонецЭлемента(); + ЗаписьXML.ЗаписатьКонецЭлемента(); + + РеальноеИмяФайла = ОбъединитьПути(КаталогОтчетовAllure, "" + (Новый УникальныйИдентификатор()) + "-testsuite.xml"); + + СтрокаХМЛ = ЗаписьXML.Закрыть(); + ТекстовыйДокумент = Новый ТекстовыйДокумент; + ТекстовыйДокумент.УстановитьТекст(СтрокаХМЛ); + ТекстовыйДокумент.Записать(РеальноеИмяФайла, КодировкаТекста.UTF8NoBOM); + +КонецПроцедуры + +// СформироватьОтчетВФорматеAllure2 +// Создает отчет об ошибках в формате Allure2 +// Параметры: +// ОшибокНет - Булево - Признак наличия ошибок +// ДатаНачала - ДатаВремя - Дата начала формирования отчета +// РезультатТестирования - Структура - Набор параметров результата тестирования +// КаталогОтчетовAllure - Строка - Путь к каталогу отчетов +// РасширениеНабора - Строка - Базовая часть набора тестов +// ПутьКФайламПроекта - Строка - Путь к файлам проекта в репозитории для генерации ссылок для перехода к строке +// Пример: https://github.com/1C-Company/GitConverter/tree/master/GitConverter/src +// +Процедура СформироватьОтчетВФорматеAllure2(ОшибокНет, ДатаНачала, РезультатТестирования, КаталогОтчетовAllure, РасширениеНабора = "", ПутьКФайламПроекта = "") Экспорт + + Если НЕ РезультатТестирования.Ошибки.Количество() Тогда + + Возврат; + + КонецЕсли; + + ФайлКаталога = Новый Файл(КаталогОтчетовAllure); + Если НЕ ФайлКаталога.Существует() Тогда + + СоздатьКаталог(ФайлКаталога.ПолноеИмя); + + КонецЕсли; + + ВремяСтарта = РезультатТестирования.ДатаНачала; + ВремяОкончания = ТекущаяДата(); + + ПредставлениеНабораТестов = "Синтаксическая проверка конфигурации"; + Если ЗначениеЗаполнено(РасширениеНабора) Тогда + + ПредставлениеНабораТестов = СтрШаблон("%2. %1", РасширениеНабора, ПредставлениеНабораТестов); + + КонецЕсли; + + ПарсерJSON = Новый ПарсерJSON(); + ВремяСтарта = РезультатТестирования.ДатаНачала; + ВремяОкончания = ТекущаяДата(); + + Для Каждого ГруппыОбъектов Из РезультатТестирования.Ошибки Цикл + + Для Каждого ГруппыТипов Из ГруппыОбъектов.Значение Цикл + + Для Каждого ТестовыйСлучай Из ГруппыТипов.Значение Цикл + + ОписаниеФункциональности = ОписаниеФункциональности(ТестовыйСлучай.ТекстОшибки); + ОписаниеСценария = ПолучитьОписаниеСценарияАллюр2(); + ОписаниеСценария.name = ГруппыОбъектов.Ключ + ". " + + ?(ЗначениеЗаполнено(ТестовыйСлучай.НомерСтроки), "" + ТестовыйСлучай.НомерСтроки + ": ", "") + + ОписаниеФункциональности; + ОписаниеСценария.fullName = ОписаниеСценария.name; + ОписаниеСценария.historyId = ОписаниеСценария.name; + ОписаниеСценария.start = ДатаВLong(ВремяСтарта); + ОписаниеСценария.stop = ДатаВLong(ВремяОкончания); + ОписаниеСценария.description = ?(ЗначениеЗаполнено(ТестовыйСлучай.НомерСтроки), "Строка " + ТестовыйСлучай.НомерСтроки + ": ", "") + + ТестовыйСлучай.ТекстОшибки; + + Если ГруппыТипов.Ключ = "Ошибка" Тогда + + ОписаниеСценария.status = "failed"; + + ИначеЕсли ГруппыТипов.Ключ = "Предупреждение" Тогда + + ОписаниеСценария.status = "broken"; + + ИначеЕсли ГруппыТипов.Ключ = "Пропущено" Тогда + + ОписаниеСценария.status = "skipped"; + + ИначеЕсли ГруппыТипов.Ключ = "Исправлено" Тогда + + ОписаниеСценария.status = "passed"; + + КонецЕсли; + + ОписаниеСценария.labels.Добавить(Новый Структура("name, value", "package", ГруппыОбъектов.Ключ)); + ОписаниеСценария.labels.Добавить(Новый Структура("name, value", "story", ОписаниеФункциональности)); + + КонтекстыОшибки = Новый Соответствие(); + ЗаполнитьКонтекстыОшибки(КонтекстыОшибки, ТестовыйСлучай.ТекстОшибки); + Для Каждого КонтекстОшибки Из КонтекстыОшибки Цикл + + ОписаниеСценария.labels.Добавить(Новый Структура("name, value", "tag", КонтекстОшибки.Ключ)); + + КонецЦикла; + + СсылкаНаСтрокуИсходников = ПолучитьСсылкуНаСтрокуИсходников(ГруппыОбъектов.Ключ, ТестовыйСлучай.НомерСтроки, ПутьКФайламПроекта); + + Если ЗначениеЗаполнено(СсылкаНаСтрокуИсходников) Тогда + + ОписаниеСсылки = Новый Структура("name, url, type"); + ОписаниеСсылки.name = "Перейти на строку с ошибкой"; + ОписаниеСсылки.url = СсылкаНаСтрокуИсходников; + ОписаниеСсылки.type = ""; + + ОписаниеСценария.links.Добавить(ОписаниеСсылки); + + КонецЕсли; + + РеальноеИмяФайла = ОбъединитьПути(КаталогОтчетовAllure, "" + ОписаниеСценария.uuid + "-result.json" ); + + ТекстовыйДокумент = Новый ТекстовыйДокумент; + ТекстовыйДокумент.УстановитьТекст(ПарсерJSON.ЗаписатьJSON(ОписаниеСценария)); + ТекстовыйДокумент.Записать(РеальноеИмяФайла, КодировкаТекста.UTF8NoBOM); + + КонецЦикла; + + КонецЦикла; + + КонецЦикла; + +КонецПроцедуры + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +Процедура ЗаполнитьКонтекстыОшибки(КонтекстыОшибки, Знач ОписаниеОшибки) + + ПозНачалоКонфигуратор = СтрНайти(ОписаниеОшибки, " (Проверка"); + ПозНачалоEDT = СтрНайти(ОписаниеОшибки, "["); + + Если ПозНачалоКонфигуратор Тогда // Формат конфигуратора + + ТекстОшибки = Сред(ОписаниеОшибки, ПозНачалоКонфигуратор); + + Если СтрНайти(ТекстОшибки, "Проверка толстого клиента (обычное приложение)") Тогда + + КонтекстыОшибки.Вставить("Толстый клиент (обычное приложение)"); + + ИначеЕсли СтрНайти(ТекстОшибки, "Проверка: Веб-клиент") Тогда + + КонтекстыОшибки.Вставить("Web-клиент"); + + ИначеЕсли СтрНайти(ТекстОшибки, "Проверка: Тонкий клиент") Тогда + + КонтекстыОшибки.Вставить("Тонкий клиент"); + + ИначеЕсли СтрНайти(ТекстОшибки, "Проверка: Внешнее соединение ") Тогда + + КонтекстыОшибки.Вставить("Внешнее соединение"); + + ИначеЕсли СтрНайти(ТекстОшибки, "Проверка: Толстый клиент ") Тогда + + КонтекстыОшибки.Вставить("Толстый клиент (управляемое приложение)"); + + КонецЕсли; + + ИначеЕсли ПозНачалоEDT Тогда + + ПозКонецEDT = СтрНайти(ОписаниеОшибки, "]", НаправлениеПоиска.СКонца); + Если ПозКонецEDT > ПозНачалоEDT Тогда + + КонтекстИсполнения = Сред(ОписаниеОшибки, ПозНачалоEDT + 1, ПозКонецEDT - ПозНачалоEDT - 1); + + Если СтрНайти(КонтекстИсполнения, "Внешнее соединение") Тогда + + КонтекстыОшибки.Вставить("Внешнее соединение"); + + КонецЕсли; + + Если СтрНайти(КонтекстИсполнения, "Сервер,") Тогда + + КонтекстыОшибки.Вставить("Сервер"); + + КонецЕсли; + + Если СтрНайти(КонтекстИсполнения, "Тонкий клиент") Тогда + + КонтекстыОшибки.Вставить("Тонкий клиент"); + + КонецЕсли; + + Если СтрНайти(КонтекстИсполнения, "Толстый клиент (управляемое приложение)") Тогда + + КонтекстыОшибки.Вставить("Толстый клиент (управляемое приложение)"); + + КонецЕсли; + + Если СтрНайти(КонтекстИсполнения, "Web-клиент") Тогда + + КонтекстыОшибки.Вставить("Web-клиент"); + + КонецЕсли; + + Если СтрНайти(КонтекстИсполнения, "Толстый клиент (обычное приложение)") Тогда + + КонтекстыОшибки.Вставить("Толстый клиент (обычное приложение)"); + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +Функция ДатаВLong(ИсходнаяДата) + + Если ТипЗнч(ИсходнаяДата) = Тип("Дата") Тогда + + Возврат Окр((ИсходнаяДата - Дата(1, 1, 1)) * 1000); + + Иначе // уже число + + Возврат ИсходнаяДата; + + КонецЕсли; + +КонецФункции + +Функция ПолучитьОписаниеСценарияАллюр2() + + СтруктураРезультата = Новый Структура(); + СтруктураРезультата.Вставить("uuid", Строка(Новый УникальныйИдентификатор())); + СтруктураРезультата.Вставить("historyId", Неопределено); + СтруктураРезультата.Вставить("name", Неопределено); + СтруктураРезультата.Вставить("fullName", Неопределено); + СтруктураРезультата.Вставить("start", Неопределено); + СтруктураРезультата.Вставить("stop", Неопределено); + СтруктураРезультата.Вставить("statusDetails", Новый Структура("known, muted,flaky", Ложь, Ложь, Ложь)); + СтруктураРезультата.Вставить("status", Неопределено); + СтруктураРезультата.Вставить("stage", "finished"); + СтруктураРезультата.Вставить("steps", Новый Массив); + СтруктураРезультата.Вставить("parameters", Новый Массив); + СтруктураРезультата.Вставить("labels", Новый Массив); + СтруктураРезультата.Вставить("links", Новый Массив); + СтруктураРезультата.Вставить("attachments", Новый Массив); + СтруктураРезультата.Вставить("description", Неопределено); + + Возврат СтруктураРезультата; + +КонецФункции + +Функция ОписаниеФункциональности(Знач ОписаниеОшибки) + + ПозНачалоКонфигуратор = СтрНайти(ОписаниеОшибки, " (Проверка"); + ПозНачалоEDT = СтрНайти(ОписаниеОшибки, "["); + + Если ПозНачалоКонфигуратор Тогда // Формат конфигуратора + + ОписаниеОшибки = Лев(ОписаниеОшибки, ПозНачалоКонфигуратор - 1); + + ИначеЕсли ПозНачалоEDT Тогда + + ОписаниеОшибки = Лев(ОписаниеОшибки, ПозНачалоEDT - 1); + + КонецЕсли; + + ПозТаб = СтрНайти(ОписаниеОшибки, "#>"); + Если ПозТаб Тогда + ОписаниеОшибки = Лев(ОписаниеОшибки, ПозТаб - 1); + КонецЕсли; + + ЗаменитьПараметрыМетода(ОписаниеОшибки, "(", ")"); + ЗаменитьПараметрыМетода(ОписаниеОшибки, """"); + ЗаменитьПараметрыМетода(ОписаниеОшибки, "'"); + ОписаниеОшибки = СтрЗаменить(ОписаниеОшибки, " <> ", " "); + ОписаниеОшибки = СтрЗаменить(ОписаниеОшибки, "(<>)", ""); + ОписаниеОшибки = СтрЗаменить(ОписаниеОшибки, " <>", ""); + ОписаниеОшибки = СтрЗаменить(ОписаниеОшибки, " ", " "); + ОписаниеОшибки = СокрЛП(ОписаниеОшибки); + + Если СтрЗаканчиваетсяНа(ОписаниеОшибки, ":") Тогда + ОписаниеОшибки = Лев(ОписаниеОшибки, СтрДлина(ОписаниеОшибки) - 1); + КонецЕсли; + Возврат СокрЛП(ОписаниеОшибки); + +КонецФункции + +Процедура ЗаменитьПараметрыМетода(ОписаниеОшибки, РазделительНачало, РазделительКонец = "") + + Если РазделительКонец = "" Тогда + РазделительКонец = РазделительНачало; + КонецЕсли; + + ПозицияКавычки = СтрНайти(ОписаниеОшибки, РазделительНачало); + Если ПозицияКавычки = 0 Тогда + Возврат; + КонецЕсли; + + Пока ПозицияКавычки > 0 Цикл + + ПозицияЗакрывающейКавычки = СтрНайти(Сред(ОписаниеОшибки, ПозицияКавычки + 1), РазделительКонец) + ПозицияКавычки; + + Если ПозицияЗакрывающейКавычки = 0 Тогда + + Прервать; + + КонецЕсли; + + ОписаниеОшибки = Лев(ОписаниеОшибки, ПозицияКавычки - 1) + "<>" + Сред(ОписаниеОшибки, ПозицияЗакрывающейКавычки + 1); + ПозицияКавычки = СтрНайти(ОписаниеОшибки, РазделительНачало); + + КонецЦикла; + + ЗаменитьПараметрыМетода(ОписаниеОшибки, РазделительНачало, РазделительКонец); + +КонецПроцедуры + +Функция ПолучитьСсылкуНаСтрокуИсходников(Знач МетаданныеОбъекта, Знач НомерСтроки, Знач ПутьКФайламПроекта) + + Если Не ЗначениеЗаполнено(ПутьКФайламПроекта) Тогда + + Возврат ""; + + КонецЕсли; + + Если Не ЗначениеЗаполнено(НомерСтроки) Тогда + + Возврат ""; + + КонецЕсли; + + СоставМетаданных = СтрРазделить(МетаданныеОбъекта, "."); + + Если СоставМетаданных.Количество() = 0 Тогда + + Возврат ""; + + КонецЕсли; + + Если СоставМетаданных.Количество() < 3 Тогда + + Возврат ""; + + КонецЕсли; + + СоставСсылки = Новый Массив; + СоставСсылки.Добавить(ПутьКФайламПроекта); + + КаталогМетаданных = ПолучитьКаталогПоИмениМетаданных(СоставМетаданных[0]); + Если НЕ ЗначениеЗаполнено(КаталогМетаданных) Тогда + + Возврат ""; + + КонецЕсли; + + СоставСсылки.Добавить(КаталогМетаданных); + СоставСсылки.Добавить(СоставМетаданных[1]); // имя + ИмяФайла = ПолучитьИмяФайлаПоИмениМодуля(СоставМетаданных[2]); + + Если ЗначениеЗаполнено(ИмяФайла) Тогда + + СоставСсылки.Добавить(СоставСсылки); + + ИначеЕсли СоставМетаданных.Количество() > 3 Тогда + + Если СтрСравнить(СоставМетаданных[2], "Форма") = 0 Тогда + + СоставСсылки.Добавить("Forms"); + СоставСсылки.Добавить(СоставМетаданных[3]); + + Если СоставМетаданных.Количество() > 5 + И СтрСравнить(СоставМетаданных[4], "Форма") = 0 + И СтрСравнить(СоставМетаданных[5], "Модуль") = 0 Тогда + + СоставСсылки.Добавить("Module.bsl"); + + КонецЕсли; + + ИначеЕсли СтрСравнить(СоставМетаданных[2], "Команда") = 0 Тогда + + СоставСсылки.Добавить("Commands"); + СоставСсылки.Добавить(СоставМетаданных[3]); + + Если СоставМетаданных.Количество() > 4 + И СтрСравнить(СоставМетаданных[4], "МодульКоманды") = 0 Тогда + + СоставСсылки.Добавить("CommandModule.bsl"); + + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + + Возврат СтрСоединить(СоставСсылки, "/") + "#L" + НомерСтроки; + +КонецФункции + +Функция ПолучитьКаталогПоИмениМетаданных(ИмяОбъекта) + + Если КэшМетаданных = Неопределено Тогда + КэшМетаданных = Новый Соответствие(); + КонецЕсли; + + КэшКаталогов = КэшМетаданных.Получить("КэшКаталогов"); + Если КэшКаталогов = Неопределено Тогда + + КэшКаталогов = Новый Соответствие(); + КэшКаталогов.Вставить("РегистрБухгалтерии", "AccountingRegisters"); + КэшКаталогов.Вставить("РегистрНакопления", "AccumulationRegisters"); + КэшКаталогов.Вставить("БизнесПроцесс", "BusinessProcesses"); + КэшКаталогов.Вставить("РегистрРасчета", "CalculationRegisters"); + КэшКаталогов.Вставить("Справочник", "Catalogs"); + КэшКаталогов.Вставить("ПланСчетов", "ChartsOfAccounts"); + КэшКаталогов.Вставить("ПланВидовРасчета", "ChartsOfCalculationTypes"); + КэшКаталогов.Вставить("ПланВидовХарактеристик", "ChartsOfCharacteristicTypes"); + КэшКаталогов.Вставить("ОбщаяГруппа", "CommandGroups"); + КэшКаталогов.Вставить("ОбщийРеквизит", "CommonAttributes"); + КэшКаталогов.Вставить("ОбщаяКоманда", "CommonCommands"); + КэшКаталогов.Вставить("ОбщаяФорма", "CommonForms"); + КэшКаталогов.Вставить("ОбщийМодуль", "CommonModules"); + КэшКаталогов.Вставить("ОбщаяКартинка", "CommonPictures"); + КэшКаталогов.Вставить("ОбщийМакет", "CommonTemplates"); + КэшКаталогов.Вставить("Константа", "Constants"); + КэшКаталогов.Вставить("Обработка", "DataProcessors"); + КэшКаталогов.Вставить("ОпределяемыйТип", "DefinedTypes"); + КэшКаталогов.Вставить("ЖурналДокумента", "DocumentJournals"); + КэшКаталогов.Вставить("Нумератор", "DocumentNumerators"); + КэшКаталогов.Вставить("Документ", "Documents"); + КэшКаталогов.Вставить("Перечисление", "Enums"); + КэшКаталогов.Вставить("ПодпискаНаСобытие", "EventSubscriptions"); + КэшКаталогов.Вставить("ПланОбмена", "ExchangePlans"); + КэшКаталогов.Вставить("ВнешнийИсточник", "ExternalDataSources"); + КэшКаталогов.Вставить("КритерийОтбора", "FilterCriteria"); + КэшКаталогов.Вставить("ФункциональнаяОпция", "FunctionalOptions"); + КэшКаталогов.Вставить("ПарамертФункциональыхОпций", "FunctionalOptionsParameters"); + КэшКаталогов.Вставить("HTTPСервис", "HTTPServices"); + КэшКаталогов.Вставить("РегистрСведений", "InformationRegisters"); + КэшКаталогов.Вставить("Язык", "Languages"); + КэшКаталогов.Вставить("Отчет", "Reports"); + КэшКаталогов.Вставить("Роль", "Roles"); + КэшКаталогов.Вставить("РегламентноеЗадание", "ScheduledJobs"); + КэшКаталогов.Вставить("Последовательность", "Sequences"); + КэшКаталогов.Вставить("ПарамертСеанса", "SessionParameters"); + КэшКаталогов.Вставить("ХранилищеНастроек", "SettingsStorages"); + КэшКаталогов.Вставить("ЭлементСтиля", "StyleItems"); + КэшКаталогов.Вставить("Подсистема", "Subsystems"); + КэшКаталогов.Вставить("Задача", "Tasks"); + КэшКаталогов.Вставить("WebСервис", "WebServices"); + КэшКаталогов.Вставить("XDTOПакет", "XDTOPackages"); + + КэшМетаданных.Вставить("КэшКаталогов", КэшКаталогов); + + КонецЕсли; + + Возврат КэшКаталогов.Получить(ИмяОбъекта); + +КонецФункции + +Функция ПолучитьИмяФайлаПоИмениМодуля(ИмяМодуля) + + Если КэшМетаданных = Неопределено Тогда + КэшМетаданных = Новый Соответствие(); + КонецЕсли; + + КэшМодулей = КэшМетаданных.Получить("КэшМодулей"); + Если КэшМодулей = Неопределено Тогда + + КэшМодулей = Новый Соответствие(); + КэшМодулей.Вставить("МодульОбъекта", "ObjectModule.bsl"); + КэшМодулей.Вставить("Модуль", "Module.bsl"); + КэшМодулей.Вставить("МодульМенеджера", "ManagerModule.bsl"); + КэшМодулей.Вставить("МодульНабораЗаписей", "RecordSetModule.bsl"); + КэшМодулей.Вставить("МодульКоманды", "CommandModule.bsl"); + + КонецЕсли; + + Возврат КэшМодулей.Получить(ИмяМодуля); + +КонецФункции diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\236\320\261\321\211\320\270\320\265\320\234\320\265\321\202\320\276\320\264\321\213.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\236\320\261\321\211\320\270\320\265\320\234\320\265\321\202\320\276\320\264\321\213.os" index e7e5d7f4..a084f2bc 100644 --- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\236\320\261\321\211\320\270\320\265\320\234\320\265\321\202\320\276\320\264\321\213.os" +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\236\320\261\321\211\320\270\320\265\320\234\320\265\321\202\320\276\320\264\321\213.os" @@ -45,7 +45,7 @@ КонецЕсли; ТекстБазовый = ТекстБазовый + Текст; - sleep(ПаузаОжиданияЧтенияБуфера); // Подождем, надеюсь буфер не переполниться. + sleep(ПаузаОжиданияЧтенияБуфера); // Подождем, надеюсь буфер не переполнится. КонецЦикла; diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\241\320\270\321\201\321\202\320\265\320\274\321\213.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\241\320\270\321\201\321\202\320\265\320\274\321\213.os" index fb51320f..ad717bbd 100644 --- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\241\320\270\321\201\321\202\320\265\320\274\321\213.os" +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\241\320\270\321\201\321\202\320\265\320\274\321\213.os" @@ -30,7 +30,7 @@ // Функция ВерсияПродукта() Экспорт - Версия = "1.6.0";// присвоение "Версия = " важно для проверки Сонара + Версия = "1.7.0";// присвоение "Версия = " важно для проверки Сонара Возврат Версия; КонецФункции // ВерсияПродукта() diff --git a/tools/runner.os b/tools/runner.os index 0311db93..cda2b478 100644 --- a/tools/runner.os +++ b/tools/runner.os @@ -96,7 +96,7 @@ КонецЕсли; ТекстБазовый = ТекстБазовый + Текст; - sleep(ПаузаОжиданияЧтенияБуфера); //Подождем, надеюсь буфер не переполниться. + sleep(ПаузаОжиданияЧтенияБуфера); //Подождем, надеюсь буфер не переполнится. КонецЦикла; @@ -949,7 +949,7 @@ Процедура ДобавитьОписаниеКомандыКонфигуратор(Знач Парсер) ОписаниеКоманды = Парсер.ОписаниеКоманды(ВозможныеКоманды().Конфигуратор); - Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-name", "Строка подключения к хранилище"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-name", "Строка подключения к хранилищу"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-user", "Пользователь хранилища"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--storage-pwd", "Пароль"); Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "--dev", "Признак dev режима, автоматом используем сервисную базу");