From f85c883c4cc83cd7725ccfba54097e2dfc012a8e Mon Sep 17 00:00:00 2001 From: Knyazkov Alexey Date: Fri, 27 Sep 2019 12:11:39 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=B0=D1=87=D0=B0=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D0=B0=D1=8F=20=D0=B8=D0=BD=D0=B8=D1=86=D0=B8=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=B0=D1=86=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 8 + LICENSE | 22 + README.md | 43 ++ features/opm-build.feature | 17 + features/step_definitions/diff3cf_feature.os | 43 ++ features/ВыполнениеСравнения.feature | 30 ++ features/ПростыеКоманды.feature | 43 ++ installlocalhost.bat | 12 + packagedef | 14 + src/main.os | 23 ++ src/Классы/ГенераторОтчета.os | 73 ++++ src/Классы/КомандаVersion.os | 33 ++ src/Классы/КомандаАнализОбъектов.os | 79 ++++ src/Классы/КомандаСправкаПоПараметрам.os | 47 +++ src/Классы/КомандаСравнение.os | 90 ++++ src/Классы/ПарсерМодулейРасширения.os | 345 ++++++++++++++++ src/Модули/АнализаторОбъектов.os | 265 ++++++++++++ src/Модули/ГенераторОтчетаHTML.os | 390 ++++++++++++++++++ src/Модули/МенеджерПриложения.os | 310 ++++++++++++++ src/Модули/ПараметрыПриложения.os | 144 +++++++ src/Модули/РезультатСравненияРасширения.os | 60 +++ src/Модули/ТипыОбъектов.os | 29 ++ tasks/test-feature.os | 18 + tasks/test.os | 82 ++++ .../configuration/Catalogs/Справочник1.xml | 84 ++++ .../CommonModules/ОбщийМодульТест.xml | 23 ++ .../ОбщийМодульТест/Ext/Module.bsl | 5 + .../fixtures/configuration/ConfigDumpInfo.xml | 24 ++ .../fixtures/configuration/Configuration.xml | 148 +++++++ .../Documents/ТестовыйДокумент.xml | 271 ++++++++++++ .../ТестовыйДокумент/Ext/ObjectModule.bsl | 6 + .../ТестовыйДокумент/Forms/ФормаДокумента.xml | 21 + .../Forms/ФормаДокумента/Ext/Form.xml | 36 ++ .../Forms/ФормаДокумента/Ext/Form/Module.bsl | 7 + .../configuration/Languages/Русский.xml | 16 + .../configuration/Roles/Администратор.xml | 15 + .../Roles/Администратор/Ext/Rights.xml | 24 ++ .../Subsystems/ПодсистемаТест.xml | 25 ++ .../ADDTST/CommonModules/ОбщийМодульТест.xml | 15 + .../ОбщийМодульТест/Ext/Module.bsl | 8 + tests/fixtures/exts/ADDTST/ConfigDumpInfo.xml | 12 + tests/fixtures/exts/ADDTST/Configuration.xml | 60 +++ .../ADDTST/Documents/ТестовыйДокумент.xml | 37 ++ .../ТестовыйДокумент/Forms/ФормаДокумента.xml | 10 + .../Forms/ФормаДокумента/Ext/Form.xml | 68 +++ .../Forms/ФормаДокумента/Ext/Form/Module.bsl | 7 + .../exts/ADDTST/Languages/Русский.xml | 10 + .../release/CommonModules/ОбщийМодульТест.xml | 23 ++ .../ОбщийМодульТест/Ext/Module.bsl | 7 + tests/fixtures/release/ConfigDumpInfo.xml | 16 + tests/fixtures/release/Configuration.xml | 132 ++++++ .../release/Documents/ТестовыйДокумент.xml | 81 ++++ .../ТестовыйДокумент/Ext/ObjectModule.bsl | 6 + .../ТестовыйДокумент/Forms/ФормаДокумента.xml | 21 + .../Forms/ФормаДокумента/Ext/Form.xml | 36 ++ .../Forms/ФормаДокумента/Ext/Form/Module.bsl | 9 + tests/fixtures/release/Languages/Русский.xml | 16 + .../fixtures/release/Roles/Администратор.xml | 15 + .../Roles/Администратор/Ext/Rights.xml | 24 ++ .../release/Subsystems/ПодсистемаТест.xml | 24 ++ tests/test-app.os | 181 ++++++++ 61 files changed, 3743 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 features/opm-build.feature create mode 100644 features/step_definitions/diff3cf_feature.os create mode 100644 features/ВыполнениеСравнения.feature create mode 100644 features/ПростыеКоманды.feature create mode 100644 installlocalhost.bat create mode 100644 packagedef create mode 100644 src/main.os create mode 100644 src/Классы/ГенераторОтчета.os create mode 100644 src/Классы/КомандаVersion.os create mode 100644 src/Классы/КомандаАнализОбъектов.os create mode 100644 src/Классы/КомандаСправкаПоПараметрам.os create mode 100644 src/Классы/КомандаСравнение.os create mode 100644 src/Классы/ПарсерМодулейРасширения.os create mode 100644 src/Модули/АнализаторОбъектов.os create mode 100644 src/Модули/ГенераторОтчетаHTML.os create mode 100644 src/Модули/МенеджерПриложения.os create mode 100644 src/Модули/ПараметрыПриложения.os create mode 100644 src/Модули/РезультатСравненияРасширения.os create mode 100644 src/Модули/ТипыОбъектов.os create mode 100644 tasks/test-feature.os create mode 100644 tasks/test.os create mode 100644 tests/fixtures/configuration/Catalogs/Справочник1.xml create mode 100644 tests/fixtures/configuration/CommonModules/ОбщийМодульТест.xml create mode 100644 tests/fixtures/configuration/CommonModules/ОбщийМодульТест/Ext/Module.bsl create mode 100644 tests/fixtures/configuration/ConfigDumpInfo.xml create mode 100644 tests/fixtures/configuration/Configuration.xml create mode 100644 tests/fixtures/configuration/Documents/ТестовыйДокумент.xml create mode 100644 tests/fixtures/configuration/Documents/ТестовыйДокумент/Ext/ObjectModule.bsl create mode 100644 tests/fixtures/configuration/Documents/ТестовыйДокумент/Forms/ФормаДокумента.xml create mode 100644 tests/fixtures/configuration/Documents/ТестовыйДокумент/Forms/ФормаДокумента/Ext/Form.xml create mode 100644 tests/fixtures/configuration/Documents/ТестовыйДокумент/Forms/ФормаДокумента/Ext/Form/Module.bsl create mode 100644 tests/fixtures/configuration/Languages/Русский.xml create mode 100644 tests/fixtures/configuration/Roles/Администратор.xml create mode 100644 tests/fixtures/configuration/Roles/Администратор/Ext/Rights.xml create mode 100644 tests/fixtures/configuration/Subsystems/ПодсистемаТест.xml create mode 100644 tests/fixtures/exts/ADDTST/CommonModules/ОбщийМодульТест.xml create mode 100644 tests/fixtures/exts/ADDTST/CommonModules/ОбщийМодульТест/Ext/Module.bsl create mode 100644 tests/fixtures/exts/ADDTST/ConfigDumpInfo.xml create mode 100644 tests/fixtures/exts/ADDTST/Configuration.xml create mode 100644 tests/fixtures/exts/ADDTST/Documents/ТестовыйДокумент.xml create mode 100644 tests/fixtures/exts/ADDTST/Documents/ТестовыйДокумент/Forms/ФормаДокумента.xml create mode 100644 tests/fixtures/exts/ADDTST/Documents/ТестовыйДокумент/Forms/ФормаДокумента/Ext/Form.xml create mode 100644 tests/fixtures/exts/ADDTST/Documents/ТестовыйДокумент/Forms/ФормаДокумента/Ext/Form/Module.bsl create mode 100644 tests/fixtures/exts/ADDTST/Languages/Русский.xml create mode 100644 tests/fixtures/release/CommonModules/ОбщийМодульТест.xml create mode 100644 tests/fixtures/release/CommonModules/ОбщийМодульТест/Ext/Module.bsl create mode 100644 tests/fixtures/release/ConfigDumpInfo.xml create mode 100644 tests/fixtures/release/Configuration.xml create mode 100644 tests/fixtures/release/Documents/ТестовыйДокумент.xml create mode 100644 tests/fixtures/release/Documents/ТестовыйДокумент/Ext/ObjectModule.bsl create mode 100644 tests/fixtures/release/Documents/ТестовыйДокумент/Forms/ФормаДокумента.xml create mode 100644 tests/fixtures/release/Documents/ТестовыйДокумент/Forms/ФормаДокумента/Ext/Form.xml create mode 100644 tests/fixtures/release/Documents/ТестовыйДокумент/Forms/ФормаДокумента/Ext/Form/Module.bsl create mode 100644 tests/fixtures/release/Languages/Русский.xml create mode 100644 tests/fixtures/release/Roles/Администратор.xml create mode 100644 tests/fixtures/release/Roles/Администратор/Ext/Rights.xml create mode 100644 tests/fixtures/release/Subsystems/ПодсистемаТест.xml create mode 100644 tests/test-app.os diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..659d540 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +bdd-log.xml +*.ospx + +/exec.log + +*.orig + +/tests.xml diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..0753288 --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2016 Andrei Ovsiankin +Copyright (c) 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 +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..8d92cdc --- /dev/null +++ b/README.md @@ -0,0 +1,43 @@ +# Утилита для автоматического сравнения переопределенных в расширении модулей измененных в новом релизе поставки основной конфигурации + +## Особенности данного решения +- скрипт автоматически сравнивает конфигурации и расширение, выгруженные в формате XML (выгрузка из конфигуратора) +- расширение также должно быть выгружено в формате XML +- помимо стандартных модулей реализована возможность сравнивать обработки заполнения вынесенные из форм документов в обработки +- результат сравнения сохраняется в файл отчет в формате HTML + +## Установка + +Установка на компьютер стандартна + +- склонировать репозиторий или +- распаковать в нужный каталог архив репозитория или +- для Windows запустить [installlocalhost.bat](/installlocalhost.bat) + +## Использование +Приложение позволяет сравнивать переопределенные в расширении методы, а также изменение структуры метаданных. Для каждого из этих режимов реализованы соответствующие команды. + +Возможные команды: + help - Выводит справку по командам + version - Выводит версию приложения + diff - Выполняет сравнение расширения с основной конфигурацией и новой поставкой + objects - Выполняет анализ изменения объектов из основной конфигурации в новой поставке + +diff - Выполняет сравнение расширения с основной конфигурацией и новой поставкой +Параметры: + <КаталогОсновнойКонфигурации> - Каталог основной конфигурации + <КаталогПоставки> - Каталог поставки + <КаталогРасширения> - Каталог расширения + <ФайлРезультат> - Файл-отчет, результат сравнения конфигураций + +Перед использованием необходимо выгрузить релиз поставки в формате XML в произвольный каталог + +- для сравнения обработок заполнения в свойствах обработки в поле комментарий необходимо указать переопределенный модуль в формате: + "Adopted.Documents\<Имя документа>\<Путь к модулю>\<ИмяМодуля.bsl>" + Например: Adopted.Documents\Отгул\Forms\ФормаДокумента\Ext\Form\Module.bsl + +- пример вызова для получения анализа переопределенных методов: + diff3cf diff <каталог основной конфигурации> <каталог с релизом поставки> <каталог с расширением> <файл результат>.html + +- пример вызова для получения анализа изменения структуры метаданных: + diff3cf objects <каталог основной конфигурации> <каталог с релизом поставки> <каталог с расширением> <файл результат>.txt diff --git a/features/opm-build.feature b/features/opm-build.feature new file mode 100644 index 0000000..eee7e7c --- /dev/null +++ b/features/opm-build.feature @@ -0,0 +1,17 @@ +# language: ru + +Функционал: Проверка сборки продукта + Как Пользователь + Я хочу автоматически проверять сборку моего продукта + Чтобы гарантировать возможность установку моего продукта у пользователей + +Контекст: Отключение отладки в логах + Допустим Я выключаю отладку лога с именем "oscript.lib.commands" + И Я очищаю параметры команды "opm" в контексте + +Сценарий: Выполнение команды без параметров + Когда Я добавляю параметр "build ." для команды "opm" + И Я выполняю команду "opm" + Тогда Вывод команды "opm" содержит "Сборка пакета завершена" + И Вывод команды "opm" не содержит "Внешнее исключение" + И Код возврата команды "opm" равен 0 diff --git a/features/step_definitions/diff3cf_feature.os b/features/step_definitions/diff3cf_feature.os new file mode 100644 index 0000000..a1d475f --- /dev/null +++ b/features/step_definitions/diff3cf_feature.os @@ -0,0 +1,43 @@ +// Реализация шагов BDD-фич/сценариев c помощью фреймворка https://github.com/artbear/1bdd + +#Использовать gitrunner +#Использовать tempfiles +#Использовать asserts + +Перем БДД; + +Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт + + БДД = КонтекстФреймворкаBDD; + + ВсеШаги = Новый Массив; + ВсеШаги.Добавить("ЯСоздаюВременныйКаталогИЗапоминаюЕгоКак"); + ВсеШаги.Добавить("ЯПереключаюсьВоВременныйКаталог"); + + Возврат ВсеШаги; +КонецФункции + +// я создаю временный каталог и запоминаю его как "Алиас" +Процедура ЯСоздаюВременныйКаталогИЗапоминаюЕгоКак(Алиас) Экспорт + + НовыйВременныйКаталог = ВременныеФайлы.СоздатьКаталог(); + СоздатьКаталог(НовыйВременныйКаталог); + + БДД.СохранитьВКонтекст(Алиас, НовыйВременныйКаталог); + +КонецПроцедуры + +// я переключаюсь во временный каталог "АлиасКаталога" +Процедура ЯПереключаюсьВоВременныйКаталог(АлиасКаталога)Экспорт + + КаталогСкрипта = БДД.ПолучитьИзКонтекста("КаталогПроекта"); + Если НЕ ЗначениеЗаполнено(КаталогСкрипта) Тогда + + БДД.СохранитьВКонтекст("КаталогПроекта", ТекущийКаталог()); + + КонецЕсли; + + КаталогРепозиториев = БДД.ПолучитьИзКонтекста(АлиасКаталога); + УстановитьТекущийКаталог(КаталогРепозиториев); + +КонецПроцедуры diff --git a/features/ВыполнениеСравнения.feature b/features/ВыполнениеСравнения.feature new file mode 100644 index 0000000..c70d7df --- /dev/null +++ b/features/ВыполнениеСравнения.feature @@ -0,0 +1,30 @@ +# language: ru + +Функциональность: Выполнение прекоммита + +Как разработчик +Я хочу быть уверенным, что diff3cf корректно сравнивает две конфигурации и расширение + +Контекст: + Допустим Я очищаю параметры команды "oscript" в контексте + И я включаю отладку лога с именем "oscript.app.diff3cf" + И я создаю временный каталог и запоминаю его как "КаталогРезультат" + И я переключаюсь во временный каталог "КаталогРезультат" + +Сценарий: Сравнение основной конфигурации конфигурации поставки и расширения + Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os diff <КаталогПроекта>/tests/fixtures/configuration <КаталогПроекта>/tests/fixtures/release <КаталогПроекта>/tests/fixtures/exts/ADDTST report.html" + Тогда Я сообщаю вывод команды "oscript" + И Вывод команды "oscript" содержит "Сохранение отчета..." + И Вывод команды "oscript" не содержит "Ошибка" + +Сценарий: Справнение с неполным набором параметров (без файла отчета) + Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os diff <КаталогПроекта>/tests/fixtures/configuration <КаталогПроекта>/tests/fixtures/release <КаталогПроекта>/tests/fixtures/exts/ADDTST" + Тогда Я сообщаю вывод команды "oscript" + И Вывод команды "oscript" содержит "Сохранение отчета..." + И Вывод команды "oscript" содержит "ОШИБКА - Не удалось сохранить результат в" + +Сценарий: Сравнение основной конфигурации и конфигурации поставки + Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os objects <КаталогПроекта>/tests/fixtures/configuration <КаталогПроекта>/tests/fixtures/release report.txt" + Тогда Я сообщаю вывод команды "oscript" + И Вывод команды "oscript" содержит "Сохраняем результат сравнения" + И Вывод команды "oscript" не содержит "Ошибка" diff --git a/features/ПростыеКоманды.feature b/features/ПростыеКоманды.feature new file mode 100644 index 0000000..2afdbec --- /dev/null +++ b/features/ПростыеКоманды.feature @@ -0,0 +1,43 @@ +# language: ru + +Функциональность: Выполнение команды продукта + +Как разработчик +Я хочу иметь возможность выполнять команды продукта +Чтобы выполнять коллективную разработку приложения для OneScript + +Контекст: + Допустим Я очищаю параметры команды "oscript" в контексте + И я включаю отладку лога с именем "oscript.app.diff3cf" + # И я включаю отладку лога с именем "bdd" + +Сценарий: Получение версии продукта + Когда Я выполняю команду "oscript" с параметрами "src/main.os version" + Тогда Я сообщаю вывод команды "oscript" + И Вывод команды "oscript" содержит "1.0.2" + И Вывод команды "oscript" не содержит "diff3cf v" + И Код возврата команды "oscript" равен 0 + +Сценарий: Получение помощи продукта + Когда Я выполняю команду "oscript" с параметрами "src/main.os help" + Тогда Вывод команды "oscript" содержит + """ + diff3cf v1.0.2 + Возможные команды: + help - Выводит справку по командам + version - Выводит версию приложения + diff - Выполняет сравнение расширения с основной конфигурацией и новой поставкой + """ + И Код возврата команды "oscript" равен 0 + +Сценарий: Вызов исполняемого файла без параметров + Когда Я выполняю команду "oscript" с параметрами "src/main.os" + Тогда Вывод команды "oscript" содержит + """ + diff3cf v1.0.2 + Возможные команды: + help - Выводит справку по командам + version - Выводит версию приложения + diff - Выполняет сравнение расширения с основной конфигурацией и новой поставкой + """ + И Код возврата команды "oscript" равен 5 diff --git a/installlocalhost.bat b/installlocalhost.bat new file mode 100644 index 0000000..12a4e29 --- /dev/null +++ b/installlocalhost.bat @@ -0,0 +1,12 @@ +@echo off +call del "*.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 \ No newline at end of file diff --git a/packagedef b/packagedef new file mode 100644 index 0000000..f86dcb7 --- /dev/null +++ b/packagedef @@ -0,0 +1,14 @@ +ПутьКСценариюПараметров = ОбъединитьПути(ТекущийСценарий().Каталог, "src", "Модули", "ПараметрыПриложения.os"); +ПараметрыСистемы_ЛокальнаяВерсия = ЗагрузитьСценарий(ПутьКСценариюПараметров); + +ИмяПродукта = НРег(ПараметрыСистемы_ЛокальнаяВерсия.ИмяПродукта()); + +Описание.Имя(ИмяПродукта) + .ВерсияСреды("1.0.21") + .Версия(ПараметрыСистемы_ЛокальнаяВерсия.ВерсияПродукта()) + .ЗависитОт("logos", "1.2.0") + .ЗависитОт("cmdline", "1.0.0") + .ВключитьФайл("src") + .ВключитьФайл("LICENSE") + .ВключитьФайл("README.md") + .ИсполняемыйФайл("src/main.os", ИмяПродукта); diff --git a/src/main.os b/src/main.os new file mode 100644 index 0000000..3a312cf --- /dev/null +++ b/src/main.os @@ -0,0 +1,23 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// Приложение генерации отчета об измененных объектах, переопределенных в расширении +// +// (с) BIA Technologies, LLC +// +/////////////////////////////////////////////////////////////////////////////// + +#Использовать "." + +/////////////////////////////////////////////////////////////////////////////// + +Приложение = МенеджерПриложения.Инициализировать(ПараметрыПриложения); + +Попытка + + Приложение.ЗавершитьРаботуПриложения(Приложение.ЗапуститьВыполнение()); + +Исключение + + Приложение.ЗавершитьРаботуПриложенияСОшибкой(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + +КонецПопытки; diff --git a/src/Классы/ГенераторОтчета.os b/src/Классы/ГенераторОтчета.os new file mode 100644 index 0000000..b1974a3 --- /dev/null +++ b/src/Классы/ГенераторОтчета.os @@ -0,0 +1,73 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// Служебный модуль с реализацией работы <ГенераторОтчета> +// +// (с) BIA Technologies, LLC +// +/////////////////////////////////////////////////////////////////////////////// + +// Сохраняет результат сравнения +// +// Параметры: +// РезультатСравнения - Структура - Результат сравнения конфигураций и расширения +// ИмяФайлаРезультата - Строка - Полное имя файла, в который будет записан результат сравнения +// Лог - log-manager - Экземпляр класса логирования +// ФорматРезультата - Строка - Необязательный, пока реализован только "HTML" формат +// +Процедура СохранитьРезультат(РезультатСравнения, ИмяФайлаРезультата, Лог, ФорматРезультата = "HTML") Экспорт + + Если ФорматРезультата = "HTML" Тогда + + Попытка + ГенераторОтчетаHTML.СохранитьРезультат(РезультатСравнения, ИмяФайлаРезультата, Лог); + Исключение + ОбработкаИсключенияЗаписи(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяФайлаРезультата, Лог); + КонецПопытки; + + ИначеЕсли ФорматРезультата = "TXT" Тогда + + ТекстРезультат = Новый ТекстовыйДокумент(); + ТекстРезультат.ДобавитьСтроку(СтрШаблон("Результат сравнения изменений в структуре объектов: + |%1 + |%2 + | + |", РезультатСравнения.РодительПуть, РезультатСравнения.ПоставкаПуть)); + + Для каждого ЭлементПроекта Из РезультатСравнения.Типы Цикл + + ТекстРезультат.ДобавитьСтроку(ЭлементПроекта); + + КонецЦикла; + + Если ЗначениеЗаполнено(ИмяФайлаРезультата) Тогда + + Попытка + ТекстРезультат.Записать(ИмяФайлаРезультата, КодировкаТекста.UTF8NoBOM); + Исключение + ОбработкаИсключенияЗаписи(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяФайлаРезультата, Лог); + КонецПопытки; + + Иначе + + Лог.Информация(ТекстРезультат.ПолучитьТекст()); + + КонецЕсли; + + Иначе + + Лог.Ошибка("Неверный формат результата"); + + КонецЕсли; + +КонецПроцедуры + +Процедура ОбработкаИсключенияЗаписи(ПредставлениеОшибки, ИмяФайлаРезультата, Лог) + + ТекстОшибки = СтрШаблон("Не удалось сохранить результат в '%1' по причине: + |%3", ИмяФайлаРезультата, ПредставлениеОшибки); + + Лог.Ошибка(ТекстОшибки); + + ВызватьИсключение ТекстОшибки; + +КонецПроцедуры \ No newline at end of file diff --git a/src/Классы/КомандаVersion.os b/src/Классы/КомандаVersion.os new file mode 100644 index 0000000..25189d8 --- /dev/null +++ b/src/Классы/КомандаVersion.os @@ -0,0 +1,33 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// Служебный модуль с реализацией работы команды version +// +/////////////////////////////////////////////////////////////////////////////// + +// настрока команды +// +// Параметры: +// Команда - ОписаниеКоманды - Соответствие ключей командной строки и их значений +// Приложение - Модуль - Модуль менеджера приложения +// +Процедура НастроитьКоманду(Знач Команда, Знач Парсер) Экспорт + +КонецПроцедуры // НастроитьКоманду + +// Выполняет логику команды +// +// Параметры: +// ПараметрыКоманды - Соответствие - Соответствие ключей командной строки и их значений +// Приложение - Модуль - Модуль менеджера приложения +// +Функция ВыполнитьКоманду(Знач ПараметрыКоманды, Знач Приложение) Экспорт + + Лог = Приложение.ПолучитьЛог(); + + Сообщить(Приложение.ВерсияПродукта()); + + Лог.Отладка("Вывод версии приложения"); + + Возврат Приложение.РезультатыКоманд().Успех; + +КонецФункции // ВыполнитьКоманду diff --git a/src/Классы/КомандаАнализОбъектов.os b/src/Классы/КомандаАнализОбъектов.os new file mode 100644 index 0000000..fec399d --- /dev/null +++ b/src/Классы/КомандаАнализОбъектов.os @@ -0,0 +1,79 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// Служебный модуль с реализацией работы команды +// +// (с) BIA Technologies, LLC +// +/////////////////////////////////////////////////////////////////////////////// + +Перем РодительПуть; +Перем ПоставкаПуть; + +Перем ФайлРезультатИмя; + +/////////////////////////////////////////////////////////////////////////////// + +// настрока команды +// +// Параметры: +// Команда - ОписаниеКоманды - Соответствие ключей командной строки и их значений +// Приложение - Модуль - Модуль менеджера приложения +// +Процедура НастроитьКоманду(Знач Команда, Знач Парсер) Экспорт + + // Добавление параметров команды + Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "КаталогОсновнойКонфигурации", "Каталог основной конфигурации"); + Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "КаталогПоставки", "Каталог поставки"); + Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "ФайлРезультат", + "Файл-отчет, результат сравнения конфигураций в формате 'txt'. + |Необязательный, если не указан результат выводится в консоли."); + +КонецПроцедуры // НастроитьКоманду + +// Выполняет логику команды +// +// Параметры: +// ПараметрыКоманды - Соответствие - Соответствие ключей командной строки и их значений +// Приложение - Модуль - Модуль менеджера приложения +// +Функция ВыполнитьКоманду(Знач ПараметрыКоманды, Знач Приложение) Экспорт + + Лог = Приложение.ПолучитьЛог(); + + РодительПуть = ПараметрыКоманды["КаталогОсновнойКонфигурации"]; + ПоставкаПуть = ПараметрыКоманды["КаталогПоставки"]; + ФайлРезультатИмя = ПараметрыКоманды["ФайлРезультат"]; + + Если Не ПроверитьКаталог(РодительПуть, "Каталог основной конфигурации", Лог) + ИЛИ Не ПроверитьКаталог(ПоставкаПуть, "Каталог поставки", Лог) Тогда + + Возврат Приложение.РезультатыКоманд().НеверныеПараметры; + + КонецЕсли; + + Лог.Информация("Получаем результат сравнения"); + РезультатСравнения = АнализаторОбъектов.ВыполнитьСравнениеОбъектов(РодительПуть, ПоставкаПуть, Лог); + + Лог.Информация("Сохраняем результат сравнения: %1", ФайлРезультатИмя); + Генератор = Новый ГенераторОтчета; + Генератор.СохранитьРезультат(РезультатСравнения, ФайлРезультатИмя, Лог, "TXT"); + + // При успешном выполнении возвращает код успеха + Возврат Приложение.РезультатыКоманд().Успех; + +КонецФункции // ВыполнитьКоманду + +/////////////////////////////////////////////////////////////////////////////// + +Функция ПроверитьКаталог(КаталогПроверки, НазначениеКаталога, Лог) + + ФайлКаталогПроверки = Новый Файл(КаталогПроверки); + + Если НЕ ФайлКаталогПроверки.Существует() ИЛИ ФайлКаталогПроверки.ЭтоФайл() Тогда + Лог.Ошибка("%1 '%2' не существует или это файл", НазначениеКаталога, РодительПуть); + Возврат Ложь; + КонецЕсли; + + Возврат Истина; + +КонецФункции \ No newline at end of file diff --git a/src/Классы/КомандаСправкаПоПараметрам.os b/src/Классы/КомандаСправкаПоПараметрам.os new file mode 100644 index 0000000..7140f94 --- /dev/null +++ b/src/Классы/КомандаСправкаПоПараметрам.os @@ -0,0 +1,47 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// Служебный модуль с реализацией работы команды help +// +/////////////////////////////////////////////////////////////////////////////// + +// настрока команды +// +// Параметры: +// Команда - ОписаниеКоманды - Соответствие ключей командной строки и их значений +// Приложение - Модуль - Модуль менеджера приложения +// +Процедура НастроитьКоманду(Знач Команда, Знач Парсер) Экспорт + + Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "Команда"); + +КонецПроцедуры // НастроитьКоманду + +// Выполняет логику команды +// +// Параметры: +// ПараметрыКоманды - Соответствие - Соответствие ключей командной строки и их значений +// Приложение - Модуль - Модуль менеджера приложения +// +Функция ВыполнитьКоманду(Знач ПараметрыКоманды, Знач Приложение) Экспорт + + Лог = Приложение.ПолучитьЛог(); + + КомандаДляСправки = ПараметрыКоманды["Команда"]; + + Если КомандаДляСправки = Неопределено Тогда + + Приложение.ВывестиСправкуПоКомандам(); + + Лог.Отладка("Вывод справки по командам"); + + Иначе + + Приложение.ВывестиСправкуПоКоманде(КомандаДляСправки); + + Лог.Отладка(СтрШаблон("Вывод справки по команде %1", КомандаДляСправки)); + + КонецЕсли; + + Возврат Приложение.РезультатыКоманд().Успех; + +КонецФункции // ВыполнитьКоманду diff --git a/src/Классы/КомандаСравнение.os b/src/Классы/КомандаСравнение.os new file mode 100644 index 0000000..4fbcffe --- /dev/null +++ b/src/Классы/КомандаСравнение.os @@ -0,0 +1,90 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// Служебный модуль с реализацией работы команды +// +// (с) BIA Technologies, LLC +// +/////////////////////////////////////////////////////////////////////////////// + +Перем РодительПуть; +Перем ПоставкаПуть; +Перем РасширениеПуть; + +Перем ФайлРезультатИмя; + +/////////////////////////////////////////////////////////////////////////////// + +// настрока команды +// +// Параметры: +// Команда - ОписаниеКоманды - Соответствие ключей командной строки и их значений +// Приложение - Модуль - Модуль менеджера приложения +// +Процедура НастроитьКоманду(Знач Команда, Знач Парсер) Экспорт + + // Добавление параметров команды + Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "КаталогОсновнойКонфигурации", "Каталог основной конфигурации"); + Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "КаталогПоставки", "Каталог поставки"); + Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "КаталогРасширения", "Каталог расширения"); + Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "ФайлРезультат", "Файл-отчет, результат сравнения конфигураций"); + +КонецПроцедуры // НастроитьКоманду + +// Выполняет логику команды +// +// Параметры: +// ПараметрыКоманды - Соответствие - Соответствие ключей командной строки и их значений +// Приложение - Модуль - Модуль менеджера приложения +// +Функция ВыполнитьКоманду(Знач ПараметрыКоманды, Знач Приложение) Экспорт + + Лог = Приложение.ПолучитьЛог(); + + РодительПуть = ПараметрыКоманды["КаталогОсновнойКонфигурации"]; + ПоставкаПуть = ПараметрыКоманды["КаталогПоставки"]; + РасширениеПуть = ПараметрыКоманды["КаталогРасширения"]; + + Если Не ПроверитьКаталог(РодительПуть, "Каталог основной конфигурации", Лог) + ИЛИ Не ПроверитьКаталог(ПоставкаПуть, "Каталог поставки", Лог) + ИЛИ Не ПроверитьКаталог(РасширениеПуть, "Каталог расширения", Лог) Тогда + + Возврат Приложение.РезультатыКоманд().НеверныеПараметры; + + КонецЕсли; + + РаздлительПути = ПолучитьРазделительПути(); + РасширениеПуть = ?(СтрЗаканчиваетсяНа(РасширениеПуть, РаздлительПути), + РасширениеПуть, РасширениеПуть + РаздлительПути); + + ФайлРезультатИмя = ПараметрыКоманды["ФайлРезультат"]; + + Лог.Информация("Получаем результат сравнения"); + РезультатСравнения = РезультатСравненияРасширения.ПолучитьРезультатСравнения( + РодительПуть, + ПоставкаПуть, + РасширениеПуть, + Лог); + + Лог.Информация("Сохраняем результат сравнения: %1", ФайлРезультатИмя); + Генератор = Новый ГенераторОтчета; + Генератор.СохранитьРезультат(РезультатСравнения, ФайлРезультатИмя, Лог, "HTML"); + + // При успешном выполнении возвращает код успеха + Возврат Приложение.РезультатыКоманд().Успех; + +КонецФункции // ВыполнитьКоманду + +/////////////////////////////////////////////////////////////////////////////// + +Функция ПроверитьКаталог(КаталогПроверки, НазначениеКаталога, Лог) + + ФайлКаталогПроверки = Новый Файл(КаталогПроверки); + + Если НЕ ФайлКаталогПроверки.Существует() ИЛИ ФайлКаталогПроверки.ЭтоФайл() Тогда + Лог.Ошибка("%1 '%2' не существует или это файл", НазначениеКаталога, РодительПуть); + Возврат Ложь; + КонецЕсли; + + Возврат Истина; + +КонецФункции \ No newline at end of file diff --git a/src/Классы/ПарсерМодулейРасширения.os b/src/Классы/ПарсерМодулейРасширения.os new file mode 100644 index 0000000..ac21bcd --- /dev/null +++ b/src/Классы/ПарсерМодулейРасширения.os @@ -0,0 +1,345 @@ +/////////////////////////////////////////////////////////////////// +// +// Модуль разбора файлов конфигурации +// +// (с) BIA Technologies, LLC +// +/////////////////////////////////////////////////////////////////// + +Перем РасширениеПуть; + +// Функция возвращает префикс расширения +// +// Параметры: +// ИмяФайлаКонфигурации - Строка - Полное имя файла configuration.xml расширения +// +// Возвращаемое значение: +// Строка - префикс расширения +// +Функция ПрочитатьПрефиксРасширения(ИмяФайлаКонфигурации) Экспорт + + Результат = ""; + + ФайлОписания = Новый ТекстовыйДокумент; + ФайлОписания.Прочитать(ИмяФайлаКонфигурации, КодировкаТекста.UTF8NoBOM); + ТекстОписания = ФайлОписания.ПолучитьТекст(); + + ПаттернПрефикса = "([\w\W]*?)<\/NamePrefix>"; + + Регексп = Новый РегулярноеВыражение(ПаттернПрефикса); + Регексп.Многострочный = Истина; + Регексп.ИгнорироватьРегистр = Истина; + + НайденныеСтроки = Регексп.НайтиСовпадения(ТекстОписания); + + Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл + + Результат = НайденнаяСтрока.Группы[1].Значение; + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// возвращает массив описаний методов файла bsl +// +// Параметры: +// ФайлМодуля - Файл - Файл BSL, методы которого нужно получить +// Префикс - Строка - Префикс используемого расширения +// +// Возвращаемое значение: +// Массив - массив структур, результат разбора метода на модули +// +Функция ПрочитатьМетодыМодуля(ФайлМодуля, Префикс = "") Экспорт + + Результат = Новый Массив(); + + ФайлОписания = Новый ТекстовыйДокумент; + ФайлОписания.Прочитать(ФайлМодуля.ПолноеИмя, КодировкаТекста.UTF8NoBOM); + ТекстОписания = ФайлОписания.ПолучитьТекст(); + + ПаттернМетода = "^[\s]*?(Процедура|Функция)[\s]*([\w\W]*?[\(])[\w\W]*?(КонецПроцедуры|КонецФункции)"; + + Регексп = Новый РегулярноеВыражение(ПаттернМетода); + Регексп.Многострочный = Истина; + Регексп.ИгнорироватьРегистр = Истина; + + НайденныеСтроки = Регексп.НайтиСовпадения(ТекстОписания); + + Директивы = ПолучитьДирективыМетодов(ФайлМодуля); + + Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл + + ТипМетода = НайденнаяСтрока.Группы[1].Значение; + ИмяМетода = СокрЛП(СтрЗаменить(НайденнаяСтрока.Группы[2].Значение, "(", "")); + + ДирективаМетода = Директивы[ИмяМетода]; + Директива = ""; + ИмяМетодаБезПрефикса = ИмяМетода; + ДлинаПередПосле = 5; // длина слов 'Перед' и 'После' + ДлинаВместо = 6; // длина слова 'Вместо' + + Если ДирективаМетода <> Неопределено Тогда + ИмяМетодаБезПрефикса = ДирективаМетода.ИмяМетода; + Директива = ДирективаМетода.Директива; + ИначеЕсли Не ПустаяСтрока(Префикс) Тогда + ИмяМетодаБезПрефикса = ?(СтрНачинаетсяС(ИмяМетода, Префикс), Сред(ИмяМетода, СтрДлина(Префикс) + 1), ИмяМетода); + Если СтрЗаканчиваетсяНа(ВРег(ИмяМетодаБезПрефикса), ВРег("Перед")) + ИЛИ СтрЗаканчиваетсяНа(ВРег(ИмяМетодаБезПрефикса), ВРег("После")) Тогда + Директива = Прав(ИмяМетодаБезПрефикса, ДлинаПередПосле); + ИмяМетодаБезПрефикса = Лев(ИмяМетодаБезПрефикса, СтрДлина(ИмяМетодаБезПрефикса) - ДлинаПередПосле); + ИначеЕсли СтрЗаканчиваетсяНа(ВРег(ИмяМетодаБезПрефикса), ВРег("Вместо")) Тогда + Директива = Прав(ИмяМетодаБезПрефикса, ДлинаВместо); + ИмяМетодаБезПрефикса = Лев(ИмяМетодаБезПрефикса, СтрДлина(ИмяМетодаБезПрефикса) - ДлинаВместо); + КонецЕсли; + КонецЕсли; + + ТелоМетода = ?(Директива = "", "", "&" + Директива + Символы.ПС) + + СокрЛП(НайденнаяСтрока.Группы[0].Значение); + + Результат.Добавить(СтандартнаяСтруктураРезультата(ТипМетода, ИмяМетода, ИмяМетодаБезПрефикса, ТелоМетода)); + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция СтандартнаяСтруктураРезультата(ТипМетода, ИмяМетода, ИмяМетодаБезПрефикса, ТелоМетода) + + Результат = Новый Структура(); + Результат.Вставить("ТипМетода", ТипМетода); + Результат.Вставить("ИмяМетода", ИмяМетода); + Результат.Вставить("ИмяМетодаБезПрефикса", ИмяМетодаБезПрефикса); + Результат.Вставить("ТелоМетода", ТелоМетода); + + Возврат Результат; + +КонецФункции + +Функция ПолучитьДирективыМетодов(ФайлМодуля) + + Результат = Новый Соответствие; + + ФайлОписания = Новый ТекстовыйДокумент; + ФайлОписания.Прочитать(ФайлМодуля.ПолноеИмя, КодировкаТекста.UTF8NoBOM); + ТекстОписания = ФайлОписания.ПолучитьТекст(); + + ПаттернМетода = "^[\s]*?\&(Перед|Вместо|После)[\s]*\(\""([\w\W]*?)\""\)*\s(?:Процедура|Функция)[\s]*([\w\W]*?)[\(]"; + + Регексп = Новый РегулярноеВыражение(ПаттернМетода); + Регексп.Многострочный = Истина; + Регексп.ИгнорироватьРегистр = Истина; + + НайденныеСтроки = Регексп.НайтиСовпадения(ТекстОписания); + + Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл + + Результат.Вставить( + НайденнаяСтрока.Группы[3].Значение, + Новый Структура("Директива, ИмяМетода", + НайденнаяСтрока.Группы[1].Значение, + НайденнаяСтрока.Группы[2].Значение + ) + ); + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Возвращает массив структур с описанием переопределенных объектов +// +// Возвращаемое значение: +// Массив - массив структур с описанием предопределенных объектов +// +Функция ПолучитьПереопределенныеОбъекты() Экспорт + + Результат = Новый Массив(); + + Для Каждого ТипОбъектов Из ТипыОбъектов.ОбъектыКонфигурации Цикл + + ФайлыОбъектов = ПолучитьФайлыОбъектов(ТипОбъектов); + + РезультатОбъекты = Новый Массив(); + + Для Каждого ФайлОбъекта Из ФайлыОбъектов Цикл + + ДобавитьПереопределенныйОбъект(ТипОбъектов, ФайлОбъекта, РезультатОбъекты); + + КонецЦикла; + + Результат.Добавить(Новый Структура("Тип, Объекты", ТипОбъектов, РезультатОбъекты)); + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Получает методы конфигурации и сопоставляет с методами расширения для переопределенных объектов +// +// Параметры: +// ФайлМодуляРасширения - Файл - Файл модуля расширения +// ФайлМодуля - Структура - Свойства файла модуля, включая его методы, сюда добавляется сопостовление методов +// ОсновнаяКонфигурацияПуть - Строка - Расположение основной конфигурации +// ИмяКонфигурации - Строка - Имя (роль) конфигурации (например: "Родитель" или "Поставка") +// +Процедура ПрочитатьМетодыОсновнойКонфигурации( + ФайлМодуляРасширения, + ФайлМодуля, + ОсновнаяКонфигурацияПуть, + ИмяКонфигурации) Экспорт + + ИмяФайлаМодуляКонфигурации = ""; + Если ФайлМодуля.Свойство("ИмяПереопределяемого", ИмяФайлаМодуляКонфигурации) Тогда + ИмяФайлаМодуляКонфигурации = ОбъединитьПути(ОсновнаяКонфигурацияПуть, ИмяФайлаМодуляКонфигурации); + Иначе + ИмяФайлаМодуляКонфигурации = ОбъединитьПути( + ОсновнаяКонфигурацияПуть, + Сред(ФайлМодуляРасширения.ПолноеИмя, СтрДлина(РасширениеПуть) + 1) + ); + КонецЕсли; + + ФайлМодуляКонфигурации = Новый Файл(ИмяФайлаМодуляКонфигурации); + + ФайлМодуля.Вставить(ИмяКонфигурации, ФайлМодуляКонфигурации.Существует()); + + Если ФайлМодуля[ИмяКонфигурации] Тогда + + СопоставитьМетодыРасширенияИКонфигурации(ПрочитатьМетодыМодуля(ФайлМодуляКонфигурации), ФайлМодуля, ИмяКонфигурации); + + КонецЕсли; + +КонецПроцедуры + +// Устанавливает значение переменной "РасширениеПуть" +// +Процедура УстановитьПуть(Путь) Экспорт + + РасширениеПуть = Путь; + +КонецПроцедуры + +// Получает файлы объектов расширения +// +// Возвращаемое значение: +// Массив - массив файлов XML +// +Функция ПолучитьФайлыОбъектов(ТипОбъектов) Экспорт + + КаталогОбъектов = ОбъединитьПути(РасширениеПуть, ТипОбъектов); + Файлы = НайтиФайлы(КаталогОбъектов, "*.xml"); + + Возврат Файлы; + +КонецФункции + +// Получает файлы модулей расширения +// +// Возвращаемое значение: +// Массив - массив файлов BSL +// +Функция ПолучитьФайлыМодулей(ТипОбъектов, ИмяОбъекта) Экспорт + + КаталогОбъектов = ОбъединитьПути(РасширениеПуть, ТипОбъектов, ИмяОбъекта); + Файлы = НайтиФайлы(КаталогОбъектов, "*.bsl", Истина); + + Возврат Файлы; + +КонецФункции + +/////////////////////////////////////////////////////////////////// + +Функция ПрочитатьНаследованиеОбъекта(ФайлОбъекта) + + Результат = Новый Структура("Наследование, Значение", Ложь, ""); + + ФайлОписания = Новый ТекстовыйДокумент; + ФайлОписания.Прочитать(ФайлОбъекта.ПолноеИмя, КодировкаТекста.UTF8NoBOM); + ТекстОписания = ФайлОписания.ПолучитьТекст(); + + ПаттернНаследование = "(?:Adopted<\/ObjectBelonging>|Adopted.([\w\W]*?)<\/Comment>)"; + + Регексп = Новый РегулярноеВыражение(ПаттернНаследование); + Регексп.Многострочный = Истина; + Регексп.ИгнорироватьРегистр = Истина; + + НайденныеСтроки = Регексп.НайтиСовпадения(ТекстОписания); + + Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл + + Результат.Наследование = Истина; + Результат.Значение = НайденнаяСтрока.Группы[1].Значение; + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Процедура СопоставитьМетодыРасширенияИКонфигурации(МетодыМодуляКонфигурации, ФайлМодуля, ИмяКонфигурации) + + Для каждого Метод Из МетодыМодуляКонфигурации Цикл // обход найденных методов + + Для каждого МетодРасширения Из ФайлМодуля.Методы Цикл // обход существующих переопределенных методов + + Если Метод.ИмяМетодаБезПрефикса = МетодРасширения.ИмяМетодаБезПрефикса Тогда + + МетодРасширения.Вставить(ИмяКонфигурации, Метод.ТелоМетода); + + КонецЕсли; + + КонецЦикла; + + КонецЦикла; + +КонецПроцедуры + +// Добавлят в массив объект конфигурации, если он переопределен. Объект может состоять из нескольких файлов. +// +// Параметры: +// ТипОбъектов - Строка - Тип объекта конфиурации (Catalogs, Documents и т.д.) +// ФайлОбъекта - Файл - XML файл объекта конфигурации +// РезультатОбъекты - Массив - в массив добавляются структуры с описанием файлов объекта +// +Процедура ДобавитьПереопределенныйОбъект(ТипОбъектов, ФайлОбъекта, РезультатОбъекты) + + Переопределение = ПрочитатьНаследованиеОбъекта(ФайлОбъекта); + Если Переопределение.Наследование Тогда + + ДобОбъект = Новый Структура("Тип, Имя", ТипОбъектов, ФайлОбъекта.ИмяБезРасширения); + + ФайлыМодулей = ПолучитьФайлыМодулей(ДобОбъект.Тип, ДобОбъект.Имя); + Если ФайлыМодулей.Количество() Тогда + + МассивФайлов = Новый Массив; + Для Каждого ФайлМодуля Из ФайлыМодулей Цикл + + ФайлСтруктура = Новый Структура("ФайлМодуля", ФайлМодуля); + Если Не ПустаяСтрока(Переопределение.Значение) И ФайлМодуля.Имя = "ObjectModule.bsl" Тогда + ФайлСтруктура.Вставить("ИмяПереопределяемого", Переопределение.Значение); + КонецЕсли; + + МассивФайлов.Добавить(ФайлСтруктура); + + КонецЦикла; + + ДобОбъект.Вставить("Модули", МассивФайлов); + РезультатОбъекты.Добавить(ДобОбъект); + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +/////////////////////////////////////////////////////////////////// + +Процедура ПриСозданииОбъекта(Путь = Неопределено) + + УстановитьПуть(Путь); + +КонецПроцедуры diff --git a/src/Модули/АнализаторОбъектов.os b/src/Модули/АнализаторОбъектов.os new file mode 100644 index 0000000..e1c5bc4 --- /dev/null +++ b/src/Модули/АнализаторОбъектов.os @@ -0,0 +1,265 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// Служебный модуль получения результата сравнения объектов основной конфы и поставки +// +// (с) BIA Technologies, LLC +// +/////////////////////////////////////////////////////////////////////////////// + +// Сравнивает три конфигурации - Родитель, Поставка и Расширение +// +// Параметры: +// РодительПуть - Строка - Каталог конфигурации Родитель +// ПоставкаПуть - Строка - Каталог конфигурации Поставка +// Лог - log-manager - Экземпляр класса логирования +// +// Возвращаемое значение: +// Структура - результат сравнения +// +Функция ВыполнитьСравнениеОбъектов(РодительПуть, ПоставкаПуть, Лог) Экспорт + + РезультатОписание = Новый Структура(); + + РезультатОписание.Вставить("РодительПуть", РодительПуть); + РезультатОписание.Вставить("ПоставкаПуть", ПоставкаПуть); + + РезультатОписание.Вставить("Типы", АнализГруппОбъектов( + "AccountingRegisters + |AccumulationRegisters + |CalculationRegisters + |Catalogs + |ChartsOfCalculationTypes + |ChartsOfCharacteristicTypes + |Documents + |InformationRegisters", РезультатОписание)); + + Возврат РезультатОписание; + +КонецФункции + +Функция АнализГруппОбъектов(ГруппыОбъектов, Описание) + + МассивРезультат = Новый Массив(); + МассивГрупп = СтрРазделить(ГруппыОбъектов, Символы.ПС); + + Для Каждого ГруппаОбъектов Из МассивГрупп Цикл + + АнализОбъектов(СокрЛП(ГруппаОбъектов), МассивРезультат, Описание); + + КонецЦикла; + + Возврат МассивРезультат; + +КонецФункции + +Процедура АнализОбъектов(ГруппаОбъектов, МассивРезультат, Описание) + + Файлы = ПолучитьФайлыОбъектов(ГруппаОбъектов, Описание); + + Для Каждого Файл Из Файлы Цикл + + ДанныеОбъектаПроекта = АнализФайлаОМД(Файл, Описание.РодительПуть); + ДанныеОбъектаПоставки = Неопределено; + + ИмяФайлаПоставки = ОбъединитьПути(Описание.ПоставкаПуть, ДанныеОбъектаПроекта.ОтносительныйПуть); + ФайлЧтение = Новый Файл(ИмяФайлаПоставки); + Если ФайлЧтение.Существует() Тогда + + ДанныеОбъектаПоставки = АнализФайлаОМД(ФайлЧтение, Описание.ПоставкаПуть); + + КонецЕсли; + + // Сравнение + Для Каждого ПолеПроекта Из ДанныеОбъектаПроекта.Поля Цикл + + Если ДанныеОбъектаПоставки <> Неопределено Тогда + + // поиск в поставке + ПолеЕсть = ПоискВПоставке(ПолеПроекта, ДанныеОбъектаПоставки.Поля, МассивРезультат, ДанныеОбъектаПроекта); + + Если Не ПолеЕсть Тогда + МассивРезультат.Добавить( + ДанныеОбъектаПроекта.ОтносительныйПуть + " : " + + ПолеПроекта.ИмяПоля + + " : Удалено"); + КонецЕсли; + + Иначе + + МассивРезультат.Добавить( + ДанныеОбъектаПроекта.ОтносительныйПуть + " : " + + " : Удалено в поставке"); + + Прервать; + + КонецЕсли; + + КонецЦикла; + + КонецЦикла; + +КонецПроцедуры + +Функция ПоискВПоставке(ПолеПроекта, ПоляПоставки, МассивРезультат, ДанныеОбъектаПроекта) + Результат = Ложь; + Для Каждого ПолеПоставки Из ПоляПоставки Цикл + + Если ПолеПроекта.ИмяПоля = ПолеПоставки.ИмяПоля Тогда + + Если ПолеПроекта.Тип <> ПолеПоставки.Тип Тогда + + МассивРезультат.Добавить( + ДанныеОбъектаПроекта.ОтносительныйПуть + " : " + + ПолеПроекта.ИмяПоля + + " : Изменен тип"); + + КонецЕсли; + + Результат = Истина; + Прервать; + + КонецЕсли; + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция АнализФайлаОМД(ФайлОбъекта, ПутьПроекта) + + ////////////////////////////////////////// + ОписаниеОбъекта = Новый Структура; + ОписаниеОбъекта.Вставить("ПолноеИмя", ФайлОбъекта.ПолноеИмя); + ОписаниеОбъекта.Вставить("ИмяОбъекта", ФайлОбъекта.ИмяБезРасширения); + ОписаниеОбъекта.Вставить("ОтносительныйПуть", ПолучитьОтносительныйПуть(ПутьПроекта, ФайлОбъекта.ПолноеИмя)); + ////////////////////////////////////////// + + ТекстОписания = МенеджерПриложения.ПрочитатьФайл(ФайлОбъекта); + + ПаттернОсновной = "([\w\W]*?)<\/Name>[\w\W]*?(?:)"; + + ПаттернТЧ = "([\w\W]*?)<\/Name>[\w\W]*?<\/TabularSection>"; + + АнализОписанияОбъекта(ТекстОписания, ПаттернОсновной, "", ОписаниеОбъекта); + АнализОписанияОбъекта(ТекстОписания, ПаттернТЧ, "ТабличнаяЧасть.", ОписаниеОбъекта); + + Возврат ОписаниеОбъекта; + +КонецФункции + +Процедура АнализОписанияОбъекта(ТекстОписания, Паттерн, Префикс, ОписаниеОбъекта) + + Регексп = МенеджерПриложения.ПолучитьРегексп(Паттерн); + + НайденныеСтроки = Регексп.НайтиСовпадения(ТекстОписания); + + Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл + + АнализРеквизитов( + НайденнаяСтрока.Группы[0].Значение, + ОписаниеОбъекта, + ?(Префикс = "", "", Префикс + НайденнаяСтрока.Группы[1].Значение + ".")); + + КонецЦикла; + +КонецПроцедуры + +Процедура АнализРеквизитов(ТекстОписания, ОписаниеОбъекта, ПрефиксПоля = "") + + СтрокаВидыПолей = "Dimension;Resource;Attribute"; + + ВидыПолей = СтрРазделить(СтрокаВидыПолей, ";"); + + ПаттернПоля = "<%1[\w\W]*?([\w\W]*?)<\/Name>[\w\W]*?<\/%1>"; + + ИндексОбъекта = 0; + + Если Не ОписаниеОбъекта.Свойство("Поля") Тогда + ОписаниеОбъекта.Вставить("Поля", Новый Массив()); + КонецЕсли; + + Для Каждого ВидПоля Из ВидыПолей Цикл + + Регексп = МенеджерПриложения.ПолучитьРегексп(СтрШаблон(ПаттернПоля, ВидПоля)); + + НайденныеСтроки = Регексп.НайтиСовпадения(ТекстОписания); + + // цикл по измерениям/ресурсам/реквизитам + Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл + + ОписаниеПоля = Новый Структура; + ОписаниеПоля.Вставить("ВидПоля", ВидПоля); + ОписаниеПоля.Вставить("ИмяПоля", ПрефиксПоля + НайденнаяСтрока.Группы[1].Значение); + ОписаниеПоля.Вставить("ТекстОписание", НайденнаяСтрока.Группы[0].Значение); + ОписаниеПоля.Вставить("Тип", АнализТипаПоля(ОписаниеОбъекта, ОписаниеПоля)); + + ОписаниеОбъекта.Поля.Добавить(ОписаниеПоля); + + КонецЦикла; + + КонецЦикла; + +КонецПроцедуры + +Функция АнализТипаПоля(ОписаниеОбъекта, ОписаниеПоля) + + Результат = 0; + + ПаттернТипа = + "" + + "[\w\W]*?([\w\W]*?)<\/Type>" + + "[\w\W]*?<\/Properties>"; + ПаттернСоставаТипа = + "(?:|)([\w\W]*?)<\/v8:Type"; + + Регексп = МенеджерПриложения.ПолучитьРегексп(ПаттернТипа); + НайденныеСтроки = Регексп.НайтиСовпадения(ОписаниеПоля.ТекстОписание); + + ОписаниеТипа = ""; + Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл + + РегекспТипа = МенеджерПриложения.ПолучитьРегексп(ПаттернСоставаТипа); + + СтрокиСоставаТипа = РегекспТипа.НайтиСовпадения(НайденнаяСтрока.Группы[1].Значение); + + Для Каждого СтрокаСоставаТипа Из СтрокиСоставаТипа Цикл + + ////////////////////////////////////////// + ОписаниеТипа = ОписаниеТипа + + ?(ОписаниеТипа = "", "", Символы.ПС) + + СтрокаСоставаТипа.Группы[1].Значение; + ////////////////////////////////////////// + + КонецЦикла; + + КонецЦикла; + + Возврат ОписаниеТипа; + +КонецФункции + +Функция ПолучитьФайлыОбъектов(ТипОбъектов, Описание) + + КаталогОбъектов = ОбъединитьПути(Описание.РодительПуть, ТипОбъектов); + + Возврат НайтиФайлы(КаталогОбъектов, "*.xml"); + +КонецФункции + +Функция ПолучитьОтносительныйПуть(РасположениеПроекта, ПолноеИмяФайла) + + СоставРП = СтрРазделить(РасположениеПроекта, ПолучитьРазделительПути(), Ложь); + СоставПуть = СтрРазделить(ПолноеИмяФайла, ПолучитьРазделительПути(), Ложь); + + Результат = ""; + + Для Сч = СоставРП.Количество() По СоставПуть.ВГраница() Цикл + + Результат = ОбъединитьПути(Результат, СоставПуть[Сч]); + + КонецЦикла; + + Возврат Результат; + +КонецФункции diff --git a/src/Модули/ГенераторОтчетаHTML.os b/src/Модули/ГенераторОтчетаHTML.os new file mode 100644 index 0000000..31c29f3 --- /dev/null +++ b/src/Модули/ГенераторОтчетаHTML.os @@ -0,0 +1,390 @@ +/////////////////////////////////////////////////////////////////// +// +// Модуль генератора отчета в формате HTML +// +// (с) BIA Technologies, LLC +// +/////////////////////////////////////////////////////////////////// + +Перем РасширениеПуть; +Перем РодительПуть; +Перем ПоставкаПуть; + +Перем Лог; + +// Сохраняет результат в формате HTML +// +// Параметры: +// РезультатСравнения - Структура - Результат сравнения конфигураций и расширения +// ИмяФайлаРезультата - Строка - Полное имя файла, в который будет записан результат сравнения +// Лог - log-manager - Экземпляр класса логирования +// +Процедура СохранитьРезультат(РезультатСравнения, ИмяФайлаРезультата, ПараметрЛог) Экспорт + + РодительПуть = РезультатСравнения.РодительПуть; + ПоставкаПуть = РезультатСравнения.ПоставкаПуть; + РасширениеПуть = РезультатСравнения.РасширениеПуть; + + Лог = ПараметрЛог; + + СоответствиеШаблонов = Новый Соответствие(); + СоответствиеШаблонов.Вставить("Шаблон", ТекстШаблон()); + СоответствиеШаблонов.Вставить("Блок", ТекстБлок()); + СоответствиеШаблонов.Вставить("Таблица", ТекстТаблица()); + + НаследованиеБлоков = Новый Соответствие(); + НаследованиеБлоков.Вставить("Корень", Новый Структура("Блок, Объекты", "Тип", "Объекты")); + НаследованиеБлоков.Вставить("Тип", Новый Структура("Блок, Объекты", "Объект", "Модули")); + НаследованиеБлоков.Вставить("Объект", Новый Структура("Блок, Объекты", "Модуль", "Методы")); + + Лог.Информация("Начало формирования отчета..."); + + Попытка + ТекстРезультат = ВывестиБлок(РезультатСравнения.Типы, "Корень", СоответствиеШаблонов, НаследованиеБлоков); + Исключение + Лог.Ошибка(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + + Лог.Информация("Сохранение отчета..."); + ФайлРезультат = Новый ТекстовыйДокумент; + ФайлРезультат.УстановитьТекст(ТекстРезультат); + ФайлРезультат.Записать(ИмяФайлаРезультата, КодировкаТекста.UTF8NoBOM); + +КонецПроцедуры + +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +Функция ВывестиБлок(ВходящиеДанные, ИмяБлока, СоответствиеШаблонов, НаследованиеБлоков) + + // ИмяБлока + // - Корень (справочники, документы и т.д.) + // - Тип - объекты одного типа (Спр1, Док1, ...) + // - Объект - модули + // - Модуль + // - Метод + + ТекстРезультат = ""; + ТекстОтчет = ""; + + Если СтрНайти("Корень;Тип;Объект", ИмяБлока) Тогда + + Для каждого ОбъектСравнения Из ВходящиеДанные Цикл + + ТекстОбъекты = ВывестиБлок(ОбъектСравнения[НаследованиеБлоков[ИмяБлока].Объекты], + НаследованиеБлоков[ИмяБлока].Блок, СоответствиеШаблонов, НаследованиеБлоков); + + Если Не ПустаяСтрока(ТекстОбъекты) Тогда + ТекстОтчет = ТекстОтчет + СтрШаблон(СоответствиеШаблонов["Блок"], + ПредставлениеОбъекта(ИмяБлока, ОбъектСравнения), ТекстОбъекты); + КонецЕсли; + + КонецЦикла; + + ТекстРезультат = ?(ИмяБлока = "Корень", + СтрШаблон(СоответствиеШаблонов["Шаблон"], ТекстCSS(), ТекстПодпись(), ТекстОтчет), + ТекстОтчет); + + ИначеЕсли ИмяБлока = "Модуль" Тогда + + Для каждого Метод Из ВходящиеДанные Цикл + + ТелоРодителя = ""; + Метод.Свойство("Родитель", ТелоРодителя); + ТелоПоставки = ""; + Метод.Свойство("Поставка", ТелоПоставки); + ТелоРасширения = Метод.ТелоМетода; + + // Если Не ПустаяСтрока(ТелоРодителя) И Не ПустаяСтрока(ТелоПоставки) Тогда // вставка для отладки + Если ТелоРодителя <> ТелоПоставки Тогда + + СравнитьДваТекста(ТелоРодителя, ТелоПоставки); + + ТекстОтчет = ТекстОтчет + + СтрШаблон(СоответствиеШаблонов["Блок"], Метод.ТипМетода + " " + Метод.ИмяМетодаБезПрефикса + "", + СтрШаблон(СоответствиеШаблонов["Таблица"], ТелоРодителя, ТелоПоставки, ТелоРасширения)); + + КонецЕсли; + + КонецЦикла; + + ТекстРезультат = ТекстОтчет; + + КонецЕсли; + + Возврат ТекстРезультат; + +КонецФункции + +Функция ПредставлениеОбъекта(ИмяБлока, ОбъектСравнения) + + Если ИмяБлока = "Корень" Тогда + + ТекстРезультат = СтрШаблон("%1", ОбъектСравнения.Тип); + + ИначеЕсли ИмяБлока = "Тип" Тогда + + ТекстРезультат = СтрШаблон("%1", ОбъектСравнения.Имя); + + ИначеЕсли ИмяБлока = "Объект" Тогда + + ТекстРезультат = СтрЗаменить(ОбъектСравнения.ФайлМодуля.ПолноеИмя, РасширениеПуть, ""); + Если ОбъектСравнения.Свойство("ИмяПереопределяемого") Тогда + ТекстРезультат = ТекстРезультат + СтрШаблон( + " (%1)", + ОбъектСравнения.ИмяПереопределяемого); + КонецЕсли; + + Иначе + + ТекстРезультат = ""; + + КонецЕсли; + + Возврат ТекстРезультат; + +КонецФункции + +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +Функция ТекстПодпись() + + Возврат "Основная конфигурация: " + РодительПуть + " + |Поставка конфигурации: " + ПоставкаПуть + " + |Расширение: " + РасширениеПуть + " + |Дата формирования: " + ТекущаяДата(); + +КонецФункции + +Функция ТекстШаблон() + + Возврат + " + | + | + | + | %1 + | + | + |

