├── .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 | 7 | Document.ТестовыйДокумент 8 | 9 | InteractiveDelete 10 | false 11 | 12 | 13 | InteractiveDeleteMarked 14 | false 15 | 16 | 17 | 18 | Subsystem.ПодсистемаТест 19 | 20 | View 21 | false 22 | 23 | 24 | -------------------------------------------------------------------------------- /tests/fixtures/configuration/Roles/Администратор/Ext/Rights.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | true 4 | true 5 | false 6 | 7 | Document.ТестовыйДокумент 8 | 9 | InteractiveDelete 10 | false 11 | 12 | 13 | InteractiveDeleteMarked 14 | false 15 | 16 | 17 | 18 | Subsystem.ПодсистемаТест 19 | 20 | View 21 | false 22 | 23 | 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 |
4 | 5 | ФормаДокумента 6 | Adopted 7 | Managed 8 | 9 |
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 |
4 | 5 | ФормаДокумента 6 | 7 | 8 | ru 9 | Форма документа 10 | 11 | 12 | 13 | Managed 14 | false 15 | 16 | PersonalComputer 17 | MobileDevice 18 | 19 | 20 |
21 |
-------------------------------------------------------------------------------- /tests/fixtures/configuration/Documents/ТестовыйДокумент/Forms/ФормаДокумента.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | ФормаДокумента 6 | 7 | 8 | ru 9 | Форма документа 10 | 11 | 12 | 13 | Managed 14 | false 15 | 16 | PlatformApplication 17 | MobilePlatformApplication 18 | 19 | 20 |
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 |
3 | CurrentOrLast 4 | Auto 5 | true 6 | 7 | 8 | ПриСозданииНаСервере 9 | 10 | 11 | 12 | Объект.Number 13 | EnterOnInput 14 | 15 | 16 | 17 | 18 | Объект.Date 19 | EnterOnInput 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | cfg:DocumentObject.ТестовыйДокумент 28 | 29 | true 30 | true 31 | 32 | Объект.RegisterRecords 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /tests/fixtures/configuration/Documents/ТестовыйДокумент/Forms/ФормаДокумента/Ext/Form.xml: -------------------------------------------------------------------------------- 1 | 2 |
3 | CurrentOrLast 4 | Auto 5 | true 6 | 7 | 8 | ПриСозданииНаСервере 9 | 10 | 11 | 12 | Объект.Number 13 | EnterOnInput 14 | 15 | 16 | 17 | 18 | Объект.Date 19 | EnterOnInput 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | cfg:DocumentObject.ТестовыйДокумент 28 | 29 | true 30 | true 31 | 32 | Объект.RegisterRecords 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /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 |
3 | CurrentOrLast 4 | Auto 5 | true 6 | 7 | 8 | ADDTSTПриСозданииНаСервереВместо 9 | 10 | 11 | 12 | Объект.Number 13 | EnterOnInput 14 | 15 | 16 | 17 | 18 | Объект.Date 19 | EnterOnInput 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | cfg:DocumentObject.ТестовыйДокумент 28 | 29 | true 30 | true 31 | 32 | Объект.RegisterRecords 33 | 34 | 35 | 36 | 37 | CurrentOrLast 38 | Auto 39 | true 40 | 41 | 42 | 43 | Объект.Number 44 | EnterOnInput 45 | 46 | 47 | 48 | 49 | Объект.Date 50 | EnterOnInput 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | cfg:DocumentObject.ТестовыйДокумент 59 | 60 | true 61 | true 62 | 63 | Объект.RegisterRecords 64 | 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /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 | | 315 | | 318 | | 321 | | 322 | | 323 | |
Основная конфигурацияПоставкаРасширение
313 | |
%1
314 | |
316 | |
%2
317 | |
319 | |
%3
320 | |
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 | --------------------------------------------------------------------------------