├── .gitignore
├── Jenkinsfile
├── tests
├── fixtures
│ ├── configuration
│ │ ├── CommonModules
│ │ │ ├── ОбщийМодульТест
│ │ │ │ └── Ext
│ │ │ │ │ └── Module.bsl
│ │ │ └── ОбщийМодульТест.xml
│ │ ├── Documents
│ │ │ ├── ТестовыйДокумент
│ │ │ │ ├── Ext
│ │ │ │ │ └── ObjectModule.bsl
│ │ │ │ └── Forms
│ │ │ │ │ ├── ФормаДокумента
│ │ │ │ │ └── Ext
│ │ │ │ │ │ ├── Form
│ │ │ │ │ │ └── Module.bsl
│ │ │ │ │ │ └── Form.xml
│ │ │ │ │ └── ФормаДокумента.xml
│ │ │ └── ТестовыйДокумент.xml
│ │ ├── Roles
│ │ │ ├── Администратор
│ │ │ │ └── Ext
│ │ │ │ │ └── Rights.xml
│ │ │ └── Администратор.xml
│ │ ├── Languages
│ │ │ └── Русский.xml
│ │ ├── Subsystems
│ │ │ └── ПодсистемаТест.xml
│ │ ├── ConfigDumpInfo.xml
│ │ ├── Catalogs
│ │ │ └── Справочник1.xml
│ │ └── Configuration.xml
│ ├── release
│ │ ├── CommonModules
│ │ │ ├── ОбщийМодульТест
│ │ │ │ └── Ext
│ │ │ │ │ └── Module.bsl
│ │ │ └── ОбщийМодульТест.xml
│ │ ├── Documents
│ │ │ ├── ТестовыйДокумент
│ │ │ │ ├── Ext
│ │ │ │ │ └── ObjectModule.bsl
│ │ │ │ └── Forms
│ │ │ │ │ ├── ФормаДокумента
│ │ │ │ │ └── Ext
│ │ │ │ │ │ ├── Form
│ │ │ │ │ │ └── Module.bsl
│ │ │ │ │ │ └── Form.xml
│ │ │ │ │ └── ФормаДокумента.xml
│ │ │ └── ТестовыйДокумент.xml
│ │ ├── Roles
│ │ │ ├── Администратор
│ │ │ │ └── Ext
│ │ │ │ │ └── Rights.xml
│ │ │ └── Администратор.xml
│ │ ├── Languages
│ │ │ └── Русский.xml
│ │ ├── Subsystems
│ │ │ └── ПодсистемаТест.xml
│ │ ├── ConfigDumpInfo.xml
│ │ └── Configuration.xml
│ └── exts
│ │ └── ADDTST
│ │ ├── CommonModules
│ │ ├── ОбщийМодульТест
│ │ │ └── Ext
│ │ │ │ └── Module.bsl
│ │ └── ОбщийМодульТест.xml
│ │ ├── Documents
│ │ ├── ТестовыйДокумент
│ │ │ └── Forms
│ │ │ │ ├── ФормаДокумента
│ │ │ │ └── Ext
│ │ │ │ │ ├── Form
│ │ │ │ │ └── Module.bsl
│ │ │ │ │ └── Form.xml
│ │ │ │ └── ФормаДокумента.xml
│ │ └── ТестовыйДокумент.xml
│ │ ├── Languages
│ │ └── Русский.xml
│ │ ├── ConfigDumpInfo.xml
│ │ └── Configuration.xml
└── test-app.os
├── installlocalhost.bat
├── tasks
├── test-feature.os
└── test.os
├── features
├── opm-build.feature
├── step_definitions
│ └── diff3cf_feature.os
├── ПростыеКоманды.feature
└── ВыполнениеСравнения.feature
├── src
├── main.os
├── Классы
│ ├── КомандаVersion.os
│ ├── КомандаСправкаПоПараметрам.os
│ ├── ГенераторОтчета.os
│ ├── КомандаАнализОбъектов.os
│ ├── КомандаСравнение.os
│ └── ПарсерМодулейРасширения.os
└── Модули
│ ├── ТипыОбъектов.os
│ ├── РезультатСравненияРасширения.os
│ ├── ПараметрыПриложения.os
│ ├── АнализаторОбъектов.os
│ ├── МенеджерПриложения.os
│ └── ГенераторОтчетаHTML.os
├── packagedef
├── LICENSE
└── README.md
/.gitignore:
--------------------------------------------------------------------------------
1 | bdd-log.xml
2 | *.ospx
3 |
4 | /exec.log
5 |
6 | *.orig
7 |
8 | /tests.xml
9 |
--------------------------------------------------------------------------------
/Jenkinsfile:
--------------------------------------------------------------------------------
1 | @Library(['jenkins-lib-core', 'jenkins-lib-oscript']) _
2 | opmPipeline()
3 |
--------------------------------------------------------------------------------
/tests/fixtures/configuration/CommonModules/ОбщийМодульТест/Ext/Module.bsl:
--------------------------------------------------------------------------------
1 | Процедура ТестПроцедуры()
2 |
3 | Тест = "Это просто тестирование сравнения конфигураций";
4 |
5 | КонецПроцедуры
--------------------------------------------------------------------------------
/tests/fixtures/release/CommonModules/ОбщийМодульТест/Ext/Module.bsl:
--------------------------------------------------------------------------------
1 | Процедура ТестПроцедуры()
2 |
3 | Тест = "Это просто тестирование сравнения конфигураций";
4 |
5 | Тест = Тест + " дополнен в обновлении...";
6 |
7 | КонецПроцедуры
--------------------------------------------------------------------------------
/tests/fixtures/release/Documents/ТестовыйДокумент/Ext/ObjectModule.bsl:
--------------------------------------------------------------------------------
1 |
2 | Процедура ОбработкаПроведения(Отказ, РежимПроведения)
3 |
4 | Тест = "Это просто тестирование сравнения конфигураций в модуле документа";
5 |
6 | КонецПроцедуры
7 |
--------------------------------------------------------------------------------
/tests/fixtures/configuration/Documents/ТестовыйДокумент/Ext/ObjectModule.bsl:
--------------------------------------------------------------------------------
1 |
2 | Процедура ОбработкаПроведения(Отказ, РежимПроведения)
3 |
4 | Тест = "Это просто тестирование сравнения конфигураций в модуле документа";
5 |
6 | КонецПроцедуры
7 |
--------------------------------------------------------------------------------
/tests/fixtures/exts/ADDTST/CommonModules/ОбщийМодульТест/Ext/Module.bsl:
--------------------------------------------------------------------------------
1 |
2 | &Вместо("ТестПроцедуры")
3 | Процедура ADDTSTТестПроцедуры()
4 | // Вставить содержимое метода.
5 |
6 | Тест = "Переопределение в расширении";
7 |
8 | КонецПроцедуры
9 |
--------------------------------------------------------------------------------
/tests/fixtures/exts/ADDTST/Documents/ТестовыйДокумент/Forms/ФормаДокумента/Ext/Form/Module.bsl:
--------------------------------------------------------------------------------
1 |
2 | &НаСервере
3 | Процедура ADDTSTПриСозданииНаСервереВместо(Отказ, СтандартнаяОбработка)
4 |
5 | Тест = "Это переопределение обработчика в форме документа";
6 |
7 | КонецПроцедуры
8 |
--------------------------------------------------------------------------------
/tests/fixtures/configuration/Documents/ТестовыйДокумент/Forms/ФормаДокумента/Ext/Form/Module.bsl:
--------------------------------------------------------------------------------
1 |
2 | &НаСервере
3 | Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
4 |
5 | Тест = "Это просто тестирование сравнения конфигураций в форме документа";
6 |
7 | КонецПроцедуры
8 |
--------------------------------------------------------------------------------
/installlocalhost.bat:
--------------------------------------------------------------------------------
1 | @echo off
2 | call del "*.ospx"
3 |
4 | for /f %%i in ('"oscript -version"') do set result=%%i
5 |
6 | if %result%==1.0.19.105 (
7 | call opm build . -mf ./packagedef -out .
8 | ) else (
9 | call opm build -m ./packagedef -o .
10 | )
11 |
12 | call opm install -f *.ospx
--------------------------------------------------------------------------------
/tests/fixtures/release/Documents/ТестовыйДокумент/Forms/ФормаДокумента/Ext/Form/Module.bsl:
--------------------------------------------------------------------------------
1 |
2 | &НаСервере
3 | Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
4 |
5 | Тест = "Это просто тестирование сравнения конфигураций в форме документа";
6 |
7 | Тест = Тест + " дополнен в обновлении...";
8 |
9 | КонецПроцедуры
10 |
--------------------------------------------------------------------------------
/tasks/test-feature.os:
--------------------------------------------------------------------------------
1 | #Использовать ".."
2 | #Использовать 1bdd
3 |
4 | КаталогФич = ОбъединитьПути(".", "features");
5 | ПутьФичи = ОбъединитьПути(".", "features", АргументыКоманднойСтроки[0]);
6 | Файл_КаталогФич = Новый Файл(КаталогФич);
7 | ФайлФичи = Новый Файл(ПутьФичи);
8 |
9 | ИсполнительБДД = Новый ИсполнительБДД;
10 | РезультатВыполнения = ИсполнительБДД.ВыполнитьФичу(ФайлФичи, Файл_КаталогФич);
11 | ИтоговыйРезультатВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатВыполнения);
12 |
13 | Сообщить(ИтоговыйРезультатВыполнения);
14 | Если ИтоговыйРезультатВыполнения = ИсполнительБДД.ВозможныеСтатусыВыполнения().Сломался Тогда
15 |
16 | ВызватьИсключение 1;
17 |
18 | КонецЕсли;
19 |
--------------------------------------------------------------------------------
/features/opm-build.feature:
--------------------------------------------------------------------------------
1 | # language: ru
2 |
3 | Функционал: Проверка сборки продукта
4 | Как Пользователь
5 | Я хочу автоматически проверять сборку моего продукта
6 | Чтобы гарантировать возможность установку моего продукта у пользователей
7 |
8 | Контекст: Отключение отладки в логах
9 | Допустим Я выключаю отладку лога с именем "oscript.lib.commands"
10 | И Я очищаю параметры команды "opm" в контексте
11 |
12 | Сценарий: Выполнение команды без параметров
13 | Когда Я добавляю параметр "build ." для команды "opm"
14 | И Я выполняю команду "opm"
15 | Тогда Вывод команды "opm" содержит "Сборка пакета завершена"
16 | И Вывод команды "opm" не содержит "Внешнее исключение"
17 | И Код возврата команды "opm" равен 0
18 |
--------------------------------------------------------------------------------
/src/main.os:
--------------------------------------------------------------------------------
1 | ///////////////////////////////////////////////////////////////////////////////
2 | //
3 | // Приложение генерации отчета об измененных объектах, переопределенных в расширении
4 | //
5 | // (с) BIA Technologies, LLC
6 | //
7 | ///////////////////////////////////////////////////////////////////////////////
8 |
9 | #Использовать "."
10 |
11 | ///////////////////////////////////////////////////////////////////////////////
12 |
13 | Приложение = МенеджерПриложения.Инициализировать(ПараметрыПриложения);
14 |
15 | Попытка
16 |
17 | Приложение.ЗавершитьРаботуПриложения(Приложение.ЗапуститьВыполнение());
18 |
19 | Исключение
20 |
21 | Приложение.ЗавершитьРаботуПриложенияСОшибкой(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
22 |
23 | КонецПопытки;
24 |
--------------------------------------------------------------------------------
/packagedef:
--------------------------------------------------------------------------------
1 | ПутьКСценариюПараметров = ОбъединитьПути(ТекущийСценарий().Каталог, "src", "Модули", "ПараметрыПриложения.os");
2 | ПараметрыСистемы_ЛокальнаяВерсия = ЗагрузитьСценарий(ПутьКСценариюПараметров);
3 |
4 | ИмяПродукта = НРег(ПараметрыСистемы_ЛокальнаяВерсия.ИмяПродукта());
5 |
6 | Описание.Имя(ИмяПродукта)
7 | .ВерсияСреды("1.9.0.6")
8 | .Версия(ПараметрыСистемы_ЛокальнаяВерсия.ВерсияПродукта())
9 | .ЗависитОт("logos", "1.7.0")
10 | .ЗависитОт("cmdline", "1.0.0")
11 | .РазработкаЗависитОт("1bdd")
12 | .РазработкаЗависитОт("1testrunner")
13 | .РазработкаЗависитОт("asserts")
14 | .РазработкаЗависитОт("tempfiles", "1.1.1")
15 | .РазработкаЗависитОт("fs")
16 | .РазработкаЗависитОт("coverage")
17 | .ВключитьФайл("src")
18 | .ВключитьФайл("LICENSE")
19 | .ВключитьФайл("README.md")
20 | .ИсполняемыйФайл("src/main.os", ИмяПродукта);
21 |
--------------------------------------------------------------------------------
/tests/fixtures/release/Roles/Администратор/Ext/Rights.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | true
4 | true
5 | false
6 |
17 |
24 |
--------------------------------------------------------------------------------
/tests/fixtures/configuration/Roles/Администратор/Ext/Rights.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | true
4 | true
5 | false
6 |
17 |
24 |
--------------------------------------------------------------------------------
/src/Классы/КомандаVersion.os:
--------------------------------------------------------------------------------
1 | ///////////////////////////////////////////////////////////////////////////////
2 | //
3 | // Служебный модуль с реализацией работы команды version
4 | //
5 | ///////////////////////////////////////////////////////////////////////////////
6 |
7 | // настрока команды
8 | //
9 | // Параметры:
10 | // Команда - ОписаниеКоманды - Соответствие ключей командной строки и их значений
11 | // Приложение - Модуль - Модуль менеджера приложения
12 | //
13 | Процедура НастроитьКоманду(Знач Команда, Знач Парсер) Экспорт
14 |
15 | КонецПроцедуры // НастроитьКоманду
16 |
17 | // Выполняет логику команды
18 | //
19 | // Параметры:
20 | // ПараметрыКоманды - Соответствие - Соответствие ключей командной строки и их значений
21 | // Приложение - Модуль - Модуль менеджера приложения
22 | //
23 | Функция ВыполнитьКоманду(Знач ПараметрыКоманды, Знач Приложение) Экспорт
24 |
25 | Лог = Приложение.ПолучитьЛог();
26 |
27 | Сообщить(Приложение.ВерсияПродукта());
28 |
29 | Лог.Отладка("Вывод версии приложения");
30 |
31 | Возврат Приложение.РезультатыКоманд().Успех;
32 |
33 | КонецФункции // ВыполнитьКоманду
34 |
--------------------------------------------------------------------------------
/tests/fixtures/exts/ADDTST/Languages/Русский.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Русский
6 | Adopted
7 | ru
8 |
9 |
10 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2016 Andrei Ovsiankin
4 | Copyright (c) 2019-2024 BIA Technologies, LLC
5 |
6 | Permission is hereby granted, free of charge, to any person obtaining a copy
7 | of this software and associated documentation files (the "Software"), to deal
8 | in the Software without restriction, including without limitation the rights
9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | copies of the Software, and to permit persons to whom the Software is
11 | furnished to do so, subject to the following conditions:
12 |
13 | The above copyright notice and this permission notice shall be included in all
14 | copies or substantial portions of the Software.
15 |
16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 | SOFTWARE.
23 |
--------------------------------------------------------------------------------
/tests/fixtures/exts/ADDTST/Documents/ТестовыйДокумент/Forms/ФормаДокумента.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
10 |
--------------------------------------------------------------------------------
/tests/fixtures/release/Roles/Администратор.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Администратор
6 |
7 |
8 | ru
9 | Администратор
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/tests/fixtures/configuration/Roles/Администратор.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Администратор
6 |
7 |
8 | ru
9 | Администратор
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/tests/fixtures/release/Languages/Русский.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Русский
6 |
7 |
8 | ru
9 | Русский
10 |
11 |
12 |
13 | ru
14 |
15 |
16 |
--------------------------------------------------------------------------------
/tests/fixtures/configuration/Languages/Русский.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Русский
6 |
7 |
8 | ru
9 | Русский
10 |
11 |
12 |
13 | ru
14 |
15 |
16 |
--------------------------------------------------------------------------------
/features/step_definitions/diff3cf_feature.os:
--------------------------------------------------------------------------------
1 | // Реализация шагов BDD-фич/сценариев c помощью фреймворка https://github.com/artbear/1bdd
2 |
3 | #Использовать gitrunner
4 | #Использовать tempfiles
5 | #Использовать asserts
6 |
7 | Перем БДД;
8 |
9 | Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт
10 |
11 | БДД = КонтекстФреймворкаBDD;
12 |
13 | ВсеШаги = Новый Массив;
14 | ВсеШаги.Добавить("ЯСоздаюВременныйКаталогИЗапоминаюЕгоКак");
15 | ВсеШаги.Добавить("ЯПереключаюсьВоВременныйКаталог");
16 |
17 | Возврат ВсеШаги;
18 | КонецФункции
19 |
20 | // я создаю временный каталог и запоминаю его как "Алиас"
21 | Процедура ЯСоздаюВременныйКаталогИЗапоминаюЕгоКак(Алиас) Экспорт
22 |
23 | НовыйВременныйКаталог = ВременныеФайлы.СоздатьКаталог();
24 | СоздатьКаталог(НовыйВременныйКаталог);
25 |
26 | БДД.СохранитьВКонтекст(Алиас, НовыйВременныйКаталог);
27 |
28 | КонецПроцедуры
29 |
30 | // я переключаюсь во временный каталог "АлиасКаталога"
31 | Процедура ЯПереключаюсьВоВременныйКаталог(АлиасКаталога)Экспорт
32 |
33 | КаталогСкрипта = БДД.ПолучитьИзКонтекста("КаталогПроекта");
34 | Если НЕ ЗначениеЗаполнено(КаталогСкрипта) Тогда
35 |
36 | БДД.СохранитьВКонтекст("КаталогПроекта", ТекущийКаталог());
37 |
38 | КонецЕсли;
39 |
40 | КаталогРепозиториев = БДД.ПолучитьИзКонтекста(АлиасКаталога);
41 | УстановитьТекущийКаталог(КаталогРепозиториев);
42 |
43 | КонецПроцедуры
44 |
--------------------------------------------------------------------------------
/tests/fixtures/exts/ADDTST/CommonModules/ОбщийМодульТест.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | ОбщийМодульТест
6 | Adopted
7 | false
8 | false
9 | true
10 | false
11 | false
12 | false
13 |
14 |
15 |
--------------------------------------------------------------------------------
/tests/fixtures/exts/ADDTST/ConfigDumpInfo.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/src/Модули/ТипыОбъектов.os:
--------------------------------------------------------------------------------
1 | Перем ОбъектыКонфигурации Экспорт;
2 |
3 | ///////////////////////////////////////////////////////////////////////////////////////////////
4 | ОбъектыКонфигурации = Новый Массив();
5 | ОбъектыКонфигурации.Добавить("AccountingRegisters");
6 | ОбъектыКонфигурации.Добавить("AccumulationRegisters");
7 | ОбъектыКонфигурации.Добавить("BusinessProcesses");
8 | ОбъектыКонфигурации.Добавить("CalculationRegisters");
9 | ОбъектыКонфигурации.Добавить("Catalogs");
10 | ОбъектыКонфигурации.Добавить("ChartsOfAccounts");
11 | ОбъектыКонфигурации.Добавить("ChartsOfCalculationTypes");
12 | ОбъектыКонфигурации.Добавить("ChartsOfCharacteristicTypes");
13 | ОбъектыКонфигурации.Добавить("CommonCommands");
14 | ОбъектыКонфигурации.Добавить("CommonForms");
15 | ОбъектыКонфигурации.Добавить("CommonModules");
16 | ОбъектыКонфигурации.Добавить("Constants");
17 | ОбъектыКонфигурации.Добавить("DataProcessors");
18 | ОбъектыКонфигурации.Добавить("DocumentJournals");
19 | ОбъектыКонфигурации.Добавить("Documents");
20 | ОбъектыКонфигурации.Добавить("Enums");
21 | ОбъектыКонфигурации.Добавить("ExchangePlans");
22 | ОбъектыКонфигурации.Добавить("Ext");
23 | ОбъектыКонфигурации.Добавить("FilterCriteria");
24 | ОбъектыКонфигурации.Добавить("HTTPServices");
25 | ОбъектыКонфигурации.Добавить("InformationRegisters");
26 | ОбъектыКонфигурации.Добавить("Reports");
27 | ОбъектыКонфигурации.Добавить("SettingsStorages");
28 | ОбъектыКонфигурации.Добавить("Tasks");
29 | ОбъектыКонфигурации.Добавить("WebServices");
30 |
--------------------------------------------------------------------------------
/src/Классы/КомандаСправкаПоПараметрам.os:
--------------------------------------------------------------------------------
1 | ///////////////////////////////////////////////////////////////////////////////
2 | //
3 | // Служебный модуль с реализацией работы команды help
4 | //
5 | ///////////////////////////////////////////////////////////////////////////////
6 |
7 | // настрока команды
8 | //
9 | // Параметры:
10 | // Команда - ОписаниеКоманды - Соответствие ключей командной строки и их значений
11 | // Приложение - Модуль - Модуль менеджера приложения
12 | //
13 | Процедура НастроитьКоманду(Знач Команда, Знач Парсер) Экспорт
14 |
15 | Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "Команда");
16 |
17 | КонецПроцедуры // НастроитьКоманду
18 |
19 | // Выполняет логику команды
20 | //
21 | // Параметры:
22 | // ПараметрыКоманды - Соответствие - Соответствие ключей командной строки и их значений
23 | // Приложение - Модуль - Модуль менеджера приложения
24 | //
25 | Функция ВыполнитьКоманду(Знач ПараметрыКоманды, Знач Приложение) Экспорт
26 |
27 | Лог = Приложение.ПолучитьЛог();
28 |
29 | КомандаДляСправки = ПараметрыКоманды["Команда"];
30 |
31 | Если КомандаДляСправки = Неопределено Тогда
32 |
33 | Приложение.ВывестиСправкуПоКомандам();
34 |
35 | Лог.Отладка("Вывод справки по командам");
36 |
37 | Иначе
38 |
39 | Приложение.ВывестиСправкуПоКоманде(КомандаДляСправки);
40 |
41 | Лог.Отладка(СтрШаблон("Вывод справки по команде %1", КомандаДляСправки));
42 |
43 | КонецЕсли;
44 |
45 | Возврат Приложение.РезультатыКоманд().Успех;
46 |
47 | КонецФункции // ВыполнитьКоманду
48 |
--------------------------------------------------------------------------------
/tests/fixtures/release/Documents/ТестовыйДокумент/Forms/ФормаДокумента.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
21 |
--------------------------------------------------------------------------------
/tests/fixtures/configuration/Documents/ТестовыйДокумент/Forms/ФормаДокумента.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
21 |
--------------------------------------------------------------------------------
/tests/fixtures/release/Subsystems/ПодсистемаТест.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | ПодсистемаТест
6 |
7 |
8 | ru
9 | Подсистема тест
10 |
11 |
12 |
13 | true
14 | true
15 |
16 |
17 |
18 | CommonModule.ОбщийМодульТест
19 | Document.ТестовыйДокумент
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/tests/fixtures/release/CommonModules/ОбщийМодульТест.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | ОбщийМодульТест
6 |
7 |
8 | ru
9 | Общий модуль тест
10 |
11 |
12 |
13 | false
14 | false
15 | true
16 | false
17 | false
18 | false
19 | false
20 | DontUse
21 |
22 |
23 |
--------------------------------------------------------------------------------
/tests/fixtures/configuration/CommonModules/ОбщийМодульТест.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | ОбщийМодульТест
6 |
7 |
8 | ru
9 | Общий модуль тест
10 |
11 |
12 |
13 | false
14 | false
15 | true
16 | false
17 | false
18 | false
19 | false
20 | DontUse
21 |
22 |
23 |
--------------------------------------------------------------------------------
/features/ПростыеКоманды.feature:
--------------------------------------------------------------------------------
1 | # language: ru
2 |
3 | Функциональность: Выполнение команды продукта
4 |
5 | Как разработчик
6 | Я хочу иметь возможность выполнять команды продукта
7 | Чтобы выполнять коллективную разработку приложения для OneScript
8 |
9 | Контекст:
10 | Допустим Я очищаю параметры команды "oscript" в контексте
11 | И я включаю отладку лога с именем "oscript.app.diff3cf"
12 | # И я включаю отладку лога с именем "bdd"
13 |
14 | Сценарий: Получение версии продукта
15 | Когда Я выполняю команду "oscript" с параметрами "src/main.os version"
16 | Тогда Я сообщаю вывод команды "oscript"
17 | И Вывод команды "oscript" содержит "24.05"
18 | И Вывод команды "oscript" не содержит "diff3cf v"
19 | И Код возврата команды "oscript" равен 0
20 |
21 | Сценарий: Получение помощи продукта
22 | Когда Я выполняю команду "oscript" с параметрами "src/main.os help"
23 | Тогда Вывод команды "oscript" содержит
24 | """
25 | diff3cf v24.05
26 | Возможные команды:
27 | help - Выводит справку по командам
28 | version - Выводит версию приложения
29 | diff - Выполняет сравнение расширения с основной конфигурацией и новой поставкой
30 | """
31 | И Код возврата команды "oscript" равен 0
32 |
33 | Сценарий: Вызов исполняемого файла без параметров
34 | Когда Я выполняю команду "oscript" с параметрами "src/main.os"
35 | Тогда Вывод команды "oscript" содержит
36 | """
37 | diff3cf v24.05
38 | Возможные команды:
39 | help - Выводит справку по командам
40 | version - Выводит версию приложения
41 | diff - Выполняет сравнение расширения с основной конфигурацией и новой поставкой
42 | """
43 | И Код возврата команды "oscript" равен 5
44 |
--------------------------------------------------------------------------------
/tests/fixtures/configuration/Subsystems/ПодсистемаТест.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | ПодсистемаТест
6 |
7 |
8 | ru
9 | Подсистема тест
10 |
11 |
12 |
13 | true
14 | true
15 |
16 |
17 |
18 | CommonModule.ОбщийМодульТест
19 | Document.ТестовыйДокумент
20 | Catalog.Справочник1
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/features/ВыполнениеСравнения.feature:
--------------------------------------------------------------------------------
1 | # language: ru
2 |
3 | Функциональность: Выполнение прекоммита
4 |
5 | Как разработчик
6 | Я хочу быть уверенным, что diff3cf корректно сравнивает две конфигурации и расширение
7 |
8 | Контекст:
9 | Допустим Я очищаю параметры команды "oscript" в контексте
10 | И я включаю отладку лога с именем "oscript.app.diff3cf"
11 | И я создаю временный каталог и запоминаю его как "КаталогРезультат"
12 | И я переключаюсь во временный каталог "КаталогРезультат"
13 |
14 | Сценарий: Сравнение основной конфигурации конфигурации поставки и расширения
15 | Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os diff <КаталогПроекта>/tests/fixtures/configuration <КаталогПроекта>/tests/fixtures/release <КаталогПроекта>/tests/fixtures/exts/ADDTST report.html"
16 | Тогда Я сообщаю вывод команды "oscript"
17 | И Вывод команды "oscript" содержит "Сохранение отчета..."
18 | И Вывод команды "oscript" не содержит "Ошибка"
19 |
20 | Сценарий: Справнение с неполным набором параметров (без файла отчета)
21 | Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os diff <КаталогПроекта>/tests/fixtures/configuration <КаталогПроекта>/tests/fixtures/release <КаталогПроекта>/tests/fixtures/exts/ADDTST"
22 | Тогда Я сообщаю вывод команды "oscript"
23 | И Вывод команды "oscript" содержит "Сохранение отчета..."
24 | И Вывод команды "oscript" содержит "ОШИБКА - Не удалось сохранить результат в"
25 |
26 | Сценарий: Сравнение основной конфигурации и конфигурации поставки
27 | Когда Я выполняю команду "oscript" с параметрами "<КаталогПроекта>/src/main.os objects <КаталогПроекта>/tests/fixtures/configuration <КаталогПроекта>/tests/fixtures/release report.txt"
28 | Тогда Я сообщаю вывод команды "oscript"
29 | И Вывод команды "oscript" содержит "Сохраняем результат сравнения"
30 | И Вывод команды "oscript" не содержит "Ошибка"
31 |
--------------------------------------------------------------------------------
/tests/fixtures/release/ConfigDumpInfo.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/tests/fixtures/release/Documents/ТестовыйДокумент/Forms/ФормаДокумента/Ext/Form.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/tests/fixtures/configuration/Documents/ТестовыйДокумент/Forms/ФормаДокумента/Ext/Form.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Утилита для автоматического сравнения переопределенных в расширении модулей измененных в новом релизе поставки основной конфигурации
2 |
3 | ## Особенности данного решения
4 | - скрипт автоматически сравнивает конфигурации и расширение, выгруженные в формате XML (выгрузка из конфигуратора)
5 | - расширение также должно быть выгружено в формате XML
6 | - помимо стандартных модулей реализована возможность сравнивать обработки заполнения вынесенные из форм документов в обработки
7 | - результат сравнения сохраняется в файл отчет в формате HTML
8 |
9 | ## Установка
10 |
11 | Установка на компьютер стандартна
12 |
13 | - склонировать репозиторий или
14 | - распаковать в нужный каталог архив репозитория или
15 | - для Windows запустить [installlocalhost.bat](/installlocalhost.bat)
16 |
17 | ## Использование
18 | Приложение позволяет сравнивать переопределенные в расширении методы, а также изменение структуры метаданных. Для каждого из этих режимов реализованы соответствующие команды.
19 |
20 | Возможные команды:
21 | help - Выводит справку по командам
22 | version - Выводит версию приложения
23 | diff - Выполняет сравнение расширения с основной конфигурацией и новой поставкой
24 | objects - Выполняет анализ изменения объектов из основной конфигурации в новой поставке
25 |
26 | diff - Выполняет сравнение расширения с основной конфигурацией и новой поставкой
27 | Параметры:
28 | <КаталогОсновнойКонфигурации> - Каталог основной конфигурации
29 | <КаталогПоставки> - Каталог поставки
30 | <КаталогРасширения> - Каталог расширения
31 | <ФайлРезультат> - Файл-отчет, результат сравнения конфигураций
32 |
33 | Перед использованием необходимо выгрузить релиз поставки в формате XML в произвольный каталог
34 |
35 | - для сравнения обработок заполнения в свойствах обработки в поле комментарий необходимо указать переопределенный модуль в формате:
36 | "Adopted.Documents\<Имя документа>\<Путь к модулю>\<ИмяМодуля.bsl>"
37 | Например: Adopted.Documents\Отгул\Forms\ФормаДокумента\Ext\Form\Module.bsl
38 |
39 | - пример вызова для получения анализа переопределенных методов:
40 | diff3cf diff <каталог основной конфигурации> <каталог с релизом поставки> <каталог с расширением> <файл результат>.html
41 |
42 | - пример вызова для получения анализа изменения структуры метаданных:
43 | diff3cf objects <каталог основной конфигурации> <каталог с релизом поставки> <файл результат>.txt
44 |
--------------------------------------------------------------------------------
/src/Модули/РезультатСравненияРасширения.os:
--------------------------------------------------------------------------------
1 | ///////////////////////////////////////////////////////////////////////////////
2 | //
3 | // Служебный модуль получения результата сравнения расширения, основной конфы и поставки
4 | //
5 | // (с) BIA Technologies, LLC
6 | //
7 | ///////////////////////////////////////////////////////////////////////////////
8 |
9 | // Сравнивает три конфигурации - Родитель, Поставка и Расширение
10 | //
11 | // Параметры:
12 | // РодительПуть - Строка - Каталог конфигурации Родитель
13 | // ПоставкаПуть - Строка - Каталог конфигурации Поставка
14 | // РасширениеПуть - Строка - Каталог конфигурации Расширение
15 | // Лог - log-manager - Экземпляр класса логирования
16 | //
17 | // Возвращаемое значение:
18 | // Структура - результат сравнения
19 | //
20 | Функция ПолучитьРезультатСравнения(РодительПуть, ПоставкаПуть, РасширениеПуть, Лог) Экспорт
21 |
22 | РасширениеОписание = Новый Структура("Префикс, Типы");
23 |
24 | РасширениеОписание.Вставить("РодительПуть", РодительПуть);
25 | РасширениеОписание.Вставить("ПоставкаПуть", ПоставкаПуть);
26 | РасширениеОписание.Вставить("РасширениеПуть", РасширениеПуть);
27 |
28 | Парсер = Новый ПарсерМодулейРасширения(РасширениеПуть);
29 |
30 | ФайлКонфигурации = ОбъединитьПути(РасширениеПуть, "Configuration.xml");
31 | РасширениеОписание.Префикс = Парсер.ПрочитатьПрефиксРасширения(ФайлКонфигурации);
32 |
33 | // Получить переопределенные объекты (файлы xml и bsl)
34 | РасширениеОписание.Типы = Парсер.ПолучитьПереопределенныеОбъекты();
35 | Для каждого ТипРасширения Из РасширениеОписание.Типы Цикл
36 |
37 | Для каждого ОбъектРасширения Из ТипРасширения.Объекты Цикл
38 |
39 | Лог.Информация(ОбъектРасширения.Тип + " - " + ОбъектРасширения.Имя);
40 | Для каждого ФайлМодуля Из ОбъектРасширения.Модули Цикл
41 |
42 | МодульОбъекта = ФайлМодуля.ФайлМодуля;
43 |
44 | ФайлМодуля.Вставить("Методы", Парсер.ПрочитатьМетодыМодуля(МодульОбъекта, РасширениеОписание.Префикс));
45 |
46 | // читаем и раскладываем модуль родителя
47 | Парсер.ПрочитатьМетодыОсновнойКонфигурации(МодульОбъекта, ФайлМодуля, РодительПуть, "Родитель");
48 |
49 | // читаем и раскладываем модуль поставки
50 | Парсер.ПрочитатьМетодыОсновнойКонфигурации(МодульОбъекта, ФайлМодуля, ПоставкаПуть, "Поставка");
51 |
52 | КонецЦикла;
53 |
54 | КонецЦикла;
55 |
56 | КонецЦикла;
57 |
58 | Возврат РасширениеОписание;
59 |
60 | КонецФункции
61 |
--------------------------------------------------------------------------------
/src/Классы/ГенераторОтчета.os:
--------------------------------------------------------------------------------
1 | ///////////////////////////////////////////////////////////////////////////////
2 | //
3 | // Служебный модуль с реализацией работы <ГенераторОтчета>
4 | //
5 | // (с) BIA Technologies, LLC
6 | //
7 | ///////////////////////////////////////////////////////////////////////////////
8 |
9 | // Сохраняет результат сравнения
10 | //
11 | // Параметры:
12 | // РезультатСравнения - Структура - Результат сравнения конфигураций и расширения
13 | // ИмяФайлаРезультата - Строка - Полное имя файла, в который будет записан результат сравнения
14 | // Лог - log-manager - Экземпляр класса логирования
15 | // ФорматРезультата - Строка - Необязательный, пока реализован только "HTML" формат
16 | //
17 | Процедура СохранитьРезультат(РезультатСравнения, ИмяФайлаРезультата, Лог, ФорматРезультата = "HTML") Экспорт
18 |
19 | Если ФорматРезультата = "HTML" Тогда
20 |
21 | Попытка
22 | ГенераторОтчетаHTML.СохранитьРезультат(РезультатСравнения, ИмяФайлаРезультата, Лог);
23 | Исключение
24 | ОбработкаИсключенияЗаписи(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяФайлаРезультата, Лог);
25 | КонецПопытки;
26 |
27 | ИначеЕсли ФорматРезультата = "TXT" Тогда
28 |
29 | ТекстРезультат = Новый ТекстовыйДокумент();
30 | ТекстРезультат.ДобавитьСтроку(СтрШаблон("Результат сравнения изменений в структуре объектов:
31 | |%1
32 | |%2
33 | |
34 | |", РезультатСравнения.РодительПуть, РезультатСравнения.ПоставкаПуть));
35 |
36 | Для каждого ЭлементПроекта Из РезультатСравнения.Типы Цикл
37 |
38 | ТекстРезультат.ДобавитьСтроку(ЭлементПроекта);
39 |
40 | КонецЦикла;
41 |
42 | Если ЗначениеЗаполнено(ИмяФайлаРезультата) Тогда
43 |
44 | Попытка
45 | ТекстРезультат.Записать(ИмяФайлаРезультата, КодировкаТекста.UTF8NoBOM);
46 | Исключение
47 | ОбработкаИсключенияЗаписи(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяФайлаРезультата, Лог);
48 | КонецПопытки;
49 |
50 | Иначе
51 |
52 | Лог.Информация(ТекстРезультат.ПолучитьТекст());
53 |
54 | КонецЕсли;
55 |
56 | Иначе
57 |
58 | Лог.Ошибка("Неверный формат результата");
59 |
60 | КонецЕсли;
61 |
62 | КонецПроцедуры
63 |
64 | Процедура ОбработкаИсключенияЗаписи(ПредставлениеОшибки, ИмяФайлаРезультата, Лог)
65 |
66 | ТекстОшибки = СтрШаблон("Не удалось сохранить результат в '%1' по причине:
67 | |%3", ИмяФайлаРезультата, ПредставлениеОшибки);
68 |
69 | Лог.Ошибка(ТекстОшибки);
70 |
71 | ВызватьИсключение ТекстОшибки;
72 |
73 | КонецПроцедуры
--------------------------------------------------------------------------------
/tests/fixtures/exts/ADDTST/Documents/ТестовыйДокумент.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | c9de9adf-490d-4f67-a092-4cdfc2e5eae2
7 | 8e0c32a8-db8d-4563-a13c-01ae7e7d054b
8 |
9 |
10 | f245c3fe-8458-4cfa-bb80-57eacad6a01f
11 | e1e76c79-5718-401c-846d-7d181b57c5a1
12 |
13 |
14 | 8c5eee5b-ebad-411a-b117-b8a3a7ddb446
15 | cb26fff0-c762-4a2e-a3d1-01a28f2423ad
16 |
17 |
18 | dc6f6f7f-5ed9-4281-acd7-f7baee3e0bd7
19 | 97b5bc52-7f3d-422c-a62c-d085abb77ac6
20 |
21 |
22 | 1519094e-2d28-4e8c-8d1d-bb010d6b6899
23 | 86199801-900d-49ea-8779-33987d4c59a6
24 |
25 |
26 |
27 | ТестовыйДокумент
28 | Adopted
29 | String
30 | 9
31 | Variable
32 |
33 |
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/tasks/test.os:
--------------------------------------------------------------------------------
1 | #Использовать "../src"
2 | #Использовать 1bdd
3 | #Использовать 1testrunner
4 |
5 | Функция ПрогнатьТесты()
6 |
7 | Тестер = Новый Тестер;
8 |
9 | ПутьКТестам = ОбъединитьПути(ТекущийСценарий().Каталог, "..", "tests");
10 | ПутьКОтчетуJUnit = ОбъединитьПути(ТекущийСценарий().Каталог, "..");
11 |
12 | КаталогТестов = Новый Файл(ПутьКТестам);
13 | Если Не КаталогТестов.Существует() Тогда
14 | Сообщить(СтрШаблон("Не найден каталог тестов %1", ПутьКТестам));
15 | Возврат Истина;
16 | КонецЕсли;
17 |
18 | РезультатТестирования = Тестер.ТестироватьКаталог(
19 | КаталогТестов,
20 | Новый Файл(ПутьКОтчетуJUnit)
21 | );
22 |
23 | Успешно = РезультатТестирования = 0;
24 |
25 | Возврат Успешно;
26 | КонецФункции // ПрогнатьТесты()
27 |
28 | Функция ПрогнатьФичи()
29 |
30 | ПутьОтчетаJUnit = "./bdd-log.xml";
31 |
32 | КаталогФич = ОбъединитьПути(".", "features");
33 |
34 | Файл_КаталогФич = Новый Файл(КаталогФич);
35 | Если Не Файл_КаталогФич.Существует() Тогда
36 | Сообщить(СтрШаблон("Не найден каталог фич %1", КаталогФич));
37 | Возврат Истина;
38 | КонецЕсли;
39 |
40 | ИсполнительБДД = Новый ИсполнительБДД;
41 | РезультатыВыполнения = ИсполнительБДД.ВыполнитьФичу(Файл_КаталогФич, Файл_КаталогФич);
42 | ИтоговыйРезультатВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатыВыполнения);
43 |
44 | СтатусВыполнения = ИсполнительБДД.ВозможныеСтатусыВыполнения().НеВыполнялся;
45 | Если РезультатыВыполнения.Строки.Количество() > 0 Тогда
46 |
47 | СтатусВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатыВыполнения);
48 |
49 | КонецЕсли;
50 |
51 | ГенераторОтчетаJUnit = Новый ГенераторОтчетаJUnit;
52 | ГенераторОтчетаJUnit.Сформировать(РезультатыВыполнения, СтатусВыполнения, ПутьОтчетаJUnit);
53 |
54 | Сообщить(СтрШаблон("Результат прогона фич <%1>
55 | |", ИтоговыйРезультатВыполнения));
56 |
57 | Возврат ИтоговыйРезультатВыполнения <> ИсполнительБДД.ВозможныеСтатусыВыполнения().Сломался;
58 | КонецФункции // ПрогнатьФичи()
59 |
60 | Попытка
61 | ТестыПрошли = ПрогнатьТесты();
62 |
63 | Исключение
64 | ТестыПрошли = Ложь;
65 | Сообщить(СтрШаблон("Тесты через 1testrunner выполнены неудачно
66 | |%1", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())));
67 | КонецПопытки;
68 |
69 | Попытка
70 | ФичиПрошли = ПрогнатьФичи();
71 | Исключение
72 | ФичиПрошли = Ложь;
73 | Сообщить(СтрШаблон("Тесты поведения через 1bdd выполнены неудачно
74 | |%1", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())));
75 | КонецПопытки;
76 |
77 | Если Не ТестыПрошли Или Не ФичиПрошли Тогда
78 | ВызватьИсключение "Тестирование завершилось неудачно!";
79 | Иначе
80 | Сообщить(СтрШаблон("Результат прогона тестов <%1>
81 | |", ТестыПрошли));
82 | КонецЕсли;
83 |
--------------------------------------------------------------------------------
/tests/fixtures/configuration/ConfigDumpInfo.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/tests/fixtures/exts/ADDTST/Documents/ТестовыйДокумент/Forms/ФормаДокумента/Ext/Form.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/tests/fixtures/exts/ADDTST/Configuration.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | 9cd510cd-abfc-11d4-9434-004095e12fc7
7 | e796b40b-c503-4c5e-945f-871874d5a84f
8 |
9 |
10 | 9fcd25a0-4822-11d4-9414-008048da11f9
11 | 1ef6003e-749f-46c4-b7ba-87ea0964089b
12 |
13 |
14 | e3687481-0a87-462c-a166-9f34594f9bba
15 | 80e30f82-f35b-4b40-a0c0-c2e4c16640e2
16 |
17 |
18 | 9de14907-ec23-4a07-96f0-85521cb6b53b
19 | cbb79db0-2948-456b-8161-b0e5feeb7174
20 |
21 |
22 | 51f2d5d8-ea4d-4064-8892-82951750031e
23 | bcefdba1-6272-4706-9f9b-82600a9a5f0d
24 |
25 |
26 | e68182ea-4237-4383-967f-90c1e3370bc7
27 | 8e8463e0-5cfe-4881-976e-dee313dc22bb
28 |
29 |
30 |
31 | РасширениеТест
32 |
33 |
34 | ru
35 | Расширение тест
36 |
37 |
38 |
39 | AddOn
40 | Adopted
41 | ADDTST
42 | Version8_3_10
43 | ManagedApplication
44 |
45 | PersonalComputer
46 |
47 | Russian
48 |
49 |
50 | Language.Русский
51 | Taxi
52 | Version8_3_10
53 |
54 |
55 | Русский
56 | ОбщийМодульТест
57 | ТестовыйДокумент
58 |
59 |
60 |
--------------------------------------------------------------------------------
/src/Классы/КомандаАнализОбъектов.os:
--------------------------------------------------------------------------------
1 | ///////////////////////////////////////////////////////////////////////////////
2 | //
3 | // Служебный модуль с реализацией работы команды
4 | //
5 | // (с) BIA Technologies, LLC
6 | //
7 | ///////////////////////////////////////////////////////////////////////////////
8 |
9 | Перем РодительПуть;
10 | Перем ПоставкаПуть;
11 |
12 | Перем ФайлРезультатИмя;
13 |
14 | ///////////////////////////////////////////////////////////////////////////////
15 |
16 | // настрока команды
17 | //
18 | // Параметры:
19 | // Команда - ОписаниеКоманды - Соответствие ключей командной строки и их значений
20 | // Приложение - Модуль - Модуль менеджера приложения
21 | //
22 | Процедура НастроитьКоманду(Знач Команда, Знач Парсер) Экспорт
23 |
24 | // Добавление параметров команды
25 | Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "КаталогОсновнойКонфигурации", "Каталог основной конфигурации");
26 | Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "КаталогПоставки", "Каталог поставки");
27 | Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "ФайлРезультат",
28 | "Файл-отчет, результат сравнения конфигураций в формате 'txt'.
29 | |Необязательный, если не указан результат выводится в консоли.");
30 |
31 | КонецПроцедуры // НастроитьКоманду
32 |
33 | // Выполняет логику команды
34 | //
35 | // Параметры:
36 | // ПараметрыКоманды - Соответствие - Соответствие ключей командной строки и их значений
37 | // Приложение - Модуль - Модуль менеджера приложения
38 | //
39 | Функция ВыполнитьКоманду(Знач ПараметрыКоманды, Знач Приложение) Экспорт
40 |
41 | Лог = Приложение.ПолучитьЛог();
42 |
43 | РодительПуть = ПараметрыКоманды["КаталогОсновнойКонфигурации"];
44 | ПоставкаПуть = ПараметрыКоманды["КаталогПоставки"];
45 | ФайлРезультатИмя = ПараметрыКоманды["ФайлРезультат"];
46 |
47 | Если Не ПроверитьКаталог(РодительПуть, "Каталог основной конфигурации", Лог)
48 | ИЛИ Не ПроверитьКаталог(ПоставкаПуть, "Каталог поставки", Лог) Тогда
49 |
50 | Возврат Приложение.РезультатыКоманд().НеверныеПараметры;
51 |
52 | КонецЕсли;
53 |
54 | // Превращение относительных путей в абсолютные
55 | РодительПуть = Новый Файл(РодительПуть).ПолноеИмя;
56 | ПоставкаПуть = Новый Файл(ПоставкаПуть).ПолноеИмя;
57 | ФайлРезультатИмя = Новый Файл(ФайлРезультатИмя).ПолноеИмя;
58 |
59 | РазделительПути = ПолучитьРазделительПути();
60 | РодительПуть = ?(СтрЗаканчиваетсяНа(РодительПуть, РазделительПути),
61 | РодительПуть, РодительПуть + РазделительПути);
62 | ПоставкаПуть = ?(СтрЗаканчиваетсяНа(ПоставкаПуть, РазделительПути),
63 | ПоставкаПуть, ПоставкаПуть + РазделительПути);
64 |
65 | Лог.Информация("Получаем результат сравнения");
66 | РезультатСравнения = АнализаторОбъектов.ВыполнитьСравнениеОбъектов(РодительПуть, ПоставкаПуть, Лог);
67 |
68 | Лог.Информация("Сохраняем результат сравнения: %1", ФайлРезультатИмя);
69 | Генератор = Новый ГенераторОтчета;
70 | Генератор.СохранитьРезультат(РезультатСравнения, ФайлРезультатИмя, Лог, "TXT");
71 |
72 | // При успешном выполнении возвращает код успеха
73 | Возврат Приложение.РезультатыКоманд().Успех;
74 |
75 | КонецФункции // ВыполнитьКоманду
76 |
77 | ///////////////////////////////////////////////////////////////////////////////
78 |
79 | Функция ПроверитьКаталог(КаталогПроверки, НазначениеКаталога, Лог)
80 |
81 | ФайлКаталогПроверки = Новый Файл(КаталогПроверки);
82 |
83 | Если НЕ ФайлКаталогПроверки.Существует() ИЛИ ФайлКаталогПроверки.ЭтоФайл() Тогда
84 | Лог.Ошибка("%1 '%2' не существует или это файл", НазначениеКаталога, РодительПуть);
85 | Возврат Ложь;
86 | КонецЕсли;
87 |
88 | Возврат Истина;
89 |
90 | КонецФункции
--------------------------------------------------------------------------------
/src/Классы/КомандаСравнение.os:
--------------------------------------------------------------------------------
1 | ///////////////////////////////////////////////////////////////////////////////
2 | //
3 | // Служебный модуль с реализацией работы команды
4 | //
5 | // (с) BIA Technologies, LLC
6 | //
7 | ///////////////////////////////////////////////////////////////////////////////
8 |
9 | Перем РодительПуть;
10 | Перем ПоставкаПуть;
11 | Перем РасширениеПуть;
12 |
13 | Перем ФайлРезультатИмя;
14 |
15 | ///////////////////////////////////////////////////////////////////////////////
16 |
17 | // настрока команды
18 | //
19 | // Параметры:
20 | // Команда - ОписаниеКоманды - Соответствие ключей командной строки и их значений
21 | // Приложение - Модуль - Модуль менеджера приложения
22 | //
23 | Процедура НастроитьКоманду(Знач Команда, Знач Парсер) Экспорт
24 |
25 | // Добавление параметров команды
26 | Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "КаталогОсновнойКонфигурации", "Каталог основной конфигурации");
27 | Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "КаталогПоставки", "Каталог поставки");
28 | Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "КаталогРасширения", "Каталог расширения");
29 | Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "ФайлРезультат", "Файл-отчет, результат сравнения конфигураций");
30 |
31 | КонецПроцедуры // НастроитьКоманду
32 |
33 | // Выполняет логику команды
34 | //
35 | // Параметры:
36 | // ПараметрыКоманды - Соответствие - Соответствие ключей командной строки и их значений
37 | // Приложение - Модуль - Модуль менеджера приложения
38 | //
39 | Функция ВыполнитьКоманду(Знач ПараметрыКоманды, Знач Приложение) Экспорт
40 |
41 | Лог = Приложение.ПолучитьЛог();
42 |
43 | РодительПуть = ПараметрыКоманды["КаталогОсновнойКонфигурации"];
44 | ПоставкаПуть = ПараметрыКоманды["КаталогПоставки"];
45 | РасширениеПуть = ПараметрыКоманды["КаталогРасширения"];
46 |
47 | Если Не ПроверитьКаталог(РодительПуть, "Каталог основной конфигурации", Лог)
48 | ИЛИ Не ПроверитьКаталог(ПоставкаПуть, "Каталог поставки", Лог)
49 | ИЛИ Не ПроверитьКаталог(РасширениеПуть, "Каталог расширения", Лог) Тогда
50 |
51 | Возврат Приложение.РезультатыКоманд().НеверныеПараметры;
52 |
53 | КонецЕсли;
54 |
55 | ФайлРезультатИмя = ПараметрыКоманды["ФайлРезультат"];
56 |
57 | // Превращение относительных путей в абсолютные
58 | РодительПуть = Новый Файл(РодительПуть).ПолноеИмя;
59 | ПоставкаПуть = Новый Файл(ПоставкаПуть).ПолноеИмя;
60 | РасширениеПуть = Новый Файл(РасширениеПуть).ПолноеИмя;
61 | ФайлРезультатИмя = Новый Файл(ФайлРезультатИмя).ПолноеИмя;
62 |
63 | РазделительПути = ПолучитьРазделительПути();
64 | РодительПуть = ?(СтрЗаканчиваетсяНа(РодительПуть, РазделительПути),
65 | РодительПуть, РодительПуть + РазделительПути);
66 | ПоставкаПуть = ?(СтрЗаканчиваетсяНа(ПоставкаПуть, РазделительПути),
67 | ПоставкаПуть, ПоставкаПуть + РазделительПути);
68 | РасширениеПуть = ?(СтрЗаканчиваетсяНа(РасширениеПуть, РазделительПути),
69 | РасширениеПуть, РасширениеПуть + РазделительПути);
70 |
71 | Лог.Информация("Получаем результат сравнения");
72 | РезультатСравнения = РезультатСравненияРасширения.ПолучитьРезультатСравнения(
73 | РодительПуть,
74 | ПоставкаПуть,
75 | РасширениеПуть,
76 | Лог);
77 |
78 | Лог.Информация("Сохраняем результат сравнения: %1", ФайлРезультатИмя);
79 | Генератор = Новый ГенераторОтчета;
80 | Генератор.СохранитьРезультат(РезультатСравнения, ФайлРезультатИмя, Лог, "HTML");
81 |
82 | // При успешном выполнении возвращает код успеха
83 | Возврат Приложение.РезультатыКоманд().Успех;
84 |
85 | КонецФункции // ВыполнитьКоманду
86 |
87 | ///////////////////////////////////////////////////////////////////////////////
88 |
89 | Функция ПроверитьКаталог(КаталогПроверки, НазначениеКаталога, Лог)
90 |
91 | ФайлКаталогПроверки = Новый Файл(КаталогПроверки);
92 |
93 | Если НЕ ФайлКаталогПроверки.Существует() ИЛИ ФайлКаталогПроверки.ЭтоФайл() Тогда
94 | Лог.Ошибка("%1 '%2' не существует или это файл", НазначениеКаталога, РодительПуть);
95 | Возврат Ложь;
96 | КонецЕсли;
97 |
98 | Возврат Истина;
99 |
100 | КонецФункции
--------------------------------------------------------------------------------
/tests/fixtures/release/Documents/ТестовыйДокумент.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | 12cd8645-67e4-4f52-97b6-33eb80c8cb3d
7 | 288ab939-f6f2-4f00-afe7-a1689e74c4cf
8 |
9 |
10 | e6cfb2e1-7b41-4bbc-8e3a-63f11d2b29b9
11 | c6b945c6-982e-4fed-964a-e9d8ce291c0c
12 |
13 |
14 | 9c776a75-b90b-4f98-a717-e9f379102896
15 | c22d1558-1e4f-4a52-8753-4c6f48c97b1f
16 |
17 |
18 | 1728ad7b-98d0-4123-b7fb-75ee6af22e95
19 | 15d6ea31-fc29-4a88-af02-6c9eebc3aa15
20 |
21 |
22 | e9cb002d-a63c-46a2-97b7-60385633b767
23 | f19e8590-3b64-40d9-ba90-dd73efce2628
24 |
25 |
26 |
27 | ТестовыйДокумент
28 |
29 |
30 | ru
31 | Тестовый документ
32 |
33 |
34 |
35 | true
36 |
37 | String
38 | 9
39 | Variable
40 | Nonperiodical
41 | true
42 | true
43 |
44 |
45 |
46 | Document.ТестовыйДокумент.StandardAttribute.Number
47 |
48 | Use
49 | Begin
50 | DontUse
51 | Directly
52 | Document.ТестовыйДокумент.Form.ФормаДокумента
53 |
54 |
55 |
56 |
57 |
58 | Allow
59 | Allow
60 | AutoDeleteOnUnpost
61 | WriteSelected
62 | AutoFill
63 |
64 | true
65 | true
66 | false
67 |
68 | Managed
69 | DontUse
70 |
71 |
72 |
73 |
74 |
75 | Auto
76 |
77 |
78 |
79 |
80 |
81 |
--------------------------------------------------------------------------------
/tests/fixtures/configuration/Catalogs/Справочник1.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | 54640876-c2e6-475b-835e-a755b661df98
7 | d4b2fd69-7010-475e-95d3-5b31d3abff26
8 |
9 |
10 | cd29b0ab-168f-46ea-bcb9-13ec622af7d7
11 | 5eb3b617-0c7e-4319-b890-097c56a166aa
12 |
13 |
14 | b8a806e9-eba1-414c-84a8-724dcd6b82ee
15 | 130f6ad5-d7be-4d32-bffd-faa976836a81
16 |
17 |
18 | cd4a0f54-030f-4c02-84db-67752c4107da
19 | 863afb5a-afed-43a0-9792-c0f39e3c7241
20 |
21 |
22 | d8ec89b5-d4fa-42e2-a9e7-620c903dca0a
23 | 6330ba24-5beb-4a5c-bcb3-62a58101d88e
24 |
25 |
26 |
27 | Справочник1
28 |
29 |
30 | false
31 | HierarchyFoldersAndItems
32 | false
33 | 2
34 | true
35 | true
36 |
37 | ToItems
38 | 9
39 | 25
40 | String
41 | Variable
42 | WholeCatalog
43 | true
44 | true
45 | AsDescription
46 |
47 | Auto
48 | InDialog
49 | false
50 | BothWays
51 |
52 | Catalog.Справочник1.StandardAttribute.Description
53 | Catalog.Справочник1.StandardAttribute.Code
54 |
55 | Begin
56 | DontUse
57 | Directly
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 | false
69 |
70 |
71 | Managed
72 | DontUse
73 |
74 |
75 |
76 |
77 |
78 | Use
79 | Auto
80 | DontUse
81 |
82 |
83 |
84 |
--------------------------------------------------------------------------------
/src/Модули/ПараметрыПриложения.os:
--------------------------------------------------------------------------------
1 | ///////////////////////////////////////////////////////////////////////////////
2 | //
3 | // Служебный модуль с набором служебных параметров приложения
4 | //
5 | // При создании нового приложения обязательно внести изменение
6 | // в ф-ии ИмяПродукта, указав имя вашего приложения.
7 | //
8 | // При выпуске новой версии обязательно изменить ее значение
9 | // в ф-ии ВерсияПродукта
10 | //
11 | ///////////////////////////////////////////////////////////////////////////////
12 |
13 | ///////////////////////////////////////////////////////////////////////////////
14 | // СВОЙСТВА ПРОДУКТА
15 | ///////////////////////////////////////////////////////////////////////////////
16 |
17 | // ВерсияПродукта
18 | // Возвращает текущую версию продукта
19 | //
20 | // Возвращаемое значение:
21 | // Строка - Значение текущей версии продукта
22 | //
23 | Функция ВерсияПродукта() Экспорт
24 |
25 | Возврат "24.05";
26 |
27 | КонецФункции // ВерсияПродукта
28 |
29 | // ИмяПродукта
30 | // Возвращает имя продукта
31 | //
32 | // Возвращаемое значение:
33 | // Строка - Значение имени продукта
34 | //
35 | Функция ИмяПродукта() Экспорт
36 |
37 | Возврат "diff3cf";
38 |
39 | КонецФункции // ИмяПродукта
40 |
41 | // ПутьКИсполняемомуФайлу
42 | // Возвращает путь к исполняемому файлу
43 | //
44 | // Возвращаемое значение:
45 | // Строка - Путь к исполняемому файлу скрипта
46 | //
47 | Функция ПутьКИсполняемомуФайлу() Экспорт
48 |
49 | Возврат ОбъединитьПути(ПутьКРодительскомуКаталогу(), "src", "main.os");
50 |
51 | КонецФункции // ПутьКИсполняемомуФайлу
52 |
53 | // ПутьКРодительскомуКаталогу
54 | // Возвращает путь к каталогу основного скрипта
55 | //
56 | // Возвращаемое значение:
57 | // Строка - Путь к каталогу основного скрипта
58 | //
59 | Функция ПутьКРодительскомуКаталогу() Экспорт
60 |
61 | Файл = Новый Файл(ОбъединитьПути(ТекущийСценарий().Каталог, "..", ".."));
62 | Возврат Файл.ПолноеИмя;
63 |
64 | КонецФункции // ПутьКРодительскомуКаталогу
65 |
66 | ///////////////////////////////////////////////////////////////////////////////
67 | // ЛОГИРОВАНИЕ
68 | ///////////////////////////////////////////////////////////////////////////////
69 |
70 | // Форматирование логов
71 | // См. описание метода "УстановитьРаскладку" библиотеки logos
72 | //
73 | Функция Форматировать(Знач Уровень, Знач Сообщение) Экспорт
74 |
75 | Возврат СтрШаблон("%1: %2 - %3", ТекущаяДата(), УровниЛога.НаименованиеУровня(Уровень), Сообщение);
76 |
77 | КонецФункции
78 |
79 | // ИмяЛогаСистемы
80 | // Возвращает идентификатор лога приложения
81 | //
82 | // Возвращаемое значение:
83 | // Строка - Значение идентификатора лога приложения
84 | //
85 | Функция ИмяЛогаСистемы() Экспорт
86 |
87 | Возврат "oscript.app." + ИмяПродукта();
88 |
89 | КонецФункции // ИмяЛогаСистемы
90 |
91 | ///////////////////////////////////////////////////////////////////////////////
92 | // НАСТРОЙКА КОМАНД
93 | ///////////////////////////////////////////////////////////////////////////////
94 |
95 | // Возвращает имя команды "version" (ключ командной строки)
96 | //
97 | // Возвращаемое значение:
98 | // Строка - имя команды
99 | //
100 | Функция ИмяКомандыВерсия() Экспорт
101 |
102 | Возврат "version";
103 |
104 | КонецФункции // ИмяКомандыВерсия
105 |
106 | // Возвращает имя команды "help" (ключ командной строки)
107 | //
108 | // Возвращаемое значение:
109 | // Строка - имя команды
110 | //
111 | Функция ИмяКомандыПомощь() Экспорт
112 |
113 | Возврат "help";
114 |
115 | КонецФункции // ИмяКомандыПомощь()
116 |
117 | // ИмяКомандыПоУмолчанию
118 | // Одна из команд может вызываться неявно, без указания команды.
119 | // Иными словами, здесь указывается какой обработчик надо вызывать, если приложение запущено без какой-либо команды
120 | // myapp /home/user/somefile.txt будет аналогично myapp default-action /home/user/somefile.txt
121 | //
122 | // Возвращаемое значение:
123 | // Строка - имя команды по умолчанию
124 | Функция ИмяКомандыПоУмолчанию() Экспорт
125 |
126 | Возврат "help";
127 |
128 | КонецФункции // ИмяКомандыПоУмолчанию
129 |
130 | // НастроитьКомандыПриложения
131 | // Регистрирует классы обрабатывающие команды прилоложения
132 | //
133 | // Параметры:
134 | // Приложение - Модуль - Модуль менеджера приложения
135 | Процедура НастроитьКомандыПриложения(Знач Приложение) Экспорт
136 |
137 | Приложение.ДобавитьКоманду(ИмяКомандыПомощь(), "КомандаСправкаПоПараметрам", "Выводит справку по командам");
138 | Приложение.ДобавитьКоманду(ИмяКомандыВерсия(), "КомандаVersion", "Выводит версию приложения");
139 | Приложение.ДобавитьКоманду("diff", "КомандаСравнение",
140 | "Выполняет сравнение расширения с основной конфигурацией и новой поставкой");
141 | Приложение.ДобавитьКоманду("objects", "КомандаАнализОбъектов",
142 | "Выполняет анализ изменения объектов из основной конфигурации в новой поставке");
143 |
144 | КонецПроцедуры // ПриРегистрацииКомандПриложения
145 |
--------------------------------------------------------------------------------
/tests/test-app.os:
--------------------------------------------------------------------------------
1 | ///////////////////////////////////////////////////////////////////
2 | //
3 | // Тестирование основной функциональности пакета
4 | // Проверка на соответствие выгрузки эталону
5 | //
6 | // (с) BIA Technologies, LLC
7 | //
8 | ///////////////////////////////////////////////////////////////////
9 |
10 | #Использовать logos
11 | #Использовать asserts
12 | #Использовать tempfiles
13 | #Использовать 1commands
14 | #Использовать ".."
15 |
16 | ///////////////////////////////////////////////////////////////////
17 |
18 | Перем Лог;
19 | Перем МенеджерВременныхФайлов;
20 | Перем РасширениеПуть;
21 | Перем РодительПуть;
22 | Перем ПоставкаПуть;
23 | Перем Парсер;
24 |
25 | ///////////////////////////////////////////////////////////////////
26 | // Программный интерфейс
27 | ///////////////////////////////////////////////////////////////////
28 |
29 | Функция ПолучитьСписокТестов(Знач ЮнитТестирование) Экспорт
30 |
31 | МассивТестов = Новый Массив;
32 | МассивТестов.Добавить("ТестПарсера_ПолучитьПрефиксРасширения");
33 | МассивТестов.Добавить("ТестПарсера_ВыполнитьЧтениеМетодовМодуля");
34 | МассивТестов.Добавить("ТестПарсера_ПолучитьПереопределенныеОбъекты");
35 | МассивТестов.Добавить("ТестПарсера_ПрочитатьМетодыОсновнойКонфигурации");
36 | МассивТестов.Добавить("ТестПриложения_ПолучитьРезультатСравнения");
37 | МассивТестов.Добавить("ТестПриложения_СохранитьРезультатСравнения");
38 |
39 | МассивТестов.Добавить("ТестПриложения_ПолучитьРезультатСравненияОбъектов");
40 |
41 | Возврат МассивТестов;
42 |
43 | КонецФункции
44 |
45 | Процедура ПередЗапускомТеста() Экспорт
46 |
47 | // служебные переменные
48 | РасширениеПуть = ОбъединитьПути("tests", "fixtures", "exts", "ADDTST");
49 | РодительПуть = ОбъединитьПути("tests", "fixtures", "configuration");
50 | ПоставкаПуть = ОбъединитьПути("tests", "fixtures", "release");
51 |
52 | ОбъектНастроек = ПараметрыПриложения;
53 |
54 | // Логирование
55 | Лог = Логирование.ПолучитьЛог(ОбъектНастроек.ИмяЛогаСистемы());
56 | Лог.УстановитьРаскладку(ОбъектНастроек);
57 |
58 | Парсер = Новый ПарсерМодулейРасширения(РасширениеПуть);
59 |
60 | МенеджерВременныхФайлов = Новый МенеджерВременныхФайлов;
61 |
62 | КонецПроцедуры
63 |
64 | Процедура ПослеЗапускаТеста() Экспорт
65 |
66 | МенеджерВременныхФайлов.Удалить();
67 |
68 | КонецПроцедуры
69 |
70 | ///////////////////////////////////////////////////////////////////
71 | // Шаги
72 | ///////////////////////////////////////////////////////////////////
73 |
74 | Процедура ТестПарсера_ПолучитьПрефиксРасширения() Экспорт
75 |
76 | ФайлКонфигурации = ОбъединитьПути(РасширениеПуть, "Configuration.xml");
77 | Префикс = Парсер.ПрочитатьПрефиксРасширения(ФайлКонфигурации);
78 |
79 | Утверждения.ПроверитьРавенство("ADDTST", Префикс);
80 |
81 | КонецПроцедуры
82 |
83 | Процедура ТестПарсера_ВыполнитьЧтениеМетодовМодуля() Экспорт
84 |
85 | ФайлКонфигурации = ОбъединитьПути(РасширениеПуть, "Configuration.xml");
86 | Префикс = Парсер.ПрочитатьПрефиксРасширения(ФайлКонфигурации);
87 |
88 | ТипОбъектов = "Documents";
89 |
90 | Объекты = Парсер.ПолучитьФайлыОбъектов(ТипОбъектов); // Получаем документы
91 | Модули = Парсер.ПолучитьФайлыМодулей(ТипОбъектов, Объекты[0].ИмяБезРасширения); // Получаем модули
92 |
93 | Методы = Парсер.ПрочитатьМетодыМодуля(Модули[0], Префикс);
94 |
95 | Утверждения.ПроверитьБольше(Методы.Количество(), 0);
96 |
97 | КонецПроцедуры
98 |
99 | Процедура ТестПарсера_ПолучитьПереопределенныеОбъекты() Экспорт
100 |
101 | Объекты = Парсер.ПолучитьПереопределенныеОбъекты();
102 |
103 | Утверждения.ПроверитьБольше(Объекты.Количество(), 0);
104 |
105 | КонецПроцедуры
106 |
107 | Процедура ТестПарсера_ПрочитатьМетодыОсновнойКонфигурации() Экспорт
108 |
109 | ФайлКонфигурации = ОбъединитьПути(РасширениеПуть, "Configuration.xml");
110 | Префикс = Парсер.ПрочитатьПрефиксРасширения(ФайлКонфигурации);
111 |
112 | ТипыКонфигурации = Парсер.ПолучитьПереопределенныеОбъекты();
113 |
114 | ОбъектыЕсть = Ложь;
115 | Для каждого ТипРасширения Из ТипыКонфигурации Цикл
116 | Если ТипРасширения.Объекты.Количество() Тогда
117 |
118 | ОбъектыЕсть = Истина;
119 |
120 | ОбъектРасширения = ТипРасширения.Объекты[0];
121 | ФайлМодуля = ОбъектРасширения.Модули[0]; // и первый модуль
122 | МодульОбъекта = ФайлМодуля.ФайлМодуля;
123 | ФайлМодуля.Вставить("Методы", Парсер.ПрочитатьМетодыМодуля(МодульОбъекта, Префикс)); // заполняем методы
124 |
125 | Парсер.ПрочитатьМетодыОсновнойКонфигурации(МодульОбъекта, ФайлМодуля, РодительПуть, "Родитель"); // сопоставляем с родительской конфигурацией
126 |
127 | Прервать;
128 |
129 | КонецЕсли;
130 | КонецЦикла;
131 |
132 | Утверждения.ПроверитьИстину(ОбъектыЕсть, "методы не обнаружены");
133 |
134 | КонецПроцедуры
135 |
136 | Процедура ТестПриложения_ПолучитьРезультатСравнения() Экспорт
137 |
138 | РезультатСравнения = РезультатСравненияРасширения.ПолучитьРезультатСравнения(
139 | РодительПуть,
140 | ПоставкаПуть,
141 | РасширениеПуть,
142 | Лог);
143 |
144 | Утверждения.ПроверитьБольше(РезультатСравнения.Типы.Количество(), 0, "нет типов в результате сравнения");
145 |
146 | КонецПроцедуры
147 |
148 | Процедура ТестПриложения_СохранитьРезультатСравнения() Экспорт
149 |
150 | ФайлРезультатИмя = МенеджерВременныхФайлов.СоздатьФайл("HTML");
151 |
152 | РезультатСравнения = РезультатСравненияРасширения.ПолучитьРезультатСравнения(
153 | РодительПуть,
154 | ПоставкаПуть,
155 | РасширениеПуть,
156 | Лог);
157 |
158 | Генератор = Новый ГенераторОтчета;
159 | Генератор.СохранитьРезультат(РезультатСравнения, ФайлРезультатИмя, Лог, "HTML");
160 |
161 | ТекстРезультат = Новый ТекстовыйДокумент();
162 | ТекстРезультат.Прочитать(ФайлРезультатИмя, КодировкаТекста.UTF8NoBOM);
163 |
164 | Утверждения.ПроверитьВхождение(ТекстРезультат.ПолучитьТекст(), "", "текст не соответствует шаблону");
165 |
166 | КонецПроцедуры
167 |
168 | ///////////////////////////////////////////////////////////////////
169 |
170 | Процедура ТестПриложения_ПолучитьРезультатСравненияОбъектов() Экспорт
171 |
172 | РезультатСравнения = АнализаторОбъектов.ВыполнитьСравнениеОбъектов(РодительПуть, ПоставкаПуть, Лог);
173 |
174 | Утверждения.ПроверитьБольше(РезультатСравнения.Типы.Количество(), 0, "нет типов в результате сравнения");
175 |
176 | КонецПроцедуры
177 |
178 | ///////////////////////////////////////////////////////////////////
179 | // Служебный функционал
180 | ///////////////////////////////////////////////////////////////////
181 |
182 |
--------------------------------------------------------------------------------
/tests/fixtures/release/Configuration.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | 9cd510cd-abfc-11d4-9434-004095e12fc7
7 | 804c66e4-c30d-409b-8591-7ee38de6cf58
8 |
9 |
10 | 9fcd25a0-4822-11d4-9414-008048da11f9
11 | 46aa5b38-d653-4c7b-976e-d50ab79964e4
12 |
13 |
14 | e3687481-0a87-462c-a166-9f34594f9bba
15 | 8d0e858b-89e5-4d0d-a61c-dd7dc2207f3f
16 |
17 |
18 | 9de14907-ec23-4a07-96f0-85521cb6b53b
19 | e3a6ca97-02b1-428c-acd6-d52cad356652
20 |
21 |
22 | 51f2d5d8-ea4d-4064-8892-82951750031e
23 | 568f0d16-cbfa-4b11-8f18-6ce8014fc83f
24 |
25 |
26 | e68182ea-4237-4383-967f-90c1e3370bc7
27 | 2ac838b4-c5db-4ad6-9cc5-8d480c868fcf
28 |
29 |
30 |
31 | ТестированиеСравнения
32 |
33 |
34 | ru
35 | Тестирование сравнения
36 |
37 |
38 |
39 |
40 | Version8_3_10
41 | ManagedApplication
42 |
43 | PersonalComputer
44 |
45 | Russian
46 |
47 |
48 |
49 |
50 | false
51 | false
52 | false
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 | Multimedia
68 | false
69 |
70 |
71 | Location
72 | false
73 |
74 |
75 | Contacts
76 | false
77 |
78 |
79 | Calendars
80 | false
81 |
82 |
83 | Telephony
84 | false
85 |
86 |
87 | PushNotification
88 | false
89 |
90 |
91 | LocalNotification
92 | false
93 |
94 |
95 | Print
96 | false
97 |
98 |
99 | InAppPurchases
100 | false
101 |
102 |
103 | Ads
104 | false
105 |
106 |
107 | Normal
108 |
109 |
110 | Language.Русский
111 |
112 |
113 |
114 |
115 |
116 | Managed
117 | NotAutoFree
118 | DontUse
119 | DontUse
120 | Taxi
121 | Version8_3_10
122 |
123 |
124 |
125 | Русский
126 | ПодсистемаТест
127 | Администратор
128 | ОбщийМодульТест
129 | ТестовыйДокумент
130 |
131 |
132 |
--------------------------------------------------------------------------------
/tests/fixtures/configuration/Configuration.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | 9cd510cd-abfc-11d4-9434-004095e12fc7
7 | 804c66e4-c30d-409b-8591-7ee38de6cf58
8 |
9 |
10 | 9fcd25a0-4822-11d4-9414-008048da11f9
11 | 46aa5b38-d653-4c7b-976e-d50ab79964e4
12 |
13 |
14 | e3687481-0a87-462c-a166-9f34594f9bba
15 | 8d0e858b-89e5-4d0d-a61c-dd7dc2207f3f
16 |
17 |
18 | 9de14907-ec23-4a07-96f0-85521cb6b53b
19 | e3a6ca97-02b1-428c-acd6-d52cad356652
20 |
21 |
22 | 51f2d5d8-ea4d-4064-8892-82951750031e
23 | 568f0d16-cbfa-4b11-8f18-6ce8014fc83f
24 |
25 |
26 | e68182ea-4237-4383-967f-90c1e3370bc7
27 | 2ac838b4-c5db-4ad6-9cc5-8d480c868fcf
28 |
29 |
30 |
31 | ТестированиеСравнения
32 |
33 |
34 | ru
35 | Тестирование сравнения
36 |
37 |
38 |
39 |
40 | Version8_3_13
41 | ManagedApplication
42 |
43 | PlatformApplication
44 |
45 | Russian
46 |
47 |
48 |
49 |
50 | false
51 | false
52 | false
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 | Multimedia
71 | false
72 |
73 |
74 | Location
75 | false
76 |
77 |
78 | Contacts
79 | false
80 |
81 |
82 | Calendars
83 | false
84 |
85 |
86 | Telephony
87 | false
88 |
89 |
90 | PushNotification
91 | false
92 |
93 |
94 | LocalNotification
95 | false
96 |
97 |
98 | Print
99 | false
100 |
101 |
102 | InAppPurchases
103 | false
104 |
105 |
106 | Ads
107 | false
108 |
109 |
110 | BackgroundLocation
111 | false
112 |
113 |
114 | BackgroundAudioPlayback
115 | false
116 |
117 |
118 | FileExchangeWithPersonalComputer
119 | false
120 |
121 |
122 | Normal
123 |
124 |
125 | Language.Русский
126 |
127 |
128 |
129 |
130 |
131 | Managed
132 | NotAutoFree
133 | DontUse
134 | DontUse
135 | Taxi
136 | Version8_3_10
137 |
138 |
139 |
140 | Русский
141 | ПодсистемаТест
142 | Администратор
143 | ОбщийМодульТест
144 | Справочник1
145 | ТестовыйДокумент
146 |
147 |
148 |
--------------------------------------------------------------------------------
/src/Модули/АнализаторОбъектов.os:
--------------------------------------------------------------------------------
1 | ///////////////////////////////////////////////////////////////////////////////
2 | //
3 | // Служебный модуль получения результата сравнения объектов основной конфы и поставки
4 | //
5 | // (с) BIA Technologies, LLC
6 | //
7 | ///////////////////////////////////////////////////////////////////////////////
8 |
9 | // Сравнивает три конфигурации - Родитель, Поставка и Расширение
10 | //
11 | // Параметры:
12 | // РодительПуть - Строка - Каталог конфигурации Родитель
13 | // ПоставкаПуть - Строка - Каталог конфигурации Поставка
14 | // Лог - log-manager - Экземпляр класса логирования
15 | //
16 | // Возвращаемое значение:
17 | // Структура - результат сравнения
18 | //
19 | Функция ВыполнитьСравнениеОбъектов(РодительПуть, ПоставкаПуть, Лог) Экспорт
20 |
21 | РезультатОписание = Новый Структура();
22 |
23 | РезультатОписание.Вставить("РодительПуть", РодительПуть);
24 | РезультатОписание.Вставить("ПоставкаПуть", ПоставкаПуть);
25 |
26 | РезультатОписание.Вставить("Типы", АнализГруппОбъектов(
27 | "AccountingRegisters
28 | |AccumulationRegisters
29 | |CalculationRegisters
30 | |Catalogs
31 | |ChartsOfCalculationTypes
32 | |ChartsOfCharacteristicTypes
33 | |Documents
34 | |InformationRegisters", РезультатОписание));
35 |
36 | Возврат РезультатОписание;
37 |
38 | КонецФункции
39 |
40 | Функция АнализГруппОбъектов(ГруппыОбъектов, Описание)
41 |
42 | МассивРезультат = Новый Массив();
43 | МассивГрупп = СтрРазделить(ГруппыОбъектов, Символы.ПС);
44 |
45 | Для Каждого ГруппаОбъектов Из МассивГрупп Цикл
46 |
47 | АнализОбъектов(СокрЛП(ГруппаОбъектов), МассивРезультат, Описание);
48 |
49 | КонецЦикла;
50 |
51 | Возврат МассивРезультат;
52 |
53 | КонецФункции
54 |
55 | Процедура АнализОбъектов(ГруппаОбъектов, МассивРезультат, Описание)
56 |
57 | Файлы = ПолучитьФайлыОбъектов(ГруппаОбъектов, Описание);
58 |
59 | Для Каждого Файл Из Файлы Цикл
60 |
61 | ДанныеОбъектаПроекта = АнализФайлаОМД(Файл, Описание.РодительПуть);
62 | ДанныеОбъектаПоставки = Неопределено;
63 |
64 | ИмяФайлаПоставки = ОбъединитьПути(Описание.ПоставкаПуть, ДанныеОбъектаПроекта.ОтносительныйПуть);
65 | ФайлЧтение = Новый Файл(ИмяФайлаПоставки);
66 | Если ФайлЧтение.Существует() Тогда
67 |
68 | ДанныеОбъектаПоставки = АнализФайлаОМД(ФайлЧтение, Описание.ПоставкаПуть);
69 |
70 | КонецЕсли;
71 |
72 | // Сравнение
73 | Для Каждого ПолеПроекта Из ДанныеОбъектаПроекта.Поля Цикл
74 |
75 | Если ДанныеОбъектаПоставки <> Неопределено Тогда
76 |
77 | // поиск в поставке
78 | ПолеЕсть = ПоискВПоставке(ПолеПроекта, ДанныеОбъектаПоставки.Поля, МассивРезультат, ДанныеОбъектаПроекта);
79 |
80 | Если Не ПолеЕсть Тогда
81 | МассивРезультат.Добавить(
82 | ДанныеОбъектаПроекта.ОтносительныйПуть + " : " +
83 | ПолеПроекта.ИмяПоля +
84 | " : Удалено");
85 | КонецЕсли;
86 |
87 | Иначе
88 |
89 | МассивРезультат.Добавить(
90 | ДанныеОбъектаПроекта.ОтносительныйПуть + " : " +
91 | " : Удалено в поставке");
92 |
93 | Прервать;
94 |
95 | КонецЕсли;
96 |
97 | КонецЦикла;
98 |
99 | КонецЦикла;
100 |
101 | КонецПроцедуры
102 |
103 | Функция ПоискВПоставке(ПолеПроекта, ПоляПоставки, МассивРезультат, ДанныеОбъектаПроекта)
104 | Результат = Ложь;
105 | Для Каждого ПолеПоставки Из ПоляПоставки Цикл
106 |
107 | Если ПолеПроекта.ИмяПоля = ПолеПоставки.ИмяПоля Тогда
108 |
109 | Если ПолеПроекта.Тип <> ПолеПоставки.Тип Тогда
110 |
111 | МассивРезультат.Добавить(
112 | ДанныеОбъектаПроекта.ОтносительныйПуть + " : " +
113 | ПолеПроекта.ИмяПоля +
114 | " : Изменен тип");
115 |
116 | КонецЕсли;
117 |
118 | Результат = Истина;
119 | Прервать;
120 |
121 | КонецЕсли;
122 |
123 | КонецЦикла;
124 |
125 | Возврат Результат;
126 |
127 | КонецФункции
128 |
129 | Функция АнализФайлаОМД(ФайлОбъекта, ПутьПроекта)
130 |
131 | //////////////////////////////////////////
132 | ОписаниеОбъекта = Новый Структура;
133 | ОписаниеОбъекта.Вставить("ПолноеИмя", ФайлОбъекта.ПолноеИмя);
134 | ОписаниеОбъекта.Вставить("ИмяОбъекта", ФайлОбъекта.ИмяБезРасширения);
135 | ОписаниеОбъекта.Вставить("ОтносительныйПуть", ПолучитьОтносительныйПуть(ПутьПроекта, ФайлОбъекта.ПолноеИмя));
136 | //////////////////////////////////////////
137 |
138 | ТекстОписания = МенеджерПриложения.ПрочитатьФайл(ФайлОбъекта);
139 |
140 | ПаттернОсновной = "([\w\W]*?)<\/Name>[\w\W]*?(?:)";
141 |
142 | ПаттернТЧ = "([\w\W]*?)<\/Name>[\w\W]*?<\/TabularSection>";
143 |
144 | АнализОписанияОбъекта(ТекстОписания, ПаттернОсновной, "", ОписаниеОбъекта);
145 | АнализОписанияОбъекта(ТекстОписания, ПаттернТЧ, "ТабличнаяЧасть.", ОписаниеОбъекта);
146 |
147 | Возврат ОписаниеОбъекта;
148 |
149 | КонецФункции
150 |
151 | Процедура АнализОписанияОбъекта(ТекстОписания, Паттерн, Префикс, ОписаниеОбъекта)
152 |
153 | Регексп = МенеджерПриложения.ПолучитьРегексп(Паттерн);
154 |
155 | НайденныеСтроки = Регексп.НайтиСовпадения(ТекстОписания);
156 |
157 | Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл
158 |
159 | АнализРеквизитов(
160 | НайденнаяСтрока.Группы[0].Значение,
161 | ОписаниеОбъекта,
162 | ?(Префикс = "", "", Префикс + НайденнаяСтрока.Группы[1].Значение + "."));
163 |
164 | КонецЦикла;
165 |
166 | КонецПроцедуры
167 |
168 | Процедура АнализРеквизитов(ТекстОписания, ОписаниеОбъекта, ПрефиксПоля = "")
169 |
170 | СтрокаВидыПолей = "Dimension;Resource;Attribute";
171 |
172 | ВидыПолей = СтрРазделить(СтрокаВидыПолей, ";");
173 |
174 | ПаттернПоля = "<%1[\w\W]*?([\w\W]*?)<\/Name>[\w\W]*?<\/%1>";
175 |
176 | ИндексОбъекта = 0;
177 |
178 | Если Не ОписаниеОбъекта.Свойство("Поля") Тогда
179 | ОписаниеОбъекта.Вставить("Поля", Новый Массив());
180 | КонецЕсли;
181 |
182 | Для Каждого ВидПоля Из ВидыПолей Цикл
183 |
184 | Регексп = МенеджерПриложения.ПолучитьРегексп(СтрШаблон(ПаттернПоля, ВидПоля));
185 |
186 | НайденныеСтроки = Регексп.НайтиСовпадения(ТекстОписания);
187 |
188 | // цикл по измерениям/ресурсам/реквизитам
189 | Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл
190 |
191 | ОписаниеПоля = Новый Структура;
192 | ОписаниеПоля.Вставить("ВидПоля", ВидПоля);
193 | ОписаниеПоля.Вставить("ИмяПоля", ПрефиксПоля + НайденнаяСтрока.Группы[1].Значение);
194 | ОписаниеПоля.Вставить("ТекстОписание", НайденнаяСтрока.Группы[0].Значение);
195 | ОписаниеПоля.Вставить("Тип", АнализТипаПоля(ОписаниеОбъекта, ОписаниеПоля));
196 |
197 | ОписаниеОбъекта.Поля.Добавить(ОписаниеПоля);
198 |
199 | КонецЦикла;
200 |
201 | КонецЦикла;
202 |
203 | КонецПроцедуры
204 |
205 | Функция АнализТипаПоля(ОписаниеОбъекта, ОписаниеПоля)
206 |
207 | Результат = 0;
208 |
209 | ПаттернТипа =
210 | "" +
211 | "[\w\W]*?([\w\W]*?)<\/Type>" +
212 | "[\w\W]*?<\/Properties>";
213 | ПаттернСоставаТипа =
214 | "(?:|)([\w\W]*?)<\/v8:Type";
215 |
216 | Регексп = МенеджерПриложения.ПолучитьРегексп(ПаттернТипа);
217 | НайденныеСтроки = Регексп.НайтиСовпадения(ОписаниеПоля.ТекстОписание);
218 |
219 | ОписаниеТипа = "";
220 | Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл
221 |
222 | РегекспТипа = МенеджерПриложения.ПолучитьРегексп(ПаттернСоставаТипа);
223 |
224 | СтрокиСоставаТипа = РегекспТипа.НайтиСовпадения(НайденнаяСтрока.Группы[1].Значение);
225 |
226 | Для Каждого СтрокаСоставаТипа Из СтрокиСоставаТипа Цикл
227 |
228 | //////////////////////////////////////////
229 | ОписаниеТипа = ОписаниеТипа +
230 | ?(ОписаниеТипа = "", "", Символы.ПС) +
231 | СтрокаСоставаТипа.Группы[1].Значение;
232 | //////////////////////////////////////////
233 |
234 | КонецЦикла;
235 |
236 | КонецЦикла;
237 |
238 | Возврат ОписаниеТипа;
239 |
240 | КонецФункции
241 |
242 | Функция ПолучитьФайлыОбъектов(ТипОбъектов, Описание)
243 |
244 | КаталогОбъектов = ОбъединитьПути(Описание.РодительПуть, ТипОбъектов);
245 |
246 | Возврат НайтиФайлы(КаталогОбъектов, "*.xml");
247 |
248 | КонецФункции
249 |
250 | Функция ПолучитьОтносительныйПуть(РасположениеПроекта, ПолноеИмяФайла)
251 |
252 | СоставРП = СтрРазделить(РасположениеПроекта, ПолучитьРазделительПути(), Ложь);
253 | СоставПуть = СтрРазделить(ПолноеИмяФайла, ПолучитьРазделительПути(), Ложь);
254 |
255 | Результат = "";
256 |
257 | Для Сч = СоставРП.Количество() По СоставПуть.ВГраница() Цикл
258 |
259 | Результат = ОбъединитьПути(Результат, СоставПуть[Сч]);
260 |
261 | КонецЦикла;
262 |
263 | Возврат Результат;
264 |
265 | КонецФункции
266 |
--------------------------------------------------------------------------------
/src/Модули/МенеджерПриложения.os:
--------------------------------------------------------------------------------
1 | ///////////////////////////////////////////////////////////////////////////////
2 | //
3 | // Служебный модуль с набором методов работы с командами приложения
4 | //
5 | // В большинстве проектов изменять данный модуль не требуется
6 | //
7 | ///////////////////////////////////////////////////////////////////////////////
8 |
9 | #Использовать logos
10 | #Использовать cmdline
11 |
12 | ///////////////////////////////////////////////////////////////////////////////
13 |
14 | Перем Лог;
15 |
16 | Перем ПарсерКоманд;
17 | Перем ИсполнителиКоманд;
18 | Перем ОбъектНастроек;
19 |
20 | ///////////////////////////////////////////////////////////////////////////////
21 | // СЛУЖЕБНЫЙ ОТКРЫТЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС
22 | ///////////////////////////////////////////////////////////////////////////////
23 |
24 | // Инициализирует и настраивает приложение
25 | //
26 | // Параметры:
27 | // Настройка - Модуль - Модуль, в котором определены настройки приложения
28 | //
29 | // Возвращаемое значение:
30 | // Модуль - Модуль менеджера приложения
31 | //
32 | Функция Инициализировать(Знач МенеджерНастроек) Экспорт
33 |
34 | // Служебные переменные
35 | ПарсерКоманд = Новый ПарсерАргументовКоманднойСтроки();
36 | ИсполнителиКоманд = Новый Соответствие;
37 | ОбъектНастроек = МенеджерНастроек;
38 |
39 | // Логирование
40 | Лог = Логирование.ПолучитьЛог(ОбъектНастроек.ИмяЛогаСистемы());
41 | Лог.УстановитьРаскладку(ОбъектНастроек);
42 |
43 | // Инициализация команд
44 | ОбъектНастроек.НастроитьКомандыПриложения(ЭтотОбъект);
45 |
46 | Возврат ЭтотОбъект;
47 |
48 | КонецФункции
49 |
50 | // Добавляет команду в приложение
51 | //
52 | // Параметры:
53 | // ИмяКоманды - Строка - Имя команды
54 | // КлассРеализации - Строка - Имя файла класса, в котором реализована команда
55 | // Описаниекоманды - Строка - краткое описание назначения команды
56 | //
57 | Процедура ДобавитьКоманду(Знач ИмяКоманды, Знач КлассРеализации, Знач ОписаниеКоманды) Экспорт
58 |
59 | Попытка
60 | РеализацияКоманды = Новый(КлассРеализации);
61 |
62 | Команда = ПарсерКоманд.ОписаниеКоманды(ИмяКоманды, ОписаниеКоманды);
63 | ПарсерКоманд.ДобавитьКоманду(Команда);
64 |
65 | РеализацияКоманды.НастроитьКоманду(Команда, ПарсерКоманд);
66 |
67 | ИсполнителиКоманд.Вставить(ИмяКоманды, РеализацияКоманды);
68 | Исключение
69 | ЗавершитьРаботуПриложенияСОшибкой(СтрШаблон("Не удалось инициализировать команду '%1' для класса '%2' по причине:
70 | |%3", ИмяКоманды, КлассРеализации, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())));
71 | КонецПопытки;
72 |
73 | КонецПроцедуры
74 |
75 | // Аварийно завершает работу приложения с ошибкой
76 | //
77 | // Параметры:
78 | // Сообщение - Строка - Сообщение, которое будет выведено пользователю перед завершением
79 | // КодВозврата (не обязательный) - Число - Код возврата с которым будет закрыто приложение
80 | // Значение по умолчанию: "ОшибкаВремениВыполнения" -- 1
81 | //
82 | Процедура ЗавершитьРаботуПриложенияСОшибкой(Знач Сообщение, Знач КодВозврата = Неопределено) Экспорт
83 |
84 | Если КодВозврата = Неопределено Тогда
85 | КодВозврата = РезультатыКоманд().ОшибкаВремениВыполнения;
86 | КонецЕсли;
87 |
88 | Лог.КритичнаяОшибка(Сообщение);
89 |
90 | ЗавершитьРаботу(КодВозврата);
91 |
92 | КонецПроцедуры
93 |
94 | // Завершает работу приложения
95 | //
96 | // Параметры:
97 | // КодВозврата (не обязательный) - Число - Код возврата с которым будет закрыто приложение
98 | // Значение по умолчанию: "Успех" -- 0
99 | //
100 | Процедура ЗавершитьРаботуПриложения(Знач КодВозврата = Неопределено) Экспорт
101 |
102 | Если КодВозврата = Неопределено Тогда
103 | КодВозврата = РезультатыКоманд().Успех;
104 | КонецЕсли;
105 |
106 | ЗавершитьРаботу(КодВозврата);
107 |
108 | КонецПроцедуры
109 |
110 | // Осуществляет запуск приложения на выполнение
111 | //
112 | // Возвращаемое значение:
113 | // Число - Код возврата выполнения команды приложения
114 | //
115 | Функция ЗапуститьВыполнение() Экспорт
116 |
117 | Попытка
118 | ПараметрыЗапуска = ПарсерКоманд.Разобрать(АргументыКоманднойСтроки);
119 | Исключение
120 | Лог.Отладка(ОписаниеОшибки());
121 |
122 | Лог.Ошибка("Не удалось определить требуемое действие.");
123 | ВывестиСправкуПоКомандам();
124 |
125 | Возврат РезультатыКоманд().НеверныеПараметры;
126 | КонецПопытки;
127 |
128 | Команда = "";
129 | ЗначенияПараметров = Неопределено;
130 |
131 | Если ПараметрыЗапуска = Неопределено ИЛИ ПараметрыЗапуска.Количество() = 0 Тогда
132 |
133 | ВывестиВерсию();
134 | ВывестиСправкуПоКомандам();
135 |
136 | Возврат РезультатыКоманд().НеверныеПараметры;
137 |
138 | ИначеЕсли ТипЗнч(ПараметрыЗапуска) = Тип("Структура") Тогда
139 |
140 | // это команда
141 | Команда = ПараметрыЗапуска.Команда;
142 | ЗначенияПараметров = ПараметрыЗапуска.ЗначенияПараметров;
143 | Лог.Отладка("Выполняю команду продукта %1", Команда);
144 |
145 | ИначеЕсли ЗначениеЗаполнено(ОбъектНастроек.ИмяКомандыПоУмолчанию()) Тогда
146 |
147 | // это команда по-умолчанию
148 | Команда = ОбъектНастроек.ИмяКомандыПоУмолчанию();
149 | ЗначенияПараметров = ПараметрыЗапуска;
150 | Лог.Отладка("Выполняю команду продукта по умолчанию %1", Команда);
151 |
152 | Иначе
153 |
154 | Возврат НекорректныеПараметры();
155 |
156 | КонецЕсли;
157 |
158 | Если Команда <> ОбъектНастроек.ИмяКомандыВерсия() Тогда
159 |
160 | ВывестиВерсию();
161 |
162 | КонецЕсли;
163 |
164 | Возврат ВыполнитьКоманду(Команда, ЗначенияПараметров);
165 |
166 | КонецФункции // ЗапуститьВыполнение()
167 |
168 | // Осуществляет запуск на выполнение указанной команды приложения
169 | //
170 | // Параметры:
171 | // ИмяКоманды - Строка - Имя команды, которую необходимо запустить
172 | // ПараметрыКоманды - Соответствие - Соответствие ключей командной строки и их значений
173 | //
174 | Функция ВыполнитьКоманду(Знач ИмяКоманды, Знач ПараметрыКоманды) Экспорт
175 |
176 | Команда = ПолучитьКоманду(ИмяКоманды);
177 | КодВозврата = Команда.ВыполнитьКоманду(ПараметрыКоманды, ЭтотОбъект);
178 |
179 | Если КодВозврата = Неопределено Тогда
180 | КодВозврата = РезультатыКоманд().Успех;
181 | КонецЕсли;
182 |
183 | Возврат КодВозврата;
184 |
185 | КонецФункции // ВыполнитьКоманду
186 |
187 | ///////////////////////////////////////////////////////////////////////////////
188 | // ПРОГРАММНЫЙ ИНТЕРФЕЙС
189 | ///////////////////////////////////////////////////////////////////////////////
190 |
191 | // Возвращает лог приложения
192 | Функция ПолучитьЛог() Экспорт
193 |
194 | Возврат Лог;
195 |
196 | КонецФункции // ПолучитьЛог
197 |
198 | // Возвращает версию продукта
199 | Функция ВерсияПродукта() Экспорт
200 |
201 | Возврат ОбъектНастроек.ВерсияПродукта();
202 |
203 | КонецФункции // ВерсияПродукта
204 |
205 | // Возвращает имя продукта
206 | Функция ИмяПродукта() Экспорт
207 |
208 | Возврат ОбъектНастроек.ИмяПродукта();
209 |
210 | КонецФункции // ИмяПродукта
211 |
212 | // Возвращает путь к исполняемому файлу
213 | Функция ПутьКИсполняемомуФайлу() Экспорт
214 |
215 | Возврат ОбъектНастроек.ПутьКИсполняемомуФайлу();
216 |
217 | КонецФункции // ПутьКИсполняемомуФайлу
218 |
219 | // Возвращает путь к каталогу основного скрипта
220 | Функция ПутьКРодительскомуКаталогу() Экспорт
221 |
222 | Возврат ОбъектНастроек.ПутьКРодительскомуКаталогу();
223 |
224 | КонецФункции // ПутьКРодительскомуКаталогу
225 |
226 | // Выводит справку по всем командам приложения
227 | Процедура ВывестиСправкуПоКомандам() Экспорт
228 |
229 | ПарсерКоманд.ВывестиСправкуПоКомандам();
230 |
231 | КонецПроцедуры // ВывестиСправкуПоКомандам
232 |
233 | // Выводит справку по указанной команде приложения.
234 | Процедура ВывестиСправкуПоКоманде(Знач ИмяКоманды) Экспорт
235 |
236 | ПарсерКоманд.ВывестиСправкуПоКоманде(ИмяКоманды);
237 |
238 | КонецПроцедуры // ВывестиСправкуПоКоманде
239 |
240 | ///////////////////////////////////////////////////////////////////////////////
241 | // ПЕРЕЧИСЛЕНИЯ
242 | ///////////////////////////////////////////////////////////////////////////////
243 |
244 | // Возвращает стандартные коды возврата приложения
245 | Функция РезультатыКоманд() Экспорт
246 |
247 | РезультатыКоманд = Новый Структура;
248 | РезультатыКоманд.Вставить("Успех", 0);
249 | РезультатыКоманд.Вставить("НеверныеПараметры", 5);
250 | РезультатыКоманд.Вставить("ОшибкаВремениВыполнения", 1);
251 |
252 | Возврат РезультатыКоманд;
253 |
254 | КонецФункции // РезультатыКоманд
255 |
256 | ///////////////////////////////////////////////////////////////////////////////
257 | // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
258 | ///////////////////////////////////////////////////////////////////////////////
259 |
260 | // Получает объект класса с реализацией указанной команды
261 | Функция ПолучитьКоманду(Знач ИмяКоманды)
262 |
263 | КлассРеализации = ИсполнителиКоманд[ИмяКоманды];
264 | Если КлассРеализации = Неопределено Тогда
265 |
266 | ВызватьИсключение СтрШаблон("Неверная операция. Команда '%1' не предусмотрена.", ИмяКоманды);
267 |
268 | КонецЕсли;
269 |
270 | Возврат КлассРеализации;
271 |
272 | КонецФункции // ПолучитьКоманду
273 |
274 | // Осуществляет вывод полной версии продукта
275 | Процедура ВывестиВерсию()
276 |
277 | Сообщить(СтрШаблон("%1 v%2", ИмяПродукта(), ВерсияПродукта()));
278 |
279 | КонецПроцедуры // ВывестиВерсию
280 |
281 | // Вывод ошибки и справки по параметрам
282 | Функция НекорректныеПараметры()
283 |
284 | Лог.Ошибка("Некорректные аргументы командной строки");
285 | ВывестиСправкуПоКомандам();
286 |
287 | Возврат РезультатыКоманд().НеверныеПараметры;
288 |
289 | КонецФункции // НекорректныеПараметры()
290 |
291 | Функция ПолучитьРегексп(Паттерн) Экспорт
292 |
293 | Регексп = Новый РегулярноеВыражение(Паттерн);
294 | Регексп.Многострочный = Истина;
295 | Регексп.ИгнорироватьРегистр = Истина;
296 |
297 | Возврат Регексп;
298 |
299 | КонецФункции
300 |
301 | Функция ПрочитатьФайл(ФайлОбъекта) Экспорт
302 |
303 | ФайлЧтение = Новый ТекстовыйДокумент;
304 | ПутьФайла = ?(ТипЗнч(ФайлОбъекта) = Тип("Строка"), ФайлОбъекта, ФайлОбъекта.ПолноеИмя);
305 |
306 | ФайлЧтение.Прочитать(ПутьФайла, КодировкаТекста.UTF8NoBOM);
307 |
308 | Возврат ФайлЧтение.ПолучитьТекст();
309 |
310 | КонецФункции
311 |
--------------------------------------------------------------------------------
/src/Модули/ГенераторОтчетаHTML.os:
--------------------------------------------------------------------------------
1 | ///////////////////////////////////////////////////////////////////
2 | //
3 | // Модуль генератора отчета в формате HTML
4 | //
5 | // (с) BIA Technologies, LLC
6 | //
7 | ///////////////////////////////////////////////////////////////////
8 |
9 | Перем РасширениеПуть;
10 | Перем РодительПуть;
11 | Перем ПоставкаПуть;
12 |
13 | Перем Лог;
14 |
15 | // Сохраняет результат в формате HTML
16 | //
17 | // Параметры:
18 | // РезультатСравнения - Структура - Результат сравнения конфигураций и расширения
19 | // ИмяФайлаРезультата - Строка - Полное имя файла, в который будет записан результат сравнения
20 | // Лог - log-manager - Экземпляр класса логирования
21 | //
22 | Процедура СохранитьРезультат(РезультатСравнения, ИмяФайлаРезультата, ПараметрЛог) Экспорт
23 |
24 | РодительПуть = РезультатСравнения.РодительПуть;
25 | ПоставкаПуть = РезультатСравнения.ПоставкаПуть;
26 | РасширениеПуть = РезультатСравнения.РасширениеПуть;
27 |
28 | Лог = ПараметрЛог;
29 |
30 | СоответствиеШаблонов = Новый Соответствие();
31 | СоответствиеШаблонов.Вставить("Шаблон", ТекстШаблон());
32 | СоответствиеШаблонов.Вставить("Блок", ТекстБлок());
33 | СоответствиеШаблонов.Вставить("Таблица", ТекстТаблица());
34 |
35 | НаследованиеБлоков = Новый Соответствие();
36 | НаследованиеБлоков.Вставить("Корень", Новый Структура("Блок, Объекты", "Тип", "Объекты"));
37 | НаследованиеБлоков.Вставить("Тип", Новый Структура("Блок, Объекты", "Объект", "Модули"));
38 | НаследованиеБлоков.Вставить("Объект", Новый Структура("Блок, Объекты", "Модуль", "Методы"));
39 |
40 | Лог.Информация("Начало формирования отчета...");
41 |
42 | Попытка
43 | ТекстРезультат = ВывестиБлок(РезультатСравнения.Типы, "Корень", СоответствиеШаблонов, НаследованиеБлоков);
44 | Исключение
45 | Лог.Ошибка(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
46 | КонецПопытки;
47 |
48 | Лог.Информация("Сохранение отчета...");
49 | ФайлРезультат = Новый ТекстовыйДокумент;
50 | ФайлРезультат.УстановитьТекст(ТекстРезультат);
51 | ФайлРезультат.Записать(ИмяФайлаРезультата, КодировкаТекста.UTF8NoBOM);
52 |
53 | КонецПроцедуры
54 |
55 | ///////////////////////////////////////////////////////////////////////////////////////////////////////
56 |
57 | Функция ВывестиБлок(ВходящиеДанные, ИмяБлока, СоответствиеШаблонов, НаследованиеБлоков)
58 |
59 | // ИмяБлока
60 | // - Корень (справочники, документы и т.д.)
61 | // - Тип - объекты одного типа (Спр1, Док1, ...)
62 | // - Объект - модули
63 | // - Модуль
64 | // - Метод
65 |
66 | ТекстРезультат = "";
67 | ТекстОтчет = "";
68 |
69 | Если СтрНайти("Корень;Тип;Объект", ИмяБлока) Тогда
70 |
71 | Для каждого ОбъектСравнения Из ВходящиеДанные Цикл
72 |
73 | ТекстОбъекты = ВывестиБлок(ОбъектСравнения[НаследованиеБлоков[ИмяБлока].Объекты],
74 | НаследованиеБлоков[ИмяБлока].Блок, СоответствиеШаблонов, НаследованиеБлоков);
75 |
76 | Если Не ПустаяСтрока(ТекстОбъекты) Тогда
77 | ТекстОтчет = ТекстОтчет + СтрШаблон(СоответствиеШаблонов["Блок"],
78 | ПредставлениеОбъекта(ИмяБлока, ОбъектСравнения), ТекстОбъекты);
79 | КонецЕсли;
80 |
81 | КонецЦикла;
82 |
83 | ТекстРезультат = ?(ИмяБлока = "Корень",
84 | СтрШаблон(СоответствиеШаблонов["Шаблон"], ТекстCSS(), ТекстПодпись(), ТекстОтчет),
85 | ТекстОтчет);
86 |
87 | ИначеЕсли ИмяБлока = "Модуль" Тогда
88 |
89 | Для каждого Метод Из ВходящиеДанные Цикл
90 |
91 | ТелоРодителя = "";
92 | Метод.Свойство("Родитель", ТелоРодителя);
93 | ТелоПоставки = "";
94 | Метод.Свойство("Поставка", ТелоПоставки);
95 | ТелоРасширения = Метод.ТелоМетода;
96 |
97 | // Если Не ПустаяСтрока(ТелоРодителя) И Не ПустаяСтрока(ТелоПоставки) Тогда // вставка для отладки
98 | Если ТелоРодителя <> ТелоПоставки Тогда
99 |
100 | СравнитьДваТекста(ТелоРодителя, ТелоПоставки);
101 |
102 | ТекстОтчет = ТекстОтчет +
103 | СтрШаблон(СоответствиеШаблонов["Блок"], Метод.ТипМетода + " " + Метод.ИмяМетодаБезПрефикса + "",
104 | СтрШаблон(СоответствиеШаблонов["Таблица"], ТелоРодителя, ТелоПоставки, ТелоРасширения));
105 |
106 | КонецЕсли;
107 |
108 | КонецЦикла;
109 |
110 | ТекстРезультат = ТекстОтчет;
111 |
112 | КонецЕсли;
113 |
114 | Возврат ТекстРезультат;
115 |
116 | КонецФункции
117 |
118 | Функция ПредставлениеОбъекта(ИмяБлока, ОбъектСравнения)
119 |
120 | Если ИмяБлока = "Корень" Тогда
121 |
122 | ТекстРезультат = СтрШаблон("%1", ОбъектСравнения.Тип);
123 |
124 | ИначеЕсли ИмяБлока = "Тип" Тогда
125 |
126 | ТекстРезультат = СтрШаблон("%1", ОбъектСравнения.Имя);
127 |
128 | ИначеЕсли ИмяБлока = "Объект" Тогда
129 |
130 | ТекстРезультат = СтрЗаменить(ОбъектСравнения.ФайлМодуля.ПолноеИмя, РасширениеПуть, "");
131 | Если ОбъектСравнения.Свойство("ИмяПереопределяемого") Тогда
132 | ТекстРезультат = ТекстРезультат + СтрШаблон(
133 | " (%1)",
134 | ОбъектСравнения.ИмяПереопределяемого);
135 | КонецЕсли;
136 |
137 | Иначе
138 |
139 | ТекстРезультат = "";
140 |
141 | КонецЕсли;
142 |
143 | Возврат ТекстРезультат;
144 |
145 | КонецФункции
146 |
147 | ///////////////////////////////////////////////////////////////////////////////////////////////////////
148 |
149 | Функция ТекстПодпись()
150 |
151 | Возврат "Основная конфигурация: " + РодительПуть + "
152 | |Поставка конфигурации: " + ПоставкаПуть + "
153 | |Расширение: " + РасширениеПуть + "
154 | |Дата формирования: " + ТекущаяДата();
155 |
156 | КонецФункции
157 |
158 | Функция ТекстШаблон()
159 |
160 | Возврат
161 | "
162 | |
163 | |
164 | |
165 | | %1
166 | |
167 | |
168 | | Анализ расширения
169 | | %2
170 | |
171 | |
172 | | %3
173 | |
174 | |
175 | |
176 | |";
177 |
178 | КонецФункции
179 |
180 | Функция ТекстCSS()
181 |
182 | Возврат "
183 | |
284 | |";
285 |
286 | КонецФункции
287 |
288 | Функция ТекстБлок()
289 |
290 | Возврат "
291 | |
292 | | %1
293 | |
294 | | %2
295 | |
296 | |
297 | |";
298 |
299 | КонецФункции
300 |
301 | Функция ТекстТаблица()
302 |
303 | Возврат "
304 | |
305 | |
306 | |
307 | | | Основная конфигурация |
308 | | Поставка |
309 | | Расширение |
310 | |
311 | |
312 | | |
313 | | %1
314 | | |
315 | |
316 | | %2
317 | | |
318 | |
319 | | %3
320 | | |
321 | |
322 | |
323 | |
324 | |";
325 |
326 | КонецФункции
327 |
328 | ///////////////////////////////////////////////////////////////////////////////////////////////////////
329 |
330 | Функция НайтиСтрокуДалее(СтрокаПоиска, Масс, Знач Старт)
331 |
332 | Пока Старт < Масс.Количество() Цикл
333 |
334 | Если СокрЛП(СтрокаПоиска) = СокрЛП(Масс[Старт]) Тогда
335 | Возврат Истина;
336 | КонецЕсли;
337 |
338 | Старт = Старт + 1;
339 |
340 | КонецЦикла;
341 |
342 | Возврат Ложь;
343 |
344 | КонецФункции
345 |
346 | Процедура СравнитьДваТекста(Текст1, Текст2)
347 |
348 | Масс1 = СтрРазделить(Текст1, Символы.ПС);
349 | Масс2 = СтрРазделить(Текст2, Символы.ПС);
350 |
351 | Сч = 0;
352 |
353 | Пока Сч < Макс(Масс1.Количество(), Масс2.Количество()) Цикл
354 |
355 | Если Сч > Масс1.ВГраница() Тогда // В родительском массиве кончились строки
356 | Масс2[Сч] = ДобавитьТегСтрокаДобавлена(Масс2[Сч]);
357 | ИначеЕсли Сч > Масс2.ВГраница() Тогда // В массиве наследнике кончились строки
358 | Масс1[Сч] = ДобавитьТегСтрокаУдалена(Масс1[Сч]);
359 | ИначеЕсли СокрЛП(Масс1[Сч]) <> СокрЛП(Масс2[Сч]) Тогда // строки не равны
360 |
361 | Если НайтиСтрокуДалее(Масс2[Сч], Масс1, Сч) Тогда // ищем в первом массиве строку второго
362 | Масс2.Вставить(Сч, "");
363 | Масс1[Сч] = ДобавитьТегСтрокаУдалена(Масс1[Сч]);
364 | Иначе
365 | Масс1.Вставить(Сч, "");
366 | Масс2[Сч] = ДобавитьТегСтрокаДобавлена(Масс2[Сч]);
367 | КонецЕсли;
368 |
369 | КонецЕсли;
370 |
371 | Сч = Сч + 1;
372 |
373 | КонецЦикла;
374 |
375 | Текст1 = СтрСоединить(Масс1, Символы.ПС);
376 | Текст2 = СтрСоединить(Масс2, Символы.ПС);
377 |
378 | КонецПроцедуры
379 |
380 | Функция ДобавитьТегСтрокаУдалена(СтрокаТекста)
381 |
382 | Возврат СтрШаблон("%1", СтрокаТекста);
383 |
384 | КонецФункции
385 |
386 | Функция ДобавитьТегСтрокаДобавлена(СтрокаТекста)
387 |
388 | Возврат СтрШаблон("%1", СтрокаТекста);
389 |
390 | КонецФункции
391 |
--------------------------------------------------------------------------------
/tests/fixtures/configuration/Documents/ТестовыйДокумент.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | 12cd8645-67e4-4f52-97b6-33eb80c8cb3d
7 | 288ab939-f6f2-4f00-afe7-a1689e74c4cf
8 |
9 |
10 | e6cfb2e1-7b41-4bbc-8e3a-63f11d2b29b9
11 | c6b945c6-982e-4fed-964a-e9d8ce291c0c
12 |
13 |
14 | 9c776a75-b90b-4f98-a717-e9f379102896
15 | c22d1558-1e4f-4a52-8753-4c6f48c97b1f
16 |
17 |
18 | 1728ad7b-98d0-4123-b7fb-75ee6af22e95
19 | 15d6ea31-fc29-4a88-af02-6c9eebc3aa15
20 |
21 |
22 | e9cb002d-a63c-46a2-97b7-60385633b767
23 | f19e8590-3b64-40d9-ba90-dd73efce2628
24 |
25 |
26 |
27 | ТестовыйДокумент
28 |
29 |
30 | ru
31 | Тестовый документ
32 |
33 |
34 |
35 | true
36 |
37 | String
38 | 9
39 | Variable
40 | Nonperiodical
41 | true
42 | true
43 |
44 |
45 |
46 | Document.ТестовыйДокумент.StandardAttribute.Number
47 |
48 | Use
49 | Begin
50 | DontUse
51 | Directly
52 | Document.ТестовыйДокумент.Form.ФормаДокумента
53 |
54 |
55 |
56 |
57 |
58 | Allow
59 | Allow
60 | AutoDeleteOnUnpost
61 | WriteSelected
62 | AutoFill
63 |
64 | true
65 | true
66 | false
67 |
68 | Managed
69 | DontUse
70 |
71 |
72 |
73 |
74 |
75 | Auto
76 | DontUse
77 |
78 |
79 |
80 |
81 | Реквизит1
82 |
83 |
84 |
85 | xs:string
86 |
87 | 10
88 | Variable
89 |
90 |
91 | false
92 |
93 |
94 |
95 | false
96 |
97 | false
98 | false
99 |
100 |
101 | false
102 |
103 | DontCheck
104 | Items
105 |
106 |
107 | Auto
108 | Auto
109 |
110 |
111 | Auto
112 | DontIndex
113 | DontUse
114 | Use
115 |
116 |
117 |
118 |
119 | Реквизит2
120 |
121 |
122 |
123 | cfg:CatalogRef.Справочник1
124 |
125 | false
126 |
127 |
128 |
129 | false
130 |
131 | false
132 | false
133 |
134 |
135 | false
136 |
137 | DontCheck
138 | Items
139 |
140 |
141 | Auto
142 | Auto
143 |
144 |
145 | Auto
146 | DontIndex
147 | DontUse
148 | Use
149 |
150 |
151 |
152 |
153 |
154 |
155 | d632e036-d75c-4ff8-8b2c-46006e419dd3
156 | a02e60cc-699d-47ac-bc5b-b5f1cab00e7f
157 |
158 |
159 | 7bf838d8-2d5a-429c-a3cd-954154d18d51
160 | ebc3195f-7749-4ff0-9ce5-e0b7c4aca343
161 |
162 |
163 |
164 | ТабличнаяЧасть1
165 |
166 |
167 |
168 | DontCheck
169 |
170 |
171 |
172 |
173 | Реквизит1
174 |
175 |
176 |
177 | v8:ValueStorage
178 |
179 | false
180 |
181 |
182 |
183 | false
184 |
185 | false
186 | false
187 |
188 |
189 | DontCheck
190 | Items
191 |
192 |
193 | Auto
194 | Auto
195 |
196 |
197 | Auto
198 | DontIndex
199 | DontUse
200 | Use
201 |
202 |
203 |
204 |
205 | Реквизит2
206 |
207 |
208 |
209 | cfg:CatalogRef.Справочник1
210 |
211 | false
212 |
213 |
214 |
215 | false
216 |
217 | false
218 | false
219 |
220 |
221 | DontCheck
222 | Items
223 |
224 |
225 | Auto
226 | Auto
227 |
228 |
229 | Auto
230 | DontIndex
231 | DontUse
232 | Use
233 |
234 |
235 |
236 |
237 | Реквизит3
238 |
239 |
240 |
241 | xs:boolean
242 |
243 | false
244 |
245 |
246 |
247 | false
248 |
249 | false
250 | false
251 |
252 |
253 | DontCheck
254 | Items
255 |
256 |
257 | Auto
258 | Auto
259 |
260 |
261 | Auto
262 | DontIndex
263 | DontUse
264 | Use
265 |
266 |
267 |
268 |
269 |
270 |
271 |
--------------------------------------------------------------------------------
/src/Классы/ПарсерМодулейРасширения.os:
--------------------------------------------------------------------------------
1 | ///////////////////////////////////////////////////////////////////
2 | //
3 | // Модуль разбора файлов конфигурации
4 | //
5 | // (с) BIA Technologies, LLC
6 | //
7 | ///////////////////////////////////////////////////////////////////
8 |
9 | Перем РасширениеПуть;
10 |
11 | // Функция возвращает префикс расширения
12 | //
13 | // Параметры:
14 | // ИмяФайлаКонфигурации - Строка - Полное имя файла configuration.xml расширения
15 | //
16 | // Возвращаемое значение:
17 | // Строка - префикс расширения
18 | //
19 | Функция ПрочитатьПрефиксРасширения(ИмяФайлаКонфигурации) Экспорт
20 |
21 | Результат = "";
22 |
23 | ФайлОписания = Новый ТекстовыйДокумент;
24 | ФайлОписания.Прочитать(ИмяФайлаКонфигурации, КодировкаТекста.UTF8NoBOM);
25 | ТекстОписания = ФайлОписания.ПолучитьТекст();
26 |
27 | ПаттернПрефикса = "([\w\W]*?)<\/NamePrefix>";
28 |
29 | Регексп = Новый РегулярноеВыражение(ПаттернПрефикса);
30 | Регексп.Многострочный = Истина;
31 | Регексп.ИгнорироватьРегистр = Истина;
32 |
33 | НайденныеСтроки = Регексп.НайтиСовпадения(ТекстОписания);
34 |
35 | Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл
36 |
37 | Результат = НайденнаяСтрока.Группы[1].Значение;
38 |
39 | КонецЦикла;
40 |
41 | Возврат Результат;
42 |
43 | КонецФункции
44 |
45 | // возвращает массив описаний методов файла bsl
46 | //
47 | // Параметры:
48 | // ФайлМодуля - Файл - Файл BSL, методы которого нужно получить
49 | // Префикс - Строка - Префикс используемого расширения
50 | //
51 | // Возвращаемое значение:
52 | // Массив - массив структур, результат разбора метода на модули
53 | //
54 | Функция ПрочитатьМетодыМодуля(ФайлМодуля, Префикс = "") Экспорт
55 |
56 | Результат = Новый Массив();
57 |
58 | ФайлОписания = Новый ТекстовыйДокумент;
59 | ФайлОписания.Прочитать(ФайлМодуля.ПолноеИмя, КодировкаТекста.UTF8NoBOM);
60 | ТекстОписания = ФайлОписания.ПолучитьТекст();
61 |
62 | ПаттернМетода = "^[\s]*?(Процедура|Функция)[\s]*([\w\W]*?[\(])[\w\W]*?(КонецПроцедуры|КонецФункции)";
63 |
64 | Регексп = Новый РегулярноеВыражение(ПаттернМетода);
65 | Регексп.Многострочный = Истина;
66 | Регексп.ИгнорироватьРегистр = Истина;
67 |
68 | НайденныеСтроки = Регексп.НайтиСовпадения(ТекстОписания);
69 |
70 | Директивы = ПолучитьДирективыМетодов(ФайлМодуля);
71 |
72 | Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл
73 |
74 | ТипМетода = НайденнаяСтрока.Группы[1].Значение;
75 | ИмяМетода = СокрЛП(СтрЗаменить(НайденнаяСтрока.Группы[2].Значение, "(", ""));
76 |
77 | ДирективаМетода = Директивы[ИмяМетода];
78 | Директива = "";
79 | ИмяМетодаБезПрефикса = ИмяМетода;
80 | ДлинаПередПосле = 5; // длина слов 'Перед' и 'После'
81 | ДлинаВместо = 6; // длина слова 'Вместо'
82 | ДлинаИзменениеИКонтроль = 18; // длина слова 'ИзменениеИКонтроль'
83 |
84 | Если ДирективаМетода <> Неопределено Тогда
85 | ИмяМетодаБезПрефикса = ДирективаМетода.ИмяМетода;
86 | Директива = ДирективаМетода.Директива;
87 | ИначеЕсли Не ПустаяСтрока(Префикс) Тогда
88 | ИмяМетодаБезПрефикса = ?(СтрНачинаетсяС(ИмяМетода, Префикс), Сред(ИмяМетода, СтрДлина(Префикс) + 1), ИмяМетода);
89 | Если СтрЗаканчиваетсяНа(ВРег(ИмяМетодаБезПрефикса), ВРег("Перед"))
90 | ИЛИ СтрЗаканчиваетсяНа(ВРег(ИмяМетодаБезПрефикса), ВРег("После")) Тогда
91 | Директива = Прав(ИмяМетодаБезПрефикса, ДлинаПередПосле);
92 | ИмяМетодаБезПрефикса = Лев(ИмяМетодаБезПрефикса, СтрДлина(ИмяМетодаБезПрефикса) - ДлинаПередПосле);
93 | ИначеЕсли СтрЗаканчиваетсяНа(ВРег(ИмяМетодаБезПрефикса), ВРег("Вместо")) Тогда
94 | Директива = Прав(ИмяМетодаБезПрефикса, ДлинаВместо);
95 | ИмяМетодаБезПрефикса = Лев(ИмяМетодаБезПрефикса, СтрДлина(ИмяМетодаБезПрефикса) - ДлинаВместо);
96 | ИначеЕсли СтрЗаканчиваетсяНа(ВРег(ИмяМетодаБезПрефикса), ВРег("ИзменениеИКонтроль")) Тогда
97 | Директива = Прав(ИмяМетодаБезПрефикса, ДлинаИзменениеИКонтроль);
98 | ИмяМетодаБезПрефикса = Лев(ИмяМетодаБезПрефикса, СтрДлина(ИмяМетодаБезПрефикса) - ДлинаИзменениеИКонтроль);
99 | КонецЕсли;
100 | КонецЕсли;
101 |
102 | ТелоМетода = ?(Директива = "", "", "&" + Директива + Символы.ПС) +
103 | СокрЛП(НайденнаяСтрока.Группы[0].Значение);
104 |
105 | Результат.Добавить(СтандартнаяСтруктураРезультата(ТипМетода, ИмяМетода, ИмяМетодаБезПрефикса, ТелоМетода));
106 |
107 | КонецЦикла;
108 |
109 | Возврат Результат;
110 |
111 | КонецФункции
112 |
113 | Функция СтандартнаяСтруктураРезультата(ТипМетода, ИмяМетода, ИмяМетодаБезПрефикса, ТелоМетода)
114 |
115 | Результат = Новый Структура();
116 | Результат.Вставить("ТипМетода", ТипМетода);
117 | Результат.Вставить("ИмяМетода", ИмяМетода);
118 | Результат.Вставить("ИмяМетодаБезПрефикса", ИмяМетодаБезПрефикса);
119 | Результат.Вставить("ТелоМетода", ТелоМетода);
120 |
121 | Возврат Результат;
122 |
123 | КонецФункции
124 |
125 | Функция ПолучитьДирективыМетодов(ФайлМодуля)
126 |
127 | Результат = Новый Соответствие;
128 |
129 | ФайлОписания = Новый ТекстовыйДокумент;
130 | ФайлОписания.Прочитать(ФайлМодуля.ПолноеИмя, КодировкаТекста.UTF8NoBOM);
131 | ТекстОписания = ФайлОписания.ПолучитьТекст();
132 |
133 | ПаттернМетода = "^[\s]*?\&(Перед|Вместо|После|ИзменениеИКонтроль)[\s]*\(\""([\w\W]*?)\""\)*\s(?:Процедура|Функция)[\s]*([\w\W]*?)[\(]";
134 |
135 | Регексп = Новый РегулярноеВыражение(ПаттернМетода);
136 | Регексп.Многострочный = Истина;
137 | Регексп.ИгнорироватьРегистр = Истина;
138 |
139 | НайденныеСтроки = Регексп.НайтиСовпадения(ТекстОписания);
140 |
141 | Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл
142 |
143 | Результат.Вставить(
144 | НайденнаяСтрока.Группы[3].Значение,
145 | Новый Структура("Директива, ИмяМетода",
146 | НайденнаяСтрока.Группы[1].Значение,
147 | НайденнаяСтрока.Группы[2].Значение
148 | )
149 | );
150 |
151 | КонецЦикла;
152 |
153 | Возврат Результат;
154 |
155 | КонецФункции
156 |
157 | // Возвращает массив структур с описанием переопределенных объектов
158 | //
159 | // Возвращаемое значение:
160 | // Массив - массив структур с описанием предопределенных объектов
161 | //
162 | Функция ПолучитьПереопределенныеОбъекты() Экспорт
163 |
164 | Результат = Новый Массив();
165 |
166 | Для Каждого ТипОбъектов Из ТипыОбъектов.ОбъектыКонфигурации Цикл
167 |
168 | ФайлыОбъектов = ПолучитьФайлыОбъектов(ТипОбъектов);
169 |
170 | РезультатОбъекты = Новый Массив();
171 |
172 | Для Каждого ФайлОбъекта Из ФайлыОбъектов Цикл
173 |
174 | ДобавитьПереопределенныйОбъект(ТипОбъектов, ФайлОбъекта, РезультатОбъекты);
175 |
176 | КонецЦикла;
177 |
178 | Результат.Добавить(Новый Структура("Тип, Объекты", ТипОбъектов, РезультатОбъекты));
179 |
180 | КонецЦикла;
181 |
182 | Возврат Результат;
183 |
184 | КонецФункции
185 |
186 | // Получает методы конфигурации и сопоставляет с методами расширения для переопределенных объектов
187 | //
188 | // Параметры:
189 | // ФайлМодуляРасширения - Файл - Файл модуля расширения
190 | // ФайлМодуля - Структура - Свойства файла модуля, включая его методы, сюда добавляется сопостовление методов
191 | // ОсновнаяКонфигурацияПуть - Строка - Расположение основной конфигурации
192 | // ИмяКонфигурации - Строка - Имя (роль) конфигурации (например: "Родитель" или "Поставка")
193 | //
194 | Процедура ПрочитатьМетодыОсновнойКонфигурации(
195 | ФайлМодуляРасширения,
196 | ФайлМодуля,
197 | ОсновнаяКонфигурацияПуть,
198 | ИмяКонфигурации) Экспорт
199 |
200 | ИмяФайлаМодуляКонфигурации = "";
201 | Если ФайлМодуля.Свойство("ИмяПереопределяемого", ИмяФайлаМодуляКонфигурации) Тогда
202 | ИмяФайлаМодуляКонфигурации = ОбъединитьПути(ОсновнаяКонфигурацияПуть, ИмяФайлаМодуляКонфигурации);
203 | Иначе
204 | ИмяФайлаМодуляКонфигурации = ОбъединитьПути(
205 | ОсновнаяКонфигурацияПуть,
206 | Сред(ФайлМодуляРасширения.ПолноеИмя, СтрДлина(РасширениеПуть) + 1)
207 | );
208 | КонецЕсли;
209 |
210 | ФайлМодуляКонфигурации = Новый Файл(ИмяФайлаМодуляКонфигурации);
211 |
212 | ФайлМодуля.Вставить(ИмяКонфигурации, ФайлМодуляКонфигурации.Существует());
213 |
214 | Если ФайлМодуля[ИмяКонфигурации] Тогда
215 |
216 | СопоставитьМетодыРасширенияИКонфигурации(ПрочитатьМетодыМодуля(ФайлМодуляКонфигурации), ФайлМодуля, ИмяКонфигурации);
217 |
218 | КонецЕсли;
219 |
220 | КонецПроцедуры
221 |
222 | // Устанавливает значение переменной "РасширениеПуть"
223 | //
224 | Процедура УстановитьПуть(Путь) Экспорт
225 |
226 | РасширениеПуть = Путь;
227 |
228 | КонецПроцедуры
229 |
230 | // Получает файлы объектов расширения
231 | //
232 | // Возвращаемое значение:
233 | // Массив - массив файлов XML
234 | //
235 | Функция ПолучитьФайлыОбъектов(ТипОбъектов) Экспорт
236 |
237 | КаталогОбъектов = ОбъединитьПути(РасширениеПуть, ТипОбъектов);
238 | Файлы = НайтиФайлы(КаталогОбъектов, "*.xml");
239 |
240 | Возврат Файлы;
241 |
242 | КонецФункции
243 |
244 | // Получает файлы модулей расширения
245 | //
246 | // Возвращаемое значение:
247 | // Массив - массив файлов BSL
248 | //
249 | Функция ПолучитьФайлыМодулей(ТипОбъектов, ИмяОбъекта) Экспорт
250 |
251 | КаталогОбъектов = ОбъединитьПути(РасширениеПуть, ТипОбъектов, ИмяОбъекта);
252 | Файлы = НайтиФайлы(КаталогОбъектов, "*.bsl", Истина);
253 |
254 | Возврат Файлы;
255 |
256 | КонецФункции
257 |
258 | ///////////////////////////////////////////////////////////////////
259 |
260 | Функция ПрочитатьНаследованиеОбъекта(ФайлОбъекта)
261 |
262 | Результат = Новый Структура("Наследование, Значение", Ложь, "");
263 |
264 | ФайлОписания = Новый ТекстовыйДокумент;
265 | ФайлОписания.Прочитать(ФайлОбъекта.ПолноеИмя, КодировкаТекста.UTF8NoBOM);
266 | ТекстОписания = ФайлОписания.ПолучитьТекст();
267 |
268 | ПаттернНаследование = "(?:Adopted<\/ObjectBelonging>|Adopted.([\w\W]*?)<\/Comment>)";
269 |
270 | Регексп = Новый РегулярноеВыражение(ПаттернНаследование);
271 | Регексп.Многострочный = Истина;
272 | Регексп.ИгнорироватьРегистр = Истина;
273 |
274 | НайденныеСтроки = Регексп.НайтиСовпадения(ТекстОписания);
275 |
276 | Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл
277 |
278 | Результат.Наследование = Истина;
279 | Результат.Значение = НайденнаяСтрока.Группы[1].Значение;
280 |
281 | КонецЦикла;
282 |
283 | Возврат Результат;
284 |
285 | КонецФункции
286 |
287 | Процедура СопоставитьМетодыРасширенияИКонфигурации(МетодыМодуляКонфигурации, ФайлМодуля, ИмяКонфигурации)
288 |
289 | Для каждого Метод Из МетодыМодуляКонфигурации Цикл // обход найденных методов
290 |
291 | Для каждого МетодРасширения Из ФайлМодуля.Методы Цикл // обход существующих переопределенных методов
292 |
293 | Если Метод.ИмяМетодаБезПрефикса = МетодРасширения.ИмяМетодаБезПрефикса Тогда
294 |
295 | МетодРасширения.Вставить(ИмяКонфигурации, Метод.ТелоМетода);
296 |
297 | КонецЕсли;
298 |
299 | КонецЦикла;
300 |
301 | КонецЦикла;
302 |
303 | КонецПроцедуры
304 |
305 | // Добавлят в массив объект конфигурации, если он переопределен. Объект может состоять из нескольких файлов.
306 | //
307 | // Параметры:
308 | // ТипОбъектов - Строка - Тип объекта конфиурации (Catalogs, Documents и т.д.)
309 | // ФайлОбъекта - Файл - XML файл объекта конфигурации
310 | // РезультатОбъекты - Массив - в массив добавляются структуры с описанием файлов объекта
311 | //
312 | Процедура ДобавитьПереопределенныйОбъект(ТипОбъектов, ФайлОбъекта, РезультатОбъекты)
313 |
314 | Переопределение = ПрочитатьНаследованиеОбъекта(ФайлОбъекта);
315 | Если Переопределение.Наследование Тогда
316 |
317 | ДобОбъект = Новый Структура("Тип, Имя", ТипОбъектов, ФайлОбъекта.ИмяБезРасширения);
318 |
319 | ФайлыМодулей = ПолучитьФайлыМодулей(ДобОбъект.Тип, ДобОбъект.Имя);
320 | Если ФайлыМодулей.Количество() Тогда
321 |
322 | МассивФайлов = Новый Массив;
323 | Для Каждого ФайлМодуля Из ФайлыМодулей Цикл
324 |
325 | ФайлСтруктура = Новый Структура("ФайлМодуля", ФайлМодуля);
326 | Если Не ПустаяСтрока(Переопределение.Значение) И ФайлМодуля.Имя = "ObjectModule.bsl" Тогда
327 | ФайлСтруктура.Вставить("ИмяПереопределяемого", Переопределение.Значение);
328 | КонецЕсли;
329 |
330 | МассивФайлов.Добавить(ФайлСтруктура);
331 |
332 | КонецЦикла;
333 |
334 | ДобОбъект.Вставить("Модули", МассивФайлов);
335 | РезультатОбъекты.Добавить(ДобОбъект);
336 |
337 | КонецЕсли;
338 |
339 | КонецЕсли;
340 |
341 | КонецПроцедуры
342 |
343 | ///////////////////////////////////////////////////////////////////
344 |
345 | Процедура ПриСозданииОбъекта(Путь = Неопределено)
346 |
347 | УстановитьПуть(Путь);
348 |
349 | КонецПроцедуры
350 |
--------------------------------------------------------------------------------