1
0
mirror of https://github.com/bia-technologies/precommit4onec.git synced 2025-02-07 13:31:49 +02:00

Merge branch 'release/1.10'

This commit is contained in:
Maxmov Valery 2019-04-09 14:15:08 +03:00
commit cac83e0463
48 changed files with 2035 additions and 520 deletions

8
.gitignore vendored
View File

@ -1,6 +1,6 @@
bdd-log.xml
*.ospx
/*.orig
/exec.log
*.orig
exec.log
/tests.xml

View File

@ -1,9 +0,0 @@
// Place your settings in this file to overwrite default and user settings.
{
"language-1c-bsl.linterEntryPoint": "src/console-entry-point.os",
"editor.rulers": [ 120 ],
"files.associations": {
"*.os-template" : "bsl"
, "packagedef" : "bsl"
}
}

240
.vscode/tasks.json vendored
View File

@ -1,240 +0,0 @@
// Available variables which can be used inside of strings.
// ${workspaceRoot}: the root folder of the team
// ${file}: the current opened file
// ${fileBasename}: the current opened file's basename
// ${fileDirname}: the current opened file's dirname
// ${fileExtname}: the current opened file's extension
// ${cwd}: the current working directory of the spawned process
{
"version": "2.0.0",
"_runner": "terminal",
"windows": {
"command": "cmd",
"args": ["/c", "chcp 65001 ;"]
},
"linux": {
"command": "sh",
"args": ["-c"]
},
"isShellCommand": true,
// "showOutput": "silent",
"_runner": "terminal",
"tasks": [
{
"taskName": "Testing project",
"args": [
"1testrunner",
"-runall",
"${workspaceRoot}/tests"
],
"echoCommand": true,
"showOutput": "always",
"suppressTaskName": true,
// "isBuildCommand": false,
"isTestCommand": false,
"problemMatcher": {
"fileLocation": "absolute",
"pattern": {
"regexp": "{Модуль\\s+(.+)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+([^{]*)",
"file": 1,
"location": 2,
"message": 3
}
}
},
{
"taskName": "Testing current test-file",
"args": [
"1testrunner",
"-run",
"${file}",
],
"echoCommand": true,
"showOutput": "always",
"suppressTaskName": true,
"isBuildCommand": false,
"isTestCommand": true,
"problemMatcher": {
"fileLocation": "absolute",
"pattern": {
"regexp": "{Модуль\\s+(.+)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+([^{]*)",
"file": 1,
"location": 2,
"message": 3
}
}
},
{
"taskName": "Exec all features",
"args": [
"1bdd",
"${workspaceRoot}/features",
"-out",
"${workspaceRoot}/exec.log"
],
"echoCommand": true,
"showOutput": "always",
"suppressTaskName": true,
"isBuildCommand": true,
"isTestCommand": false,
"problemMatcher": {
"fileLocation": "absolute",
"pattern": {
"regexp": "{Модуль\\s+(.+)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+([^{]*)",
"file": 1,
"location": 2,
"message": 3
}
}
},
{
"taskName": "Exec feature",
"args": [
"1bdd",
"${file}",
"-out",
"${workspaceRoot}/exec.log"
],
"echoCommand": true,
"showOutput": "always",
"suppressTaskName": true,
"isBuildCommand": false,
"isTestCommand": true,
"problemMatcher": {
"fileLocation": "absolute",
"pattern": [
{
"regexp": "{Модуль\\s+(.+)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+([^{]*)",
"file": 1,
"location": 2,
"message": 3
}
]
}
},
{
"taskName": "Exec feature for current step def",
"args": [
"1bdd",
"${fileDirname}/../${fileBasenameNoExtension}.feature",
"-fail-fast",
"-out",
"${workspaceRoot}/exec.log"
],
"echoCommand": true,
"showOutput": "always",
"suppressTaskName": true,
"isBuildCommand": false,
"isTestCommand": true,
"problemMatcher": {
"fileLocation": "absolute",
"pattern": [
{
"regexp": "{Модуль\\s+(.+)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+([^{]*)",
"file": 1,
"location": 2,
"message": 3
}
]
}
},
{
"taskName": "Generate feature steps",
"args": [
"1bdd",
"gen",
"${file}",
"-out",
"${workspaceRoot}/exec.log"
],
"echoCommand": true,
"showOutput": "always",
"suppressTaskName": true,
"isBuildCommand": false,
"isTestCommand": false,
"problemMatcher": {
"fileLocation": "absolute",
"pattern": {
"regexp": "{Модуль\\s+(.+)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+([^{]*)",
"file": 1,
"location": 2,
"message": 3
}
}
},
{
"taskName": "Opm: package build",
"args": [
"opm",
"build",
"${workspaceRoot}"
],
"echoCommand": true,
"showOutput": "always",
"suppressTaskName": true,
"isBuildCommand": false
},
{
"taskName": "OneScript: compile",
"args": [
"oscript",
"-encoding=utf-8",
"-compile",
"${file}"
],
"echoCommand": true,
"showOutput": "always",
"suppressTaskName": true,
"isBuildCommand": false
},
{
"taskName": "OneScript: check",
"args": [
"oscript",
"-encoding=utf-8",
"-check",
"${file}"
],
"echoCommand": true,
"showOutput": "always",
"suppressTaskName": true,
"isBuildCommand": false
},
{
"taskName": "OneScript: make",
"args": [
"oscript",
"-encoding=utf-8",
"-make",
"${file}",
"${fileBasename}.exe"
],
"echoCommand": true,
"showOutput": "always",
"suppressTaskName": true,
"isBuildCommand": false
},
{
"taskName": "OneScript: run",
"args": [
"oscript",
"-encoding=utf-8",
"${file}"
],
"echoCommand": true,
"showOutput": "always",
"suppressTaskName": true,
"isBuildCommand": true,
"problemMatcher": {
"fileLocation": "absolute",
"pattern": {
"regexp": "^{Модуль\\s+(.*)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+(.*)}$",
"file": 1,
"location": 2,
"message": 3
}
}
}
]
}

View File

@ -1,7 +1,7 @@
The MIT License (MIT)
Copyright (c) 2016 Andrei Ovsiankin
Copyright (c) 2017-2018 BIA Technologies, LLC
Copyright (c) 2017-2019 BIA Technologies, LLC
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@ -36,14 +36,16 @@
- `РазборОтчетОбработокРасширений` - при выполнении данного сценария, файлы внешних отчетов, обработок и расширений средствами платформы будут разложены на исходные файлы и помещены в каталог исходных файлов репозитория в подкаталоги, соответствующие расширениям. Например внешний отчет `ВнешнийОтчет1.erf` будет разложен в каталог `src\erf\ВнешнийОтчет1`
- `РазборОбычныхФормНаИсходники` - при выполнении данного сценария, файлы обычных форм (`Form.bin`) раскладываются на исходные файлы с помощью инструмента `v8unpack`
- `КорректировкаXMLФорм` - при выполнении данного сценария, файлы описаний форм (`Form.xml`) проверяются на наличие задублировавшихся индексов элементов, которые образуются при объединениях. Если дубли есть, то они исправляются
- `ДобавлениеПробеловПередКлючевымиСловами` - при выполнении данного сценария, в файлах модулей перед ключевыми словами добавляются отсутсвующие пробелы. На данный момент обрабатывается только ключевое слово `Экспорт`.
- `ДобавлениеПробеловПередКлючевымиСловами` - при выполнении данного сценария, в файлах модулей перед ключевыми словами добавляются отсутствующие пробелы. На данный момент обрабатывается только ключевое слово `Экспорт`.
- `УдалениеЛишнихКонцевыхПробелов` - при выполнении данного сценария, в файлах модулей удаляются лишние пробелы и табы в конце не пустой строки.
- `СортировкаДереваМетаданных` - при выполнении данного сценария, выполняется упорядочивание объектов метаданных в дереве за исключением подсистем, они остаются в том порядке, который задал разработчик.
- `СинхронизацияОбъектовМетаданныхИФайлов` - анализирует наличие файлов и объектов конфигурации.
- `УдалениеДублейМетаданных` - удаляет задублированные объекты метаданных (результат кривого мерджа)
- `ЗапретИспользованияПерейти` - проверяет модуль на использование методоа `Перейти`
- `ЗапретИспользованияПерейти` - проверяет модуль на использование методов `Перейти`
- `УдалениеЛишнихПустыхСтрок` - выполняет очистку модуля от лишних пустых строк (лишними считаются 2 и более идущих подряд пустых строках)
- `ПроверкаКорректностиОбластей` - выполняет проверку на корректность скобок областей: `на парность` и `перед окончание области должно быть ее определение`
- `ПроверкаДублейПроцедурИФункций` - выполняет поиск одинаковых названий процедур и функций в модуле.
- `ОтключениеПолнотекстовогоПоиска` - По умолчанию отключает полнотекстовый поиск в файлах описания метаданных. Имеет настройку для исключения файлов из обработки. Для исключения необходимо указать относительный путь в репозитории до файла описания метаданного. Можно выключать из обработки отдельные реквизиты метаданного, для этого надо задать массив реквизитов в конфигурационном файле.
## Изменение настроек
@ -60,13 +62,13 @@ precommit4onec может читать настройки своей работ
Конфигурирование дает возможности:
- Изменить список сценариев обработки файлов
- Активизировать алгоритм подключния сценариев из каталогов репозитория
- Активизировать алгоритм подключения сценариев из каталогов репозитория
Некоторые сценарии поддерживают возможность изменения своих настроек со значений по умолчанию на установленные в конфигурационном файле. На данный момент реализована возможность указывать необходимую версию платформы 1С:Предприятие в сценарии `РазборОтчетОбработокРасширений`.
## Расширение функциональности
Для создания нового сценария обработки файлов необходимо воспользваться шаблоном, находящимся в каталоге `СценарииОбработки` скрипта.
Для создания нового сценария обработки файлов необходимо воспользоваться шаблоном, находящимся в каталоге `СценарииОбработки` скрипта.
### Установка сценария для всех репозиториев

View File

@ -3,6 +3,7 @@
#Использовать gitrunner
#Использовать tempfiles
#Использовать asserts
#Использовать "../../src"
Перем БДД;
@ -17,6 +18,9 @@
ВсеШаги.Добавить("ВКаталогеРепозиторияЕстьФайл");
ВсеШаги.Добавить("ЯКопируюФайлВКаталогРепозитория");
ВсеШаги.Добавить("ЯФиксируюИзмененияВРепозиторииСКомментарием");
ВсеШаги.Добавить("ЯУстанавливаюКодировкуВыводаКоманды");
ВсеШаги.Добавить("УФайлаЕстьМетка");
ВсеШаги.Добавить("СодержимоеФайлаИФайлаРазное");
Возврат ВсеШаги;
КонецФункции
@ -102,4 +106,41 @@
РепозиторийGit.Закоммитить(ТекстКомментария, ИСТИНА);
КонецПроцедуры
// я устанавливаю кодировку вывода "Кодировка" команды "ИмяКоманды"
Процедура ЯУстанавливаюКодировкуВыводаКоманды(Кодировка, ИмяКоманды) Экспорт
КлючКонтекста = КлючКоманды(ИмяКоманды);
Команда = БДД.ПолучитьИзКонтекста(КлючКонтекста);
Команда.УстановитьКодировкуВывода(Кодировка);
КонецПроцедуры
Функция КлючКоманды(Знач ИмяКоманды)
Возврат "Команда-" + ИмяКоманды;
КонецФункции
// у файла <Файл> есть метка <Bom>
Процедура УФайлаЕстьМетка(Файл, Метка) Экспорт
КаталогРепозитория = БДД.ПолучитьИзКонтекста("РабочийКаталог");
КонечныйФайл = ОбъединитьПути(КаталогРепозитория, Файл);
Кодировка = ФайловыеОперации.ОпределитьКодировку(КонечныйФайл);
ЕстьМетка = Кодировка = КодировкаТекста.UTF8;
Ожидаем.Что(ЕстьМетка).Равно(Булево(Метка));
КонецПроцедуры //ОпределитьКодировку
// Содержимое файла "ИсходныйФайл" и файла "КонечныйФайл" разное
Процедура СодержимоеФайлаИФайлаРазное(ИсходныйФайл, КонечныйФайл) Экспорт
ИсходныйФайл = ОбъединитьПути(БДД.ПолучитьИзКонтекста("КаталогПроекта"), ИсходныйФайл);
КонечныйФайл = ОбъединитьПути(БДД.ПолучитьИзКонтекста("РабочийКаталог"), КонечныйФайл);
СодержимоеКонечногоФайла = ФайловыеОперации.ПрочитатьТекстФайла(КонечныйФайл);
СодержимоеИсходногоФайла = ФайловыеОперации.ПрочитатьТекстФайла(ИсходныйФайл);
Ожидаем.Что(СодержимоеИсходногоФайла).Не_().Равно(СодержимоеКонечногоФайла);
КонецПроцедуры

View File

@ -7,36 +7,125 @@
Контекст:
Допустим Я очищаю параметры команды "oscript" в контексте
И я очищаю параметры команды "git" в контексте
И Я устанавливаю кодировку вывода "utf-8" команды "git"
И я включаю отладку лога с именем "oscript.app.precommit4onec"
И я создаю временный каталог и запоминаю его как "КаталогРепозиториев"
И я переключаюсь во временный каталог "КаталогРепозиториев"
И я создаю новый репозиторий "rep1" в каталоге "КаталогРепозиториев" и запоминаю его как "Репозиторий1"
И я выполняю команду "oscript" c параметрами "<КаталогПроекта>/src/main.os install rep1"
И я создаю новый репозиторий "rep1" в каталоге "КаталогРепозиториев" и запоминаю его как "РабочийКаталог"
И я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os install rep1"
И я установил рабочий каталог как текущий каталог
Сценарий: Разбор отчетов, обработок, конфигурации на исходники.
Когда Я копирую файл "tests/fixtures/demo/DemoОбработка.epf" в каталог репозитория "РабочийКаталог"
И я копирую файл "tests/fixtures/demo/DemoОтчет.erf" в каталог репозитория "РабочийКаталог"
И я копирую файл "tests/fixtures/demo/DemoРасширение.cfe" в каталог репозитория "РабочийКаталог"
И я фиксирую изменения в репозитории "РабочийКаталог" с комментарием "demo коммит"
Тогда В каталоге "src" репозитория "РабочийКаталог" есть файл "erf\DemoОтчет\DemoОтчет\Forms\ОсновнаяОФ\Ext\Form\Module.bsl"
И В каталоге "src" репозитория "РабочийКаталог" есть файл "erf\DemoОтчет\DemoОтчет\Forms\ОсновнаяОФ\Ext\Form\form"
И В каталоге "src" репозитория "РабочийКаталог" есть файл "erf\DemoОтчет\DemoОтчет.xml"
И В каталоге "src" репозитория "РабочийКаталог" есть файл "erf\DemoОтчет\DemoОтчет\Templates\ОсновнаяСхемаКомпоновкиДанных.xml"
И В каталоге "src" репозитория "РабочийКаталог" есть файл "erf\DemoОтчет\DemoОтчет\Templates\ОсновнаяСхемаКомпоновкиДанных\Ext\Template.xml"
И В каталоге "src" репозитория "РабочийКаталог" есть файл "erf\DemoОтчет\DemoОтчет\Forms\ОсновнаяОФ.xml"
И В каталоге "src" репозитория "РабочийКаталог" есть файл "erf\DemoОтчет\DemoОтчет\Forms\ОсновнаяОФ\Ext\Form.bin"
И В каталоге "src" репозитория "РабочийКаталог" есть файл "erf\DemoОтчет\DemoОтчет\Forms\ОсновнаяУФ.xml"
И В каталоге "src" репозитория "РабочийКаталог" есть файл "erf\DemoОтчет\DemoОтчет\Forms\ОсновнаяУФ\Ext\Form.xml"
И В каталоге "src" репозитория "РабочийКаталог" есть файл "epf\DemoОбработка\DemoОбработка.xml"
И В каталоге "src" репозитория "РабочийКаталог" есть файл "epf\DemoОбработка\DemoОбработка\Forms\ОсновнаяОФ.xml"
И В каталоге "src" репозитория "РабочийКаталог" есть файл "epf\DemoОбработка\DemoОбработка\Forms\ОсновнаяОФ\Ext\Form.bin"
И В каталоге "src" репозитория "РабочийКаталог" есть файл "epf\DemoОбработка\DemoОбработка\Forms\ОсновнаяУФ.xml"
И В каталоге "src" репозитория "РабочийКаталог" есть файл "epf\DemoОбработка\DemoОбработка\Forms\ОсновнаяУФ\Ext\Form.xml"
И В каталоге "src" репозитория "РабочийКаталог" есть файл "epf\DemoОбработка\DemoОбработка\Forms\ОсновнаяОФ\Ext\Form\Module.bsl"
И В каталоге "src" репозитория "РабочийКаталог" есть файл "epf\DemoОбработка\DemoОбработка\Forms\ОсновнаяОФ\Ext\Form\form"
И В каталоге "src" репозитория "РабочийКаталог" есть файл "cfe\DemoРасширение\ConfigDumpInfo.xml"
И В каталоге "src" репозитория "РабочийКаталог" есть файл "cfe\DemoРасширение\Configuration.xml"
И В каталоге "src" репозитория "РабочийКаталог" есть файл "cfe\DemoРасширение\CommonModules\DemoРасш_Demo.xml"
И В каталоге "src" репозитория "РабочийКаталог" есть файл "cfe\DemoРасширение\CommonModules\DemoРасш_Demo\Ext\Module.bsl"
И В каталоге "src" репозитория "РабочийКаталог" есть файл "cfe\DemoРасширение\Subsystems\DemoРасш_Demo.xml"
И В каталоге "src" репозитория "РабочийКаталог" есть файл "cfe\DemoРасширение\Languages\Русский.xml"
Сценарий: Фиксация изменений
Когда Я копирую файл "features/demo/DemoОбработка.epf" в каталог репозитория "Репозиторий1"
И я копирую файл "features/demo/DemoОтчет.erf" в каталог репозитория "Репозиторий1"
И я копирую файл "features/demo/DemoРасширение.cfe" в каталог репозитория "Репозиторий1"
И я фиксирую изменения в репозитории "Репозиторий1" с комментарием "demo коммит"
Тогда В каталоге "src" репозитория "Репозиторий1" есть файл "erf\DemoОтчет\DemoОтчет\Forms\ОсновнаяОФ\Ext\Form\Module.bsl"
И В каталоге "src" репозитория "Репозиторий1" есть файл "erf\DemoОтчет\DemoОтчет\Forms\ОсновнаяОФ\Ext\Form\form"
И В каталоге "src" репозитория "Репозиторий1" есть файл "erf\DemoОтчет\DemoОтчет.xml"
И В каталоге "src" репозитория "Репозиторий1" есть файл "erf\DemoОтчет\DemoОтчет\Templates\ОсновнаяСхемаКомпоновкиДанных.xml"
И В каталоге "src" репозитория "Репозиторий1" есть файл "erf\DemoОтчет\DemoОтчет\Templates\ОсновнаяСхемаКомпоновкиДанных\Ext\Template.xml"
И В каталоге "src" репозитория "Репозиторий1" есть файл "erf\DemoОтчет\DemoОтчет\Forms\ОсновнаяОФ.xml"
И В каталоге "src" репозитория "Репозиторий1" есть файл "erf\DemoОтчет\DemoОтчет\Forms\ОсновнаяОФ\Ext\Form.bin"
И В каталоге "src" репозитория "Репозиторий1" есть файл "erf\DemoОтчет\DemoОтчет\Forms\ОсновнаяУФ.xml"
И В каталоге "src" репозитория "Репозиторий1" есть файл "erf\DemoОтчет\DemoОтчет\Forms\ОсновнаяУФ\Ext\Form.xml"
И В каталоге "src" репозитория "Репозиторий1" есть файл "epf\DemoОбработка\DemoОбработка.xml"
И В каталоге "src" репозитория "Репозиторий1" есть файл "epf\DemoОбработка\DemoОбработка\Forms\ОсновнаяОФ.xml"
И В каталоге "src" репозитория "Репозиторий1" есть файл "epf\DemoОбработка\DemoОбработка\Forms\ОсновнаяОФ\Ext\Form.bin"
И В каталоге "src" репозитория "Репозиторий1" есть файл "epf\DemoОбработка\DemoОбработка\Forms\ОсновнаяУФ.xml"
И В каталоге "src" репозитория "Репозиторий1" есть файл "epf\DemoОбработка\DemoОбработка\Forms\ОсновнаяУФ\Ext\Form.xml"
И В каталоге "src" репозитория "Репозиторий1" есть файл "epf\DemoОбработка\DemoОбработка\Forms\ОсновнаяОФ\Ext\Form\Module.bsl"
И В каталоге "src" репозитория "Репозиторий1" есть файл "epf\DemoОбработка\DemoОбработка\Forms\ОсновнаяОФ\Ext\Form\form"
И В каталоге "src" репозитория "Репозиторий1" есть файл "cfe\DemoРасширение\ConfigDumpInfo.xml"
И В каталоге "src" репозитория "Репозиторий1" есть файл "cfe\DemoРасширение\Configuration.xml"
И В каталоге "src" репозитория "Репозиторий1" есть файл "cfe\DemoРасширение\CommonModules\DemoРасш_Demo.xml"
И В каталоге "src" репозитория "Репозиторий1" есть файл "cfe\DemoРасширение\CommonModules\DemoРасш_Demo\Ext\Module.bsl"
И В каталоге "src" репозитория "Репозиторий1" есть файл "cfe\DemoРасширение\Subsystems\DemoРасш_Demo.xml"
И В каталоге "src" репозитория "Репозиторий1" есть файл "cfe\DemoРасширение\Languages\Русский.xml"
Сценарий: Успешный коммит в репозиторий
Когда Я копирую файл "tests\fixtures\ПроверкаДублейПроцедурПоложительныйТест.bsl" в каталог репозитория "РабочийКаталог"
И Я установил рабочий каталог как текущий каталог
И Я выполняю команду "git" с параметрами "add --all"
И Я выполняю команду "git" с параметрами "commit -m addProcedure"
Тогда Вывод команды "git" не содержит "обнаружены неуникальные имена методов"
Сценарий: Прекоммит заблокировал коммит в репозиторий
Когда Я копирую файл "tests\fixtures\ПроверкаДублейПроцедурНегативныйТест.bsl" в каталог репозитория "РабочийКаталог"
И Я установил рабочий каталог как текущий каталог
И Я выполняю команду "git" с параметрами "add --all"
И Я выполняю команду "git" с параметрами "commit -m addProcedure"
Тогда Вывод команды "git" содержит "обнаружены неуникальные имена методов"
Сценарий: Прекоммит использует локальные настройки репозитория вместо глобальных
Когда Я копирую каталог "localscenario" из каталога "tests\fixtures" проекта в рабочий каталог
И Я копирую файл "v8config.json" из каталога "tests\fixtures" проекта в рабочий каталог
И я выполняю команду "git" с параметрами "add --all"
И я выполняю команду "git" с параметрами "commit -m addFile"
Тогда я вижу в консоли вывод "Используем локальные настройки"
Сценарий: Выполнение локальных сценариев к каталоге репозитория
Когда Я копирую файл "tests\fixtures\demo\DemoОбработка.epf" в каталог репозитория "РабочийКаталог"
И Я копирую каталог "localscenario" из каталога "tests\fixtures" проекта в рабочий каталог
И Я копирую файл "v8config.json" из каталога "tests\fixtures" проекта в рабочий каталог
И я выполняю команду "git" с параметрами "add --all"
И я выполняю команду "git" с параметрами "commit -m addFile"
Тогда я вижу в консоли вывод "ДобавлениеHelloWorld"
Сценарий: Когда выключены глобальные сценарии и нет локальных прекоммит выдает ошибку
Когда Я копирую файл "v8config.json" из каталога "tests\fixtures" проекта в рабочий каталог
И я выполняю команду "git" с параметрами "add --all"
И я выполняю команду "git" с параметрами "commit -m addFile"
Тогда я вижу в консоли вывод "Нет доступных сценариев обработки файлов"
Сценарий: В коммит попадают только проиндексированные файлы
Когда Я копирую файл "tests\fixtures\demo\DemoОбработка.epf" в каталог репозитория "РабочийКаталог"
И я фиксирую изменения в репозитории "РабочийКаталог" с комментарием "demo коммит"
И в каталоге "src" репозитория "РабочийКаталог" есть файл "epf\DemoОбработка\DemoОбработка\Forms\ОсновнаяОФ\Ext\Form\Module.bsl"
И я создаю файл "РабочийКаталог/src/ФайлСТекстом.bsl" с текстом "текст178"
И я выполняю команду "git" с параметрами "add --all"
И я создаю файл "РабочийКаталог\src\epf\DemoОбработка\DemoОбработка\Forms\ОсновнаяОФ\Ext\Form\Module.bsl" с текстом "текст178"
И я выполняю команду "git" с параметрами "commit -m addFile"
Тогда Вывод команды "git" не содержит "Module.bsl"
Сценарий: По умолчанию прекоммит убирает полнотекстовый поиск в исходниках конфигуратора
Когда Я копирую файл "tests\fixtures\Документ.xml" в каталог репозитория "РабочийКаталог"
И Файл "Документ.xml" в рабочем каталоге содержит "FullTextSearch>Use<"
И я фиксирую изменения в репозитории "РабочийКаталог" с комментарием "demo коммит"
Тогда Файл "Документ.xml" в рабочем каталоге не содержит "FullTextSearch>Use<"
Сценарий: По умолчанию прекоммит убирает полнотекстовый поиск в исходниках EDT
Когда Я копирую файл "tests\fixtures\Документ.mdo" в каталог репозитория "РабочийКаталог"
И Файл "Документ.mdo" в рабочем каталоге содержит "fullTextSearch>Use<"
И я фиксирую изменения в репозитории "РабочийКаталог" с комментарием "demo коммит"
Тогда Файл "Документ.mdo" в рабочем каталоге не содержит "fullTextSearch>Use<"
Сценарий: Отключение полнотекстового поиска игнорирует файл в исключении
Когда Я создаю каталог "src" в рабочем каталоге
И Я копирую файл "Документ.mdo" из каталога "tests\fixtures" проекта в подкаталог "src" рабочего каталога
И Я копирую файл "Документ.xml" из каталога "tests\fixtures" проекта в подкаталог "src" рабочего каталога
И Файл "src\Документ.mdo" в рабочем каталоге содержит "fullTextSearch>Use<"
И Файл "src\Документ.xml" в рабочем каталоге содержит "FullTextSearch>Use<"
И я создаю файл "РабочийКаталог\v8config.json" с текстом
"""
{
"Precommt4onecСценарии": {
"ИспользоватьСценарииРепозитория": false,
"КаталогЛокальныхСценариев": "",
"ГлобальныеСценарии": [
"ОтключениеПолнотекстовогоПоиска.os"
],
"НастройкиСценариев": {
"ОтключениеПолнотекстовогоПоиска": {
"МетаданныеДляИсключения": {
"src\\Документ.mdo": []
}
}
}
}
}
"""
И я фиксирую изменения в репозитории "РабочийКаталог" с комментарием "demo коммит"
Тогда Файл "\src\Документ.mdo" в рабочем каталоге содержит "fullTextSearch>Use<"
И Файл "\src\Документ.xml" в рабочем каталоге не содержит "FullTextSearch>Use<"

View File

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

View File

@ -12,17 +12,17 @@
# И я включаю отладку лога с именем "bdd"
Сценарий: Получение версии продукта
Когда Я выполняю команду "oscript" c параметрами "src/main.os version"
Когда Я выполняю команду "oscript" с параметрами "src/main.os version"
Тогда Я сообщаю вывод команды "oscript"
И Вывод команды "oscript" содержит "1.0.12.2"
И Вывод команды "oscript" содержит "1.10.0"
И Вывод команды "oscript" не содержит "precommit4onec v"
И Код возврата команды "oscript" равен 0
Сценарий: Получение помощи продукта
Когда Я выполняю команду "oscript" c параметрами "src/main.os help"
Когда Я выполняю команду "oscript" с параметрами "src/main.os help"
Тогда Вывод команды "oscript" содержит
"""
precommit4onec v1.0.12.2
precommit4onec v1.10.0
Возможные команды:
help - Выводит справку по командам
version - Выводит версию приложения
@ -33,10 +33,10 @@
И Код возврата команды "oscript" равен 0
Сценарий: Вызов исполняемого файла без параметров
Когда Я выполняю команду "oscript" c параметрами "src/main.os"
Когда Я выполняю команду "oscript" с параметрами "src/main.os"
Тогда Вывод команды "oscript" содержит
"""
precommit4onec v1.0.12.2
precommit4onec v1.10.0
Возможные команды:
help - Выводит справку по командам
version - Выводит версию приложения

View File

@ -15,24 +15,26 @@
И я создаю новый репозиторий "rep2" в каталоге "КаталогРепозиториев" и запоминаю его как "Репозиторий2"
Сценарий: Установка precommit4onec в репозиторий
Когда Я выполняю команду "oscript" c параметрами "<КаталогПроекта>/src/main.os install rep1"
Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os install rep1"
Тогда Код возврата команды "oscript" равен 0
И Я сообщаю вывод команды "oscript"
И Вывод команды "oscript" содержит "precommit4onec v1.0.12.2"
И Вывод команды "oscript" содержит "precommit4onec v1.10.0"
И Вывод команды "oscript" содержит "Pre-commit hook для rep1 создан"
И В каталоге ".git/hooks" репозитория "Репозиторий1" есть файл "pre-commit"
Сценарий: precommit4onec не устанавливается в пустой каталог
Когда Я выполняю команду "oscript" c параметрами "<КаталогПроекта>/src/main.os install ./"
Тогда Код возврата команды "oscript" равен 0
Когда я создаю временный каталог и запоминаю его как "ПустойКаталог"
И я переключаюсь во временный каталог "ПустойКаталог"
И Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os install ./"
Тогда Код возврата команды "oscript" равен 1
И Я сообщаю вывод команды "oscript"
И Вывод команды "oscript" содержит "precommit4onec v1.0.12.2"
И Вывод команды "oscript" содержит "не является репозиторием git"
И Вывод команды "oscript" содержит "precommit4onec v1.10.0"
И Вывод команды "oscript" содержит "can only be used inside a git repository"
Сценарий: Установка precommit4onec во вложенные каталоги
Когда Я выполняю команду "oscript" c параметрами "<КаталогПроекта>/src/main.os install ./ -r"
Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os install ./ -r"
Тогда Код возврата команды "oscript" равен 0
И Я сообщаю вывод команды "oscript"
И Вывод команды "oscript" содержит "precommit4onec v1.0.12.2"
И Вывод команды "oscript" содержит "precommit4onec v1.10.0"
И В каталоге ".git/hooks" репозитория "Репозиторий1" есть файл "pre-commit"
И В каталоге ".git/hooks" репозитория "Репозиторий2" есть файл "pre-commit"

View File

@ -0,0 +1,27 @@
# language: ru
Функциональность: Работа с файлами в прекоммите
Как разработчик
Я хочу иметь возможность коммитить свой код и при выполнении прекоммита кодировка
файла с исходником не должна измениться
Контекст:
Допустим Я очищаю параметры команды "oscript" в контексте
И я включаю отладку лога с именем "oscript.app.precommit4onec"
И я создаю временный каталог и запоминаю его как "КаталогРепозиториев"
И я переключаюсь во временный каталог "КаталогРепозиториев"
И я создаю новый репозиторий "rep1" в каталоге "КаталогРепозиториев" и запоминаю его как "РабочийКаталог"
И Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os install rep1"
И Я установил рабочий каталог как текущий каталог
Структура сценария: Кодировка файла после коммита остается прежней
Когда Я копирую файл <Исходный файл> в каталог репозитория "РабочийКаталог"
И У файла <Конечный файл> есть метка <Bom>
И я фиксирую изменения в репозитории "РабочийКаталог" с комментарием "Добавил файл процедур"
Тогда У файла <Конечный файл> есть метка <Bom>
И Содержимое файла <Исходный файл> и файла <Конечный файл> разное
Примеры:
| Исходный файл | Конечный файл | Bom |
| tests\fixtures\NoBom.bsl| NoBom.bsl | Нет |
| tests\fixtures\Bom.bsl | Bom.bsl | Да |

View File

@ -1,4 +1,12 @@
@ECHO OFF
@echo off
call del "*.ospx"
call opm build . -mf ./packagedef -out .
call opm install -f precommit4onec-1.0.12.2.ospx
for /f %%i in ('"oscript -version"') do set result=%%i
if %result%==1.0.19.105 (
call opm build . -mf ./packagedef -out .
) else (
call opm build -m ./packagedef -o .
)
call opm install -f *.ospx

View File

@ -1,4 +1,4 @@
ПутьКСценариюПараметров = ОбъединитьПути(ТекущийСценарий().Каталог, "src", "Модули", "ПараметрыПриложения.os");
ПутьКСценариюПараметров = ОбъединитьПути(ТекущийСценарий().Каталог, "src", "Модули", "ПараметрыПриложения.os");
ПараметрыСистемы_ЛокальнаяВерсия = ЗагрузитьСценарий(ПутьКСценариюПараметров);
ИмяПродукта = НРег(ПараметрыСистемы_ЛокальнаяВерсия.ИмяПродукта());
@ -6,14 +6,14 @@
Описание.Имя(ИмяПродукта)
.ВерсияСреды("1.0.17")
.Версия(ПараметрыСистемы_ЛокальнаяВерсия.ВерсияПродукта())
.ЗависитОт("logos", "0.5")
.ЗависитОт("cmdline", "0.4.1")
.ЗависитОт("1bdd", "1.5.2")
.ЗависитОт("gitrunner", "1.4.0")
.ЗависитОт("v8runner", "0.4.1")
.ЗависитОт("v8unpack", "1.0.1")
.ЗависитОт("logos", "1.2.0")
.ЗависитОт("cmdline", "1.0.0")
.ЗависитОт("1bdd", "1.9.0")
.ЗависитОт("gitrunner", "1.6.0")
.ЗависитОт("v8runner", "1.3.0")
.ЗависитОт("v8unpack", "1.0.3")
.ВключитьФайл("src")
.ВключитьФайл("features")
.ВключитьФайл("tasks")
.ВключитьФайл("v8config.json")
.ВключитьФайл("LICENSE")
.ВключитьФайл("README.md")
.ИсполняемыйФайл("src/main.os", ИмяПродукта);

View File

@ -33,7 +33,7 @@
Если НЕ ПараметрыКоманды["-global"]
И НЕ ЗначениеЗаполнено(ПараметрыКоманды["-rep-path"]) Тогда
Лог.Ошибка("Для конфгурирования необходимо передать флаг -global или указать каталог репозитория параметром -rep-path");
Лог.Ошибка("Для конфигурирования необходимо передать флаг -global или указать каталог репозитория параметром -rep-path");
Возврат Приложение.РезультатыКоманд().НеверныеПараметры;
КонецЕсли;
@ -124,7 +124,7 @@
ГлобальныеСценарии = ПолучитьИменаСценариев(ТекущийКаталогСценариев);
УправлениеНастройками.ЗаписатьНастройку(ИмяПриложения + "\ГлобальныеСценарии", ГлобальныеСценарии);
НастройкиСценариев = СформироватьНастройкиСценариев();
НастройкиСценариев = СформироватьНастройкиСценариев(ГлобальныеСценарии, ТекущийКаталогСценариев);
УправлениеНастройками.ЗаписатьНастройку(ИмяПриложения + "\НастройкиСценариев", НастройкиСценариев);
КонецПроцедуры
@ -162,17 +162,23 @@
КонецФункции
Функция СформироватьНастройкиСценариев()
Функция СформироватьНастройкиСценариев(МассивСценариев, КаталогСценариев)
// todo: Надо будет доработать таким образом, чтобы настройки считывались из сценария
НастройкиСценариев = Новый Соответствие;
Рефлектор = Новый Рефлектор;
// для сценария РазборОтчетовОбработокРасширений
НастройкиСценария = Новый Соответствие;
НастройкиСценария.Вставить("ИспользоватьНастройкиПоУмолчанию", Истина);
НастройкиСценария.Вставить("ВерсияПлатформы", "");
Для Каждого Сценарий Из МассивСценариев Цикл
ОбъектСценария = ЗагрузитьСценарий(ОбъединитьПути(КаталогСценариев, Сценарий));
Если Рефлектор.МетодСуществует(ОбъектСценария, "ПолучитьСтандартныеНастройкиСценария") Тогда
СтруктураНастроек = Рефлектор.ВызватьМетод(ОбъектСценария, "ПолучитьСтандартныеНастройкиСценария");
НастройкиСценариев.Вставить(СтруктураНастроек.ИмяСценария, СтруктураНастроек.Настройка);
НастройкиСценариев = Новый Соответствие;
НастройкиСценариев.Вставить("РазборОтчетовОбработокРасширений", НастройкиСценария);
КонецЕсли;
КонецЦикла;
Возврат НастройкиСценариев;
@ -212,8 +218,8 @@
УправлениеНастройками.ЗаписатьНастройку(ИмяПриложения + "\КаталогЛокальныхСценариев", КаталогЛокальныхСценариев);
УправлениеНастройками.ЗаписатьНастройку(ИмяПриложения + "\ГлобальныеСценарии", ГлобальныеСценарии);
УправлениеНастройками.ЗаписатьНастройку(ИмяПриложения + "\НастройкиСценариев", СформироватьНастройкиСценариев());
НастройкиСценариев = СформироватьНастройкиСценариев(ГлобальныеСценарии, КаталогГлобальныхСценариев);
УправлениеНастройками.ЗаписатьНастройку(ИмяПриложения + "\НастройкиСценариев", );
КонецПроцедуры

View File

@ -46,13 +46,13 @@
Лог.Информация("Используем глобальные настройки");
УправлениеНастройками = Новый НастройкиРепозитория(Приложение.ПутьКРодительскомуКаталогу());
Иначе
Лог.Информация("Используем локальные настройки");
КонецЕсли;
ЗагрузитьСценарииОбработки(Приложение.КаталогСценариев(), УправлениеНастройками, КаталогРепозитория);
КаталогИсходныхФайлов = ПараметрыКоманды["-source-dir"];
@ -86,7 +86,7 @@
Ит = 0;
ПараметрыОбработки = Новый Структура("Лог, ФайлыДляПостОбработки, ИзмененныеКаталоги, КаталогРепозитория, УправлениеНастройками",
Лог, Новый Массив, Новый Массив, КаталогРепозитория, УправлениеНастройками);
Лог, Новый Массив, Новый Массив, КаталогРепозитория, УправлениеНастройками);
Пока Ит < ЖурналИзменений.Количество() Цикл
АнализируемыйФайл = Новый Файл(ОбъединитьПути(КаталогРепозитория, ЖурналИзменений[Ит].ИмяФайла));
@ -135,44 +135,22 @@
ПараметрыКомандыGit = Новый Массив;
ПараметрыКомандыGit.Добавить("diff-index --name-status --cached HEAD");
РепозиторийGit.ВыполнитьКоманду(ПараметрыКомандыGit);
ПараметрыКомандыGit = Новый Массив;
ПараметрыКомандыGit.Добавить("status --porcelain");
РепозиторийGit.ВыполнитьКоманду(ПараметрыКомандыGit);
РезультатВывода = РепозиторийGit.ПолучитьВыводКоманды();
СтрокиВывода = СтрРазделить(РезультатВывода, Символы.ПС);
РезультатВывода = РепозиторийGit.ПолучитьВыводКоманды();
СтрокиВывода = СтрРазделить(РезультатВывода, Символы.ПС);
ЖурналИзменений = Новый Массив;
ЖурналИзменений = Новый Массив;
Для Каждого СтрокаВывода Из СтрокиВывода Цикл
Лог.Отладка(" <%1>", СтрокаВывода);
СтрокаВывода = СокрЛП(СтрокаВывода);
ПозицияПробела = СтрНайти(СтрокаВывода, " ");
СимволИзменения = Лев(СтрокаВывода, 1);
Если СимволИзменения = "?" Тогда
Продолжить;
КонецЕсли;
ТипИзменения = ВариантИзмененийФайловGit.ОпределитьВариантИзменения(СимволИзменения);
ИмяФайла = СокрЛП(СтрЗаменить(Сред(СтрокаВывода, ПозицияПробела + 1), """", ""));
Если ТипИзменения = ВариантИзмененийФайловGit.Переименован
ИЛИ ТипИзменения = ВариантИзмененийФайловGit.Скопирован Тогда
// это два события - удален и добавлен
ПозицияСтрелки = СтрНайти(ИмяФайла, "->");
ИмяФайлаУдален = СокрЛП(Лев(ИмяФайла, ПозицияСтрелки - 1));
ЖурналИзменений.Добавить(Новый Структура("ИмяФайла, ТипИзменения", ИмяФайлаУдален, ВариантИзмененийФайловGit.Удален));
Лог.Отладка(" В журнале git %2 файл <%1>", ИмяФайлаУдален, ВариантИзмененийФайловGit.Удален);
ИмяФайла = СокрЛП(Сред(ИмяФайла, ПозицияСтрелки + 2));
ТипИзменения = ВариантИзмененийФайловGit.Добавлен;
КонецЕсли;
СтрокаВывода = СокрЛП(СтрокаВывода);
ПозицияПробела = СтрНайти(СтрокаВывода, Символы.Таб);
СимволИзменения = Лев(СтрокаВывода, 1);
ТипИзменения = ВариантИзмененийФайловGit.ОпределитьВариантИзменения(СимволИзменения);
ИмяФайла = СокрЛП(СтрЗаменить(Сред(СтрокаВывода, ПозицияПробела + 1), """", ""));
ЖурналИзменений.Добавить(Новый Структура("ИмяФайла, ТипИзменения", ИмяФайла, ТипИзменения));
Лог.Отладка(" В журнале git %2 файл <%1>", ИмяФайла, ТипИзменения);
КонецЦикла;
@ -189,7 +167,7 @@
ИменаЗагружаемыхСценариев = Новый Массив;
Если НЕ УправлениеНастройками.ЭтоНовый() Тогда
Лог.Информация("Читаем настройки");
ИменаЗагружаемыхСценариев = УправлениеНастройками.Настройка("Precommt4onecСценарии\ГлобальныеСценарии");
Если УправлениеНастройками.Настройка("Precommt4onecСценарии\ИспользоватьСценарииРепозитория") Тогда
@ -197,15 +175,15 @@
ЛокальныйКаталог = УправлениеНастройками.Настройка("Precommt4onecСценарии\КаталогЛокальныхСценариев");
ПутьКЛокальнымСценариям = ОбъединитьПути(КаталогРепозитория, ЛокальныйКаталог);
ФайлПутьКЛокальнымСценариям = Новый Файл(ПутьКЛокальнымСценариям);
Если Не ФайлПутьКЛокальнымСценариям.Существует() ИЛИ ФайлПутьКЛокальнымСценариям.ЭтоФайл() Тогда
Лог.Ошибка("Сценарии из репозитория не загружены т.к. отсутствует каталог %1", ЛокальныйКаталог);
Иначе
Если Не ФайлПутьКЛокальнымСценариям.Существует() ИЛИ ФайлПутьКЛокальнымСценариям.ЭтоФайл() Тогда
Лог.Ошибка("Сценарии из репозитория не загружены т.к. отсутствует каталог %1", ЛокальныйКаталог);
Иначе
ФайлыЛокальныхСценариев = НайтиФайлы(ФайлПутьКЛокальнымСценариям.ПолноеИмя, "*.os");
КонецЕсли;
КонецЕсли;
@ -213,7 +191,7 @@
КонецЕсли;
ЗагрузитьСценарииИзКаталога(СценарииОбработки, ФайлыГлобальныхСценариев, ИменаЗагружаемыхСценариев);
ЗагрузитьСценарииИзКаталога(СценарииОбработки, ФайлыЛокальныхСценариев);
ЗагрузитьСценарииИзКаталога(СценарииОбработки, ФайлыЛокальныхСценариев, , Истина);
Если СценарииОбработки.Количество() = 0 Тогда
@ -223,14 +201,14 @@
КонецПроцедуры
Процедура ЗагрузитьСценарииИзКаталога(СценарииОбработки, ФайлыСценариев, Знач ИменаЗагружаемыхСценариев = Неопределено)
Процедура ЗагрузитьСценарииИзКаталога(СценарииОбработки, ФайлыСценариев, Знач ИменаЗагружаемыхСценариев = Неопределено, ЗагрузитьВсе = Ложь)
Если ИменаЗагружаемыхСценариев = Неопределено Тогда
ИменаЗагружаемыхСценариев = Новый Массив;
КонецЕсли;
Для Каждого ФайлСценария Из ФайлыСценариев Цикл
Если СтрСравнить(ФайлСценария.ИмяБезРасширения, "ШаблонСценария") = 0 Тогда
@ -238,8 +216,8 @@
Продолжить;
КонецЕсли;
Если ИменаЗагружаемыхСценариев.Найти(ФайлСценария.Имя) = Неопределено Тогда
Если НЕ ЗагрузитьВсе И ИменаЗагружаемыхСценариев.Найти(ФайлСценария.Имя) = Неопределено Тогда
Продолжить;

View File

@ -11,7 +11,7 @@
///////////////////////////////////////////////////////////////////
Перем ИнициализацияВыпонена; // содержит признак инициализации репозитория
Перем ИнициализацияВыполнена; // содержит признак инициализации репозитория
Перем НовыйКонфиг; // содержит признак нового конфига
Перем Конфигурация; // описание конфигурации
Перем АдресКонфигурационногоФайла; // адрес нахождения конфигурационного файла
@ -34,31 +34,31 @@
КонецФункции // ЭтоНовый()
// ГлобальныеНастройки
// Возврает набор глобальных настроек
// Возвращает набор глобальных настроек
//
// Возвращаемое значение:
// Соответствие - Набор глобальных настроек при их наличии, если настроек нет то будет возвращено пустое соответствие
//
Функция ГлобальныеНастройки() Экспорт
ПроверкаИницализации();
ПроверкаИнициализации();
Возврат НастройкиПриложения("GLOBAL");
КонецФункции // ГлобальныеНастройки() Экспорт
// НастройкиПриложения
// Возврает набор настроек для приложения
// Возвращает набор настроек для приложения
//
// Параметры:
// ИмяПриложения - Строка - Имя приложения
//
// Возвращаемое значение:
// Соответствие - Набор гнастроек при их наличии, если настроек нет то будет возвращено пустое соответствие
// Соответствие - Набор настроек при их наличии, если настроек нет то будет возвращено пустое соответствие
//
Функция НастройкиПриложения(ИмяПриложения) Экспорт
ПроверкаИницализации();
ПроверкаИнициализации();
Если ПустаяСтрока(ИмяПриложения) Тогда
ВызватьИсключение "Не указано имя приложения";
@ -89,7 +89,7 @@
//
Функция Настройка(ИмяНастройки)Экспорт
ПроверкаИницализации();
ПроверкаИнициализации();
РазложенноеИмяНастройки = РазобратьИмяНастройки(ИмяНастройки);
ИскомоеПриложение = НастройкиПриложения(РазложенноеИмяНастройки.ИмяПриложения);
@ -109,7 +109,7 @@
//
Процедура ЗаписатьНастройку(ИмяНастройки, Значение) Экспорт
ПроверкаИницализации();
ПроверкаИнициализации();
РазложенноеИмяНастройки = РазобратьИмяНастройки(ИмяНастройки);
ИскомоеПриложение = НастройкиПриложения(РазложенноеИмяНастройки.ИмяПриложения);
@ -133,7 +133,7 @@
//
Процедура ЗаписатьНастройкиПриложения(ИмяПриложения, Значение) Экспорт
ПроверкаИницализации();
ПроверкаИнициализации();
Если ПустаяСтрока(ИмяПриложения) Тогда
@ -161,7 +161,7 @@
//
Процедура УдалитьНастройкиПриложения(ИмяПриложения) Экспорт
ПроверкаИницализации();
ПроверкаИнициализации();
Если ПустаяСтрока(ИмяПриложения) Тогда
@ -179,15 +179,15 @@
// Служебный функционал
///////////////////////////////////////////////////////////////////
Функция ПроверкаИницализации()
Функция ПроверкаИнициализации()
Если Не ИнициализацияВыпонена Тогда
Если Не ИнициализацияВыполнена Тогда
ВызватьИсключение "Необходимо выполнить инициализацию"
КонецЕсли;
КонецФункции // ПроверкаИницализации()
КонецФункции // ПроверкаИнициализации()
Функция РазобратьИмяНастройки(Знач ИмяНастройки)
@ -233,7 +233,7 @@
//
Процедура ПриСозданииОбъекта(КаталогРепозитория, ОбновлятьКонф = ЛОЖЬ)
ИнициализацияВыпонена = ЛОЖЬ;
ИнициализацияВыполнена = ЛОЖЬ;
НовыйКонфиг = ЛОЖЬ;
Конфигурация = Неопределено;
АдресКонфигурационногоФайла = "";
@ -264,6 +264,6 @@
КонецЕсли;
ИнициализацияВыпонена = ИСТИНА;
ИнициализацияВыполнена = ИСТИНА;
КонецПроцедуры // ПриСозданииОбъекта()

View File

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

View File

@ -9,7 +9,7 @@
// ЭтоФайлИсходников
// Возвращает истину, если файл является файлом исходных кодов
// Параметры:
// Файл - Строка - Полный путь к файлу
// Файл - Файл - Полный путь к файлу
//
// Возвращаемое значение:
// Булево - Признак
@ -29,7 +29,7 @@
// ЭтоФайлОписанияКонфигурации
// Возвращает истину, если файл является файлом описания конфигурации
// Параметры:
// Файл - Строка - Полный путь к файлу
// Файл - Файл - Полный путь к файлу
//
// Возвращаемое значение:
// Булево - Признак
@ -49,7 +49,7 @@
// ЭтоФайлОписанияКонфигурацииEDT
// Возвращает истину, если файл является файлом описания конфигурации в формате EDT
// Параметры:
// Файл - Строка - Полный путь к файлу
// Файл - Файл - Полный путь к файлу
//
// Возвращаемое значение:
// Булево - Признак
@ -65,3 +65,135 @@
Возврат СтрСравнить(Файл.Имя, "Configuration.mdo") = 0;
КонецФункции
// ЭтоФайлОбычнойФормы
// Возвращает истину, если файл является файлом обычной формы
// Параметры:
// Файл - Файл - Полный путь к файлу
//
// Возвращаемое значение:
// Булево - Признак
//
Функция ЭтоФайлОбычнойФормы(Файл) Экспорт
Если ПустаяСтрока(Файл.Расширение) Тогда
Возврат Ложь;
КонецЕсли;
Возврат СтрСравнить(Файл.Имя, "Form.bin") = 0;
КонецФункции // ЭтоФайлОбычнойФормы
// ЭтоФайлОписанияМетаданных
// Возвращает истину, если файл является описанием метаданных, исключая файлы описания конфигурации.
// Параметры:
// Файл - Файл - Полный путь к файлу
//
// Возвращаемое значение:
// Булево - Признак
//
Функция ЭтоФайлОписанияМетаданных(Файл) Экспорт
Если ПустаяСтрока(Файл.Расширение) Тогда
Возврат Ложь;
КонецЕсли;
Возврат ЭтоФайлОписанияМетаданныхКонфигуратора(Файл) ИЛИ ЭтоФайлОписанияМетаданныхEDT(Файл);
КонецФункции // ЭтоФайлОписанияМетаданных
// ЭтоФайлОписанияМетаданныхКонфигуратора
// Возвращает истину, если файл является описанием метаданных конфигуратора, исключая Configuration.xml
// Параметры:
// Файл - Файл - Полный путь к файлу
//
// Возвращаемое значение:
// Булево - Признак
//
Функция ЭтоФайлОписанияМетаданныхКонфигуратора(Файл) Экспорт
Если ПустаяСтрока(Файл.Расширение) Тогда
Возврат Ложь;
КонецЕсли;
Если ЭтоФайлОписанияКонфигурации(Файл) Тогда
Возврат Ложь;
КонецЕсли;
Возврат СтрСравнить(Файл.Расширение, ".xml") = 0;
КонецФункции // ЭтоФайлОписанияМетаданныхКонфигуратора
// ЭтоФайлОписанияМетаданныхEDT
// Возвращает истину, если файл является описанием метаданных конфигуратора, исключая Configuration.mdo
// Параметры:
// Файл - Файл - Полный путь к файлу
//
// Возвращаемое значение:
// Булево - Признак
//
Функция ЭтоФайлОписанияМетаданныхEDT(Файл) Экспорт
Если ПустаяСтрока(Файл.Расширение) Тогда
Возврат Ложь;
КонецЕсли;
Если ЭтоФайлОписанияКонфигурацииEDT(Файл) Тогда
Возврат Ложь;
КонецЕсли;
Возврат СтрСравнить(Файл.Расширение, ".mdo") = 0;
КонецФункции // ЭтоФайлОписанияМетаданныхEDT
// ЭтоФайлОписанияФормы
// Возвращает истину, если файл является файлом описания формы
// Параметры:
// Файл - Файл - Полный путь к файлу
//
// Возвращаемое значение:
// Булево - Признак
//
Функция ЭтоФайлОписанияФормы(Файл) Экспорт
Если ПустаяСтрока(Файл.Расширение) Тогда
Возврат Ложь;
КонецЕсли;
Возврат СтрСравнить(Файл.Имя, "Form.xml") = 0;
КонецФункции
// ЭтоФайлОписанияФормыEDT
// Возвращает истину, если файл является файлом описания формы в формате EDT
// Параметры:
// Файл - Файл - Полный путь к файлу
//
// Возвращаемое значение:
// Булево - Признак
//
Функция ЭтоФайлОписанияФормыEDT(Файл) Экспорт
Если ПустаяСтрока(Файл.Расширение) Тогда
Возврат Ложь;
КонецЕсли;
Возврат СтрСравнить(Файл.Имя, "Form.form") = 0;
КонецФункции

View File

@ -0,0 +1,83 @@
///////////////////////////////////////////////////////////////////////////////
//
// Служебный модуль с набором методов для работы с файлами
//
// (с) BIA Technologies, LLC
//
///////////////////////////////////////////////////////////////////////////////
// ПрочитатьТекстФайла
// Возвращает содержимое файла, читая его в правильной кодировке
// Параметры:
// ПутьКФайлу - Строка - Полный путь к файлу
//
// Возвращаемое значение:
// Строка - Содержимое файла
//
Функция ПрочитатьТекстФайла(ПутьКФайлу) Экспорт
Кодировка = ОпределитьКодировку(ПутьКФайлу);
Текст = Новый ЧтениеТекста();
Текст.Открыть(ПутьКФайлу, Кодировка);
СодержимоеФайла = Текст.Прочитать();
Текст.Закрыть();
Возврат СодержимоеФайла;
КонецФункции // ПрочитатьТекстФайла
// ЗаписатьТекстФайла
// Определяет кодировку файла и записывает содержимое в файл
//
// Параметры:
// ПутьКФайлу - Строка - Полный путь к файлу
// СодержимоеФайла - Строка - Текст для записи
Процедура ЗаписатьТекстФайла(ПутьКФайлу, СодержимоеФайла) Экспорт
Кодировка = ОпределитьКодировку(ПутьКФайлу);
ЗаписьТекста = Новый ЗаписьТекста(ПутьКФайлу, Кодировка, , , Символы.ПС);
ЗаписьТекста.Записать(СодержимоеФайла);
ЗаписьТекста.Закрыть();
КонецПроцедуры // ЗаписатьТекстФайла
// ОпределитьКодировку
// Читает первые 3 байта файла и ищет маркер BOM кодировки UTF-8
// Параметры:
// ПутьКФайлу - Строка - Полный путь к файлу
//
// Возвращаемое значение:
// Перечисление - Кодировка файла
//
Функция ОпределитьКодировку(ПутьКФайлу) Экспорт
МаркерUTFBOM = СтрРазделить("239 187 191", " ");
ЧтениеДанных = Новый ЧтениеДанных(ПутьКФайлу);
Буфер = Новый БуферДвоичныхДанных(МаркерUTFBOM.Количество());
ЧтениеДанных.ПрочитатьВБуферДвоичныхДанных(Буфер, , МаркерUTFBOM.Количество());
Cч = 0;
ЕстьBOM = Истина;
Для Каждого Байт ИЗ Буфер Цикл
Если МаркерUTFBOM[Cч] <> Строка(Байт) Тогда
ЕстьBOM = Ложь;
Прервать;
КонецЕсли;
Cч = Cч + 1;
КонецЦикла;
ЧтениеДанных.Закрыть();
Возврат ?(ЕстьBOM, КодировкаТекста.UTF8, КодировкаТекста.UTF8NoBOM);
КонецФункции // ОпределитьКодировку

View File

@ -27,7 +27,7 @@
// * Лог - Объект - Текущий лог
// * ИзмененныеКаталоги - Массив - Каталоги, которые необходимо добавить в индекс
// * КаталогРепозитория - Строка - Адрес каталога репозитория
// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образоавшиеся в результате работы сценария
// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образовавшиеся в результате работы сценария
// и которые необходимо дообработать
//
// Возвращаемое значение:
@ -57,10 +57,7 @@
Функция ВставитьНужныеПробелы(Знач ИмяФайла)
Текст = Новый ЧтениеТекста();
Текст.Открыть(ИмяФайла, КодировкаТекста.UTF8NoBOM);
СодержимоеФайла = Текст.Прочитать();
Текст.Закрыть();
СодержимоеФайла = ФайловыеОперации.ПрочитатьТекстФайла(ИмяФайла);
Если Не ЗначениеЗаполнено(СодержимоеФайла) Тогда
@ -79,10 +76,7 @@
КонецЕсли;
СодержимоеФайла = Регексп.Заменить(СодержимоеФайла, "$1 $2$3$4");
ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8NoBOM,,, Символы.ПС);
ЗаписьТекста.Записать(СодержимоеФайла);
ЗаписьТекста.Закрыть();
ФайловыеОперации.ЗаписатьТекстФайла(ИмяФайла, СодержимоеФайла);
Возврат Истина;

View File

@ -28,7 +28,7 @@
// * Лог - Объект - Текущий лог
// * ИзмененныеКаталоги - Массив - Каталоги, которые необходимо добавить в индекс
// * КаталогРепозитория - Строка - Адрес каталога репозитория
// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образоавшиеся в результате работы сценария
// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образовавшиеся в результате работы сценария
// и которые необходимо дообработать
//
// Возвращаемое значение:
@ -53,11 +53,7 @@
Процедура ПроверитьНаОтсутствиеПерейти(ПутьКФайлуМодуля)
Текст = Новый ЧтениеТекста();
Текст.Открыть(ПутьКФайлуМодуля, КодировкаТекста.UTF8NoBOM);
ТекстМодуля = Текст.Прочитать();
Текст.Закрыть();
ТекстМодуля = ФайловыеОперации.ПрочитатьТекстФайла(ПутьКФайлуМодуля);
ТекстОшибки = "";
ШаблонПоиска = Новый РегулярноеВыражение("[\s;]+?Перейти\s+?~[a-zA-ZА-Яа-я0-9_]+");

View File

@ -26,7 +26,7 @@
// * Лог - Объект - Текущий лог
// * ИзмененныеКаталоги - Массив - Каталоги, которые необходимо добавить в индекс
// * КаталогРепозитория - Строка - Адрес каталога репозитория
// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образоавшиеся в результате работы сценария
// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образовавшиеся в результате работы сценария
// и которые необходимо дообработать
//
// Возвращаемое значение:
@ -36,17 +36,33 @@
Лог = ДополнительныеПараметры.Лог;
НастройкиСценария = ДополнительныеПараметры.УправлениеНастройками.Настройка("Precommt4onecСценарии\НастройкиСценариев").Получить(ИмяСценария());
Если АнализируемыйФайл.Существует() И ЭтоФайлОписанияФормы(АнализируемыйФайл) Тогда
Лог.Информация("Обработка файла '%1' по сценарию '%2'", АнализируемыйФайл.ПолноеИмя, ИмяСценария());
Если ОбновитьИндексыЭлементовВФорме(АнализируемыйФайл.ПолноеИмя) Тогда
Если АнализируемыйФайл.Существует() Тогда
ДополнительныеПараметры.ИзмененныеКаталоги.Добавить(АнализируемыйФайл.ПолноеИмя);
Если ТипыФайлов.ЭтоФайлОписанияФормы(АнализируемыйФайл) Тогда
Лог.Информация("Обработка файла '%1' по сценарию '%2'", АнализируемыйФайл.ПолноеИмя, ИмяСценария());
Если ОбновитьИндексыЭлементовВФорме(АнализируемыйФайл.ПолноеИмя) Тогда
ДополнительныеПараметры.ИзмененныеКаталоги.Добавить(АнализируемыйФайл.ПолноеИмя);
КонецЕсли;
Возврат ИСТИНА;
ИначеЕсли ТипыФайлов.ЭтоФайлОписанияФормыEDT(АнализируемыйФайл) Тогда
Лог.Информация("Обработка файла '%1' по сценарию '%2'", АнализируемыйФайл.ПолноеИмя, ИмяСценария());
Если ОбновитьИндексыЭлементовВФорме(АнализируемыйФайл.ПолноеИмя, Истина) Тогда
ДополнительныеПараметры.ИзмененныеКаталоги.Добавить(АнализируемыйФайл.ПолноеИмя);
КонецЕсли;
Возврат ИСТИНА;
КонецЕсли;
Возврат ИСТИНА;
КонецЕсли;
@ -54,26 +70,13 @@
КонецФункции // ОбработатьФайл()
Функция ЭтоФайлОписанияФормы(Файл)
Если ПустаяСтрока(Файл.Расширение) Тогда
Возврат Ложь;
КонецЕсли;
Возврат СтрСравнить(Файл.Имя, "Form.xml") = 0;
КонецФункции
Функция ОбновитьИндексыЭлементовВФорме(Знач ИмяФайла, EDT = Ложь)
Функция ОбновитьИндексыЭлементовВФорме(Знач ИмяФайла)
СодержимоеФайла = ФайловыеОперации.ПрочитатьТекстФайла(ИмяФайла);
Текст = Новый ЧтениеТекста();
Текст.Открыть(ИмяФайла, КодировкаТекста.UTF8NoBOM);
СодержимоеФайла = Текст.Прочитать();
Текст.Закрыть();
ПаттернID = ?(EDT, "<id>([0-9-]+)<\/id>", "id=\""([0-9-]+)\""\/*>");
Регексп = Новый РегулярноеВыражение("id=\""([0-9-]+)\""\/*>");
Регексп = Новый РегулярноеВыражение(ПаттернID);
Регексп.ИгнорироватьРегистр = ИСТИНА;
Регексп.Многострочный = ИСТИНА;
ГруппыИндексов = Регексп.НайтиСовпадения(СодержимоеФайла);
@ -114,9 +117,9 @@
Пока СтрокаТЧ.Количество > 1 Цикл
ИсходнаяСтрока = "id=""" + СтрокаТЧ.Значение + """";
ИсходнаяСтрока = ?(EDT, "<id>" + СтрокаТЧ.Значение + "<", "id=""" + СтрокаТЧ.Значение + """");
ПоследнийНомер = ПоследнийНомер + 1;
СтрокаЗамены = "id=""" + ПоследнийНомер + """";
СтрокаЗамены = ?(EDT, "<id>" + ПоследнийНомер + "<", "id=""" + ПоследнийНомер + """");
Поз = СтрНайти(СодержимоеФайла, ИсходнаяСтрока);
@ -129,9 +132,7 @@
КонецЦикла;
ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8NoBOM,,, Символы.ПС);
ЗаписьТекста.Записать(СодержимоеФайла);
ЗаписьТекста.Закрыть();
ФайловыеОперации.ЗаписатьТекстФайла(ИмяФайла, СодержимоеФайла);
Возврат ИСТИНА;

View File

@ -0,0 +1,274 @@
///////////////////////////////////////////////////////////////////////////////
//
// Служебный модуль с реализацией сценариев обработки файлов <ОтключениеПолнотекстовогоПоиска>
//
///////////////////////////////////////////////////////////////////////////////
Перем ЗначениеПоиска;
// ИмяСценария
// Возвращает имя сценария обработки файлов
//
// Возвращаемое значение:
// Строка - Имя текущего сценария обработки файлов
//
Функция ИмяСценария() Экспорт
Возврат "ОтключениеПолнотекстовогоПоиска";
КонецФункции // ИмяСценария()
// ПолучитьСтандартныеНастройкиСценария
// Возвращает структуру настроек сценария
//
// Возвращаемое значение:
// Структура - Структура с настройками сценария
// * ИмяСценария - Строка - Имя, с которым сохранятся настройки
// * Настройка - Соответствие - настройки
//
Функция ПолучитьСтандартныеНастройкиСценария() Экспорт
НастройкиСценария = Новый Соответствие;
ПутьИРеквизиты = Новый Соответствие;
МассивРеквизитов = Новый Массив;
МассивРеквизитов.Добавить("Номер");
МассивРеквизитов.Добавить("ТабличнаяЧасть1.Реквизит");
ПутьИРеквизиты.Вставить("src\_example.xml", МассивРеквизитов);
ПутьИРеквизиты.Вставить("src\_example2.xml", Новый Массив);
НастройкиСценария.Вставить("МетаданныеДляИсключения", ПутьИРеквизиты);
Возврат Новый Структура("ИмяСценария, Настройка", ИмяСценария(), НастройкиСценария);
КонецФункции
// ОбработатьФайл
// Выполняет обработку файла
//
// Параметры:
// АнализируемыйФайл - Файл - Файл из журнала git для анализа
// КаталогИсходныхФайлов - Строка - Каталог расположения исходных файлов относительно каталог репозитория
// ДополнительныеПараметры - Структура - Набор дополнительных параметров, которые можно использовать
// * Лог - Объект - Текущий лог
// * ИзмененныеКаталоги - Массив - Каталоги, которые необходимо добавить в индекс
// * КаталогРепозитория - Строка - Адрес каталога репозитория
// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образовавшиеся в результате работы сценария
// и которые необходимо дообработать
//
// Возвращаемое значение:
// Булево - Признак выполненной обработки файла
//
Функция ОбработатьФайл(АнализируемыйФайл, КаталогИсходныхФайлов, ДополнительныеПараметры) Экспорт
Лог = ДополнительныеПараметры.Лог;
НастройкиСценария = ДополнительныеПараметры.УправлениеНастройками.Настройка("Precommt4onecСценарии\НастройкиСценариев").Получить(ИмяСценария());
Если АнализируемыйФайл.Существует() И ТипыФайлов.ЭтоФайлОписанияМетаданных(АнализируемыйФайл) Тогда
МетаданныеДляИсключения = НастройкиСценария.Получить("МетаданныеДляИсключения");
ОтносительныйПуть = СтрЗаменить(АнализируемыйФайл.ПолноеИмя, ДополнительныеПараметры.КаталогРепозитория, "");
МассивРеквизитов = МетаданныеДляИсключения.Получить(ОтносительныйПуть);
Если МассивРеквизитов = Неопределено ИЛИ ЗначениеЗаполнено(МассивРеквизитов) Тогда
//Неопределено - нет файла в исключении, массив не пустой - исключение только по реквизитам
Лог.Информация("Обработка файла '%1' по сценарию '%2'", АнализируемыйФайл.ПолноеИмя, ИмяСценария());
ЭтоEDT = ТипыФайлов.ЭтоФайлОписанияМетаданныхEDT(АнализируемыйФайл);
Если ОтключитьПолнотекстовыйПоиск(АнализируемыйФайл.ПолноеИмя, МассивРеквизитов, ЭтоEDT) Тогда
ДополнительныеПараметры.ИзмененныеКаталоги.Добавить(АнализируемыйФайл.ПолноеИмя);
КонецЕсли;
Возврат Истина;
КонецЕсли;
КонецЕсли;
Возврат Ложь;
КонецФункции // ОбработатьФайл()
Функция ОтключитьПолнотекстовыйПоиск(Знач ИмяФайла, МассивРеквизитов, ЭтоEDT)
ТекстФайла = ФайловыеОперации.ПрочитатьТекстФайла(ИмяФайла);
СодержимоеФайла = ТекстФайла;
Если Не ЗначениеЗаполнено(СодержимоеФайла) Тогда
Возврат Ложь;
КонецЕсли;
Если ЗначениеЗаполнено(МассивРеквизитов) Тогда
// получение текста файла до табличных частей
Регексп = Новый РегулярноеВыражение("(<\?xml version[\w\W]+?)(<TabularSection|<\/MetaDataObject>|<\/mdclass:Document>)([\w\W]+)?");
Регексп.ИгнорироватьРегистр = Истина;
Регексп.Многострочный = Истина;
Совпадения = Регексп.НайтиСовпадения(СодержимоеФайла);
Если Совпадения.Количество() = 0 Тогда
Возврат Ложь;
КонецЕсли;
СекцияДоТаблиц = Совпадения[0].Группы[1].Значение;
ЗакрывающаяСекция = Совпадения[0].Группы[2].Значение;
СекцияТаблиц = Совпадения[0].Группы[3].Значение;
СекцияДоТаблиц = ОбработатьСтандартныеАтрибуты(СекцияДоТаблиц, МассивРеквизитов);
СекцияДоТаблиц = ОбработатьРеквизиты(СекцияДоТаблиц, МассивРеквизитов);
ЕстьСекцияТаблиц = СекцияТаблиц <> "";
Если ЕстьСекцияТаблиц Тогда
ОбработатьТабличныеЧасти(СекцияТаблиц, МассивРеквизитов, ЭтоEDT);
КонецЕсли;
СодержимоеФайла = СекцияДоТаблиц + ?(ЕстьСекцияТаблиц, ЗакрывающаяСекция + СекцияТаблиц, ЗакрывающаяСекция);
Иначе // Обработается весь файл целиком
СодержимоеФайла = ЗаменитьПоиск(СодержимоеФайла);
КонецЕсли;
Если СтрСравнить(ТекстФайла, СодержимоеФайла) = 0 Тогда
Возврат Ложь;
КонецЕсли;
ФайловыеОперации.ЗаписатьТекстФайла(ИмяФайла, СодержимоеФайла);
Возврат Истина;
КонецФункции
Функция ЗаменитьПоиск(СодержимоеФайла, Знач ПоискРеквизита = "")
ПолнотекстовыйПоиск = "(<(?:xr\:)?fullTextSearch>)(Use)(<\/(?:xr\:)?fullTextSearch>)";
Выражение = ПоискРеквизита + ПолнотекстовыйПоиск;
Регексп = Новый РегулярноеВыражение(Выражение);
Регексп.ИгнорироватьРегистр = Истина;
Регексп.Многострочный = Истина;
ГруппыИндексов = Регексп.НайтиСовпадения(СодержимоеФайла);
Если ГруппыИндексов.Количество() <> 0 Тогда
Если ЗначениеЗаполнено(ПоискРеквизита) Тогда
СодержимоеФайла = Регексп.Заменить(СодержимоеФайла, "$1$2DontUse$4");
Иначе
СодержимоеФайла = Регексп.Заменить(СодержимоеФайла, "$1DontUse$3");
КонецЕсли;
КонецЕсли;
Возврат СодержимоеФайла;
КонецФункции
Функция ОбработатьСтандартныеАтрибуты(СодержимоеФайла, Исключения)
СтандартныеАтрибуты = "Attribute name=""([а-яa-zA-ZА-Я0-9_]+)"">[\w\W]+?((<xr:FullTextSearch>(Use)<\/xr:FullTextSearch>)|<\/xr:StandardAttribute>)";
Регексп = Новый РегулярноеВыражение(СтандартныеАтрибуты);
Регексп.ИгнорироватьРегистр = Истина;
Регексп.Многострочный = Истина;
КоллекцияСовпадений = Регексп.НайтиСовпадения(СодержимоеФайла);
Для Каждого Совпадение Из КоллекцияСовпадений Цикл
Если Совпадение.Группы[4].Значение = ЗначениеПоиска.Use И Исключения.Найти(Совпадение.Группы[1].Значение) = Неопределено Тогда
ПоискРеквизита = СтрШаблон("(Attribute name=""%1"">[\w\W]+?)", Совпадение.Группы[1].Значение);
СодержимоеФайла = ЗаменитьПоиск(СодержимоеФайла, ПоискРеквизита);
КонецЕсли;
КонецЦикла;
Возврат СодержимоеФайла;
КонецФункции
Функция ОбработатьРеквизиты(СодержимоеФайла, Исключения)
ПоискРеквизиты = "<Name>([а-яa-zA-ZА-Я0-9_]+)<\/Name>[\w\W]+?(<FullTextSearch>(Use)<\/FullTextSearch>)|<\/Properties>|<\/attributes>";
Регексп = Новый РегулярноеВыражение(ПоискРеквизиты);
Регексп.ИгнорироватьРегистр = Истина;
Регексп.Многострочный = Истина;
КоллекцияСовпадений = Регексп.НайтиСовпадения(СодержимоеФайла);
Для Каждого Совпадение Из КоллекцияСовпадений Цикл
Если Совпадение.Группы[3].Значение = ЗначениеПоиска.Use И Исключения.Найти(Совпадение.Группы[1].Значение) = Неопределено Тогда
ПоискРеквизита = СтрШаблон("(<Name>%1<\/Name>[\w\W]+?)", Совпадение.Группы[1].Значение);
СодержимоеФайла = ЗаменитьПоиск(СодержимоеФайла, ПоискРеквизита);
КонецЕсли;
КонецЦикла;
Возврат СодержимоеФайла;
КонецФункции
Функция ОбработатьТабличныеЧасти(ТекстФайла, Исключения, ЭтоEDT)
Если ЭтоEDT Тогда
Шаблон = "<\/producedTypes>\s+<name>([а-яa-zA-ZА-Я0-9_]+)<\/name>|(<Name>)([а-яa-zA-ZА-Я0-9_]+)<\/Name>|(<FullTextSearch>)(Use)<\/FullTextSearch>";
ШаблонЗамены = "(<\/producedTypes>\s+<name>%1<\/name>[\w\W]+?<Name>%2<\/Name>[\w\W]+?)";
Иначе
Шаблон = "TabularSection\.[\w\W]+?\.([\w\W]+?)""|(<Name>)([а-яa-zA-ZА-Я0-9_]+)<\/Name>|(<FullTextSearch>)(Use)<\/FullTextSearch>";
ШаблонЗамены = "(TabularSection\.[\w\W]+?\.%1""[\w\W]+?<Name>%2<\/Name>[\w\W]+?)";
КонецЕсли;
Регексп = Новый РегулярноеВыражение(Шаблон);
Регексп.ИгнорироватьРегистр = Истина;
Регексп.Многострочный = Истина;
КоллекцияСовпадений = Регексп.НайтиСовпадения(ТекстФайла);
Таблица = "";
Реквизит = "";
Для Каждого Совпадение Из КоллекцияСовпадений Цикл
Таблица = ?(ЗначениеЗаполнено(Совпадение.Группы[1].Значение), Совпадение.Группы[1].Значение, Таблица);
Реквизит = ?(ЗначениеЗаполнено(Совпадение.Группы[3].Значение), Совпадение.Группы[3].Значение, Реквизит);
ИспользованиеПоиска = Совпадение.Группы[4].Значение;
Если ЗначениеЗаполнено(ИспользованиеПоиска) И Исключения.Найти(Таблица + "." + Реквизит) = Неопределено Тогда
ПолнотекстовыйПоиск = СтрШаблон(ШаблонЗамены, Таблица, Реквизит);
ТекстФайла = ЗаменитьПоиск(ТекстФайла, ПолнотекстовыйПоиск)
КонецЕсли;
КонецЦикла;
Возврат ТекстФайла;
КонецФункции
ЗначениеПоиска = Новый Структура ("Use, DontUse", "Use", "DontUse");

View File

@ -0,0 +1,115 @@
///////////////////////////////////////////////////////////////////////////////
//
// Служебный модуль с реализацией сценариев обработки файлов <ИмяСценария>
//
///////////////////////////////////////////////////////////////////////////////
Перем Лог;
// ИмяСценария
// Возвращает имя сценария обработки файлов
//
// Возвращаемое значение:
// Строка - Имя текущего сценария обработки файлов
//
Функция ИмяСценария() Экспорт
Возврат "ПроверкаДублейПроцедурИФункций";
КонецФункции // ИмяСценария()
// ОбработатьФайл
// Выполняет обработку файла
//
// Параметры:
// АнализируемыйФайл - Файл - Файл из журнала git для анализа
// КаталогИсходныхФайлов - Строка - Каталог расположения исходных файлов относительно каталог репозитория
// ДополнительныеПараметры - Структура - Набор дополнительных параметров, которые можно использовать
// * Лог - Объект - Текущий лог
// * ИзмененныеКаталоги - Массив - Каталоги, которые необходимо добавить в индекс
// * КаталогРепозитория - Строка - Адрес каталога репозитория
// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образовавшиеся в результате работы сценария
// и которые необходимо дообработать
//
// Возвращаемое значение:
// Булево - Признак выполненной обработки файла
//
Функция ОбработатьФайл(АнализируемыйФайл, КаталогИсходныхФайлов, ДополнительныеПараметры) Экспорт
Лог = ДополнительныеПараметры.Лог;
НастройкиСценария = ДополнительныеПараметры.УправлениеНастройками.Настройка("Precommt4onecСценарии\НастройкиСценариев").Получить(ИмяСценария());
Если АнализируемыйФайл.Существует() И ТипыФайлов.ЭтоФайлИсходников(АнализируемыйФайл) Тогда
Лог.Информация("Обработка файла '%1' по сценарию '%2'", АнализируемыйФайл.ПолноеИмя, ИмяСценария());
ПроверитьНаДублированиеМетодов(АнализируемыйФайл.ПолноеИмя);
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции // ОбработатьФайл()
// ПроверитьНаДублированиеМетодов
// Выполняет поиск дублей имен процедур и функций файла
//
// Параметры:
// ПутьКФайлуМодуля - Строка - Путь до файла
//
Процедура ПроверитьНаДублированиеМетодов(ПутьКФайлуМодуля)
Текст = Новый ЧтениеТекста();
Текст.Открыть(ПутьКФайлуМодуля, КодировкаТекста.UTF8NoBOM);
ТекстМодуля = Текст.Прочитать();
Текст.Закрыть();
ТекстОшибки = "";
ШаблонПоиска = Новый РегулярноеВыражение("^\s*(?:Процедура|Функция|procedure|function)\s+?([а-яА-ЯёЁ0-9_\w]+?)\s*?\(");
ШаблонПоиска.Многострочный = Истина;
ШаблонПоиска.ИгнорироватьРегистр = Истина;
Если НЕ ПустаяСтрока(ТекстМодуля) Тогда
Совпадения = ШаблонПоиска.НайтиСовпадения(ТекстМодуля);
Если Совпадения.Количество() Тогда
ТЗПроцедуры = Новый ТаблицаЗначений;
ТЗПроцедуры.Колонки.Добавить("ИмяПроцедуры");
ТЗПроцедуры.Колонки.Добавить("Количество");
Для Каждого Совпадение Из Совпадения Цикл
СтрокаТЗ = ТЗПроцедуры.Добавить();
СтрокаТЗ.ИмяПроцедуры = НРЕГ(Совпадение.Группы[1].Значение);
СтрокаТЗ.Количество = 1;
КонецЦикла;
КоличествоПроцедур = ТЗПроцедуры.Количество();
ТЗПроцедуры.Свернуть("ИмяПроцедуры", "Количество");
КоличествоУникальных = ТЗПроцедуры.Количество();
Если КоличествоПроцедур <> КоличествоУникальных Тогда
ТекстОшибки = СтрШаблон("В файле '%1' обнаружены неуникальные имена методов " + Символы.ПС, ПутьКФайлуМодуля);
Для Каждого СтрокаТЗ Из ТЗПроцедуры Цикл
ТекстОшибки = ТекстОшибки + ?(СтрокаТЗ.Количество > 1, СтрокаТЗ.ИмяПроцедуры + Символы.ПС, "");
КонецЦикла;
Лог.Ошибка(ТекстОшибки);
ВызватьИсключение ТекстОшибки;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры // ПроверитьНаДублированиеМетодов()

View File

@ -28,7 +28,7 @@
// * Лог - Объект - Текущий лог
// * ИзмененныеКаталоги - Массив - Каталоги, которые необходимо добавить в индекс
// * КаталогРепозитория - Строка - Адрес каталога репозитория
// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образоавшиеся в результате работы сценария
// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образовавшиеся в результате работы сценария
// и которые необходимо дообработать
//
// Возвращаемое значение:
@ -53,12 +53,8 @@
Процедура ПроверитьНаКорректностьОбластей(ПутьКФайлуМодуля)
Текст = Новый ЧтениеТекста();
Текст.Открыть(ПутьКФайлуМодуля, КодировкаТекста.UTF8NoBOM);
ТекстМодуля = Текст.Прочитать();
Текст.Закрыть();
ТекстМодуля = ФайловыеОперации.ПрочитатьТекстФайла(ПутьКФайлуМодуля);
ТекстОшибки = "";
ШаблонПоиска = Новый РегулярноеВыражение("^[\t ]*?#[\t ]*?(?:(?:Область[\t ]+?([a-zA-Zа-яА-Я0-9_]+?))|(?:КонецОбласти))[\t ]*?(?:\/\/.*)*$");
ШаблонПоиска.Многострочный = Истина;

View File

@ -31,7 +31,7 @@
// * Лог - Объект - Текущий лог
// * ИзмененныеКаталоги - Массив - Каталоги, которые необходимо добавить в индекс
// * КаталогРепозитория - Строка - Адрес каталога репозитория
// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образоавшиеся в результате работы сценария
// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образовавшиеся в результате работы сценария
// и которые необходимо дообработать
//
// Возвращаемое значение:
@ -42,7 +42,7 @@
Лог = ДополнительныеПараметры.Лог;
НастройкиСценария = ДополнительныеПараметры.УправлениеНастройками.Настройка("Precommt4onecСценарии\НастройкиСценариев").Получить(ИмяСценария());
Если ЭтоФайлОбычнойФормы(АнализируемыйФайл) Тогда
Если ТипыФайлов.ЭтоФайлОбычнойФормы(АнализируемыйФайл) Тогда
Лог.Информация("Обработка файла '%1' по сценарию '%2'", АнализируемыйФайл.ПолноеИмя, ИмяСценария());
@ -78,18 +78,6 @@
КонецФункции // ОбработатьФайл()
Функция ЭтоФайлОбычнойФормы(Файл)
Если ПустаяСтрока(Файл.Расширение) Тогда
Возврат Ложь;
КонецЕсли;
Возврат СтрСравнить(Файл.Имя, "Form.bin") = 0;
КонецФункции
Функция ПодготовитьКаталогВыгрузки(КаталогИсходныхФайлов, ОбрабатываемыйФайл, ДополнительныеПараметры)
ФайлУдален = НЕ ОбрабатываемыйФайл.Существует();

View File

@ -27,6 +27,24 @@
КонецФункции // ИмяСценария()
// ПолучитьСтандартныеНастройкиСценария
// Возвращает структуру настроек сценария
//
// Возвращаемое значение:
// Структура - Структура с настройками сценария
// * ИмяСценария - Строка - Имя, с которым сохранятся настройки
// * Настройка - Соответствие - настройки
//
Функция ПолучитьСтандартныеНастройкиСценария() Экспорт
НастройкиСценария = Новый Соответствие;
НастройкиСценария.Вставить("ИспользоватьНастройкиПоУмолчанию", Истина);
НастройкиСценария.Вставить("ВерсияПлатформы", "");
Возврат Новый Структура("ИмяСценария, Настройка", ИмяСценария(), НастройкиСценария);
КонецФункции
// ОбработатьФайл
// Выполняет обработку файла
//
@ -37,7 +55,7 @@
// * Лог - Объект - Текущий лог
// * ИзмененныеКаталоги - Массив - Каталоги, которые необходимо добавить в индекс
// * КаталогРепозитория - Строка - Адрес каталога репозитория
// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образоавшиеся в результате работы сценария
// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образовавшиеся в результате работы сценария
// и которые необходимо дообработать
//
// Возвращаемое значение:

View File

@ -26,7 +26,7 @@
// * Лог - Объект - Текущий лог
// * ИзмененныеКаталоги - Массив - Каталоги, которые необходимо добавить в индекс
// * КаталогРепозитория - Строка - Адрес каталога репозитория
// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образоавшиеся в результате работы сценария
// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образовавшиеся в результате работы сценария
// и которые необходимо дообработать
//
// Возвращаемое значение:
@ -56,11 +56,7 @@
Функция СинхронизироватьМетаданныеиФайлы(Знач ИмяФайла, УдаленныеФайлы)
Текст = Новый ЧтениеТекста();
Текст.Открыть(ИмяФайла, "utf-8");
СодержимоеФайла = Текст.Прочитать();
Текст.Закрыть();
СодержимоеФайла = ФайловыеОперации.ПрочитатьТекстФайла(ИмяФайла);
Регексп = Новый РегулярноеВыражение("(<ChildObjects>\s+?)([\w\W]+?)(\s+<\/ChildObjects>)");
Регексп.ИгнорироватьРегистр = ИСТИНА;
Регексп.Многострочный = ИСТИНА;
@ -172,11 +168,19 @@
КонецЦикла;
МассивИсключенийМетаданных = ПолучитьМассивИсключенийМетаданных();
// проверка наличия объектов, для которых нет каталогов
Если ОбъектыМетаданных.Количество() Тогда
Для Каждого ОбъектМетаданных Из ОбъектыМетаданных Цикл
Если МассивИсключенийМетаданных.Найти(ОбъектМетаданных.Тип) <> Неопределено Тогда
Продолжить;
КонецЕсли;
ЕдиныйТекстОшибки = ЕдиныйТекстОшибки + ?(ПустаяСтрока(ЕдиныйТекстОшибки), "", Символы.ПС)
+ "Отсутствуют файлы для " + ОбъектМетаданных.ТипМетаданных + "." + ОбъектМетаданных.ИмяМетаданных;
@ -201,6 +205,15 @@
КонецФункции
Функция ПолучитьМассивИсключенийМетаданных()
МассивИсключений = Новый Массив();
МассивИсключений.Добавить("Sequence");
Возврат МассивИсключений;
КонецФункции
Функция СписокКаталоговТиповМетаданных()
Список = Новый СписокЗначений();
@ -238,6 +251,7 @@
Список.Добавить("SessionParameters", "SessionParameter");
Список.Добавить("SettingsStorages", "SettingsStorage");
Список.Добавить("StyleItems", "StyleItem");
Список.Добавить("Sequences", "Sequence");
Список.Добавить("Styles", "Style");
Список.Добавить("Subsystems", "Subsystem");
Список.Добавить("Tasks", "Task");

View File

@ -26,7 +26,7 @@
// * Лог - Объект - Текущий лог
// * ИзмененныеКаталоги - Массив - Каталоги, которые необходимо добавить в индекс
// * КаталогРепозитория - Строка - Адрес каталога репозитория
// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образоавшиеся в результате работы сценария
// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образовавшиеся в результате работы сценария
// и которые необходимо дообработать
//
// Возвращаемое значение:
@ -72,10 +72,7 @@
Функция ОтсортироватьДеревоМетаданных(Знач ИмяФайла)
Текст = Новый ЧтениеТекста();
Текст.Открыть(ИмяФайла, "utf-8");
СодержимоеФайла = Текст.Прочитать();
Текст.Закрыть();
СодержимоеФайла = ФайловыеОперации.ПрочитатьТекстФайла(ИмяФайла);
Регексп = Новый РегулярноеВыражение("(<ChildObjects>\s+?)([\w\W]+?)(\s+<\/ChildObjects>)");
Регексп.ИгнорироватьРегистр = ИСТИНА;
@ -136,12 +133,9 @@
Возврат Ложь;
КонецЕсли;
СодержимоеФайла = Регексп.Заменить(СодержимоеФайла, "$1" + СтрокаЗамены + "$3");
ЗаписьТекста = Новый ЗаписьТекста;
ЗаписьТекста.Открыть(ИмяФайла, КодировкаТекста.UTF8);
ЗаписьТекста.Записать(СодержимоеФайла);
ЗаписьТекста.Закрыть();
ФайловыеОперации.ЗаписатьТекстФайла(ИмяФайла, СодержимоеФайла);
Возврат Истина;
@ -215,10 +209,7 @@
КонецЕсли;
СодержимоеФайла = Регексп.Заменить(СодержимоеФайла, "$1" + СокрЛП(СтрокаЗамены) + Символы.ПС + "$3");
ЗаписьТекста = Новый ЗаписьТекста;
ЗаписьТекста.Открыть(ИмяФайла, КодировкаТекста.UTF8NoBOM);
ЗаписьТекста.Записать(СодержимоеФайла);
ЗаписьТекста.Закрыть();
ФайловыеОперации.ЗаписатьТекстФайла(ИмяФайла, СодержимоеФайла);
Возврат Истина;

View File

@ -26,7 +26,7 @@
// * Лог - Объект - Текущий лог
// * ИзмененныеКаталоги - Массив - Каталоги, которые необходимо добавить в индекс
// * КаталогРепозитория - Строка - Адрес каталога репозитория
// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образоавшиеся в результате работы сценария
// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образовавшиеся в результате работы сценария
// и которые необходимо дообработать
//
// Возвращаемое значение:
@ -72,10 +72,7 @@
Функция УдалитьДублиВМетаданных(Знач ИмяФайла)
Текст = Новый ЧтениеТекста();
Текст.Открыть(ИмяФайла, "utf-8");
СодержимоеФайла = Текст.Прочитать();
Текст.Закрыть();
СодержимоеФайла = ФайловыеОперации.ПрочитатьТекстФайла(ИмяФайла);
Регексп = Новый РегулярноеВыражение("(<ChildObjects>\s+?)([\w\W]+?)(\s+<\/ChildObjects>)");
Регексп.ИгнорироватьРегистр = ИСТИНА;
@ -139,10 +136,7 @@
КонецЕсли;
СодержимоеФайла = Регексп.Заменить(СодержимоеФайла, "$1" + СтрокаЗамены + "$3");
ЗаписьТекста = Новый ЗаписьТекста;
ЗаписьТекста.Открыть(ИмяФайла, КодировкаТекста.UTF8);
ЗаписьТекста.Записать(СодержимоеФайла);
ЗаписьТекста.Закрыть();
ФайловыеОперации.ЗаписатьТекстФайла(ИмяФайла, СодержимоеФайла);
Возврат Истина;

View File

@ -26,7 +26,7 @@
// * Лог - Объект - Текущий лог
// * ИзмененныеКаталоги - Массив - Каталоги, которые необходимо добавить в индекс
// * КаталогРепозитория - Строка - Адрес каталога репозитория
// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образоавшиеся в результате работы сценария
// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образовавшиеся в результате работы сценария
// и которые необходимо дообработать
//
// Возвращаемое значение:
@ -56,10 +56,7 @@
Функция ИсправитьКонцевыеПробелы(Знач ИмяФайла)
Текст = Новый ЧтениеТекста();
Текст.Открыть(ИмяФайла, КодировкаТекста.UTF8NoBOM);
СодержимоеФайла = Текст.Прочитать();
Текст.Закрыть();
СодержимоеФайла = ФайловыеОперации.ПрочитатьТекстФайла(ИмяФайла);
Если Не ЗначениеЗаполнено(СодержимоеФайла) Тогда
@ -79,9 +76,7 @@
СодержимоеФайла = Регексп.Заменить(СодержимоеФайла, "$1");
ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8NoBOM,,, Символы.ПС);
ЗаписьТекста.Записать(СодержимоеФайла);
ЗаписьТекста.Закрыть();
ФайловыеОперации.ЗаписатьТекстФайла(ИмяФайла, СодержимоеФайла);
Возврат Истина;

View File

@ -26,7 +26,7 @@
// * Лог - Объект - Текущий лог
// * ИзмененныеКаталоги - Массив - Каталоги, которые необходимо добавить в индекс
// * КаталогРепозитория - Строка - Адрес каталога репозитория
// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образоавшиеся в результате работы сценария
// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образовавшиеся в результате работы сценария
// и которые необходимо дообработать
//
// Возвращаемое значение:
@ -55,11 +55,8 @@
КонецФункции // ОбработатьФайл()
Функция УдалитьЛишниеПустыеСтроки(Знач ИмяФайла)
Текст = Новый ЧтениеТекста();
Текст.Открыть(ИмяФайла, КодировкаТекста.UTF8NoBOM);
СодержимоеФайла = Текст.Прочитать();
Текст.Закрыть();
СодержимоеФайла = ФайловыеОперации.ПрочитатьТекстФайла(ИмяФайла);
Если Не ЗначениеЗаполнено(СодержимоеФайла) Тогда
@ -73,9 +70,7 @@
НовоеСодержимоеФайла = РегекспОчистка.Заменить(СодержимоеФайла, Символы.ПС);
Если СтрСравнить(СодержимоеФайла, НовоеСодержимоеФайла) <> 0 Тогда
ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8NoBOM,,, Символы.ПС);
ЗаписьТекста.Записать(НовоеСодержимоеФайла);
ЗаписьТекста.Закрыть();
ФайловыеОперации.ЗаписатьТекстФайла(ИмяФайла, НовоеСодержимоеФайла);
Возврат Истина;
КонецЕсли;

View File

@ -14,9 +14,31 @@
ВызватьИсключение "Имя сценария не установлено";
Возврат "ИмяСценария";
КонецФункции // ИмяСценария()
// ПолучитьСтандартныеНастройкиСценария
// Возвращает структуру настроек сценария
//
// Возвращаемое значение:
// Структура - Структура с настройками сценария
// * ИмяСценария - Строка - Имя, с которым сохранятся настройки
// * Настройка - Соответствие - настройки
//
Функция ПолучитьСтандартныеНастройкиСценария() Экспорт
ВызватьИсключение "Настройки отсутствуют";
НастройкиСценария = Новый Соответствие;
НастройкиСценария.Вставить("ИспользоватьПоУмолчанию", Истина);
НастройкиСценария.Вставить("Версия", "");
НастройкиСценария.Вставить("КоличествоПопыток", 5);
НастройкиСценария.Вставить("МассивПараметров", Новый Массив);
Возврат Новый Структура("ИмяСценария, Настройка", ИмяСценария(), НастройкиСценария);
КонецФункции
// ОбработатьФайл
// Выполняет обработку файла
//
@ -27,8 +49,9 @@
// * Лог - Объект - Текущий лог
// * ИзмененныеКаталоги - Массив - Каталоги, которые необходимо добавить в индекс
// * КаталогРепозитория - Строка - Адрес каталога репозитория
// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образоавшиеся в результате работы сценария
// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образовавшиеся в результате работы сценария
// и которые необходимо дообработать
// * ИзмененныеКаталоги - Массив - Каталоги / файлы которые необходимо добавить в индекс
//
// Возвращаемое значение:
// Булево - Признак выполненной обработки файла
@ -38,7 +61,71 @@
ВызватьИсключение "Обработка файла не реализована";
Лог = ДополнительныеПараметры.Лог;
НастройкиСценария = ДополнительныеПараметры.УправлениеНастройками.Настройка("Precommt4onecСценарии\НастройкиСценариев").Получить(ИмяСценария());
Лог.Информация("Обработка файла '%1' по сценарию '%2'", АнализируемыйФайл.ПолноеИмя, ИмяСценария());
Возврат ЛОЖЬ;
// анализ файла без изменения его содержимого
Если АнализируемыйФайл.Существует() И ТипыФайлов.ЭтоФайлИсходников(АнализируемыйФайл) Тогда
Лог.Информация("Обработка файла '%1' по сценарию '%2'", АнализируемыйФайл.ПолноеИмя, ИмяСценария());
ШаблоннаяОбработкаФайла(АнализируемыйФайл);
Возврат Истина;
КонецЕсли;
// анализ файла с изменением его содержимого
Если АнализируемыйФайл.Существует() И ТипыФайлов.ЭтоФайлИсходников(АнализируемыйФайл) Тогда
Лог.Информация("Обработка файла '%1' по сценарию '%2'", АнализируемыйФайл.ПолноеИмя, ИмяСценария());
Если ШаблоннаяОбработкаФайлаСИзменением(АнализируемыйФайл) Тогда
//Добавим измененный каталог или файл в индекс, чтобы он закоммитился с изменениями
ДополнительныеПараметры.ИзмененныеКаталоги.Добавить(АнализируемыйФайл.ПолноеИмя);
//Добавим измененный файл в журнал изменений без добавления в индекс, чтобы сценарии прошли снова
ДополнительныеПараметры.ФайлыДляПостОбработки.Добавить(АнализируемыйФайл.ПолноеИмя);
Возврат Истина;
КонецЕсли;
КонецЕсли;
Возврат Ложь;
КонецФункции // ОбработатьФайл()
Процедура ШаблоннаяОбработкаФайла(ИмяФайла)
СодержимоеФайла = ФайловыеОперации.ПрочитатьТекстФайла(ИмяФайла);
Если Не ЗначениеЗаполнено(СодержимоеФайла) Тогда
Возврат;
КонецЕсли;
Если СодержимоеФайла = СодержимоеФайла Тогда
ВызватьИсключение "Содержимое файла равно содержимому файла";
КонецЕсли;
КонецПроцедуры
Функция ШаблоннаяОбработкаФайлаСИзменением(ИмяФайла)
СодержимоеФайла = ФайловыеОперации.ПрочитатьТекстФайла(ИмяФайла);
Если Не ЗначениеЗаполнено(СодержимоеФайла) Тогда
Возврат Ложь;
КонецЕсли;
ФайловыеОперации.ЗаписатьТекстФайла(ИмяФайла, СодержимоеФайла + "1");
Возврат Истина;
КонецФункции

12
tests/fixtures/BOM.bsl vendored Normal file
View File

@ -0,0 +1,12 @@
Процедура Имя ()
КонецПроцедуры
Процедура Имя1 ()
КонецПроцедуры

12
tests/fixtures/NoBom.bsl vendored Normal file
View File

@ -0,0 +1,12 @@
Процедура Имя ()
КонецПроцедуры
Процедура Имя1 ()
КонецПроцедуры

View File

@ -0,0 +1,62 @@
///////////////////////////////////////////////////////////////////////////////
//
// Служебный модуль с реализацией сценариев обработки файлов <ИмяСценария>
//
///////////////////////////////////////////////////////////////////////////////
Перем Лог;
// ИмяСценария
// Возвращает имя сценария обработки файлов
//
// Возвращаемое значение:
// Строка - Имя текущего сценария обработки файлов
//
Функция ИмяСценария() Экспорт
Возврат "ПроверкаДублейПроцедурИФункций";
КонецФункции // ИмяСценария()
// ОбработатьФайл
// Выполняет обработку файла
//
// Параметры:
// АнализируемыйФайл - Файл - Файл из журнала git для анализа
// КаталогИсходныхФайлов - Строка - Каталог расположения исходных файлов относительно каталог репозитория
// ДополнительныеПараметры - Структура - Набор дополнительных параметров, которые можно использовать
// * Лог - Объект - Текущий лог
// * ИзмененныеКаталоги - Массив - Каталоги, которые необходимо добавить в индекс
// * КаталогРепозитория - Строка - Адрес каталога репозитория
// * ФайлыДляПостОбработки - Массив - Файлы, изменившиеся / образоавшиеся в результате работы сценария
// и которые необходимо дообработать
//
// Возвращаемое значение:
// Булево - Признак выполненной обработки файла
//
Функция ОбработатьФайл(АнализируемыйФайл, КаталогИсходныхФайлов, ДополнительныеПараметры) Экспорт
Лог = ДополнительныеПараметры.Лог;
НастройкиСценария = ДополнительныеПараметры.УправлениеНастройками.Настройка("Precommt4onecСценарии\НастройкиСценариев").Получить(ИмяСценария());
Если АнализируемыйФайл.Существует() И ТипыФайлов.ЭтоФайлИсходников(АнализируемыйФайл) Тогда
Лог.Информация("Обработка файла '%1' по сценарию '%2'", АнализируемыйФайл.ПолноеИмя, ИмяСценария());
ДобавитьПриветМир(АнализируемыйФайл.ПолноеИмя);
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции // ОбработатьФайл()
Процедура ДобавитьПриветМир(ПутьКФайлуМодуля)
Текст = Новый ЗаписьТекста();
Текст.Открыть(ПутьКФайлуМодуля, КодировкаТекста.UTF8NoBOM);
ТекстМодуля = Текст.ЗаписатьСтроку("HelloWorld", Символы.ПС);
Текст.Закрыть();
КонецПроцедуры

13
tests/fixtures/v8config.json vendored Normal file
View File

@ -0,0 +1,13 @@
{
"Precommt4onecСценарии": {
"ИспользоватьСценарииРепозитория": true,
"КаталогЛокальныхСценариев": "localscenario",
"ГлобальныеСценарии": [],
"НастройкиСценариев": {
"РазборОтчетовОбработокРасширений": {
"ИспользоватьНастройкиПоУмолчанию": true,
"ВерсияПлатформы": ""
}
}
}
}

105
tests/fixtures/Документ.mdo vendored Normal file
View File

@ -0,0 +1,105 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:Document xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="385df754-ca61-4a33-891e-85a76740ce8c">
<producedTypes>
<objectType typeId="dfd6d675-7224-48e1-9f73-27c877f4ebe7" valueTypeId="dc7923eb-814f-4270-94e4-b90e09ba69cc"/>
<refType typeId="514db708-6540-4aac-9572-7bc815a489cd" valueTypeId="e83fcebe-b881-4ea1-ab4f-66ac8b6a9125"/>
<selectionType typeId="cc0398a5-fb11-4964-a2cc-660199555a1a" valueTypeId="cccce58b-d552-4b60-b68b-6d67a46b1241"/>
<listType typeId="f48dffcb-19af-4486-ac12-06c56992a664" valueTypeId="2504943b-5617-4e14-80a4-a5da48ad3ae8"/>
<managerType typeId="5efb0435-af92-4b42-ae5a-411d9fb5250f" valueTypeId="3843301c-ad40-42c1-9e49-1b6bd6f90d32"/>
</producedTypes>
<name>Документ</name>
<synonym>
<key>ru</key>
<value>Документ</value>
</synonym>
<useStandardCommands>true</useStandardCommands>
<inputByString>Document.Документ.StandardAttribute.Number</inputByString>
<createOnInput>Use</createOnInput>
<dataLockControlMode>Managed</dataLockControlMode>
<fullTextSearch>Use</fullTextSearch>
<numberType>String</numberType>
<numberLength>9</numberLength>
<numberAllowedLength>Variable</numberAllowedLength>
<checkUnique>true</checkUnique>
<autonumbering>true</autonumbering>
<postInPrivilegedMode>true</postInPrivilegedMode>
<unpostInPrivilegedMode>true</unpostInPrivilegedMode>
<attributes uuid="01eea830-71a8-4902-b017-62a4d83a4740">
<name>Реквизит</name>
<synonym>
<key>ru</key>
<value>Реквизит</value>
</synonym>
<type>
<types>String</types>
<stringQualifiers>
<length>10</length>
</stringQualifiers>
</type>
<fullTextSearch>Use</fullTextSearch>
</attributes>
<tabularSections uuid="2c6232da-69cb-4df3-8edb-266590e0b802">
<producedTypes>
<objectType typeId="09b7654a-ee86-421d-af11-ebf35b735f4a" valueTypeId="8550bec4-2626-4a90-9ba4-157e89f19e2d"/>
<rowType typeId="692d5e88-96ff-4bc9-bb0d-3294edbbf1bc" valueTypeId="2ae0c435-e1ea-4b69-8cfc-9bb34e8db960"/>
</producedTypes>
<name>ТабличнаяЧасть</name>
<synonym>
<key>ru</key>
<value>Табличная часть</value>
</synonym>
<attributes uuid="1ebe77fa-0796-4dfe-b378-32e7bb78452c">
<name>Реквизит</name>
<synonym>
<key>ru</key>
<value>Реквизит</value>
</synonym>
<type>
<types>String</types>
<stringQualifiers>
<length>10</length>
</stringQualifiers>
</type>
<fullTextSearch>Use</fullTextSearch>
</attributes>
<attributes uuid="adbb4501-d947-4486-a88d-6a02a30e5f98">
<name>Реквизит1</name>
<synonym>
<key>ru</key>
<value>Реквизит1</value>
</synonym>
<type>
<types>String</types>
<stringQualifiers>
<length>10</length>
</stringQualifiers>
</type>
<fullTextSearch>Use</fullTextSearch>
</attributes>
</tabularSections>
<tabularSections uuid="bb551f9f-818a-4572-b64d-9b1b34e714a6">
<producedTypes>
<objectType typeId="5e9118b2-a4a0-4748-9386-763b9731c2cf" valueTypeId="75025611-4968-4d40-84e2-748123f73818"/>
<rowType typeId="1adafac5-71fd-45a0-9814-c5de37e5f917" valueTypeId="e37fc074-f327-4900-b612-6f0510e85636"/>
</producedTypes>
<name>ТабличнаяЧасть1</name>
<synonym>
<key>ru</key>
<value>Табличная часть1</value>
</synonym>
<attributes uuid="cabdb765-3400-4065-8c71-7c355202c9da">
<name>Реквизит</name>
<synonym>
<key>ru</key>
<value>Реквизит</value>
</synonym>
<type>
<types>String</types>
<stringQualifiers>
<length>10</length>
</stringQualifiers>
</type>
<fullTextSearch>Use</fullTextSearch>
</attributes>
</tabularSections>
</mdclass:Document>

376
tests/fixtures/Документ.xml vendored Normal file
View File

@ -0,0 +1,376 @@
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.7">
<Document uuid="931ff8b9-d808-49bc-a47c-8e3f2faa223f">
<InternalInfo>
<xr:GeneratedType name="DocumentObject.Документ" category="Object">
<xr:TypeId>0a63ee71-6357-4a50-b082-35f60b3be0e0</xr:TypeId>
<xr:ValueId>10bc61a2-ef43-4627-9748-ae6089c9bde1</xr:ValueId>
</xr:GeneratedType>
<xr:GeneratedType name="DocumentRef.Документ" category="Ref">
<xr:TypeId>e1fe1cb5-e8cb-441e-b2e3-a72ee43a4038</xr:TypeId>
<xr:ValueId>6e4dfc1f-8cc4-4fd9-9331-532a9b25b94a</xr:ValueId>
</xr:GeneratedType>
<xr:GeneratedType name="DocumentSelection.Документ" category="Selection">
<xr:TypeId>86597e09-2004-4fcc-9c8f-7b1e35aa1431</xr:TypeId>
<xr:ValueId>0dc19544-4f64-4479-ad60-e06dda1298ee</xr:ValueId>
</xr:GeneratedType>
<xr:GeneratedType name="DocumentList.Документ" category="List">
<xr:TypeId>855d48d4-5dce-4629-9998-d7a693d9d8d2</xr:TypeId>
<xr:ValueId>c74d8db3-5efd-4832-b863-6f8678445184</xr:ValueId>
</xr:GeneratedType>
<xr:GeneratedType name="DocumentManager.Документ" category="Manager">
<xr:TypeId>0cb5077c-9a73-4650-b93c-9d489b897d3b</xr:TypeId>
<xr:ValueId>5d3b3e0c-fb2e-45a8-b528-d257f903e7bc</xr:ValueId>
</xr:GeneratedType>
</InternalInfo>
<Properties>
<Name>Документ</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Документ</v8:content>
</v8:item>
</Synonym>
<Comment>Документ</Comment>
<UseStandardCommands>true</UseStandardCommands>
<Numerator/>
<NumberType>String</NumberType>
<NumberLength>10</NumberLength>
<NumberAllowedLength>Fixed</NumberAllowedLength>
<NumberPeriodicity>Year</NumberPeriodicity>
<CheckUnique>true</CheckUnique>
<Autonumbering>true</Autonumbering>
<StandardAttributes>
<xr:StandardAttribute name="Posted">
<xr:LinkByType/>
<xr:FillChecking>DontCheck</xr:FillChecking>
<xr:MultiLine>false</xr:MultiLine>
<xr:FillFromFillingValue>false</xr:FillFromFillingValue>
<xr:CreateOnInput>Auto</xr:CreateOnInput>
<xr:MaxValue xsi:nil="true"/>
<xr:ToolTip/>
<xr:ExtendedEdit>false</xr:ExtendedEdit>
<xr:Format/>
<xr:ChoiceForm/>
<xr:QuickChoice>Auto</xr:QuickChoice>
<xr:ChoiceHistoryOnInput>Auto</xr:ChoiceHistoryOnInput>
<xr:EditFormat/>
<xr:PasswordMode>false</xr:PasswordMode>
<xr:DataHistory>Use</xr:DataHistory>
<xr:MarkNegatives>false</xr:MarkNegatives>
<xr:MinValue xsi:nil="true"/>
<xr:Synonym/>
<xr:Comment/>
<xr:FullTextSearch>Use</xr:FullTextSearch>
<xr:ChoiceParameterLinks/>
<xr:FillValue xsi:nil="true"/>
<xr:Mask/>
<xr:ChoiceParameters/>
</xr:StandardAttribute>
<xr:StandardAttribute name="Ref">
<xr:LinkByType/>
<xr:FillChecking>DontCheck</xr:FillChecking>
<xr:MultiLine>false</xr:MultiLine>
<xr:FillFromFillingValue>false</xr:FillFromFillingValue>
<xr:CreateOnInput>Auto</xr:CreateOnInput>
<xr:MaxValue xsi:nil="true"/>
<xr:ToolTip/>
<xr:ExtendedEdit>false</xr:ExtendedEdit>
<xr:Format/>
<xr:ChoiceForm/>
<xr:QuickChoice>Auto</xr:QuickChoice>
<xr:ChoiceHistoryOnInput>Auto</xr:ChoiceHistoryOnInput>
<xr:EditFormat/>
<xr:PasswordMode>false</xr:PasswordMode>
<xr:DataHistory>Use</xr:DataHistory>
<xr:MarkNegatives>false</xr:MarkNegatives>
<xr:MinValue xsi:nil="true"/>
<xr:Synonym/>
<xr:Comment/>
<xr:FullTextSearch>Use</xr:FullTextSearch>
<xr:ChoiceParameterLinks/>
<xr:FillValue xsi:nil="true"/>
<xr:Mask/>
<xr:ChoiceParameters/>
</xr:StandardAttribute>
<xr:StandardAttribute name="DeletionMark">
<xr:LinkByType/>
<xr:FillChecking>DontCheck</xr:FillChecking>
<xr:MultiLine>false</xr:MultiLine>
<xr:FillFromFillingValue>false</xr:FillFromFillingValue>
<xr:CreateOnInput>Auto</xr:CreateOnInput>
<xr:MaxValue xsi:nil="true"/>
<xr:ToolTip/>
<xr:ExtendedEdit>false</xr:ExtendedEdit>
<xr:Format/>
<xr:ChoiceForm/>
<xr:QuickChoice>Auto</xr:QuickChoice>
<xr:ChoiceHistoryOnInput>Auto</xr:ChoiceHistoryOnInput>
<xr:EditFormat/>
<xr:PasswordMode>false</xr:PasswordMode>
<xr:DataHistory>Use</xr:DataHistory>
<xr:MarkNegatives>false</xr:MarkNegatives>
<xr:MinValue xsi:nil="true"/>
<xr:Synonym/>
<xr:Comment/>
<xr:FullTextSearch>Use</xr:FullTextSearch>
<xr:ChoiceParameterLinks/>
<xr:FillValue xsi:nil="true"/>
<xr:Mask/>
<xr:ChoiceParameters/>
</xr:StandardAttribute>
<xr:StandardAttribute name="Date">
<xr:LinkByType/>
<xr:FillChecking>ShowError</xr:FillChecking>
<xr:MultiLine>false</xr:MultiLine>
<xr:FillFromFillingValue>false</xr:FillFromFillingValue>
<xr:CreateOnInput>Auto</xr:CreateOnInput>
<xr:MaxValue xsi:nil="true"/>
<xr:ToolTip/>
<xr:ExtendedEdit>false</xr:ExtendedEdit>
<xr:Format/>
<xr:ChoiceForm/>
<xr:QuickChoice>Auto</xr:QuickChoice>
<xr:ChoiceHistoryOnInput>Auto</xr:ChoiceHistoryOnInput>
<xr:EditFormat/>
<xr:PasswordMode>false</xr:PasswordMode>
<xr:DataHistory>Use</xr:DataHistory>
<xr:MarkNegatives>false</xr:MarkNegatives>
<xr:MinValue xsi:nil="true"/>
<xr:Synonym/>
<xr:Comment/>
<xr:FullTextSearch>Use</xr:FullTextSearch>
<xr:ChoiceParameterLinks/>
<xr:FillValue xsi:nil="true"/>
<xr:Mask/>
<xr:ChoiceParameters/>
</xr:StandardAttribute>
<xr:StandardAttribute name="Number">
<xr:LinkByType/>
<xr:FillChecking>DontCheck</xr:FillChecking>
<xr:MultiLine>false</xr:MultiLine>
<xr:FillFromFillingValue>false</xr:FillFromFillingValue>
<xr:CreateOnInput>Auto</xr:CreateOnInput>
<xr:MaxValue xsi:nil="true"/>
<xr:ToolTip/>
<xr:ExtendedEdit>false</xr:ExtendedEdit>
<xr:Format/>
<xr:ChoiceForm/>
<xr:QuickChoice>Auto</xr:QuickChoice>
<xr:ChoiceHistoryOnInput>Auto</xr:ChoiceHistoryOnInput>
<xr:EditFormat/>
<xr:PasswordMode>false</xr:PasswordMode>
<xr:DataHistory>Use</xr:DataHistory>
<xr:MarkNegatives>false</xr:MarkNegatives>
<xr:MinValue xsi:nil="true"/>
<xr:Synonym/>
<xr:Comment/>
<xr:FullTextSearch>Use</xr:FullTextSearch>
<xr:ChoiceParameterLinks/>
<xr:FillValue xsi:type="xs:string"> </xr:FillValue>
<xr:Mask/>
<xr:ChoiceParameters/>
</xr:StandardAttribute>
</StandardAttributes>
<Characteristics/>
<BasedOn>
<xr:Item xsi:type="xr:MDObjectRef">Document.ВводНачальныхОстатков</xr:Item>
<xr:Item xsi:type="xr:MDObjectRef">Document.РКО</xr:Item>
<xr:Item xsi:type="xr:MDObjectRef">Document.ПКО</xr:Item>
<xr:Item xsi:type="xr:MDObjectRef">Document.АвансовыйОтчет</xr:Item>
<xr:Item xsi:type="xr:MDObjectRef">Document.ВозмещениеШтрафы</xr:Item>
</BasedOn>
<InputByString>
<xr:Field>Document.РКО.StandardAttribute.Number</xr:Field>
</InputByString>
<CreateOnInput>Use</CreateOnInput>
<SearchStringModeOnInputByString>Begin</SearchStringModeOnInputByString>
<FullTextSearchOnInputByString>Use</FullTextSearchOnInputByString>
<ChoiceDataGetModeOnInputByString>Directly</ChoiceDataGetModeOnInputByString>
<DefaultObjectForm>Document.РКО.Form.ФормаДокумента</DefaultObjectForm>
<DefaultListForm>Document.РКО.Form.ФормаСписка</DefaultListForm>
<DefaultChoiceForm>Document.РКО.Form.ФормаСписка</DefaultChoiceForm>
<AuxiliaryObjectForm/>
<AuxiliaryListForm/>
<AuxiliaryChoiceForm/>
<Posting>Allow</Posting>
<RealTimePosting>Deny</RealTimePosting>
<RegisterRecordsDeletion>AutoDeleteOff</RegisterRecordsDeletion>
<RegisterRecordsWritingOnPost>WriteModified</RegisterRecordsWritingOnPost>
<SequenceFilling>AutoFill</SequenceFilling>
<RegisterRecords></RegisterRecords>
<PostInPrivilegedMode>false</PostInPrivilegedMode>
<UnpostInPrivilegedMode>false</UnpostInPrivilegedMode>
<IncludeHelpInContents>true</IncludeHelpInContents>
<DataLockFields/>
<DataLockControlMode>Automatic</DataLockControlMode>
<FullTextSearch>Use</FullTextSearch>
<ObjectPresentation/>
<ExtendedObjectPresentation/>
<ListPresentation/>
<ExtendedListPresentation/>
<Explanation/>
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
<DataHistory>DontUse</DataHistory>
</Properties>
<ChildObjects>
<Attribute uuid="8fa5eded-c1ec-4edc-b0fe-dc673c7486c7">
<Properties>
<Name>UID</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>UID</v8:content>
</v8:item>
</Synonym>
<Comment/>
<Type>
<v8:Type>xs:string</v8:Type>
<v8:StringQualifiers>
<v8:Length>36</v8:Length>
<v8:AllowedLength>Variable</v8:AllowedLength>
</v8:StringQualifiers>
</Type>
<PasswordMode>false</PasswordMode>
<Format/>
<EditFormat/>
<ToolTip/>
<MarkNegatives>false</MarkNegatives>
<Mask/>
<MultiLine>false</MultiLine>
<ExtendedEdit>false</ExtendedEdit>
<MinValue xsi:nil="true"/>
<MaxValue xsi:nil="true"/>
<FillFromFillingValue>false</FillFromFillingValue>
<FillValue xsi:nil="true"/>
<FillChecking>DontCheck</FillChecking>
<ChoiceFoldersAndItems>Items</ChoiceFoldersAndItems>
<ChoiceParameterLinks/>
<ChoiceParameters/>
<QuickChoice>Auto</QuickChoice>
<CreateOnInput>Auto</CreateOnInput>
<ChoiceForm/>
<LinkByType/>
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
<Indexing>Index</Indexing>
<FullTextSearch>Use</FullTextSearch>
<DataHistory>Use</DataHistory>
</Properties>
</Attribute>
<Attribute uuid="d39a6a5c-73a0-4df9-a3b1-b62fb0c2041a">
<Properties>
<Name>Автор</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Автор</v8:content>
</v8:item>
</Synonym>
<Comment/>
<Type>
<v8:Type>cfg:CatalogRef.Пользователи</v8:Type>
</Type>
<PasswordMode>false</PasswordMode>
<Format/>
<EditFormat/>
<ToolTip/>
<MarkNegatives>false</MarkNegatives>
<Mask/>
<MultiLine>false</MultiLine>
<ExtendedEdit>false</ExtendedEdit>
<MinValue xsi:nil="true"/>
<MaxValue xsi:nil="true"/>
<FillFromFillingValue>false</FillFromFillingValue>
<FillValue xsi:nil="true"/>
<FillChecking>DontCheck</FillChecking>
<ChoiceFoldersAndItems>Items</ChoiceFoldersAndItems>
<ChoiceParameterLinks/>
<ChoiceParameters/>
<QuickChoice>Auto</QuickChoice>
<CreateOnInput>Auto</CreateOnInput>
<ChoiceForm/>
<LinkByType/>
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
<Indexing>Index</Indexing>
<FullTextSearch>DontUse</FullTextSearch>
<DataHistory>Use</DataHistory>
</Properties>
</Attribute>
<Form>ФормаДокумента</Form>
<Form>ФормаСписка</Form>
<TabularSection uuid="95245065-867e-4d1f-a8f9-ebed62cd0489">
<InternalInfo>
<xr:GeneratedType name="DocumentTabularSection.РКО.ТабличнаяЧасть1" category="TabularSection">
<xr:TypeId>80865b81-ba79-4e7f-bbb6-c9817e08f4dd</xr:TypeId>
<xr:ValueId>3608b01d-e050-453f-ae0a-93e3eea243c3</xr:ValueId>
</xr:GeneratedType>
<xr:GeneratedType name="DocumentTabularSectionRow.РКО.ТабличнаяЧасть1" category="TabularSectionRow">
<xr:TypeId>7720174e-1f6c-4639-98d8-9a488f6488a5</xr:TypeId>
<xr:ValueId>73fe98f8-8875-49ef-ac49-37806daf575b</xr:ValueId>
</xr:GeneratedType>
</InternalInfo>
<Properties>
<Name>ТабличнаяЧасть1</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>ТабличнаяЧасть1</v8:content>
</v8:item>
</Synonym>
<Comment>ТабличнаяЧасть1</Comment>
<ToolTip/>
<FillChecking>DontCheck</FillChecking>
</Properties>
<ChildObjects>
<Attribute uuid="b04234e4-d0ca-4a9c-9735-794e9e798f7c">
<Properties>
<Name>Субконто</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Субконто</v8:content>
</v8:item>
</Synonym>
<Comment/>
<Type>
<v8:Type>cfg:CatalogRef.ВидыОпераций</v8:Type>
<v8:Type>cfg:CatalogRef.Сотрудники</v8:Type>
<v8:Type>cfg:CatalogRef.СтатьиЗатрат</v8:Type>
<v8:Type>cfg:CatalogRef.Пользователи</v8:Type>
<v8:Type>cfg:CatalogRef.Контрагенты</v8:Type>
<v8:Type>cfg:CatalogRef.ЕдиницыИзмерения</v8:Type>
<v8:Type>cfg:CatalogRef.БанковскиеСчета</v8:Type>
<v8:Type>cfg:CatalogRef.Номенклатура</v8:Type>
<v8:Type>cfg:CatalogRef.Кассы</v8:Type>
<v8:Type>cfg:CatalogRef.Машины</v8:Type>
<v8:Type>cfg:CatalogRef.Подразделения</v8:Type>
</Type>
<PasswordMode>false</PasswordMode>
<Format/>
<EditFormat/>
<ToolTip/>
<MarkNegatives>false</MarkNegatives>
<Mask/>
<MultiLine>false</MultiLine>
<ExtendedEdit>false</ExtendedEdit>
<MinValue xsi:nil="true"/>
<MaxValue xsi:nil="true"/>
<FillChecking>DontCheck</FillChecking>
<ChoiceFoldersAndItems>Items</ChoiceFoldersAndItems>
<ChoiceParameterLinks/>
<ChoiceParameters/>
<QuickChoice>Auto</QuickChoice>
<CreateOnInput>Auto</CreateOnInput>
<ChoiceForm/>
<LinkByType/>
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
<Indexing>Index</Indexing>
<FullTextSearch>Use</FullTextSearch>
<DataHistory>Use</DataHistory>
</Properties>
</Attribute>
</ChildObjects>
</TabularSection>
</ChildObjects>
</Document>
</MetaDataObject>

View File

@ -0,0 +1,34 @@
Процедура Проц() Экспорт
КонецПроцедуры
//ПРоцедура Проц()
Функция Проц() Экспорт
КонецПроцедуры // Процедура проц()
Процедура УпроститьLevel() Экспорт
КонецПроцедуры
Процедура level_Forma1t() Экспорт
КонецПроцедуры
Процедура Проц1_() Экспорт
КонецПроцедуры
Процедура _Проц12() Экспорт
КонецПроцедуры
пРоцедура проц2 (парам1)
КонецПроцедуры;
Функция функё1() Экспорт
КонецФункции
Процедура ПРоц3()
КонецПроцедуры
Функция Функ1()
КонецФункции
Функция _Функ1()
КонецФункции

View File

@ -0,0 +1,30 @@
Процедура Проц() Экспорт
КонецПроцедуры
Процедура УпроститьLevel() Экспорт
КонецПроцедуры
Процедура level_Forma1t() Экспорт
КонецПроцедуры
Процедура Проц1_() Экспорт
КонецПроцедуры
Процедура _Проц12() Экспорт
КонецПроцедуры
пРоцедура проц2 (парам1)
КонецПроцедуры;
Функция функё1() Экспорт
КонецФункции
Процедура ПРоц3()
КонецПроцедуры
Функция Функ1()
КонецФункции
Функция _Функ1()
КонецФункции

View File

@ -0,0 +1,16 @@
Процедура РадномныеВычисления (парам1)
КонецПроцедуры;
Функция РадномныеВычисления() Экспорт
КонецФункции
Процедура Изменить(Парам1, Парам2)
КонецПроцедуры
Процедура Изменить(Парам 1 = Неопределено)
КонецФункции
Функция _Функ1()
КонецФункции

View File

@ -0,0 +1,191 @@
#Использовать asserts
#Использовать logos
#Использовать tempfiles
Перем юТест;
Перем Лог;
Перем МенеджерВременныхФайлов;
// Основная точка входа
Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт
юТест = ЮнитТестирование;
ВсеТесты = Новый Массив;
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийПроверкиДублейПроцедурВызываетИсключение");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийПроверкиДублейПроцедурОбработаетФайл");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийПроверкиДублейПроцедурНеОбработаетНесуществующийФайл");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийПроверкиДублейПроцедурНеОбработаетНеИсходник");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийОтключенияПолнотекстовогоПоискаИмеетМетодПолученияНастроек");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийРазбораОтчетовОбработокРасширенийИмеетМетодПолученияНастроек");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийОтключенияПолнотекстовогоПоискаВозвращаетНастройки");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоСценарийРазбораОтчетовОбработокРасширенийВозвращаетНастройки");
Возврат ВсеТесты;
КонецФункции
Процедура ПередЗапускомТеста() Экспорт
ВремТестер = Новый Тестер;
Лог = Логирование.ПолучитьЛог(ВремТестер.ИмяЛога());
ВключитьПоказОтладки();
МенеджерВременныхФайлов = Новый МенеджерВременныхФайлов;
КонецПроцедуры
Процедура ПослеЗапускаТеста() Экспорт
МенеджерВременныхФайлов.Удалить();
МенеджерВременныхФайлов = Неопределено;
КонецПроцедуры
Процедура ТестДолжен_ПроверитьЧтоСценарийОтключенияПолнотекстовогоПоискаИмеетМетодПолученияНастроек() Экспорт
ОбъектСценария = ПолучитьСценарий("ОтключениеПолнотекстовогоПоиска.os");
СценарийИмеетМетод(ОбъектСценария, НазваниеМетодаНастроек());
КонецПроцедуры
Процедура ТестДолжен_ПроверитьЧтоСценарийРазбораОтчетовОбработокРасширенийИмеетМетодПолученияНастроек() Экспорт
ОбъектСценария = ПолучитьСценарий("РазборОтчетовОбработокРасширений.os");
СценарийИмеетМетод(ОбъектСценария, НазваниеМетодаНастроек());
КонецПроцедуры
Процедура ТестДолжен_ПроверитьЧтоСценарийОтключенияПолнотекстовогоПоискаВозвращаетНастройки() Экспорт
ОбъектСценария = ПолучитьСценарий("ОтключениеПолнотекстовогоПоиска.os");
СценарийВозвращаетНастройки(ОбъектСценария, "ОтключениеПолнотекстовогоПоиска");
КонецПроцедуры
Процедура ТестДолжен_ПроверитьЧтоСценарийРазбораОтчетовОбработокРасширенийВозвращаетНастройки() Экспорт
ОбъектСценария = ПолучитьСценарий("РазборОтчетовОбработокРасширений.os");
СценарийВозвращаетНастройки(ОбъектСценария, "РазборОтчетовОбработокРасширений");
КонецПроцедуры
Процедура ТестДолжен_ПроверитьЧтоСценарийПроверкиДублейПроцедурВызываетИсключение() Экспорт
ОбъектСценария = ПолучитьСценарий("ПроверкаДублейПроцедурИФункций.os");
Файл = Новый Файл(ОбъединитьПути(КаталогТестовыхФикстур(), "ПроверкаДублейПроцедурНегативныйТест.bsl"));
СПараметрами = Новый Файл(ОбъединитьПути(КаталогТестовыхФикстур(), "ПроверкаДублейПроцедурСПараметрами.bsl"));
ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, "обнаружены неуникальные имена методов");
ВызываетсяИсключениеСТекстом(ОбъектСценария, СПараметрами, "обнаружены неуникальные имена методов");
КонецПроцедуры
Процедура ТестДолжен_ПроверитьЧтоСценарийПроверкиДублейПроцедурОбработаетФайл() Экспорт
Файл = Новый Файл(ОбъединитьПути(КаталогТестовыхФикстур(), "ПроверкаДублейПроцедурПоложительныйТест.bsl"));
ОбъектСценария = ПолучитьСценарий("ПроверкаДублейПроцедурИФункций.os");
Результат = ОбъектСценария.ОбработатьФайл(Файл, Файл.Путь, ПолучитьДополнительныеНастройки());
Ожидаем.Что(Результат, Истина).ЭтоИстина();
КонецПроцедуры
Процедура ТестДолжен_ПроверитьЧтоСценарийПроверкиДублейПроцедурНеОбработаетНесуществующийФайл() Экспорт
Файл = Новый Файл(ПолучитьИмяВременногоФайла("bsl"));
ОбъектСценария = ПолучитьСценарий("ПроверкаДублейПроцедурИФункций.os");
Результат = ОбъектСценария.ОбработатьФайл(Файл, Файл.Путь, ПолучитьДополнительныеНастройки());
Ожидаем.Что(Результат, Истина).ЭтоЛожь();
КонецПроцедуры
Процедура ТестДолжен_ПроверитьЧтоСценарийПроверкиДублейПроцедурНеОбработаетНеИсходник() Экспорт
Файл = Новый Файл(МенеджерВременныхФайлов.СоздатьФайл("xml"));
ОбъектСценария = ПолучитьСценарий("ПроверкаДублейПроцедурИФункций.os");
Результат = ОбъектСценария.ОбработатьФайл(Файл, Файл.Путь, ПолучитьДополнительныеНастройки());
Ожидаем.Что(Результат, Истина).ЭтоЛожь();
КонецПроцедуры
Процедура ВызываетсяИсключениеСТекстом(ОбъектСценария, Файл, ТекстИсключения)
ДополнительныеНастройки = ПолучитьДополнительныеНастройки();
ПараметрыМетода = Новый Массив;
ПараметрыМетода.Добавить(Файл);
ПараметрыМетода.Добавить(Файл.Путь);
ПараметрыМетода.Добавить(ДополнительныеНастройки);
Ожидаем.Что(ОбъектСценария).Метод("ОбработатьФайл", ПараметрыМетода).ВыбрасываетИсключение(ТекстИсключения);
КонецПроцедуры
Процедура СценарийИмеетМетод(ОбъектСценария, ИмяМетода)
Рефлектор = Новый Рефлектор;
ЕстьМетод = Рефлектор.МетодСуществует(ОбъектСценария, ИмяМетода);
Ожидаем.Что(ЕстьМетод, Истина).ЭтоИстина();
КонецПроцедуры
Функция ПолучитьСценарий(ИмяСценария)
Сценарий = ОбъединитьПути(КаталогИсходников(), "src", "СценарииОбработки", ИмяСценария);
ОбъектСценария = ЗагрузитьСценарий(Сценарий);
Возврат ОбъектСценария;
КонецФункции
Процедура СценарийВозвращаетНастройки(ОбъектСценария, ИмяНастройки)
Рефлектор = Новый Рефлектор;
СтруктураНастроек = Рефлектор.ВызватьМетод(ОбъектСценария, НазваниеМетодаНастроек());
Утверждения.ПроверитьРавенство(СтруктураНастроек.ИмяСценария, ИмяНастройки);
Утверждения.ПроверитьРавенство(ТипЗнч(СтруктураНастроек.Настройка), Тип("Соответствие"));
КонецПроцедуры
Процедура ВключитьПоказОтладки()
Лог.УстановитьУровень(УровниЛога.Отладка);
КонецПроцедуры
Процедура ВыключитьПоказОтладки()
Лог.УстановитьУровень(УровниЛога.Информация);
КонецПроцедуры
Функция КаталогТестовыхФикстур()
Возврат ОбъединитьПути(КаталогИсходников(), "tests\fixtures");
КонецФункции
Функция КаталогИсходников()
Возврат ОбъединитьПути(ТекущийСценарий().Каталог, "..");
КонецФункции
Функция НазваниеМетодаНастроек()
Возврат "ПолучитьСтандартныеНастройкиСценария";
КонецФункции
Функция ПолучитьДополнительныеНастройки()
УправлениеНастройками = Новый НастройкиРепозитория(ТекущийКаталог());
ДополнительныеНастройки = Новый Структура("Лог, УправлениеНастройками", Лог, УправлениеНастройками);
Возврат ДополнительныеНастройки;
КонецФункции

View File

@ -0,0 +1,77 @@
#Использовать asserts
#Использовать logos
#Использовать tempfiles
#Использовать "../src"
Перем юТест;
Перем Лог;
Перем МенеджерВременныхФайлов;
// Основная точка входа
Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт
юТест = ЮнитТестирование;
ВсеТесты = Новый Массив;
ВсеТесты.Добавить("ТестДолжен_ПрочитатьФайл");
ВсеТесты.Добавить("ТестДолжен_ЗаписатьФайл");
Возврат ВсеТесты;
КонецФункции
Процедура ТестДолжен_ПрочитатьФайл() Экспорт
ПутьКФайлу = ОбъединитьПути(КаталогТестовыхФикстур(), "NoBom.bsl");
СодержимоеФайла = ФайловыеОперации.ПрочитатьТекстФайла(ПутьКФайлу);
Утверждения.ПроверитьЗаполненность(СодержимоеФайла);
КонецПроцедуры
Процедура ТестДолжен_ЗаписатьФайл() Экспорт
Файл = Новый Файл(МенеджерВременныхФайлов.СоздатьФайл("bsl"));
ФайловыеОперации.ЗаписатьТекстФайла(Файл.ПолноеИмя, Файл.ПолноеИмя);
СодержимоеФайла = ФайловыеОперации.ПрочитатьТекстФайла(Файл.ПолноеИмя);
Утверждения.ПроверитьРавенство(СодержимоеФайла, Файл.ПолноеИмя);
КонецПроцедуры
Процедура ПередЗапускомТеста() Экспорт
ВремТестер = Новый Тестер;
Лог = Логирование.ПолучитьЛог(ВремТестер.ИмяЛога());
ВключитьПоказОтладки();
МенеджерВременныхФайлов = Новый МенеджерВременныхФайлов;
КонецПроцедуры
Процедура ПослеЗапускаТеста() Экспорт
МенеджерВременныхФайлов.Удалить();
МенеджерВременныхФайлов = Неопределено;
КонецПроцедуры
Процедура ВключитьПоказОтладки()
Лог.УстановитьУровень(УровниЛога.Отладка);
КонецПроцедуры
Процедура ВыключитьПоказОтладки()
Лог.УстановитьУровень(УровниЛога.Информация);
КонецПроцедуры
Функция КаталогТестовыхФикстур()
Возврат ОбъединитьПути(КаталогИсходников(), "tests\fixtures");
КонецФункции
Функция КаталогИсходников()
Возврат ОбъединитьПути(ТекущийСценарий().Каталог, "..");
КонецФункции

View File

@ -6,6 +6,8 @@
"ДобавлениеПробеловПередКлючевымиСловами.os",
"ЗапретИспользованияПерейти.os",
"КорректировкаXMLФорм.os",
"ОтключениеПолнотекстовогоПоиска.os",
"ПроверкаДублейПроцедурИФункций.os",
"ПроверкаКорректностиОбластей.os",
"РазборОбычныхФормНаИсходники.os",
"РазборОтчетовОбработокРасширений.os",
@ -16,6 +18,14 @@
"УдалениеЛишнихПустыхСтрок.os"
],
"НастройкиСценариев": {
"ОтключениеПолнотекстовогоПоиска": {
"МетаданныеДляИсключения": {
"src\\_example.xml": [
"Номер"
],
"src\\_example2.xml": []
}
},
"РазборОтчетовОбработокРасширений": {
"ИспользоватьНастройкиПоУмолчанию": true,
"ВерсияПлатформы": ""