Анализ расширения

+ |
%2
+ |

+ |
+ | %3 + |
+ |

 

+ | + |"; + +КонецФункции + +Функция ТекстCSS() + + Возврат " + | + |"; + +КонецФункции + +Функция ТекстБлок() + + Возврат " + |
+ | %1 + |
+ | %2 + |
+ |
+ |"; + +КонецФункции + +Функция ТекстТаблица() + + Возврат " + | + | + | + | + | + | + | + | + | + | + | + | + | + |
Основная конфигурацияПоставкаРасширение
+ |
%1
+ |
+ |
%2
+ |
+ |
%3
+ |
+ |"; + +КонецФункции + +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +Функция НайтиСтрокуДалее(СтрокаПоиска, Масс, Знач Старт) + + Пока Старт < Масс.Количество() Цикл + + Если СокрЛП(СтрокаПоиска) = СокрЛП(Масс[Старт]) Тогда + Возврат Истина; + КонецЕсли; + + Старт = Старт + 1; + + КонецЦикла; + + Возврат Ложь; + +КонецФункции + +Процедура СравнитьДваТекста(Текст1, Текст2) + + Масс1 = СтрРазделить(Текст1, Символы.ПС); + Масс2 = СтрРазделить(Текст2, Символы.ПС); + + Сч = 0; + + Пока Сч < Макс(Масс1.Количество(), Масс2.Количество()) Цикл + + Если Сч > Масс1.ВГраница() Тогда // В родительском массиве кончились строки + Масс2[Сч] = ДобавитьТегСтрокаДобавлена(Масс2[Сч]); + ИначеЕсли Сч > Масс2.ВГраница() Тогда // В массиве наследнике кончились строки + Масс1[Сч] = ДобавитьТегСтрокаУдалена(Масс1[Сч]); + ИначеЕсли СокрЛП(Масс1[Сч]) <> СокрЛП(Масс2[Сч]) Тогда // строки не равны + + Если НайтиСтрокуДалее(Масс2[Сч], Масс1, Сч) Тогда // ищем в первом массиве строку второго + Масс2.Вставить(Сч, ""); + Масс1[Сч] = ДобавитьТегСтрокаУдалена(Масс1[Сч]); + Иначе + Масс1.Вставить(Сч, ""); + Масс2[Сч] = ДобавитьТегСтрокаДобавлена(Масс2[Сч]); + КонецЕсли; + + КонецЕсли; + + Сч = Сч + 1; + + КонецЦикла; + + Текст1 = СтрСоединить(Масс1, Символы.ПС); + Текст2 = СтрСоединить(Масс2, Символы.ПС); + +КонецПроцедуры + +Функция ДобавитьТегСтрокаУдалена(СтрокаТекста) + + Возврат СтрШаблон("%1", СтрокаТекста); + +КонецФункции + +Функция ДобавитьТегСтрокаДобавлена(СтрокаТекста) + + Возврат СтрШаблон("%1", СтрокаТекста); + +КонецФункции diff --git a/src/Модули/МенеджерПриложения.os b/src/Модули/МенеджерПриложения.os new file mode 100644 index 0000000..4f41f4d --- /dev/null +++ b/src/Модули/МенеджерПриложения.os @@ -0,0 +1,310 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// Служебный модуль с набором методов работы с командами приложения +// +// В большинстве проектов изменять данный модуль не требуется +// +/////////////////////////////////////////////////////////////////////////////// + +#Использовать logos +#Использовать cmdline + +/////////////////////////////////////////////////////////////////////////////// + +Перем Лог; + +Перем ПарсерКоманд; +Перем ИсполнителиКоманд; +Перем ОбъектНастроек; + +/////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЙ ОТКРЫТЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС +/////////////////////////////////////////////////////////////////////////////// + +// Инициализирует и настраивает приложение +// +// Параметры: +// Настройка - Модуль - Модуль, в котором определены настройки приложения +// +// Возвращаемое значение: +// Модуль - Модуль менеджера приложения +// +Функция Инициализировать(Знач МенеджерНастроек) Экспорт + + // Служебные переменные + ПарсерКоманд = Новый ПарсерАргументовКоманднойСтроки(); + ИсполнителиКоманд = Новый Соответствие; + ОбъектНастроек = МенеджерНастроек; + + // Логирование + Лог = Логирование.ПолучитьЛог(ОбъектНастроек.ИмяЛогаСистемы()); + Лог.УстановитьРаскладку(ОбъектНастроек); + + // Инициализация команд + ОбъектНастроек.НастроитьКомандыПриложения(ЭтотОбъект); + + Возврат ЭтотОбъект; + +КонецФункции + +// Добавляет команду в приложение +// +// Параметры: +// ИмяКоманды - Строка - Имя команды +// КлассРеализации - Строка - Имя файла класса, в котором реализована команда +// Описаниекоманды - Строка - краткое описание назначения команды +// +Процедура ДобавитьКоманду(Знач ИмяКоманды, Знач КлассРеализации, Знач ОписаниеКоманды) Экспорт + + Попытка + РеализацияКоманды = Новый(КлассРеализации); + + Команда = ПарсерКоманд.ОписаниеКоманды(ИмяКоманды, ОписаниеКоманды); + ПарсерКоманд.ДобавитьКоманду(Команда); + + РеализацияКоманды.НастроитьКоманду(Команда, ПарсерКоманд); + + ИсполнителиКоманд.Вставить(ИмяКоманды, РеализацияКоманды); + Исключение + ЗавершитьРаботуПриложенияСОшибкой(СтрШаблон("Не удалось инициализировать команду '%1' для класса '%2' по причине: + |%3", ИмяКоманды, КлассРеализации, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); + КонецПопытки; + +КонецПроцедуры + +// Аварийно завершает работу приложения с ошибкой +// +// Параметры: +// Сообщение - Строка - Сообщение, которое будет выведено пользователю перед завершением +// КодВозврата (не обязательный) - Число - Код возврата с которым будет закрыто приложение +// Значение по умолчанию: "ОшибкаВремениВыполнения" -- 1 +// +Процедура ЗавершитьРаботуПриложенияСОшибкой(Знач Сообщение, Знач КодВозврата = Неопределено) Экспорт + + Если КодВозврата = Неопределено Тогда + КодВозврата = РезультатыКоманд().ОшибкаВремениВыполнения; + КонецЕсли; + + Лог.КритичнаяОшибка(Сообщение); + + ЗавершитьРаботу(КодВозврата); + +КонецПроцедуры + +// Завершает работу приложения +// +// Параметры: +// КодВозврата (не обязательный) - Число - Код возврата с которым будет закрыто приложение +// Значение по умолчанию: "Успех" -- 0 +// +Процедура ЗавершитьРаботуПриложения(Знач КодВозврата = Неопределено) Экспорт + + Если КодВозврата = Неопределено Тогда + КодВозврата = РезультатыКоманд().Успех; + КонецЕсли; + + ЗавершитьРаботу(КодВозврата); + +КонецПроцедуры + +// Осуществляет запуск приложения на выполнение +// +// Возвращаемое значение: +// Число - Код возврата выполнения команды приложения +// +Функция ЗапуститьВыполнение() Экспорт + + Попытка + ПараметрыЗапуска = ПарсерКоманд.Разобрать(АргументыКоманднойСтроки); + Исключение + Лог.Отладка(ОписаниеОшибки()); + + Лог.Ошибка("Не удалось определить требуемое действие."); + ВывестиСправкуПоКомандам(); + + Возврат РезультатыКоманд().НеверныеПараметры; + КонецПопытки; + + Команда = ""; + ЗначенияПараметров = Неопределено; + + Если ПараметрыЗапуска = Неопределено ИЛИ ПараметрыЗапуска.Количество() = 0 Тогда + + ВывестиВерсию(); + ВывестиСправкуПоКомандам(); + + Возврат РезультатыКоманд().НеверныеПараметры; + + ИначеЕсли ТипЗнч(ПараметрыЗапуска) = Тип("Структура") Тогда + + // это команда + Команда = ПараметрыЗапуска.Команда; + ЗначенияПараметров = ПараметрыЗапуска.ЗначенияПараметров; + Лог.Отладка("Выполняю команду продукта %1", Команда); + + ИначеЕсли ЗначениеЗаполнено(ОбъектНастроек.ИмяКомандыПоУмолчанию()) Тогда + + // это команда по-умолчанию + Команда = ОбъектНастроек.ИмяКомандыПоУмолчанию(); + ЗначенияПараметров = ПараметрыЗапуска; + Лог.Отладка("Выполняю команду продукта по умолчанию %1", Команда); + + Иначе + + Возврат НекорректныеПараметры(); + + КонецЕсли; + + Если Команда <> ОбъектНастроек.ИмяКомандыВерсия() Тогда + + ВывестиВерсию(); + + КонецЕсли; + + Возврат ВыполнитьКоманду(Команда, ЗначенияПараметров); + +КонецФункции // ЗапуститьВыполнение() + +// Осуществляет запуск на выполнение указанной команды приложения +// +// Параметры: +// ИмяКоманды - Строка - Имя команды, которую необходимо запустить +// ПараметрыКоманды - Соответствие - Соответствие ключей командной строки и их значений +// +Функция ВыполнитьКоманду(Знач ИмяКоманды, Знач ПараметрыКоманды) Экспорт + + Команда = ПолучитьКоманду(ИмяКоманды); + КодВозврата = Команда.ВыполнитьКоманду(ПараметрыКоманды, ЭтотОбъект); + + Если КодВозврата = Неопределено Тогда + КодВозврата = РезультатыКоманд().Успех; + КонецЕсли; + + Возврат КодВозврата; + +КонецФункции // ВыполнитьКоманду + +/////////////////////////////////////////////////////////////////////////////// +// ПРОГРАММНЫЙ ИНТЕРФЕЙС +/////////////////////////////////////////////////////////////////////////////// + +// Возвращает лог приложения +Функция ПолучитьЛог() Экспорт + + Возврат Лог; + +КонецФункции // ПолучитьЛог + +// Возвращает версию продукта +Функция ВерсияПродукта() Экспорт + + Возврат ОбъектНастроек.ВерсияПродукта(); + +КонецФункции // ВерсияПродукта + +// Возвращает имя продукта +Функция ИмяПродукта() Экспорт + + Возврат ОбъектНастроек.ИмяПродукта(); + +КонецФункции // ИмяПродукта + +// Возвращает путь к исполняемому файлу +Функция ПутьКИсполняемомуФайлу() Экспорт + + Возврат ОбъектНастроек.ПутьКИсполняемомуФайлу(); + +КонецФункции // ПутьКИсполняемомуФайлу + +// Возвращает путь к каталогу основного скрипта +Функция ПутьКРодительскомуКаталогу() Экспорт + + Возврат ОбъектНастроек.ПутьКРодительскомуКаталогу(); + +КонецФункции // ПутьКРодительскомуКаталогу + +// Выводит справку по всем командам приложения +Процедура ВывестиСправкуПоКомандам() Экспорт + + ПарсерКоманд.ВывестиСправкуПоКомандам(); + +КонецПроцедуры // ВывестиСправкуПоКомандам + +// Выводит справку по указанной команде приложения. +Процедура ВывестиСправкуПоКоманде(Знач ИмяКоманды) Экспорт + + ПарсерКоманд.ВывестиСправкуПоКоманде(ИмяКоманды); + +КонецПроцедуры // ВывестиСправкуПоКоманде + +/////////////////////////////////////////////////////////////////////////////// +// ПЕРЕЧИСЛЕНИЯ +/////////////////////////////////////////////////////////////////////////////// + +// Возвращает стандартные коды возврата приложения +Функция РезультатыКоманд() Экспорт + + РезультатыКоманд = Новый Структура; + РезультатыКоманд.Вставить("Успех", 0); + РезультатыКоманд.Вставить("НеверныеПараметры", 5); + РезультатыКоманд.Вставить("ОшибкаВремениВыполнения", 1); + + Возврат РезультатыКоманд; + +КонецФункции // РезультатыКоманд + +/////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ +/////////////////////////////////////////////////////////////////////////////// + +// Получает объект класса с реализацией указанной команды +Функция ПолучитьКоманду(Знач ИмяКоманды) + + КлассРеализации = ИсполнителиКоманд[ИмяКоманды]; + Если КлассРеализации = Неопределено Тогда + + ВызватьИсключение СтрШаблон("Неверная операция. Команда '%1' не предусмотрена.", ИмяКоманды); + + КонецЕсли; + + Возврат КлассРеализации; + +КонецФункции // ПолучитьКоманду + +// Осуществляет вывод полной версии продукта +Процедура ВывестиВерсию() + + Сообщить(СтрШаблон("%1 v%2", ИмяПродукта(), ВерсияПродукта())); + +КонецПроцедуры // ВывестиВерсию + +// Вывод ошибки и справки по параметрам +Функция НекорректныеПараметры() + + Лог.Ошибка("Некорректные аргументы командной строки"); + ВывестиСправкуПоКомандам(); + + Возврат РезультатыКоманд().НеверныеПараметры; + +КонецФункции // НекорректныеПараметры() + +Функция ПолучитьРегексп(Паттерн) Экспорт + + Регексп = Новый РегулярноеВыражение(Паттерн); + Регексп.Многострочный = Истина; + Регексп.ИгнорироватьРегистр = Истина; + + Возврат Регексп; + +КонецФункции + +Функция ПрочитатьФайл(ФайлОбъекта) Экспорт + + ФайлЧтение = Новый ТекстовыйДокумент; + ПутьФайла = ?(ТипЗнч(ФайлОбъекта) = Тип("Строка"), ФайлОбъекта, ФайлОбъекта.ПолноеИмя); + + ФайлЧтение.Прочитать(ПутьФайла, КодировкаТекста.UTF8NoBOM); + + Возврат ФайлЧтение.ПолучитьТекст(); + +КонецФункции diff --git a/src/Модули/ПараметрыПриложения.os b/src/Модули/ПараметрыПриложения.os new file mode 100644 index 0000000..577db8f --- /dev/null +++ b/src/Модули/ПараметрыПриложения.os @@ -0,0 +1,144 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// Служебный модуль с набором служебных параметров приложения +// +// При создании нового приложения обязательно внести изменение +// в ф-ии ИмяПродукта, указав имя вашего приложения. +// +// При выпуске новой версии обязательно изменить ее значение +// в ф-ии ВерсияПродукта +// +/////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////// +// СВОЙСТВА ПРОДУКТА +/////////////////////////////////////////////////////////////////////////////// + +// ВерсияПродукта +// Возвращает текущую версию продукта +// +// Возвращаемое значение: +// Строка - Значение текущей версии продукта +// +Функция ВерсияПродукта() Экспорт + + Возврат "1.0.2"; + +КонецФункции // ВерсияПродукта + +// ИмяПродукта +// Возвращает имя продукта +// +// Возвращаемое значение: +// Строка - Значение имени продукта +// +Функция ИмяПродукта() Экспорт + + Возврат "diff3cf"; + +КонецФункции // ИмяПродукта + +// ПутьКИсполняемомуФайлу +// Возвращает путь к исполняемому файлу +// +// Возвращаемое значение: +// Строка - Путь к исполняемому файлу скрипта +// +Функция ПутьКИсполняемомуФайлу() Экспорт + + Возврат ОбъединитьПути(ПутьКРодительскомуКаталогу(), "src", "main.os"); + +КонецФункции // ПутьКИсполняемомуФайлу + +// ПутьКРодительскомуКаталогу +// Возвращает путь к каталогу основного скрипта +// +// Возвращаемое значение: +// Строка - Путь к каталогу основного скрипта +// +Функция ПутьКРодительскомуКаталогу() Экспорт + + Файл = Новый Файл(ОбъединитьПути(ТекущийСценарий().Каталог, "..", "..")); + Возврат Файл.ПолноеИмя; + +КонецФункции // ПутьКРодительскомуКаталогу + +/////////////////////////////////////////////////////////////////////////////// +// ЛОГИРОВАНИЕ +/////////////////////////////////////////////////////////////////////////////// + +// Форматирование логов +// См. описание метода "УстановитьРаскладку" библиотеки logos +// +Функция Форматировать(Знач Уровень, Знач Сообщение) Экспорт + + Возврат СтрШаблон("%1: %2 - %3", ТекущаяДата(), УровниЛога.НаименованиеУровня(Уровень), Сообщение); + +КонецФункции + +// ИмяЛогаСистемы +// Возвращает идентификатор лога приложения +// +// Возвращаемое значение: +// Строка - Значение идентификатора лога приложения +// +Функция ИмяЛогаСистемы() Экспорт + + Возврат "oscript.app." + ИмяПродукта(); + +КонецФункции // ИмяЛогаСистемы + +/////////////////////////////////////////////////////////////////////////////// +// НАСТРОЙКА КОМАНД +/////////////////////////////////////////////////////////////////////////////// + +// Возвращает имя команды "version" (ключ командной строки) +// +// Возвращаемое значение: +// Строка - имя команды +// +Функция ИмяКомандыВерсия() Экспорт + + Возврат "version"; + +КонецФункции // ИмяКомандыВерсия + +// Возвращает имя команды "help" (ключ командной строки) +// +// Возвращаемое значение: +// Строка - имя команды +// +Функция ИмяКомандыПомощь() Экспорт + + Возврат "help"; + +КонецФункции // ИмяКомандыПомощь() + +// ИмяКомандыПоУмолчанию +// Одна из команд может вызываться неявно, без указания команды. +// Иными словами, здесь указывается какой обработчик надо вызывать, если приложение запущено без какой-либо команды +// myapp /home/user/somefile.txt будет аналогично myapp default-action /home/user/somefile.txt +// +// Возвращаемое значение: +// Строка - имя команды по умолчанию +Функция ИмяКомандыПоУмолчанию() Экспорт + + Возврат "help"; + +КонецФункции // ИмяКомандыПоУмолчанию + +// НастроитьКомандыПриложения +// Регистрирует классы обрабатывающие команды прилоложения +// +// Параметры: +// Приложение - Модуль - Модуль менеджера приложения +Процедура НастроитьКомандыПриложения(Знач Приложение) Экспорт + + Приложение.ДобавитьКоманду(ИмяКомандыПомощь(), "КомандаСправкаПоПараметрам", "Выводит справку по командам"); + Приложение.ДобавитьКоманду(ИмяКомандыВерсия(), "КомандаVersion", "Выводит версию приложения"); + Приложение.ДобавитьКоманду("diff", "КомандаСравнение", + "Выполняет сравнение расширения с основной конфигурацией и новой поставкой"); + Приложение.ДобавитьКоманду("objects", "КомандаАнализОбъектов", + "Выполняет анализ изменения объектов из основной конфигурации в новой поставке"); + +КонецПроцедуры // ПриРегистрацииКомандПриложения diff --git a/src/Модули/РезультатСравненияРасширения.os b/src/Модули/РезультатСравненияРасширения.os new file mode 100644 index 0000000..af87a81 --- /dev/null +++ b/src/Модули/РезультатСравненияРасширения.os @@ -0,0 +1,60 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// Служебный модуль получения результата сравнения расширения, основной конфы и поставки +// +// (с) BIA Technologies, LLC +// +/////////////////////////////////////////////////////////////////////////////// + +// Сравнивает три конфигурации - Родитель, Поставка и Расширение +// +// Параметры: +// РодительПуть - Строка - Каталог конфигурации Родитель +// ПоставкаПуть - Строка - Каталог конфигурации Поставка +// РасширениеПуть - Строка - Каталог конфигурации Расширение +// Лог - log-manager - Экземпляр класса логирования +// +// Возвращаемое значение: +// Структура - результат сравнения +// +Функция ПолучитьРезультатСравнения(РодительПуть, ПоставкаПуть, РасширениеПуть, Лог) Экспорт + + РасширениеОписание = Новый Структура("Префикс, Типы"); + + РасширениеОписание.Вставить("РодительПуть", РодительПуть); + РасширениеОписание.Вставить("ПоставкаПуть", ПоставкаПуть); + РасширениеОписание.Вставить("РасширениеПуть", РасширениеПуть); + + Парсер = Новый ПарсерМодулейРасширения(РасширениеПуть); + + ФайлКонфигурации = ОбъединитьПути(РасширениеПуть, "Configuration.xml"); + РасширениеОписание.Префикс = Парсер.ПрочитатьПрефиксРасширения(ФайлКонфигурации); + + // Получить переопределенные объекты (файлы xml и bsl) + РасширениеОписание.Типы = Парсер.ПолучитьПереопределенныеОбъекты(); + Для каждого ТипРасширения Из РасширениеОписание.Типы Цикл + + Для каждого ОбъектРасширения Из ТипРасширения.Объекты Цикл + + Лог.Информация(ОбъектРасширения.Тип + " - " + ОбъектРасширения.Имя); + Для каждого ФайлМодуля Из ОбъектРасширения.Модули Цикл + + МодульОбъекта = ФайлМодуля.ФайлМодуля; + + ФайлМодуля.Вставить("Методы", Парсер.ПрочитатьМетодыМодуля(МодульОбъекта, РасширениеОписание.Префикс)); + + // читаем и раскладываем модуль родителя + Парсер.ПрочитатьМетодыОсновнойКонфигурации(МодульОбъекта, ФайлМодуля, РодительПуть, "Родитель"); + + // читаем и раскладываем модуль поставки + Парсер.ПрочитатьМетодыОсновнойКонфигурации(МодульОбъекта, ФайлМодуля, ПоставкаПуть, "Поставка"); + + КонецЦикла; + + КонецЦикла; + + КонецЦикла; + + Возврат РасширениеОписание; + +КонецФункции diff --git a/src/Модули/ТипыОбъектов.os b/src/Модули/ТипыОбъектов.os new file mode 100644 index 0000000..f2befd7 --- /dev/null +++ b/src/Модули/ТипыОбъектов.os @@ -0,0 +1,29 @@ +Перем ОбъектыКонфигурации Экспорт; + +/////////////////////////////////////////////////////////////////////////////////////////////// +ОбъектыКонфигурации = Новый Массив(); +ОбъектыКонфигурации.Добавить("AccountingRegisters"); +ОбъектыКонфигурации.Добавить("AccumulationRegisters"); +ОбъектыКонфигурации.Добавить("BusinessProcesses"); +ОбъектыКонфигурации.Добавить("CalculationRegisters"); +ОбъектыКонфигурации.Добавить("Catalogs"); +ОбъектыКонфигурации.Добавить("ChartsOfAccounts"); +ОбъектыКонфигурации.Добавить("ChartsOfCalculationTypes"); +ОбъектыКонфигурации.Добавить("ChartsOfCharacteristicTypes"); +ОбъектыКонфигурации.Добавить("CommonCommands"); +ОбъектыКонфигурации.Добавить("CommonForms"); +ОбъектыКонфигурации.Добавить("CommonModules"); +ОбъектыКонфигурации.Добавить("Constants"); +ОбъектыКонфигурации.Добавить("DataProcessors"); +ОбъектыКонфигурации.Добавить("DocumentJournals"); +ОбъектыКонфигурации.Добавить("Documents"); +ОбъектыКонфигурации.Добавить("Enums"); +ОбъектыКонфигурации.Добавить("ExchangePlans"); +ОбъектыКонфигурации.Добавить("Ext"); +ОбъектыКонфигурации.Добавить("FilterCriteria"); +ОбъектыКонфигурации.Добавить("HTTPServices"); +ОбъектыКонфигурации.Добавить("InformationRegisters"); +ОбъектыКонфигурации.Добавить("Reports"); +ОбъектыКонфигурации.Добавить("SettingsStorages"); +ОбъектыКонфигурации.Добавить("Tasks"); +ОбъектыКонфигурации.Добавить("WebServices"); diff --git a/tasks/test-feature.os b/tasks/test-feature.os new file mode 100644 index 0000000..ece94e0 --- /dev/null +++ b/tasks/test-feature.os @@ -0,0 +1,18 @@ +#Использовать ".." +#Использовать 1bdd + +КаталогФич = ОбъединитьПути(".", "features"); +ПутьФичи = ОбъединитьПути(".", "features", АргументыКоманднойСтроки[0]); +Файл_КаталогФич = Новый Файл(КаталогФич); +ФайлФичи = Новый Файл(ПутьФичи); + +ИсполнительБДД = Новый ИсполнительБДД; +РезультатВыполнения = ИсполнительБДД.ВыполнитьФичу(ФайлФичи, Файл_КаталогФич); +ИтоговыйРезультатВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатВыполнения); + +Сообщить(ИтоговыйРезультатВыполнения); +Если ИтоговыйРезультатВыполнения = ИсполнительБДД.ВозможныеСтатусыВыполнения().Сломался Тогда + + ВызватьИсключение 1; + +КонецЕсли; diff --git a/tasks/test.os b/tasks/test.os new file mode 100644 index 0000000..0576ba5 --- /dev/null +++ b/tasks/test.os @@ -0,0 +1,82 @@ +#Использовать "../src" +#Использовать 1bdd +#Использовать 1testrunner + +Функция ПрогнатьТесты() + + Тестер = Новый Тестер; + + ПутьКТестам = ОбъединитьПути(ТекущийСценарий().Каталог, "..", "tests"); + ПутьКОтчетуJUnit = ОбъединитьПути(ТекущийСценарий().Каталог, ".."); + + КаталогТестов = Новый Файл(ПутьКТестам); + Если Не КаталогТестов.Существует() Тогда + Сообщить(СтрШаблон("Не найден каталог тестов %1", ПутьКТестам)); + Возврат Истина; + КонецЕсли; + + РезультатТестирования = Тестер.ТестироватьКаталог( + КаталогТестов, + Новый Файл(ПутьКОтчетуJUnit) + ); + + Успешно = РезультатТестирования = 0; + + Возврат Успешно; +КонецФункции // ПрогнатьТесты() + +Функция ПрогнатьФичи() + + ПутьОтчетаJUnit = "./bdd-log.xml"; + + КаталогФич = ОбъединитьПути(".", "features"); + + Файл_КаталогФич = Новый Файл(КаталогФич); + Если Не Файл_КаталогФич.Существует() Тогда + Сообщить(СтрШаблон("Не найден каталог фич %1", КаталогФич)); + Возврат Истина; + КонецЕсли; + + ИсполнительБДД = Новый ИсполнительБДД; + РезультатыВыполнения = ИсполнительБДД.ВыполнитьФичу(Файл_КаталогФич, Файл_КаталогФич); + ИтоговыйРезультатВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатыВыполнения); + + СтатусВыполнения = ИсполнительБДД.ВозможныеСтатусыВыполнения().НеВыполнялся; + Если РезультатыВыполнения.Строки.Количество() > 0 Тогда + + СтатусВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатыВыполнения); + + КонецЕсли; + + ГенераторОтчетаJUnit = Новый ГенераторОтчетаJUnit; + ГенераторОтчетаJUnit.Сформировать(РезультатыВыполнения, СтатусВыполнения, ПутьОтчетаJUnit); + + Сообщить(СтрШаблон("Результат прогона фич <%1> + |", ИтоговыйРезультатВыполнения)); + + Возврат ИтоговыйРезультатВыполнения <> ИсполнительБДД.ВозможныеСтатусыВыполнения().Сломался; +КонецФункции // ПрогнатьФичи() + +Попытка + ТестыПрошли = ПрогнатьТесты(); + +Исключение + ТестыПрошли = Ложь; + Сообщить(СтрШаблон("Тесты через 1testrunner выполнены неудачно + |%1", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); +КонецПопытки; + +Попытка + ФичиПрошли = ПрогнатьФичи(); +Исключение + ФичиПрошли = Ложь; + Сообщить(СтрШаблон("Тесты поведения через 1bdd выполнены неудачно + |%1", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); +КонецПопытки; + +Если Не ТестыПрошли Или Не ФичиПрошли Тогда + ВызватьИсключение "Тестирование завершилось неудачно!"; +Иначе + Сообщить(СтрШаблон("Результат прогона тестов <%1> + |", ТестыПрошли)); +КонецЕсли; diff --git a/tests/fixtures/configuration/Catalogs/Справочник1.xml b/tests/fixtures/configuration/Catalogs/Справочник1.xml new file mode 100644 index 0000000..fb36db0 --- /dev/null +++ b/tests/fixtures/configuration/Catalogs/Справочник1.xml @@ -0,0 +1,84 @@ + + + + + + 54640876-c2e6-475b-835e-a755b661df98 + d4b2fd69-7010-475e-95d3-5b31d3abff26 + + + cd29b0ab-168f-46ea-bcb9-13ec622af7d7 + 5eb3b617-0c7e-4319-b890-097c56a166aa + + + b8a806e9-eba1-414c-84a8-724dcd6b82ee + 130f6ad5-d7be-4d32-bffd-faa976836a81 + + + cd4a0f54-030f-4c02-84db-67752c4107da + 863afb5a-afed-43a0-9792-c0f39e3c7241 + + + d8ec89b5-d4fa-42e2-a9e7-620c903dca0a + 6330ba24-5beb-4a5c-bcb3-62a58101d88e + + + + Справочник1 + + + false + HierarchyFoldersAndItems + false + 2 + true + true + + ToItems + 9 + 25 + String + Variable + WholeCatalog + true + true + AsDescription + + Auto + InDialog + false + BothWays + + Catalog.Справочник1.StandardAttribute.Description + Catalog.Справочник1.StandardAttribute.Code + + Begin + DontUse + Directly + + + + + + + + + + + false + + + Managed + DontUse + + + + + + Use + Auto + DontUse + + + + \ No newline at end of file diff --git a/tests/fixtures/configuration/CommonModules/ОбщийМодульТест.xml b/tests/fixtures/configuration/CommonModules/ОбщийМодульТест.xml new file mode 100644 index 0000000..6145714 --- /dev/null +++ b/tests/fixtures/configuration/CommonModules/ОбщийМодульТест.xml @@ -0,0 +1,23 @@ + + + + + ОбщийМодульТест + + + ru + Общий модуль тест + + + + false + false + true + false + false + false + false + DontUse + + + \ No newline at end of file diff --git a/tests/fixtures/configuration/CommonModules/ОбщийМодульТест/Ext/Module.bsl b/tests/fixtures/configuration/CommonModules/ОбщийМодульТест/Ext/Module.bsl new file mode 100644 index 0000000..4a4a07a --- /dev/null +++ b/tests/fixtures/configuration/CommonModules/ОбщийМодульТест/Ext/Module.bsl @@ -0,0 +1,5 @@ +Процедура ТестПроцедуры() + + Тест = "Это просто тестирование сравнения конфигураций"; + +КонецПроцедуры \ No newline at end of file diff --git a/tests/fixtures/configuration/ConfigDumpInfo.xml b/tests/fixtures/configuration/ConfigDumpInfo.xml new file mode 100644 index 0000000..5432d46 --- /dev/null +++ b/tests/fixtures/configuration/ConfigDumpInfo.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/fixtures/configuration/Configuration.xml b/tests/fixtures/configuration/Configuration.xml new file mode 100644 index 0000000..56e5c61 --- /dev/null +++ b/tests/fixtures/configuration/Configuration.xml @@ -0,0 +1,148 @@ + + + + + + 9cd510cd-abfc-11d4-9434-004095e12fc7 + 804c66e4-c30d-409b-8591-7ee38de6cf58 + + + 9fcd25a0-4822-11d4-9414-008048da11f9 + 46aa5b38-d653-4c7b-976e-d50ab79964e4 + + + e3687481-0a87-462c-a166-9f34594f9bba + 8d0e858b-89e5-4d0d-a61c-dd7dc2207f3f + + + 9de14907-ec23-4a07-96f0-85521cb6b53b + e3a6ca97-02b1-428c-acd6-d52cad356652 + + + 51f2d5d8-ea4d-4064-8892-82951750031e + 568f0d16-cbfa-4b11-8f18-6ce8014fc83f + + + e68182ea-4237-4383-967f-90c1e3370bc7 + 2ac838b4-c5db-4ad6-9cc5-8d480c868fcf + + + + ТестированиеСравнения + + + ru + Тестирование сравнения + + + + + Version8_3_13 + ManagedApplication + + PlatformApplication + + Russian + + + + + false + false + false + + + + + + + + + + + + + + + + + + Multimedia + false + + + Location + false + + + Contacts + false + + + Calendars + false + + + Telephony + false + + + PushNotification + false + + + LocalNotification + false + + + Print + false + + + InAppPurchases + false + + + Ads + false + + + BackgroundLocation + false + + + BackgroundAudioPlayback + false + + + FileExchangeWithPersonalComputer + false + + + Normal + + + Language.Русский + + + + + + Managed + NotAutoFree + DontUse + DontUse + Taxi + Version8_3_10 + + + + Русский + ПодсистемаТест + Администратор + ОбщийМодульТест + Справочник1 + ТестовыйДокумент + + + \ No newline at end of file diff --git a/tests/fixtures/configuration/Documents/ТестовыйДокумент.xml b/tests/fixtures/configuration/Documents/ТестовыйДокумент.xml new file mode 100644 index 0000000..6ec1272 --- /dev/null +++ b/tests/fixtures/configuration/Documents/ТестовыйДокумент.xml @@ -0,0 +1,271 @@ + + + + + + 12cd8645-67e4-4f52-97b6-33eb80c8cb3d + 288ab939-f6f2-4f00-afe7-a1689e74c4cf + + + e6cfb2e1-7b41-4bbc-8e3a-63f11d2b29b9 + c6b945c6-982e-4fed-964a-e9d8ce291c0c + + + 9c776a75-b90b-4f98-a717-e9f379102896 + c22d1558-1e4f-4a52-8753-4c6f48c97b1f + + + 1728ad7b-98d0-4123-b7fb-75ee6af22e95 + 15d6ea31-fc29-4a88-af02-6c9eebc3aa15 + + + e9cb002d-a63c-46a2-97b7-60385633b767 + f19e8590-3b64-40d9-ba90-dd73efce2628 + + + + ТестовыйДокумент + + + ru + Тестовый документ + + + + true + + String + 9 + Variable + Nonperiodical + true + true + + + + Document.ТестовыйДокумент.StandardAttribute.Number + + Use + Begin + DontUse + Directly + Document.ТестовыйДокумент.Form.ФормаДокумента + + + + + + Allow + Allow + AutoDeleteOnUnpost + WriteSelected + AutoFill + + true + true + false + + Managed + DontUse + + + + + + Auto + DontUse + + + + + Реквизит1 + + + + xs:string + + 10 + Variable + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + DontIndex + DontUse + Use + + + + + Реквизит2 + + + + cfg:CatalogRef.Справочник1 + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + DontIndex + DontUse + Use + + +
ФормаДокумента
+ + + + d632e036-d75c-4ff8-8b2c-46006e419dd3 + a02e60cc-699d-47ac-bc5b-b5f1cab00e7f + + + 7bf838d8-2d5a-429c-a3cd-954154d18d51 + ebc3195f-7749-4ff0-9ce5-e0b7c4aca343 + + + + ТабличнаяЧасть1 + + + + DontCheck + + + + + Реквизит1 + + + + v8:ValueStorage + + false + + + + false + + false + false + + + DontCheck + Items + + + Auto + Auto + + + Auto + DontIndex + DontUse + Use + + + + + Реквизит2 + + + + cfg:CatalogRef.Справочник1 + + false + + + + false + + false + false + + + DontCheck + Items + + + Auto + Auto + + + Auto + DontIndex + DontUse + Use + + + + + Реквизит3 + + + + xs:boolean + + false + + + + false + + false + false + + + DontCheck + Items + + + Auto + Auto + + + Auto + DontIndex + DontUse + Use + + + + +
+
+
\ No newline at end of file diff --git a/tests/fixtures/configuration/Documents/ТестовыйДокумент/Ext/ObjectModule.bsl b/tests/fixtures/configuration/Documents/ТестовыйДокумент/Ext/ObjectModule.bsl new file mode 100644 index 0000000..b1eba6c --- /dev/null +++ b/tests/fixtures/configuration/Documents/ТестовыйДокумент/Ext/ObjectModule.bsl @@ -0,0 +1,6 @@ + +Процедура ОбработкаПроведения(Отказ, РежимПроведения) + + Тест = "Это просто тестирование сравнения конфигураций в модуле документа"; + +КонецПроцедуры diff --git a/tests/fixtures/configuration/Documents/ТестовыйДокумент/Forms/ФормаДокумента.xml b/tests/fixtures/configuration/Documents/ТестовыйДокумент/Forms/ФормаДокумента.xml new file mode 100644 index 0000000..13bf30b --- /dev/null +++ b/tests/fixtures/configuration/Documents/ТестовыйДокумент/Forms/ФормаДокумента.xml @@ -0,0 +1,21 @@ + + +
+ + ФормаДокумента + + + ru + Форма документа + + + + Managed + false + + PlatformApplication + MobilePlatformApplication + + +
+
\ No newline at end of file diff --git a/tests/fixtures/configuration/Documents/ТестовыйДокумент/Forms/ФормаДокумента/Ext/Form.xml b/tests/fixtures/configuration/Documents/ТестовыйДокумент/Forms/ФормаДокумента/Ext/Form.xml new file mode 100644 index 0000000..286df70 --- /dev/null +++ b/tests/fixtures/configuration/Documents/ТестовыйДокумент/Forms/ФормаДокумента/Ext/Form.xml @@ -0,0 +1,36 @@ + +
+ CurrentOrLast + Auto + true + + + ПриСозданииНаСервере + + + + Объект.Number + EnterOnInput + + + + + Объект.Date + EnterOnInput + + + + + + + + cfg:DocumentObject.ТестовыйДокумент + + true + true + + Объект.RegisterRecords + + + + \ No newline at end of file diff --git a/tests/fixtures/configuration/Documents/ТестовыйДокумент/Forms/ФормаДокумента/Ext/Form/Module.bsl b/tests/fixtures/configuration/Documents/ТестовыйДокумент/Forms/ФормаДокумента/Ext/Form/Module.bsl new file mode 100644 index 0000000..60b7975 --- /dev/null +++ b/tests/fixtures/configuration/Documents/ТестовыйДокумент/Forms/ФормаДокумента/Ext/Form/Module.bsl @@ -0,0 +1,7 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Тест = "Это просто тестирование сравнения конфигураций в форме документа"; + +КонецПроцедуры diff --git a/tests/fixtures/configuration/Languages/Русский.xml b/tests/fixtures/configuration/Languages/Русский.xml new file mode 100644 index 0000000..45aa03d --- /dev/null +++ b/tests/fixtures/configuration/Languages/Русский.xml @@ -0,0 +1,16 @@ + + + + + Русский + + + ru + Русский + + + + ru + + + \ No newline at end of file diff --git a/tests/fixtures/configuration/Roles/Администратор.xml b/tests/fixtures/configuration/Roles/Администратор.xml new file mode 100644 index 0000000..c1cf4e6 --- /dev/null +++ b/tests/fixtures/configuration/Roles/Администратор.xml @@ -0,0 +1,15 @@ + + + + + Администратор + + + ru + Администратор + + + + + + \ No newline at end of file diff --git a/tests/fixtures/configuration/Roles/Администратор/Ext/Rights.xml b/tests/fixtures/configuration/Roles/Администратор/Ext/Rights.xml new file mode 100644 index 0000000..0ff70d8 --- /dev/null +++ b/tests/fixtures/configuration/Roles/Администратор/Ext/Rights.xml @@ -0,0 +1,24 @@ + + + true + true + false + + Document.ТестовыйДокумент + + InteractiveDelete + false + + + InteractiveDeleteMarked + false + + + + Subsystem.ПодсистемаТест + + View + false + + + \ No newline at end of file diff --git a/tests/fixtures/configuration/Subsystems/ПодсистемаТест.xml b/tests/fixtures/configuration/Subsystems/ПодсистемаТест.xml new file mode 100644 index 0000000..f7769fa --- /dev/null +++ b/tests/fixtures/configuration/Subsystems/ПодсистемаТест.xml @@ -0,0 +1,25 @@ + + + + + ПодсистемаТест + + + ru + Подсистема тест + + + + true + true + + + + CommonModule.ОбщийМодульТест + Document.ТестовыйДокумент + Catalog.Справочник1 + + + + + \ No newline at end of file diff --git a/tests/fixtures/exts/ADDTST/CommonModules/ОбщийМодульТест.xml b/tests/fixtures/exts/ADDTST/CommonModules/ОбщийМодульТест.xml new file mode 100644 index 0000000..e0331ae --- /dev/null +++ b/tests/fixtures/exts/ADDTST/CommonModules/ОбщийМодульТест.xml @@ -0,0 +1,15 @@ + + + + + ОбщийМодульТест + Adopted + false + false + true + false + false + false + + + \ No newline at end of file diff --git a/tests/fixtures/exts/ADDTST/CommonModules/ОбщийМодульТест/Ext/Module.bsl b/tests/fixtures/exts/ADDTST/CommonModules/ОбщийМодульТест/Ext/Module.bsl new file mode 100644 index 0000000..368c5d9 --- /dev/null +++ b/tests/fixtures/exts/ADDTST/CommonModules/ОбщийМодульТест/Ext/Module.bsl @@ -0,0 +1,8 @@ + +&Вместо("ТестПроцедуры") +Процедура ADDTSTТестПроцедуры() + // Вставить содержимое метода. + + Тест = "Переопределение в расширении"; + +КонецПроцедуры diff --git a/tests/fixtures/exts/ADDTST/ConfigDumpInfo.xml b/tests/fixtures/exts/ADDTST/ConfigDumpInfo.xml new file mode 100644 index 0000000..f800ede --- /dev/null +++ b/tests/fixtures/exts/ADDTST/ConfigDumpInfo.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/fixtures/exts/ADDTST/Configuration.xml b/tests/fixtures/exts/ADDTST/Configuration.xml new file mode 100644 index 0000000..07798d9 --- /dev/null +++ b/tests/fixtures/exts/ADDTST/Configuration.xml @@ -0,0 +1,60 @@ + + + + + + 9cd510cd-abfc-11d4-9434-004095e12fc7 + e796b40b-c503-4c5e-945f-871874d5a84f + + + 9fcd25a0-4822-11d4-9414-008048da11f9 + 1ef6003e-749f-46c4-b7ba-87ea0964089b + + + e3687481-0a87-462c-a166-9f34594f9bba + 80e30f82-f35b-4b40-a0c0-c2e4c16640e2 + + + 9de14907-ec23-4a07-96f0-85521cb6b53b + cbb79db0-2948-456b-8161-b0e5feeb7174 + + + 51f2d5d8-ea4d-4064-8892-82951750031e + bcefdba1-6272-4706-9f9b-82600a9a5f0d + + + e68182ea-4237-4383-967f-90c1e3370bc7 + 8e8463e0-5cfe-4881-976e-dee313dc22bb + + + + РасширениеТест + + + ru + Расширение тест + + + + AddOn + Adopted + ADDTST + Version8_3_10 + ManagedApplication + + PersonalComputer + + Russian + + + Language.Русский + Taxi + Version8_3_10 + + + Русский + ОбщийМодульТест + ТестовыйДокумент + + + \ No newline at end of file diff --git a/tests/fixtures/exts/ADDTST/Documents/ТестовыйДокумент.xml b/tests/fixtures/exts/ADDTST/Documents/ТестовыйДокумент.xml new file mode 100644 index 0000000..b417b9e --- /dev/null +++ b/tests/fixtures/exts/ADDTST/Documents/ТестовыйДокумент.xml @@ -0,0 +1,37 @@ + + + + + + c9de9adf-490d-4f67-a092-4cdfc2e5eae2 + 8e0c32a8-db8d-4563-a13c-01ae7e7d054b + + + f245c3fe-8458-4cfa-bb80-57eacad6a01f + e1e76c79-5718-401c-846d-7d181b57c5a1 + + + 8c5eee5b-ebad-411a-b117-b8a3a7ddb446 + cb26fff0-c762-4a2e-a3d1-01a28f2423ad + + + dc6f6f7f-5ed9-4281-acd7-f7baee3e0bd7 + 97b5bc52-7f3d-422c-a62c-d085abb77ac6 + + + 1519094e-2d28-4e8c-8d1d-bb010d6b6899 + 86199801-900d-49ea-8779-33987d4c59a6 + + + + ТестовыйДокумент + Adopted + String + 9 + Variable + + +
ФормаДокумента
+
+
+
\ No newline at end of file diff --git a/tests/fixtures/exts/ADDTST/Documents/ТестовыйДокумент/Forms/ФормаДокумента.xml b/tests/fixtures/exts/ADDTST/Documents/ТестовыйДокумент/Forms/ФормаДокумента.xml new file mode 100644 index 0000000..0e6e835 --- /dev/null +++ b/tests/fixtures/exts/ADDTST/Documents/ТестовыйДокумент/Forms/ФормаДокумента.xml @@ -0,0 +1,10 @@ + + +
+ + ФормаДокумента + Adopted + Managed + +
+
\ No newline at end of file diff --git a/tests/fixtures/exts/ADDTST/Documents/ТестовыйДокумент/Forms/ФормаДокумента/Ext/Form.xml b/tests/fixtures/exts/ADDTST/Documents/ТестовыйДокумент/Forms/ФормаДокумента/Ext/Form.xml new file mode 100644 index 0000000..1355c7a --- /dev/null +++ b/tests/fixtures/exts/ADDTST/Documents/ТестовыйДокумент/Forms/ФормаДокумента/Ext/Form.xml @@ -0,0 +1,68 @@ + +
+ CurrentOrLast + Auto + true + + + ADDTSTПриСозданииНаСервереВместо + + + + Объект.Number + EnterOnInput + + + + + Объект.Date + EnterOnInput + + + + + + + + cfg:DocumentObject.ТестовыйДокумент + + true + true + + Объект.RegisterRecords + + + + + CurrentOrLast + Auto + true + + + + Объект.Number + EnterOnInput + + + + + Объект.Date + EnterOnInput + + + + + + + + cfg:DocumentObject.ТестовыйДокумент + + true + true + + Объект.RegisterRecords + + + + + \ No newline at end of file diff --git a/tests/fixtures/exts/ADDTST/Documents/ТестовыйДокумент/Forms/ФормаДокумента/Ext/Form/Module.bsl b/tests/fixtures/exts/ADDTST/Documents/ТестовыйДокумент/Forms/ФормаДокумента/Ext/Form/Module.bsl new file mode 100644 index 0000000..9b758c5 --- /dev/null +++ b/tests/fixtures/exts/ADDTST/Documents/ТестовыйДокумент/Forms/ФормаДокумента/Ext/Form/Module.bsl @@ -0,0 +1,7 @@ + +&НаСервере +Процедура ADDTSTПриСозданииНаСервереВместо(Отказ, СтандартнаяОбработка) + + Тест = "Это переопределение обработчика в форме документа"; + +КонецПроцедуры diff --git a/tests/fixtures/exts/ADDTST/Languages/Русский.xml b/tests/fixtures/exts/ADDTST/Languages/Русский.xml new file mode 100644 index 0000000..1926684 --- /dev/null +++ b/tests/fixtures/exts/ADDTST/Languages/Русский.xml @@ -0,0 +1,10 @@ + + + + + Русский + Adopted + ru + + + \ No newline at end of file diff --git a/tests/fixtures/release/CommonModules/ОбщийМодульТест.xml b/tests/fixtures/release/CommonModules/ОбщийМодульТест.xml new file mode 100644 index 0000000..fecc68d --- /dev/null +++ b/tests/fixtures/release/CommonModules/ОбщийМодульТест.xml @@ -0,0 +1,23 @@ + + + + + ОбщийМодульТест + + + ru + Общий модуль тест + + + + false + false + true + false + false + false + false + DontUse + + + \ No newline at end of file diff --git a/tests/fixtures/release/CommonModules/ОбщийМодульТест/Ext/Module.bsl b/tests/fixtures/release/CommonModules/ОбщийМодульТест/Ext/Module.bsl new file mode 100644 index 0000000..24cb860 --- /dev/null +++ b/tests/fixtures/release/CommonModules/ОбщийМодульТест/Ext/Module.bsl @@ -0,0 +1,7 @@ +Процедура ТестПроцедуры() + + Тест = "Это просто тестирование сравнения конфигураций"; + + Тест = Тест + " дополнен в обновлении..."; + +КонецПроцедуры \ No newline at end of file diff --git a/tests/fixtures/release/ConfigDumpInfo.xml b/tests/fixtures/release/ConfigDumpInfo.xml new file mode 100644 index 0000000..064a376 --- /dev/null +++ b/tests/fixtures/release/ConfigDumpInfo.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/fixtures/release/Configuration.xml b/tests/fixtures/release/Configuration.xml new file mode 100644 index 0000000..810ea22 --- /dev/null +++ b/tests/fixtures/release/Configuration.xml @@ -0,0 +1,132 @@ + + + + + + 9cd510cd-abfc-11d4-9434-004095e12fc7 + 804c66e4-c30d-409b-8591-7ee38de6cf58 + + + 9fcd25a0-4822-11d4-9414-008048da11f9 + 46aa5b38-d653-4c7b-976e-d50ab79964e4 + + + e3687481-0a87-462c-a166-9f34594f9bba + 8d0e858b-89e5-4d0d-a61c-dd7dc2207f3f + + + 9de14907-ec23-4a07-96f0-85521cb6b53b + e3a6ca97-02b1-428c-acd6-d52cad356652 + + + 51f2d5d8-ea4d-4064-8892-82951750031e + 568f0d16-cbfa-4b11-8f18-6ce8014fc83f + + + e68182ea-4237-4383-967f-90c1e3370bc7 + 2ac838b4-c5db-4ad6-9cc5-8d480c868fcf + + + + ТестированиеСравнения + + + ru + Тестирование сравнения + + + + + Version8_3_10 + ManagedApplication + + PersonalComputer + + Russian + + + + + false + false + false + + + + + + + + + + + + + + + Multimedia + false + + + Location + false + + + Contacts + false + + + Calendars + false + + + Telephony + false + + + PushNotification + false + + + LocalNotification + false + + + Print + false + + + InAppPurchases + false + + + Ads + false + + + Normal + + + Language.Русский + + + + + + Managed + NotAutoFree + DontUse + DontUse + Taxi + Version8_3_10 + + + + Русский + ПодсистемаТест + Администратор + ОбщийМодульТест + ТестовыйДокумент + + + \ No newline at end of file diff --git a/tests/fixtures/release/Documents/ТестовыйДокумент.xml b/tests/fixtures/release/Documents/ТестовыйДокумент.xml new file mode 100644 index 0000000..f38758e --- /dev/null +++ b/tests/fixtures/release/Documents/ТестовыйДокумент.xml @@ -0,0 +1,81 @@ + + + + + + 12cd8645-67e4-4f52-97b6-33eb80c8cb3d + 288ab939-f6f2-4f00-afe7-a1689e74c4cf + + + e6cfb2e1-7b41-4bbc-8e3a-63f11d2b29b9 + c6b945c6-982e-4fed-964a-e9d8ce291c0c + + + 9c776a75-b90b-4f98-a717-e9f379102896 + c22d1558-1e4f-4a52-8753-4c6f48c97b1f + + + 1728ad7b-98d0-4123-b7fb-75ee6af22e95 + 15d6ea31-fc29-4a88-af02-6c9eebc3aa15 + + + e9cb002d-a63c-46a2-97b7-60385633b767 + f19e8590-3b64-40d9-ba90-dd73efce2628 + + + + ТестовыйДокумент + + + ru + Тестовый документ + + + + true + + String + 9 + Variable + Nonperiodical + true + true + + + + Document.ТестовыйДокумент.StandardAttribute.Number + + Use + Begin + DontUse + Directly + Document.ТестовыйДокумент.Form.ФормаДокумента + + + + + + Allow + Allow + AutoDeleteOnUnpost + WriteSelected + AutoFill + + true + true + false + + Managed + DontUse + + + + + + Auto + + +
ФормаДокумента
+
+
+
\ No newline at end of file diff --git a/tests/fixtures/release/Documents/ТестовыйДокумент/Ext/ObjectModule.bsl b/tests/fixtures/release/Documents/ТестовыйДокумент/Ext/ObjectModule.bsl new file mode 100644 index 0000000..b1eba6c --- /dev/null +++ b/tests/fixtures/release/Documents/ТестовыйДокумент/Ext/ObjectModule.bsl @@ -0,0 +1,6 @@ + +Процедура ОбработкаПроведения(Отказ, РежимПроведения) + + Тест = "Это просто тестирование сравнения конфигураций в модуле документа"; + +КонецПроцедуры diff --git a/tests/fixtures/release/Documents/ТестовыйДокумент/Forms/ФормаДокумента.xml b/tests/fixtures/release/Documents/ТестовыйДокумент/Forms/ФормаДокумента.xml new file mode 100644 index 0000000..c8c84a6 --- /dev/null +++ b/tests/fixtures/release/Documents/ТестовыйДокумент/Forms/ФормаДокумента.xml @@ -0,0 +1,21 @@ + + +
+ + ФормаДокумента + + + ru + Форма документа + + + + Managed + false + + PersonalComputer + MobileDevice + + +
+
\ No newline at end of file diff --git a/tests/fixtures/release/Documents/ТестовыйДокумент/Forms/ФормаДокумента/Ext/Form.xml b/tests/fixtures/release/Documents/ТестовыйДокумент/Forms/ФормаДокумента/Ext/Form.xml new file mode 100644 index 0000000..db156d6 --- /dev/null +++ b/tests/fixtures/release/Documents/ТестовыйДокумент/Forms/ФормаДокумента/Ext/Form.xml @@ -0,0 +1,36 @@ + +
+ CurrentOrLast + Auto + true + + + ПриСозданииНаСервере + + + + Объект.Number + EnterOnInput + + + + + Объект.Date + EnterOnInput + + + + + + + + cfg:DocumentObject.ТестовыйДокумент + + true + true + + Объект.RegisterRecords + + + + \ No newline at end of file diff --git a/tests/fixtures/release/Documents/ТестовыйДокумент/Forms/ФормаДокумента/Ext/Form/Module.bsl b/tests/fixtures/release/Documents/ТестовыйДокумент/Forms/ФормаДокумента/Ext/Form/Module.bsl new file mode 100644 index 0000000..1d89aa8 --- /dev/null +++ b/tests/fixtures/release/Documents/ТестовыйДокумент/Forms/ФормаДокумента/Ext/Form/Module.bsl @@ -0,0 +1,9 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Тест = "Это просто тестирование сравнения конфигураций в форме документа"; + + Тест = Тест + " дополнен в обновлении..."; + +КонецПроцедуры diff --git a/tests/fixtures/release/Languages/Русский.xml b/tests/fixtures/release/Languages/Русский.xml new file mode 100644 index 0000000..04be58a --- /dev/null +++ b/tests/fixtures/release/Languages/Русский.xml @@ -0,0 +1,16 @@ + + + + + Русский + + + ru + Русский + + + + ru + + + \ No newline at end of file diff --git a/tests/fixtures/release/Roles/Администратор.xml b/tests/fixtures/release/Roles/Администратор.xml new file mode 100644 index 0000000..bdfa3e1 --- /dev/null +++ b/tests/fixtures/release/Roles/Администратор.xml @@ -0,0 +1,15 @@ + + + + + Администратор + + + ru + Администратор + + + + + + \ No newline at end of file diff --git a/tests/fixtures/release/Roles/Администратор/Ext/Rights.xml b/tests/fixtures/release/Roles/Администратор/Ext/Rights.xml new file mode 100644 index 0000000..2491a03 --- /dev/null +++ b/tests/fixtures/release/Roles/Администратор/Ext/Rights.xml @@ -0,0 +1,24 @@ + + + true + true + false + + Document.ТестовыйДокумент + + InteractiveDelete + false + + + InteractiveDeleteMarked + false + + + + Subsystem.ПодсистемаТест + + View + false + + + \ No newline at end of file diff --git a/tests/fixtures/release/Subsystems/ПодсистемаТест.xml b/tests/fixtures/release/Subsystems/ПодсистемаТест.xml new file mode 100644 index 0000000..a5c0b1b --- /dev/null +++ b/tests/fixtures/release/Subsystems/ПодсистемаТест.xml @@ -0,0 +1,24 @@ + + + + + ПодсистемаТест + + + ru + Подсистема тест + + + + true + true + + + + CommonModule.ОбщийМодульТест + Document.ТестовыйДокумент + + + + + \ No newline at end of file diff --git a/tests/test-app.os b/tests/test-app.os new file mode 100644 index 0000000..8db55dc --- /dev/null +++ b/tests/test-app.os @@ -0,0 +1,181 @@ +/////////////////////////////////////////////////////////////////// +// +// Тестирование основной функциональности пакета +// Проверка на соответствие выгрузки эталону +// +// (с) BIA Technologies, LLC +// +/////////////////////////////////////////////////////////////////// + +#Использовать logos +#Использовать asserts +#Использовать tempfiles +#Использовать 1commands +#Использовать ".." + +/////////////////////////////////////////////////////////////////// + +Перем Лог; +Перем МенеджерВременныхФайлов; +Перем РасширениеПуть; +Перем РодительПуть; +Перем ПоставкаПуть; +Перем Парсер; + +/////////////////////////////////////////////////////////////////// +// Программный интерфейс +/////////////////////////////////////////////////////////////////// + +Функция ПолучитьСписокТестов(Знач ЮнитТестирование) Экспорт + + МассивТестов = Новый Массив; + МассивТестов.Добавить("ТестПарсера_ПолучитьПрефиксРасширения"); + МассивТестов.Добавить("ТестПарсера_ВыполнитьЧтениеМетодовМодуля"); + МассивТестов.Добавить("ТестПарсера_ПолучитьПереопределенныеОбъекты"); + МассивТестов.Добавить("ТестПарсера_ПрочитатьМетодыОсновнойКонфигурации"); + МассивТестов.Добавить("ТестПриложения_ПолучитьРезультатСравнения"); + МассивТестов.Добавить("ТестПриложения_СохранитьРезультатСравнения"); + + МассивТестов.Добавить("ТестПриложения_ПолучитьРезультатСравненияОбъектов"); + + Возврат МассивТестов; + +КонецФункции + +Процедура ПередЗапускомТеста() Экспорт + + // служебные переменные + РасширениеПуть = ОбъединитьПути("tests", "fixtures", "exts", "ADDTST"); + РодительПуть = ОбъединитьПути("tests", "fixtures", "configuration"); + ПоставкаПуть = ОбъединитьПути("tests", "fixtures", "release"); + + ОбъектНастроек = ПараметрыПриложения; + + // Логирование + Лог = Логирование.ПолучитьЛог(ОбъектНастроек.ИмяЛогаСистемы()); + Лог.УстановитьРаскладку(ОбъектНастроек); + + Парсер = Новый ПарсерМодулейРасширения(РасширениеПуть); + + МенеджерВременныхФайлов = Новый МенеджерВременныхФайлов; + +КонецПроцедуры + +Процедура ПослеЗапускаТеста() Экспорт + + МенеджерВременныхФайлов.Удалить(); + +КонецПроцедуры + +/////////////////////////////////////////////////////////////////// +// Шаги +/////////////////////////////////////////////////////////////////// + +Процедура ТестПарсера_ПолучитьПрефиксРасширения() Экспорт + + ФайлКонфигурации = ОбъединитьПути(РасширениеПуть, "Configuration.xml"); + Префикс = Парсер.ПрочитатьПрефиксРасширения(ФайлКонфигурации); + + Утверждения.ПроверитьРавенство("ADDTST", Префикс); + +КонецПроцедуры + +Процедура ТестПарсера_ВыполнитьЧтениеМетодовМодуля() Экспорт + + ФайлКонфигурации = ОбъединитьПути(РасширениеПуть, "Configuration.xml"); + Префикс = Парсер.ПрочитатьПрефиксРасширения(ФайлКонфигурации); + + ТипОбъектов = "Documents"; + + Объекты = Парсер.ПолучитьФайлыОбъектов(ТипОбъектов); // Получаем документы + Модули = Парсер.ПолучитьФайлыМодулей(ТипОбъектов, Объекты[0].ИмяБезРасширения); // Получаем модули + + Методы = Парсер.ПрочитатьМетодыМодуля(Модули[0], Префикс); + + Утверждения.ПроверитьБольше(Методы.Количество(), 0); + +КонецПроцедуры + +Процедура ТестПарсера_ПолучитьПереопределенныеОбъекты() Экспорт + + Объекты = Парсер.ПолучитьПереопределенныеОбъекты(); + + Утверждения.ПроверитьБольше(Объекты.Количество(), 0); + +КонецПроцедуры + +Процедура ТестПарсера_ПрочитатьМетодыОсновнойКонфигурации() Экспорт + + ФайлКонфигурации = ОбъединитьПути(РасширениеПуть, "Configuration.xml"); + Префикс = Парсер.ПрочитатьПрефиксРасширения(ФайлКонфигурации); + + ТипыКонфигурации = Парсер.ПолучитьПереопределенныеОбъекты(); + + ОбъектыЕсть = Ложь; + Для каждого ТипРасширения Из ТипыКонфигурации Цикл + Если ТипРасширения.Объекты.Количество() Тогда + + ОбъектыЕсть = Истина; + + ОбъектРасширения = ТипРасширения.Объекты[0]; + ФайлМодуля = ОбъектРасширения.Модули[0]; // и первый модуль + МодульОбъекта = ФайлМодуля.ФайлМодуля; + ФайлМодуля.Вставить("Методы", Парсер.ПрочитатьМетодыМодуля(МодульОбъекта, Префикс)); // заполняем методы + + Парсер.ПрочитатьМетодыОсновнойКонфигурации(МодульОбъекта, ФайлМодуля, РодительПуть, "Родитель"); // сопоставляем с родительской конфигурацией + + Прервать; + + КонецЕсли; + КонецЦикла; + + Утверждения.ПроверитьИстину(ОбъектыЕсть, "методы не обнаружены"); + +КонецПроцедуры + +Процедура ТестПриложения_ПолучитьРезультатСравнения() Экспорт + + РезультатСравнения = РезультатСравненияРасширения.ПолучитьРезультатСравнения( + РодительПуть, + ПоставкаПуть, + РасширениеПуть, + Лог); + + Утверждения.ПроверитьБольше(РезультатСравнения.Типы.Количество(), 0, "нет типов в результате сравнения"); + +КонецПроцедуры + +Процедура ТестПриложения_СохранитьРезультатСравнения() Экспорт + + ФайлРезультатИмя = МенеджерВременныхФайлов.СоздатьФайл("HTML"); + + РезультатСравнения = РезультатСравненияРасширения.ПолучитьРезультатСравнения( + РодительПуть, + ПоставкаПуть, + РасширениеПуть, + Лог); + + Генератор = Новый ГенераторОтчета; + Генератор.СохранитьРезультат(РезультатСравнения, ФайлРезультатИмя, Лог, "HTML"); + + ТекстРезультат = Новый ТекстовыйДокумент(); + ТекстРезультат.Прочитать(ФайлРезультатИмя, КодировкаТекста.UTF8NoBOM); + + Утверждения.ПроверитьВхождение(ТекстРезультат.ПолучитьТекст(), "", "текст не соответствует шаблону"); + +КонецПроцедуры + +/////////////////////////////////////////////////////////////////// + +Процедура ТестПриложения_ПолучитьРезультатСравненияОбъектов() Экспорт + + РезультатСравнения = АнализаторОбъектов.ВыполнитьСравнениеОбъектов(РодительПуть, ПоставкаПуть, Лог); + + Утверждения.ПроверитьБольше(РезультатСравнения.Типы.Количество(), 0, "нет типов в результате сравнения"); + +КонецПроцедуры + +/////////////////////////////////////////////////////////////////// +// Служебный функционал +/////////////////////////////////////////////////////////////////// +