From 12aa02b86fea36c092790794527462c46a250866 Mon Sep 17 00:00:00 2001 From: Ivan Karlo Date: Thu, 19 Mar 2026 18:31:40 +0300 Subject: [PATCH] . --- build.gradle.kts | 47 + .../AccountingRegisterToJaxbConverter.java | 83 + .../AccumulationRegisterToJaxbConverter.java | 80 + .../write/BusinessProcessToJaxbConverter.java | 62 + .../CalculationRegisterToJaxbConverter.java | 84 + .../jaxb/write/CatalogToJaxbConverter.java | 236 ++ .../write/ChartOfAccountsToJaxbConverter.java | 62 + ...hartOfCalculationTypesToJaxbConverter.java | 63 + ...tOfCharacteristicTypesToJaxbConverter.java | 63 + .../write/CommandGroupToJaxbConverter.java | 56 + .../write/CommonModuleToJaxbConverter.java | 61 + .../write/ConfigurationToJaxbConverter.java | 201 ++ .../write/DataProcessorToJaxbConverter.java | 62 + .../jaxb/write/DesignerJaxbWriter.java | 188 ++ .../write/DesignerNamespacePrefixMapper.java | 27 + .../jaxb/write/DesignerPathResolver.java | 80 + .../write/DocumentJournalToJaxbConverter.java | 62 + .../jaxb/write/DocumentToJaxbConverter.java | 62 + .../jaxb/write/EnumToJaxbConverter.java | 91 + .../write/ExchangePlanToJaxbConverter.java | 62 + .../write/FilterCriterionToJaxbConverter.java | 62 + .../jaxb/write/FormToJaxbConverter.java | 63 + .../InformationRegisterToJaxbConverter.java | 62 + .../jaxb/write/JaxbWriteDefaults.java | 114 + .../mdclasses/jaxb/write/JaxbWriteUtils.java | 40 + .../jaxb/write/LanguageToJaxbConverter.java | 51 + .../jaxb/write/MDClassesJaxbWriter.java | 291 ++ .../jaxb/write/ReportToJaxbConverter.java | 62 + .../jaxb/write/RoleToJaxbConverter.java | 51 + .../write/SettingsStorageToJaxbConverter.java | 50 + .../jaxb/write/SubsystemToJaxbConverter.java | 85 + .../jaxb/write/TaskToJaxbConverter.java | 62 + .../mdclasses/jaxb/write/WriteOptions.java | 95 + .../mdclasses/jaxb/write/package-info.java | 13 + src/main/xsd/v8.3.27/catalog.xml | 16 + .../xsd/v8.3.27/v8.1c.ru-8.1-data-core.xsd | 398 +++ .../v8.3.27/v8.1c.ru-8.1-data-enterprise.xsd | 390 +++ src/main/xsd/v8.3.27/v8.1c.ru-8.1-data-ui.xsd | 424 +++ .../xsd/v8.3.27/v8.1c.ru-8.2-data-bsl.xsd | 56 + .../v8.3.27/v8.1c.ru-8.2-data-spreadsheet.xsd | 693 ++++ .../v8.1c.ru-8.2-managed-application-cmi.xsd | 275 ++ .../v8.1c.ru-8.2-managed-application-core.xsd | 1109 +++++++ ....1c.ru-8.2-managed-application-logform.xsd | 2023 ++++++++++++ ....1c.ru-8.2-managed-application-modules.xsd | 71 + .../xsd/v8.3.27/v8.1c.ru-8.2-uobjects.xsd | 379 +++ .../xsd/v8.3.27/v8.1c.ru-8.3-MDClasses.xsd | 2859 ++++++++++++++++ .../xsd/v8.3.27/v8.1c.ru-8.3-xcf-enums.xsd | 593 ++++ .../xsd/v8.3.27/v8.1c.ru-8.3-xcf-predef.xsd | 128 + .../xsd/v8.3.27/v8.1c.ru-8.3-xcf-readable.xsd | 271 ++ src/main/xsd/v8.5/bindings.xjb | 73 + src/main/xsd/v8.5/catalog.xml | 16 + src/main/xsd/v8.5/v8.1c.ru-8.1-data-core.xsd | 398 +++ .../xsd/v8.5/v8.1c.ru-8.1-data-enterprise.xsd | 441 +++ src/main/xsd/v8.5/v8.1c.ru-8.1-data-ui.xsd | 436 +++ src/main/xsd/v8.5/v8.1c.ru-8.2-data-bsl.xsd | 56 + .../v8.5/v8.1c.ru-8.2-data-spreadsheet.xsd | 710 ++++ .../v8.1c.ru-8.2-managed-application-cmi.xsd | 278 ++ .../v8.1c.ru-8.2-managed-application-core.xsd | 1161 +++++++ ....1c.ru-8.2-managed-application-logform.xsd | 2363 ++++++++++++++ ....1c.ru-8.2-managed-application-modules.xsd | 71 + src/main/xsd/v8.5/v8.1c.ru-8.2-uobjects.xsd | 379 +++ src/main/xsd/v8.5/v8.1c.ru-8.3-MDClasses.xsd | 2899 +++++++++++++++++ src/main/xsd/v8.5/v8.1c.ru-8.3-xcf-enums.xsd | 608 ++++ src/main/xsd/v8.5/v8.1c.ru-8.3-xcf-predef.xsd | 128 + .../xsd/v8.5/v8.1c.ru-8.3-xcf-readable.xsd | 271 ++ .../jaxb/write/DesignerJaxbWriterTest.java | 149 + .../jaxb/write/DesignerPathResolverTest.java | 75 + .../jaxb/write/JaxbWriterExampleTest.java | 64 + 68 files changed, 23094 insertions(+) create mode 100644 src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/AccountingRegisterToJaxbConverter.java create mode 100644 src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/AccumulationRegisterToJaxbConverter.java create mode 100644 src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/BusinessProcessToJaxbConverter.java create mode 100644 src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/CalculationRegisterToJaxbConverter.java create mode 100644 src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/CatalogToJaxbConverter.java create mode 100644 src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/ChartOfAccountsToJaxbConverter.java create mode 100644 src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/ChartOfCalculationTypesToJaxbConverter.java create mode 100644 src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/ChartOfCharacteristicTypesToJaxbConverter.java create mode 100644 src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/CommandGroupToJaxbConverter.java create mode 100644 src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/CommonModuleToJaxbConverter.java create mode 100644 src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/ConfigurationToJaxbConverter.java create mode 100644 src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/DataProcessorToJaxbConverter.java create mode 100644 src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/DesignerJaxbWriter.java create mode 100644 src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/DesignerNamespacePrefixMapper.java create mode 100644 src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/DesignerPathResolver.java create mode 100644 src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/DocumentJournalToJaxbConverter.java create mode 100644 src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/DocumentToJaxbConverter.java create mode 100644 src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/EnumToJaxbConverter.java create mode 100644 src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/ExchangePlanToJaxbConverter.java create mode 100644 src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/FilterCriterionToJaxbConverter.java create mode 100644 src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/FormToJaxbConverter.java create mode 100644 src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/InformationRegisterToJaxbConverter.java create mode 100644 src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/JaxbWriteDefaults.java create mode 100644 src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/JaxbWriteUtils.java create mode 100644 src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/LanguageToJaxbConverter.java create mode 100644 src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/MDClassesJaxbWriter.java create mode 100644 src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/ReportToJaxbConverter.java create mode 100644 src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/RoleToJaxbConverter.java create mode 100644 src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/SettingsStorageToJaxbConverter.java create mode 100644 src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/SubsystemToJaxbConverter.java create mode 100644 src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/TaskToJaxbConverter.java create mode 100644 src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/WriteOptions.java create mode 100644 src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/package-info.java create mode 100644 src/main/xsd/v8.3.27/catalog.xml create mode 100644 src/main/xsd/v8.3.27/v8.1c.ru-8.1-data-core.xsd create mode 100644 src/main/xsd/v8.3.27/v8.1c.ru-8.1-data-enterprise.xsd create mode 100644 src/main/xsd/v8.3.27/v8.1c.ru-8.1-data-ui.xsd create mode 100644 src/main/xsd/v8.3.27/v8.1c.ru-8.2-data-bsl.xsd create mode 100644 src/main/xsd/v8.3.27/v8.1c.ru-8.2-data-spreadsheet.xsd create mode 100644 src/main/xsd/v8.3.27/v8.1c.ru-8.2-managed-application-cmi.xsd create mode 100644 src/main/xsd/v8.3.27/v8.1c.ru-8.2-managed-application-core.xsd create mode 100644 src/main/xsd/v8.3.27/v8.1c.ru-8.2-managed-application-logform.xsd create mode 100644 src/main/xsd/v8.3.27/v8.1c.ru-8.2-managed-application-modules.xsd create mode 100644 src/main/xsd/v8.3.27/v8.1c.ru-8.2-uobjects.xsd create mode 100644 src/main/xsd/v8.3.27/v8.1c.ru-8.3-MDClasses.xsd create mode 100644 src/main/xsd/v8.3.27/v8.1c.ru-8.3-xcf-enums.xsd create mode 100644 src/main/xsd/v8.3.27/v8.1c.ru-8.3-xcf-predef.xsd create mode 100644 src/main/xsd/v8.3.27/v8.1c.ru-8.3-xcf-readable.xsd create mode 100644 src/main/xsd/v8.5/bindings.xjb create mode 100644 src/main/xsd/v8.5/catalog.xml create mode 100644 src/main/xsd/v8.5/v8.1c.ru-8.1-data-core.xsd create mode 100644 src/main/xsd/v8.5/v8.1c.ru-8.1-data-enterprise.xsd create mode 100644 src/main/xsd/v8.5/v8.1c.ru-8.1-data-ui.xsd create mode 100644 src/main/xsd/v8.5/v8.1c.ru-8.2-data-bsl.xsd create mode 100644 src/main/xsd/v8.5/v8.1c.ru-8.2-data-spreadsheet.xsd create mode 100644 src/main/xsd/v8.5/v8.1c.ru-8.2-managed-application-cmi.xsd create mode 100644 src/main/xsd/v8.5/v8.1c.ru-8.2-managed-application-core.xsd create mode 100644 src/main/xsd/v8.5/v8.1c.ru-8.2-managed-application-logform.xsd create mode 100644 src/main/xsd/v8.5/v8.1c.ru-8.2-managed-application-modules.xsd create mode 100644 src/main/xsd/v8.5/v8.1c.ru-8.2-uobjects.xsd create mode 100644 src/main/xsd/v8.5/v8.1c.ru-8.3-MDClasses.xsd create mode 100644 src/main/xsd/v8.5/v8.1c.ru-8.3-xcf-enums.xsd create mode 100644 src/main/xsd/v8.5/v8.1c.ru-8.3-xcf-predef.xsd create mode 100644 src/main/xsd/v8.5/v8.1c.ru-8.3-xcf-readable.xsd create mode 100644 src/test/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/DesignerJaxbWriterTest.java create mode 100644 src/test/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/DesignerPathResolverTest.java create mode 100644 src/test/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/JaxbWriterExampleTest.java diff --git a/build.gradle.kts b/build.gradle.kts index d45a85bd4..30f2880d2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -54,6 +54,10 @@ dependencies { implementation("com.thoughtworks.xstream:xstream:1.4.21") + // JAXB (Jakarta) for Designer XML write via XSD-generated classes + implementation("jakarta.xml.bind:jakarta.xml.bind-api:4.0.2") + implementation("org.glassfish.jaxb:jaxb-runtime:4.0.5") + // логирование implementation("org.slf4j:slf4j-api:2.0.16") @@ -89,6 +93,38 @@ dependencies { jmhAnnotationProcessor("org.openjdk.jmh:jmh-generator-annprocess:1.37") } +val xjcOutputMDClasses = layout.buildDirectory.dir("generated/sources/xjc-mdclasses") +val xsdV85Dir = layout.projectDirectory.dir("src/main/xsd/v8.5") + +val xjc by configurations.creating +dependencies { + xjc("org.glassfish.jaxb:jaxb-xjc:4.0.5") + xjc("org.glassfish.jaxb:jaxb-runtime:4.0.5") +} + +tasks.register("xjcMDClasses") { + group = "Build" + description = "Generate JAXB classes from v8.5 MDClasses XSD" + classpath = xjc + mainClass = "com.sun.tools.xjc.Driver" + workingDir = xsdV85Dir.asFile + doFirst { + args( + "-extension", + "-catalog", "catalog.xml", + "-b", "bindings.xjb", + "-d", xjcOutputMDClasses.get().asFile.absolutePath, + "v8.1c.ru-8.3-MDClasses.xsd" + ) + } + inputs.dir(xsdV85Dir) + outputs.dir(xjcOutputMDClasses) +} + +tasks.compileJava { + dependsOn("xjcMDClasses") +} + java { sourceCompatibility = JavaVersion.VERSION_21 targetCompatibility = JavaVersion.VERSION_21 @@ -96,6 +132,16 @@ java { withJavadocJar() } +sourceSets["main"].java.srcDir(xjcOutputMDClasses) + +tasks.named("sourcesJar") { + dependsOn("xjcMDClasses") +} + +tasks.named("licenseMain") { + dependsOn("xjcMDClasses") +} + jmh { warmupIterations = 3 iterations = 5 @@ -172,6 +218,7 @@ license { ext["project"] = "MDClasses" mapping("java", "SLASHSTAR_STYLE") include("**/*.java") + exclude("**/jaxb/**") } diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/AccountingRegisterToJaxbConverter.java b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/AccountingRegisterToJaxbConverter.java new file mode 100644 index 000000000..cae0241d3 --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/AccountingRegisterToJaxbConverter.java @@ -0,0 +1,83 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import com.github._1c_syntax.bsl.mdo.AccountingRegister; +import com.github._1c_syntax.bsl.mdo.children.ObjectForm; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.AccountingRegisterChildObjects; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.AccountingRegisterProperties; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.MetaDataObject; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ObjectFactory; + +import java.math.BigDecimal; + +/** + * Преобразует регистр бухгалтерии mdclasses в JAXB-DTO для записи Designer XML. + */ +public final class AccountingRegisterToJaxbConverter { + + private static final ObjectFactory FACTORY = new ObjectFactory(); + + private AccountingRegisterToJaxbConverter() { + } + + /** + * Собирает JAXB MetaDataObject из регистра бухгалтерии. + * + * @param ar регистр бухгалтерии из модели mdclasses + * @return корневой элемент для маршаллинга в Designer XML + */ + public static MetaDataObject toMetaDataObject(AccountingRegister ar) { + MetaDataObject root = FACTORY.createMetaDataObject(); + root.setVersion(JaxbWriteDefaults.DEFAULT_FORMAT_VERSION); + com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.AccountingRegister inner = FACTORY.createAccountingRegister(); + inner.setUuid(ar.getUuid() != null ? ar.getUuid() : ""); + inner.setProperties(buildProperties(ar)); + inner.setChildObjects(buildChildObjects(ar)); + root.setAccountingRegister(inner); + return root; + } + + private static AccountingRegisterProperties buildProperties(AccountingRegister ar) { + AccountingRegisterProperties p = FACTORY.createAccountingRegisterProperties(); + p.setName(ar.getName()); + p.setSynonym(JaxbWriteDefaults.localStringType(JaxbWriteUtils.contentForLocalString(ar.getSynonym()))); + p.setComment(ar.getComment() != null ? ar.getComment() : ""); + p.setObjectBelonging(JaxbWriteDefaults.objectBelongingNative()); + p.setUseStandardCommands(false); + p.setIncludeHelpInContents(false); + p.setHelp(""); + p.setChartOfAccounts(""); + p.setCorrespondence(false); + p.setPeriodAdjustmentLength(BigDecimal.ZERO); + p.setDefaultListForm(""); + p.setAuxiliaryListForm(""); + p.setRecordSetModule(""); + p.setManagerModule(""); + p.setStandardAttributes(JaxbWriteDefaults.emptyStandardAttributeDescriptions()); + p.setDataLockControlMode(JaxbWriteDefaults.defaultDataLockControlModeAutomatic()); + p.setEnableTotalsSplitting(false); + p.setFullTextSearch(JaxbWriteDefaults.fullTextSearchDontUse()); + p.setListPresentation(JaxbWriteDefaults.localStringType("")); + p.setExtendedListPresentation(JaxbWriteDefaults.localStringType("")); + p.setExplanation(JaxbWriteDefaults.localStringType("")); + p.setAdditionalIndexes(""); + return p; + } + + private static AccountingRegisterChildObjects buildChildObjects(AccountingRegister ar) { + AccountingRegisterChildObjects co = FACTORY.createAccountingRegisterChildObjects(); + if (ar.getForms() != null) { + for (ObjectForm form : ar.getForms()) { + co.getForm().add(form.getName() != null ? form.getName() : ""); + } + } + return co; + } +} diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/AccumulationRegisterToJaxbConverter.java b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/AccumulationRegisterToJaxbConverter.java new file mode 100644 index 000000000..3116249a7 --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/AccumulationRegisterToJaxbConverter.java @@ -0,0 +1,80 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import com.github._1c_syntax.bsl.mdo.AccumulationRegister; +import com.github._1c_syntax.bsl.mdo.children.ObjectForm; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.AccumulationRegisterChildObjects; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.AccumulationRegisterProperties; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.MetaDataObject; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ObjectFactory; + +/** + * Преобразует регистр накопления mdclasses в JAXB-DTO для записи Designer XML. + */ +public final class AccumulationRegisterToJaxbConverter { + + private static final ObjectFactory FACTORY = new ObjectFactory(); + + private AccumulationRegisterToJaxbConverter() { + } + + /** + * Собирает JAXB MetaDataObject из регистра накопления. + * + * @param ar регистр накопления из модели mdclasses + * @return корневой элемент для маршаллинга в Designer XML + */ + public static MetaDataObject toMetaDataObject(AccumulationRegister ar) { + MetaDataObject root = FACTORY.createMetaDataObject(); + root.setVersion(JaxbWriteDefaults.DEFAULT_FORMAT_VERSION); + com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.AccumulationRegister inner = FACTORY.createAccumulationRegister(); + inner.setUuid(ar.getUuid() != null ? ar.getUuid() : ""); + inner.setProperties(buildProperties(ar)); + inner.setChildObjects(buildChildObjects(ar)); + root.setAccumulationRegister(inner); + return root; + } + + private static AccumulationRegisterProperties buildProperties(AccumulationRegister ar) { + AccumulationRegisterProperties p = FACTORY.createAccumulationRegisterProperties(); + p.setName(ar.getName()); + p.setSynonym(JaxbWriteDefaults.localStringType(JaxbWriteUtils.contentForLocalString(ar.getSynonym()))); + p.setComment(ar.getComment() != null ? ar.getComment() : ""); + p.setObjectBelonging(JaxbWriteDefaults.objectBelongingNative()); + p.setUseStandardCommands(false); + p.setDefaultListForm(""); + p.setAuxiliaryListForm(""); + p.setRegisterType(JaxbWriteDefaults.accumulationRegisterTypeBalance()); + p.setIncludeHelpInContents(false); + p.setHelp(""); + p.setRecordSetModule(""); + p.setManagerModule(""); + p.setStandardAttributes(JaxbWriteDefaults.emptyStandardAttributeDescriptions()); + p.setDataLockControlMode(JaxbWriteDefaults.defaultDataLockControlModeAutomatic()); + p.setFullTextSearch(JaxbWriteDefaults.fullTextSearchDontUse()); + p.setEnableTotalsSplitting(false); + p.setAggregates(""); + p.setListPresentation(JaxbWriteDefaults.localStringType("")); + p.setExtendedListPresentation(JaxbWriteDefaults.localStringType("")); + p.setExplanation(JaxbWriteDefaults.localStringType("")); + p.setAdditionalIndexes(""); + return p; + } + + private static AccumulationRegisterChildObjects buildChildObjects(AccumulationRegister ar) { + AccumulationRegisterChildObjects co = FACTORY.createAccumulationRegisterChildObjects(); + if (ar.getForms() != null) { + for (ObjectForm form : ar.getForms()) { + co.getForm().add(form.getName() != null ? form.getName() : ""); + } + } + return co; + } +} diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/BusinessProcessToJaxbConverter.java b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/BusinessProcessToJaxbConverter.java new file mode 100644 index 000000000..372ce30dd --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/BusinessProcessToJaxbConverter.java @@ -0,0 +1,62 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import com.github._1c_syntax.bsl.mdo.BusinessProcess; +import com.github._1c_syntax.bsl.mdo.children.ObjectForm; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.MetaDataObject; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ObjectFactory; + +/** + * Преобразует бизнес-процесс mdclasses в JAXB-DTO для записи Designer XML. + */ +public final class BusinessProcessToJaxbConverter { + + private static final ObjectFactory FACTORY = new ObjectFactory(); + + private BusinessProcessToJaxbConverter() { + } + + /** + * Собирает JAXB MetaDataObject из бизнес-процесса. + * + * @param bp бизнес-процесс из модели mdclasses + * @return корневой элемент для маршаллинга в Designer XML + */ + public static MetaDataObject toMetaDataObject(BusinessProcess bp) { + MetaDataObject root = FACTORY.createMetaDataObject(); + root.setVersion(JaxbWriteDefaults.DEFAULT_FORMAT_VERSION); + com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.BusinessProcess inner = FACTORY.createBusinessProcess(); + inner.setUuid(bp.getUuid() != null ? bp.getUuid() : ""); + inner.setProperties(buildProperties(bp)); + inner.setChildObjects(buildChildObjects(bp)); + root.setBusinessProcess(inner); + return root; + } + + private static com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.BusinessProcessProperties buildProperties(BusinessProcess bp) { + com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.BusinessProcessProperties p = + FACTORY.createBusinessProcessProperties(); + p.setName(bp.getName()); + p.setSynonym(JaxbWriteDefaults.localStringType(JaxbWriteUtils.contentForLocalString(bp.getSynonym()))); + p.setComment(bp.getComment() != null ? bp.getComment() : ""); + return p; + } + + private static com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.BusinessProcessChildObjects buildChildObjects(BusinessProcess bp) { + com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.BusinessProcessChildObjects childObjects = + FACTORY.createBusinessProcessChildObjects(); + if (bp.getForms() != null) { + for (ObjectForm form : bp.getForms()) { + childObjects.getForm().add(form.getName() != null ? form.getName() : ""); + } + } + return childObjects; + } +} diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/CalculationRegisterToJaxbConverter.java b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/CalculationRegisterToJaxbConverter.java new file mode 100644 index 000000000..9a650688c --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/CalculationRegisterToJaxbConverter.java @@ -0,0 +1,84 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import com.github._1c_syntax.bsl.mdo.CalculationRegister; +import com.github._1c_syntax.bsl.mdo.children.ObjectForm; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.CalculationRegisterChildObjects; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.CalculationRegisterProperties; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.MetaDataObject; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ObjectFactory; + +/** + * Преобразует регистр расчёта mdclasses в JAXB-DTO для записи Designer XML. + */ +public final class CalculationRegisterToJaxbConverter { + + private static final ObjectFactory FACTORY = new ObjectFactory(); + + private CalculationRegisterToJaxbConverter() { + } + + /** + * Собирает JAXB MetaDataObject из регистра расчёта. + * + * @param cr регистр расчёта из модели mdclasses + * @return корневой элемент для маршаллинга в Designer XML + */ + public static MetaDataObject toMetaDataObject(CalculationRegister cr) { + MetaDataObject root = FACTORY.createMetaDataObject(); + root.setVersion(JaxbWriteDefaults.DEFAULT_FORMAT_VERSION); + com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.CalculationRegister inner = FACTORY.createCalculationRegister(); + inner.setUuid(cr.getUuid() != null ? cr.getUuid() : ""); + inner.setProperties(buildProperties(cr)); + inner.setChildObjects(buildChildObjects(cr)); + root.setCalculationRegister(inner); + return root; + } + + private static CalculationRegisterProperties buildProperties(CalculationRegister cr) { + CalculationRegisterProperties p = FACTORY.createCalculationRegisterProperties(); + p.setName(cr.getName()); + p.setSynonym(JaxbWriteDefaults.localStringType(JaxbWriteUtils.contentForLocalString(cr.getSynonym()))); + p.setComment(cr.getComment() != null ? cr.getComment() : ""); + p.setObjectBelonging(JaxbWriteDefaults.objectBelongingNative()); + p.setUseStandardCommands(false); + p.setDefaultListForm(""); + p.setAuxiliaryListForm(""); + p.setPeriodicity(JaxbWriteDefaults.calculationRegisterPeriodicityYear()); + p.setActionPeriod(false); + p.setBasePeriod(false); + p.setSchedule(""); + p.setScheduleValue(""); + p.setScheduleDate(""); + p.setChartOfCalculationTypes(""); + p.setRecordSetModule(""); + p.setManagerModule(""); + p.setIncludeHelpInContents(false); + p.setHelp(""); + p.setStandardAttributes(JaxbWriteDefaults.emptyStandardAttributeDescriptions()); + p.setDataLockControlMode(JaxbWriteDefaults.defaultDataLockControlModeAutomatic()); + p.setFullTextSearch(JaxbWriteDefaults.fullTextSearchDontUse()); + p.setListPresentation(JaxbWriteDefaults.localStringType("")); + p.setExtendedListPresentation(JaxbWriteDefaults.localStringType("")); + p.setExplanation(JaxbWriteDefaults.localStringType("")); + p.setAdditionalIndexes(""); + return p; + } + + private static CalculationRegisterChildObjects buildChildObjects(CalculationRegister cr) { + CalculationRegisterChildObjects co = FACTORY.createCalculationRegisterChildObjects(); + if (cr.getForms() != null) { + for (ObjectForm form : cr.getForms()) { + co.getForm().add(form.getName() != null ? form.getName() : ""); + } + } + return co; + } +} diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/CatalogToJaxbConverter.java b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/CatalogToJaxbConverter.java new file mode 100644 index 000000000..b97518613 --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/CatalogToJaxbConverter.java @@ -0,0 +1,236 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import com.github._1c_syntax.bsl.mdo.Attribute; +import com.github._1c_syntax.bsl.mdo.Catalog; +import com.github._1c_syntax.bsl.mdo.children.ObjectCommand; +import com.github._1c_syntax.bsl.mdo.children.ObjectForm; +import com.github._1c_syntax.bsl.mdo.support.CodeSeries; +import com.github._1c_syntax.bsl.types.MdoReference; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.AttributeProperties; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.CatalogChildObjects; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.CatalogProperties; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.Command; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.CommandProperties; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.MetaDataObject; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ObjectFactory; +import com.github._1c_syntax.bsl.mdclasses.jaxb.v8_1_data_core.AllowedLength; +import com.github._1c_syntax.bsl.mdclasses.jaxb.v8_2_managed_application_logform.ChoiceDataGetModeOnInputByString; +import com.github._1c_syntax.bsl.mdclasses.jaxb.v8_2_managed_application_logform.FullTextSearchOnInputByString; +import com.github._1c_syntax.bsl.mdclasses.jaxb.v8_2_managed_application_logform.SearchStringModeOnInputByString; +import com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_enums.CatalogCodeType; +import com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_enums.CatalogCodesSeries; +import com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_enums.CatalogMainPresentation; +import com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_enums.CreateOnInput; +import com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_enums.DataHistoryUse; +import com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_enums.EditType; +import com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_enums.HierarchyType; +import com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_enums.PredefinedDataUpdate; +import com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_enums.SubordinationUse; + +import java.math.BigDecimal; +import java.util.Set; + +/** + * Преобразует модель справочника mdclasses в JAXB-DTO для записи Designer XML. + */ +public final class CatalogToJaxbConverter { + + private static final ObjectFactory FACTORY = new ObjectFactory(); + + private static final String EMPTY_REF = ""; + + private static final Set STANDARD_CATALOG_ATTRIBUTE_NAMES = Set.of( + "Code", "Description", "Ref", "DeletionMark", "IsFolder", "Owner", "Parent", + "PredefinedDataName", "Predefined" + ); + + private CatalogToJaxbConverter() { + } + + /** + * Собирает JAXB MetaDataObject из справочника mdclasses. + * + * @param catalog справочник из модели mdclasses + * @return корневой элемент для маршаллинга в Designer XML + */ + public static MetaDataObject toMetaDataObject(Catalog catalog) { + return toMetaDataObject(catalog, null); + } + + /** + * Собирает JAXB MetaDataObject из справочника mdclasses с указанием группы команд по умолчанию. + * + * @param catalog справочник из модели mdclasses + * @param defaultCommandGroupRef MDO-ссылка группы команд (например, "CommandGroup.ГруппаКоманд1") для команд без группы + * @return корневой элемент для маршаллинга в Designer XML + */ + public static MetaDataObject toMetaDataObject(Catalog catalog, String defaultCommandGroupRef) { + MetaDataObject root = FACTORY.createMetaDataObject(); + root.setVersion(JaxbWriteDefaults.DEFAULT_FORMAT_VERSION); + com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.Catalog inner = FACTORY.createCatalog(); + inner.setUuid(catalog.getUuid() != null ? catalog.getUuid() : ""); + inner.setProperties(buildProperties(catalog)); + inner.setChildObjects(buildChildObjects(catalog, defaultCommandGroupRef)); + root.setCatalog(inner); + return root; + } + + private static CatalogProperties buildProperties(Catalog c) { + CatalogProperties p = FACTORY.createCatalogProperties(); + p.setName(c.getName()); + p.setSynonym(JaxbWriteDefaults.localStringType(JaxbWriteUtils.contentForLocalString(c.getSynonym()))); + p.setComment(c.getComment() != null ? c.getComment() : ""); + p.setObjectBelonging(JaxbWriteDefaults.objectBelongingNative()); + p.setHierarchical(false); + p.setHierarchyType(HierarchyType.HIERARCHY_FOLDERS_AND_ITEMS); + p.setLimitLevelCount(false); + p.setLevelCount(BigDecimal.ONE); + p.setFoldersOnTop(true); + p.setUseStandardCommands(true); + p.setOwners(buildOwners(c)); + p.setSubordinationUse(SubordinationUse.TO_FOLDERS_AND_ITEMS); + p.setCodeLength(BigDecimal.valueOf(9)); + p.setDescriptionLength(BigDecimal.valueOf(150)); + p.setCodeType(CatalogCodeType.STRING); + p.setCodeAllowedLength(AllowedLength.VARIABLE); + p.setCodeSeries(codeSeriesToJaxb(c.getCodeSeries())); + p.setCheckUnique(c.isCheckUnique()); + p.setAutonumbering(false); + p.setDefaultPresentation(CatalogMainPresentation.AS_DESCRIPTION); + p.setStandardAttributes(JaxbWriteDefaults.emptyStandardAttributeDescriptions()); + p.setCharacteristics(JaxbWriteDefaults.emptyCharacteristicsDescriptions()); + p.setPredefined(""); + p.setPredefinedDataUpdate(PredefinedDataUpdate.DONT_AUTO_UPDATE); + p.setEditType(EditType.IN_LIST); + p.setQuickChoice(false); + p.setChoiceMode(JaxbWriteDefaults.choiceModeFromForm()); + p.setInputByString(JaxbWriteDefaults.emptyFieldList()); + p.setSearchStringModeOnInputByString(SearchStringModeOnInputByString.ANY_PART); + p.setFullTextSearchOnInputByString(FullTextSearchOnInputByString.USE); + p.setChoiceDataGetModeOnInputByString(ChoiceDataGetModeOnInputByString.DIRECTLY); + p.setDefaultObjectForm(EMPTY_REF); + p.setDefaultFolderForm(EMPTY_REF); + p.setDefaultListForm(EMPTY_REF); + p.setDefaultChoiceForm(EMPTY_REF); + p.setDefaultFolderChoiceForm(EMPTY_REF); + p.setAuxiliaryObjectForm(EMPTY_REF); + p.setAuxiliaryFolderForm(EMPTY_REF); + p.setAuxiliaryListForm(EMPTY_REF); + p.setAuxiliaryChoiceForm(EMPTY_REF); + p.setAuxiliaryFolderChoiceForm(EMPTY_REF); + p.setObjectModule(EMPTY_REF); + p.setManagerModule(EMPTY_REF); + p.setIncludeHelpInContents(false); + p.setHelp(EMPTY_REF); + p.setBasedOn(JaxbWriteDefaults.emptyMDListType()); + p.setDataLockFields(JaxbWriteDefaults.emptyFieldList()); + p.setDataLockControlMode(JaxbWriteDefaults.defaultDataLockControlModeAutomatic()); + p.setFullTextSearch(JaxbWriteDefaults.fullTextSearchDontUse()); + p.setObjectPresentation(JaxbWriteDefaults.localStringType("")); + p.setExtendedObjectPresentation(JaxbWriteDefaults.localStringType("")); + p.setListPresentation(JaxbWriteDefaults.localStringType("")); + p.setExtendedListPresentation(JaxbWriteDefaults.localStringType("")); + p.setExplanation(JaxbWriteDefaults.localStringType(JaxbWriteUtils.contentForLocalString(c.getExplanation()))); + p.setCreateOnInput(CreateOnInput.DONT_USE); + p.setChoiceHistoryOnInput(JaxbWriteDefaults.choiceHistoryOnInputAuto()); + p.setDataHistory(DataHistoryUse.DONT_USE); + p.setUpdateDataHistoryImmediatelyAfterWrite(false); + p.setExecuteAfterWriteDataHistoryVersionProcessing(false); + p.setAdditionalIndexes(EMPTY_REF); + return p; + } + + private static com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_readable.MDListType buildOwners(Catalog c) { + com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_readable.MDListType owners = + new com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_readable.MDListType(); + if (c.getOwners() != null && !c.getOwners().isEmpty()) { + for (MdoReference ref : c.getOwners()) { + owners.getItem().add(shortNameFromMdoRef(ref != null ? ref.getMdoRef() : null)); + } + } + return owners; + } + + private static CatalogCodesSeries codeSeriesToJaxb(CodeSeries cs) { + if (cs == null) { + return CatalogCodesSeries.WHOLE_CATALOG; + } + return switch (cs) { + case WITHIN_SUBORDINATION -> CatalogCodesSeries.WITHIN_SUBORDINATION; + case WITHIN_OWNER_SUBORDINATION -> CatalogCodesSeries.WITHIN_OWNER_SUBORDINATION; + default -> CatalogCodesSeries.WHOLE_CATALOG; + }; + } + + private static CatalogChildObjects buildChildObjects(Catalog c, String defaultCommandGroupRef) { + CatalogChildObjects co = FACTORY.createCatalogChildObjects(); + addForms(co, c); + addCommands(co, c, defaultCommandGroupRef); + addAttributes(co, c); + return co; + } + + private static void addForms(CatalogChildObjects co, Catalog c) { + if (c.getForms() == null) { + return; + } + for (ObjectForm form : c.getForms()) { + co.getForm().add(form.getName() != null ? form.getName() : ""); + } + } + + private static void addCommands(CatalogChildObjects co, Catalog c, String defaultCommandGroupRef) { + if (c.getCommands() == null) { + return; + } + for (ObjectCommand cmd : c.getCommands()) { + Command command = FACTORY.createCommand(); + command.setUuid(cmd.getUuid() != null ? cmd.getUuid() : ""); + CommandProperties cmdProps = FACTORY.createCommandProperties(); + cmdProps.setName(cmd.getName()); + cmdProps.setSynonym(JaxbWriteDefaults.localStringType(JaxbWriteUtils.contentForLocalString(cmd.getSynonym()))); + cmdProps.setComment(cmd.getComment() != null ? cmd.getComment() : ""); + cmdProps.setOnMainServerUnavalableBehavior(JaxbWriteDefaults.onMainServerUnavalableBehaviorAuto()); + if (defaultCommandGroupRef != null && !defaultCommandGroupRef.isEmpty()) { + cmdProps.setGroup(defaultCommandGroupRef); + } + command.setProperties(cmdProps); + co.getCommand().add(command); + } + } + + private static void addAttributes(CatalogChildObjects co, Catalog c) { + if (c.getAttributes() == null) { + return; + } + for (Attribute attr : c.getAttributes()) { + if (attr.getName() == null || STANDARD_CATALOG_ATTRIBUTE_NAMES.contains(attr.getName())) { + continue; + } + com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.Attribute attribute = FACTORY.createAttribute(); + attribute.setUuid(attr.getUuid() != null ? attr.getUuid() : ""); + AttributeProperties attrProps = FACTORY.createAttributeProperties(); + attrProps.setName(attr.getName()); + attrProps.setSynonym(JaxbWriteDefaults.localStringType(JaxbWriteUtils.contentForLocalString(attr.getSynonym()))); + attrProps.setComment(attr.getComment() != null ? attr.getComment() : ""); + attribute.setProperties(attrProps); + co.getAttribute().add(attribute); + } + } + + private static String shortNameFromMdoRef(String mdoRef) { + if (mdoRef == null) { + return ""; + } + int dot = mdoRef.indexOf('.'); + return dot >= 0 ? mdoRef.substring(dot + 1) : mdoRef; + } +} diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/ChartOfAccountsToJaxbConverter.java b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/ChartOfAccountsToJaxbConverter.java new file mode 100644 index 000000000..dac598e6d --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/ChartOfAccountsToJaxbConverter.java @@ -0,0 +1,62 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import com.github._1c_syntax.bsl.mdo.ChartOfAccounts; +import com.github._1c_syntax.bsl.mdo.children.ObjectForm; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ChartOfAccountsChildObjects; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ChartOfAccountsProperties; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.MetaDataObject; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ObjectFactory; + +/** + * Преобразует план счетов mdclasses в JAXB-DTO для записи Designer XML. + */ +public final class ChartOfAccountsToJaxbConverter { + + private static final ObjectFactory FACTORY = new ObjectFactory(); + + private ChartOfAccountsToJaxbConverter() { + } + + /** + * Собирает JAXB MetaDataObject из плана счетов. + * + * @param coa план счетов из модели mdclasses + * @return корневой элемент для маршаллинга в Designer XML + */ + public static MetaDataObject toMetaDataObject(ChartOfAccounts coa) { + MetaDataObject root = FACTORY.createMetaDataObject(); + root.setVersion(JaxbWriteDefaults.DEFAULT_FORMAT_VERSION); + com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ChartOfAccounts inner = FACTORY.createChartOfAccounts(); + inner.setUuid(coa.getUuid() != null ? coa.getUuid() : ""); + inner.setProperties(buildProperties(coa)); + inner.setChildObjects(buildChildObjects(coa)); + root.setChartOfAccounts(inner); + return root; + } + + private static ChartOfAccountsProperties buildProperties(ChartOfAccounts coa) { + ChartOfAccountsProperties p = FACTORY.createChartOfAccountsProperties(); + p.setName(coa.getName()); + p.setSynonym(JaxbWriteDefaults.localStringType(JaxbWriteUtils.contentForLocalString(coa.getSynonym()))); + p.setComment(coa.getComment() != null ? coa.getComment() : ""); + return p; + } + + private static ChartOfAccountsChildObjects buildChildObjects(ChartOfAccounts chart) { + ChartOfAccountsChildObjects childObjects = FACTORY.createChartOfAccountsChildObjects(); + if (chart.getForms() != null) { + for (ObjectForm form : chart.getForms()) { + childObjects.getForm().add(form.getName() != null ? form.getName() : ""); + } + } + return childObjects; + } +} diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/ChartOfCalculationTypesToJaxbConverter.java b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/ChartOfCalculationTypesToJaxbConverter.java new file mode 100644 index 000000000..a4376fd3f --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/ChartOfCalculationTypesToJaxbConverter.java @@ -0,0 +1,63 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import com.github._1c_syntax.bsl.mdo.ChartOfCalculationTypes; +import com.github._1c_syntax.bsl.mdo.children.ObjectForm; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ChartOfCalculationTypesChildObjects; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ChartOfCalculationTypesProperties; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.MetaDataObject; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ObjectFactory; + +/** + * Преобразует план видов расчёта mdclasses в JAXB-DTO для записи Designer XML. + */ +public final class ChartOfCalculationTypesToJaxbConverter { + + private static final ObjectFactory FACTORY = new ObjectFactory(); + + private ChartOfCalculationTypesToJaxbConverter() { + } + + /** + * Собирает JAXB MetaDataObject из плана видов расчёта. + * + * @param chart план видов расчёта из модели mdclasses + * @return корневой элемент для маршаллинга в Designer XML + */ + public static MetaDataObject toMetaDataObject(ChartOfCalculationTypes chart) { + MetaDataObject root = FACTORY.createMetaDataObject(); + root.setVersion(JaxbWriteDefaults.DEFAULT_FORMAT_VERSION); + com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ChartOfCalculationTypes inner = + FACTORY.createChartOfCalculationTypes(); + inner.setUuid(chart.getUuid() != null ? chart.getUuid() : ""); + inner.setProperties(buildProperties(chart)); + inner.setChildObjects(buildChildObjects(chart)); + root.setChartOfCalculationTypes(inner); + return root; + } + + private static ChartOfCalculationTypesProperties buildProperties(ChartOfCalculationTypes chart) { + ChartOfCalculationTypesProperties p = FACTORY.createChartOfCalculationTypesProperties(); + p.setName(chart.getName()); + p.setSynonym(JaxbWriteDefaults.localStringType(JaxbWriteUtils.contentForLocalString(chart.getSynonym()))); + p.setComment(chart.getComment() != null ? chart.getComment() : ""); + return p; + } + + private static ChartOfCalculationTypesChildObjects buildChildObjects(ChartOfCalculationTypes chart) { + ChartOfCalculationTypesChildObjects childObjects = FACTORY.createChartOfCalculationTypesChildObjects(); + if (chart.getForms() != null) { + for (ObjectForm form : chart.getForms()) { + childObjects.getForm().add(form.getName() != null ? form.getName() : ""); + } + } + return childObjects; + } +} diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/ChartOfCharacteristicTypesToJaxbConverter.java b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/ChartOfCharacteristicTypesToJaxbConverter.java new file mode 100644 index 000000000..7b0172829 --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/ChartOfCharacteristicTypesToJaxbConverter.java @@ -0,0 +1,63 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import com.github._1c_syntax.bsl.mdo.ChartOfCharacteristicTypes; +import com.github._1c_syntax.bsl.mdo.children.ObjectForm; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ChartOfCharacteristicTypesChildObjects; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ChartOfCharacteristicTypesProperties; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.MetaDataObject; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ObjectFactory; + +/** + * Преобразует план видов характеристик mdclasses в JAXB-DTO для записи Designer XML. + */ +public final class ChartOfCharacteristicTypesToJaxbConverter { + + private static final ObjectFactory FACTORY = new ObjectFactory(); + + private ChartOfCharacteristicTypesToJaxbConverter() { + } + + /** + * Собирает JAXB MetaDataObject из плана видов характеристик. + * + * @param chart план видов характеристик из модели mdclasses + * @return корневой элемент для маршаллинга в Designer XML + */ + public static MetaDataObject toMetaDataObject(ChartOfCharacteristicTypes chart) { + MetaDataObject root = FACTORY.createMetaDataObject(); + root.setVersion(JaxbWriteDefaults.DEFAULT_FORMAT_VERSION); + com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ChartOfCharacteristicTypes inner = + FACTORY.createChartOfCharacteristicTypes(); + inner.setUuid(chart.getUuid() != null ? chart.getUuid() : ""); + inner.setProperties(buildProperties(chart)); + inner.setChildObjects(buildChildObjects(chart)); + root.setChartOfCharacteristicTypes(inner); + return root; + } + + private static ChartOfCharacteristicTypesProperties buildProperties(ChartOfCharacteristicTypes chart) { + ChartOfCharacteristicTypesProperties p = FACTORY.createChartOfCharacteristicTypesProperties(); + p.setName(chart.getName()); + p.setSynonym(JaxbWriteDefaults.localStringType(JaxbWriteUtils.contentForLocalString(chart.getSynonym()))); + p.setComment(chart.getComment() != null ? chart.getComment() : ""); + return p; + } + + private static ChartOfCharacteristicTypesChildObjects buildChildObjects(ChartOfCharacteristicTypes chart) { + ChartOfCharacteristicTypesChildObjects childObjects = FACTORY.createChartOfCharacteristicTypesChildObjects(); + if (chart.getForms() != null) { + for (ObjectForm form : chart.getForms()) { + childObjects.getForm().add(form.getName() != null ? form.getName() : ""); + } + } + return childObjects; + } +} diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/CommandGroupToJaxbConverter.java b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/CommandGroupToJaxbConverter.java new file mode 100644 index 000000000..3de0f2d0a --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/CommandGroupToJaxbConverter.java @@ -0,0 +1,56 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import com.github._1c_syntax.bsl.mdo.CommandGroup; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.CommandGroupProperties; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.MetaDataObject; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ObjectFactory; +import com.github._1c_syntax.bsl.mdclasses.jaxb.v8_2_managed_application_core.CommandGroupCategory; +import com.github._1c_syntax.bsl.mdclasses.jaxb.v8_2_managed_application_logform.ButtonRepresentation; + +/** + * Преобразует группу команд mdclasses в JAXB-DTO для записи Designer XML. + */ +public final class CommandGroupToJaxbConverter { + + private static final ObjectFactory FACTORY = new ObjectFactory(); + + private CommandGroupToJaxbConverter() { + } + + /** + * Собирает JAXB MetaDataObject из группы команд. + * + * @param commandGroup группа команд из модели mdclasses + * @return корневой элемент для маршаллинга в Designer XML + */ + public static MetaDataObject toMetaDataObject(CommandGroup commandGroup) { + MetaDataObject root = FACTORY.createMetaDataObject(); + root.setVersion(JaxbWriteDefaults.DEFAULT_FORMAT_VERSION); + com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.CommandGroup inner = FACTORY.createCommandGroup(); + inner.setUuid(commandGroup.getUuid() != null ? commandGroup.getUuid() : ""); + inner.setProperties(buildProperties(commandGroup)); + root.setCommandGroup(inner); + return root; + } + + private static CommandGroupProperties buildProperties(CommandGroup g) { + CommandGroupProperties p = FACTORY.createCommandGroupProperties(); + p.setName(g.getName() != null ? g.getName() : ""); + p.setSynonym(JaxbWriteDefaults.localStringType(JaxbWriteUtils.contentForLocalString(g.getSynonym()))); + p.setComment(g.getComment() != null ? g.getComment() : ""); + p.setObjectBelonging(JaxbWriteDefaults.objectBelongingNative()); + p.setRepresentation(ButtonRepresentation.AUTO); + p.setToolTip(JaxbWriteDefaults.localStringType("")); + p.setPicture(JaxbWriteDefaults.emptyPicture()); + p.setCategory(CommandGroupCategory.NAVIGATION_PANEL); + return p; + } +} diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/CommonModuleToJaxbConverter.java b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/CommonModuleToJaxbConverter.java new file mode 100644 index 000000000..1075c39b4 --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/CommonModuleToJaxbConverter.java @@ -0,0 +1,61 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import com.github._1c_syntax.bsl.mdo.CommonModule; +import com.github._1c_syntax.bsl.mdo.support.ReturnValueReuse; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.CommonModuleProperties; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.MetaDataObject; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ObjectFactory; + +/** + * Преобразует модель общего модуля mdclasses в JAXB-DTO для записи Designer XML. + */ +public final class CommonModuleToJaxbConverter { + + private static final ObjectFactory FACTORY = new ObjectFactory(); + + private CommonModuleToJaxbConverter() { + } + + /** + * Собирает JAXB MetaDataObject из общего модуля mdclasses. + * + * @param commonModule общий модуль из модели mdclasses + * @return корневой элемент для маршаллинга в Designer XML + */ + public static MetaDataObject toMetaDataObject(CommonModule commonModule) { + MetaDataObject root = FACTORY.createMetaDataObject(); + root.setVersion(JaxbWriteDefaults.DEFAULT_FORMAT_VERSION); + com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.CommonModule inner = FACTORY.createCommonModule(); + inner.setUuid(commonModule.getUuid() != null ? commonModule.getUuid() : ""); + inner.setProperties(buildProperties(commonModule)); + root.setCommonModule(inner); + return root; + } + + private static CommonModuleProperties buildProperties(CommonModule c) { + CommonModuleProperties p = FACTORY.createCommonModuleProperties(); + p.setName(c.getName()); + p.setSynonym(JaxbWriteDefaults.localStringType(JaxbWriteUtils.contentForLocalString(c.getSynonym()))); + p.setComment(c.getComment() != null ? c.getComment() : ""); + p.setGlobal(c.isGlobal()); + p.setServer(c.isServer()); + p.setClientManagedApplication(c.isClientManagedApplication()); + p.setClientOrdinaryApplication(c.isClientOrdinaryApplication()); + p.setExternalConnection(c.isExternalConnection()); + p.setServerCall(c.isServerCall()); + p.setPrivileged(c.isPrivileged()); + ReturnValueReuse rvr = c.getReturnValuesReuse(); + if (rvr != null && rvr != ReturnValueReuse.UNKNOWN && rvr.fullName() != null) { + p.setReturnValuesReuse(com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_enums.ReturnValuesReuse.fromValue(rvr.fullName().getEn())); + } + return p; + } +} diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/ConfigurationToJaxbConverter.java b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/ConfigurationToJaxbConverter.java new file mode 100644 index 000000000..b67857f68 --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/ConfigurationToJaxbConverter.java @@ -0,0 +1,201 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import com.github._1c_syntax.bsl.mdclasses.CF; +import com.github._1c_syntax.bsl.mdclasses.Configuration; +import com.github._1c_syntax.bsl.mdo.MD; +import com.github._1c_syntax.bsl.mdo.support.ApplicationRunMode; +import com.github._1c_syntax.bsl.support.CompatibilityMode; +import com.github._1c_syntax.bsl.mdo.support.InterfaceCompatibilityMode; +import com.github._1c_syntax.bsl.types.ScriptVariant; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ConfigurationChildObjects; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ConfigurationProperties; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.MetaDataObject; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ObjectFactory; +import com.github._1c_syntax.bsl.mdclasses.jaxb.v8_2_managed_application_core.ClientRunMode; + +import java.util.List; +import java.util.UUID; + +/** + * Преобразует корневую конфигурацию (CF) в JAXB-DTO для записи Designer XML. + */ +public final class ConfigurationToJaxbConverter { + + private static final ObjectFactory FACTORY = new ObjectFactory(); + + private ConfigurationToJaxbConverter() { + } + + /** + * Собирает JAXB MetaDataObject из конфигурации mdclasses. + * + * @param configuration конфигурация + * @return корневой элемент для маршаллинга в Designer XML + */ + public static MetaDataObject toMetaDataObject(Configuration configuration) { + CF cf = configuration; + MetaDataObject root = FACTORY.createMetaDataObject(); + root.setVersion(JaxbWriteDefaults.DEFAULT_FORMAT_VERSION); + com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.Configuration inner = FACTORY.createConfiguration(); + inner.setUuid(nonEmptyUuid(cf.getUuid())); + inner.setFormatVersion(JaxbWriteDefaults.DEFAULT_FORMAT_VERSION); + inner.setProperties(buildProperties(cf)); + inner.setChildObjects(buildChildObjects(cf)); + root.setConfiguration(inner); + return root; + } + + private static String nonEmptyUuid(String uuid) { + String value = (uuid != null && !uuid.isBlank()) ? uuid : UUID.randomUUID().toString(); + return value.toLowerCase(); + } + + private static ConfigurationProperties buildProperties(CF c) { + ConfigurationProperties p = FACTORY.createConfigurationProperties(); + p.setName(c.getName()); + p.setSynonym(JaxbWriteDefaults.localStringType(JaxbWriteUtils.contentForLocalString(c.getSynonym()))); + p.setComment(c.getComment() != null ? c.getComment() : ""); + p.setVendor(c.getVendor() != null ? c.getVendor() : ""); + p.setVersion(c.getVersion() != null ? c.getVersion() : ""); + ApplicationRunMode runMode = c.getDefaultRunMode(); + if (runMode == ApplicationRunMode.MANAGED_APPLICATION) { + p.setDefaultRunMode(ClientRunMode.MANAGED_APPLICATION); + } else if (runMode == ApplicationRunMode.ORDINARY_APPLICATION) { + p.setDefaultRunMode(ClientRunMode.ORDINARY_APPLICATION); + } + ScriptVariant scriptVariant = c.getScriptVariant(); + if (scriptVariant != null) { + p.setScriptVariant(safeScriptVariant(scriptVariant.name())); + } + if (c.getDefaultLanguage() != null && c.getDefaultLanguage().getMdoRef() != null && !c.getDefaultLanguage().getMdoRef().isEmpty()) { + p.setDefaultLanguage(c.getDefaultLanguage().getMdoRef()); + } + InterfaceCompatibilityMode ifMode = c.getInterfaceCompatibilityMode(); + if (ifMode != null && ifMode.fullName() != null) { + p.setInterfaceCompatibilityMode(safeInterfaceCompatibilityMode(ifMode.fullName().getEn())); + } + CompatibilityMode compatMode = c.getCompatibilityMode(); + if (compatMode != null) { + p.setCompatibilityMode(safeCompatibilityMode(compatMode.toString())); + } + CompatibilityMode extCompatMode = c.getConfigurationExtensionCompatibilityMode(); + if (extCompatMode != null) { + p.setConfigurationExtensionCompatibilityMode(safeCompatibilityMode(extCompatMode.toString())); + } + return p; + } + + private static com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_enums.InterfaceCompatibilityMode safeInterfaceCompatibilityMode(String value) { + if (value == null || value.isEmpty()) { + return com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_enums.InterfaceCompatibilityMode.VERSION_8_2; + } + try { + return com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_enums.InterfaceCompatibilityMode.fromValue(value); + } catch (IllegalArgumentException e) { + return com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_enums.InterfaceCompatibilityMode.VERSION_8_2; + } + } + + private static com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_enums.CompatibilityMode safeCompatibilityMode(String value) { + if (value == null || value.isEmpty()) { + return com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_enums.CompatibilityMode.values()[0]; + } + try { + return com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_enums.CompatibilityMode.fromValue(value); + } catch (IllegalArgumentException e) { + return com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_enums.CompatibilityMode.values()[0]; + } + } + + private static com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_enums.ScriptVariant safeScriptVariant(String value) { + if (value == null || value.isEmpty()) { + return com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_enums.ScriptVariant.values()[0]; + } + try { + return com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_enums.ScriptVariant.valueOf(value); + } catch (IllegalArgumentException e) { + return com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_enums.ScriptVariant.values()[0]; + } + } + + private static String shortNameFromMdoRef(String mdoRef) { + if (mdoRef == null) { + return ""; + } + int dot = mdoRef.indexOf('.'); + return dot >= 0 ? mdoRef.substring(dot + 1) : mdoRef; + } + + private static ConfigurationChildObjects buildChildObjects(CF c) { + ConfigurationChildObjects co = FACTORY.createConfigurationChildObjects(); + addChildNames(c.getLanguages(), co.getLanguage(), MD::getName); + addChildNames(c.getSubsystems(), co.getSubsystem(), MD::getName); + addChildNames(c.getStyleItems(), co.getStyleItem(), MD::getName); + addChildNames(c.getStyles(), co.getStyle(), MD::getName); + addChildNames(c.getCommonPictures(), co.getCommonPicture(), MD::getName); + addChildNames(c.getInterfaces(), co.getInterface(), MD::getName); + addChildNames(c.getSessionParameters(), co.getSessionParameter(), MD::getName); + addChildNames(c.getRoles(), co.getRole(), MD::getName); + addChildNames(c.getCommonTemplates(), co.getCommonTemplate(), MD::getName); + addChildNames(c.getFilterCriteria(), co.getFilterCriterion(), MD::getName); + addChildNames(c.getCommonModules(), co.getCommonModule(), MD::getName); + addChildNames(c.getCommonAttributes(), co.getCommonAttribute(), MD::getName); + addChildNames(c.getExchangePlans(), co.getExchangePlan(), md -> shortNameFromMdoRef(md.getMdoRef())); + addChildNames(c.getXDTOPackages(), co.getXDTOPackage(), MD::getName); + addChildNames(c.getWebServices(), co.getWebService(), MD::getName); + addChildNames(c.getHttpServices(), co.getHTTPService(), MD::getName); + addChildNames(c.getWsReferences(), co.getWSReference(), md -> shortNameFromMdoRef(md.getMdoRef())); + addChildNames(c.getEventSubscriptions(), co.getEventSubscription(), MD::getName); + addChildNames(c.getScheduledJobs(), co.getScheduledJob(), MD::getName); + addChildNames(c.getSettingsStorages(), co.getSettingsStorage(), MD::getName); + addChildNames(c.getFunctionalOptions(), co.getFunctionalOption(), MD::getName); + addChildNames(c.getFunctionalOptionsParameters(), co.getFunctionalOptionsParameter(), MD::getName); + addChildNames(c.getDefinedTypes(), co.getDefinedType(), MD::getName); + addChildNames(c.getCommonCommands(), co.getCommonCommand(), MD::getName); + addChildNames(c.getCommandGroups(), co.getCommandGroup(), g -> shortNameFromMdoRef(g.getMdoRef())); + addChildNames(c.getConstants(), co.getConstant(), MD::getName); + addChildNames(c.getCommonForms(), co.getCommonForm(), MD::getName); + addChildNames(c.getCatalogs(), co.getCatalog(), MD::getName); + addChildNames(c.getDocuments(), co.getDocument(), MD::getName); + addChildNames(c.getDocumentNumerators(), co.getDocumentNumerator(), MD::getName); + addChildNames(c.getSequences(), co.getSequence(), MD::getName); + addChildNames(c.getDocumentJournals(), co.getDocumentJournal(), MD::getName); + addChildNames(c.getEnums(), co.getEnum(), MD::getName); + addChildNames(c.getReports(), co.getReport(), MD::getName); + addChildNames(c.getDataProcessors(), co.getDataProcessor(), MD::getName); + addChildNames(c.getInformationRegisters(), co.getInformationRegister(), MD::getName); + addChildNames(c.getAccumulationRegisters(), co.getAccumulationRegister(), MD::getName); + addChildNames(c.getChartsOfCharacteristicTypes(), co.getChartOfCharacteristicTypes(), MD::getName); + addChildNames(c.getChartsOfAccounts(), co.getChartOfAccounts(), MD::getName); + addChildNames(c.getAccountingRegisters(), co.getAccountingRegister(), MD::getName); + addChildNames(c.getChartsOfCalculationTypes(), co.getChartOfCalculationTypes(), MD::getName); + addChildNames(c.getCalculationRegisters(), co.getCalculationRegister(), MD::getName); + addChildNames(c.getBusinessProcesses(), co.getBusinessProcess(), MD::getName); + addChildNames(c.getTasks(), co.getTask(), MD::getName); + addChildNames(c.getExternalDataSources(), co.getExternalDataSource(), MD::getName); + addChildNames(c.getIntegrationServices(), co.getIntegrationService(), MD::getName); + addChildNames(c.getBots(), co.getBot(), MD::getName); + addChildNames(c.getWebSocketClients(), co.getWebSocketClient(), MD::getName); + return co; + } + + private static void addChildNames(List list, List target, java.util.function.Function nameFn) { + if (list == null) { + return; + } + for (T md : list) { + String name = nameFn.apply(md); + if (name != null) { + target.add(name); + } + } + } +} diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/DataProcessorToJaxbConverter.java b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/DataProcessorToJaxbConverter.java new file mode 100644 index 000000000..150387e9c --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/DataProcessorToJaxbConverter.java @@ -0,0 +1,62 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import com.github._1c_syntax.bsl.mdo.DataProcessor; +import com.github._1c_syntax.bsl.mdo.children.ObjectForm; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.DataProcessorChildObjects; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.DataProcessorProperties; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.MetaDataObject; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ObjectFactory; + +/** + * Преобразует обработку mdclasses в JAXB-DTO для записи Designer XML. + */ +public final class DataProcessorToJaxbConverter { + + private static final ObjectFactory FACTORY = new ObjectFactory(); + + private DataProcessorToJaxbConverter() { + } + + /** + * Собирает JAXB MetaDataObject из обработки. + * + * @param dp обработка из модели mdclasses + * @return корневой элемент для маршаллинга в Designer XML + */ + public static MetaDataObject toMetaDataObject(DataProcessor dp) { + MetaDataObject root = FACTORY.createMetaDataObject(); + root.setVersion(JaxbWriteDefaults.DEFAULT_FORMAT_VERSION); + com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.DataProcessor inner = FACTORY.createDataProcessor(); + inner.setUuid(dp.getUuid() != null ? dp.getUuid() : ""); + inner.setProperties(buildProperties(dp)); + inner.setChildObjects(buildChildObjects(dp)); + root.setDataProcessor(inner); + return root; + } + + private static DataProcessorProperties buildProperties(DataProcessor dp) { + DataProcessorProperties p = FACTORY.createDataProcessorProperties(); + p.setName(dp.getName()); + p.setSynonym(JaxbWriteDefaults.localStringType(JaxbWriteUtils.contentForLocalString(dp.getSynonym()))); + p.setComment(dp.getComment() != null ? dp.getComment() : ""); + return p; + } + + private static DataProcessorChildObjects buildChildObjects(DataProcessor dp) { + DataProcessorChildObjects co = FACTORY.createDataProcessorChildObjects(); + if (dp.getForms() != null) { + for (ObjectForm form : dp.getForms()) { + co.getForm().add(form.getName() != null ? form.getName() : ""); + } + } + return co; + } +} diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/DesignerJaxbWriter.java b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/DesignerJaxbWriter.java new file mode 100644 index 000000000..958e74614 --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/DesignerJaxbWriter.java @@ -0,0 +1,188 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.MetaDataObject; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ObjectFactory; + +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBElement; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Marshaller; + +import java.io.ByteArrayOutputStream; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.UUID; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Сериализация JAXB MetaDataObject в XML-файл в формате Designer. + */ +public final class DesignerJaxbWriter { + + private static final JAXBContext JAXB_CONTEXT; + + static { + try { + JAXB_CONTEXT = JAXBContext.newInstance(MetaDataObject.class); + } catch (JAXBException e) { + throw new ExceptionInInitializerError(e); + } + } + + private DesignerJaxbWriter() { + } + + private static final String NS_MDCLASSES = "http://v8.1c.ru/8.3/MDClasses"; + private static final String NS_XCF_READABLE = "http://v8.1c.ru/8.3/xcf/readable"; + + /** + * InternalInfo для Configuration: 7 ContainedObject (Конфигуратор 1С требует ровно 7). + * ClassId — константы платформы (тип внутреннего объекта), одинаковы во всех выгрузках. + * ObjectId — уникальный идентификатор экземпляра; в каждой конфигурации свои, генерируем при записи. + */ + private static String buildConfigurationInternalInfoBlock() { + return """ + + + 9cd510cd-abfc-11d4-9434-004095e12fc7 + %s + + + 9fcd25a0-4822-11d4-9414-008048da11f9 + %s + + + e3687481-0a87-462c-a166-9f34594f9bba + %s + + + 9de14907-ec23-4a07-96f0-85521cb6b53b + %s + + + 51f2d5d8-ea4d-4064-8892-82951750031e + %s + + + e68182ea-4237-4383-967f-90c1e3370bc7 + %s + + + fb282519-d103-4dd3-bc12-cb271d631dfc + %s + + """.formatted( + UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID(), + UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID()); + } + + /** Плейсхолдер имени справочника (без $, чтобы не интерпретировался в replaceFirst как группа). */ + private static final String CATALOG_NAME_PLACEHOLDER = "\u0000CatalogName\u0000"; + + private static final Pattern NAME_TAG = Pattern.compile("([^<]+)"); + + /** + * InternalInfo для справочника: xr:GeneratedType (Object, Ref, Selection, List, Manager), + * как в фикстурах. Имя подставляется из плейсхолдера после вставки (из первого тега <Name>). + */ + private static String buildCatalogInternalInfoBlock() { + String n = CATALOG_NAME_PLACEHOLDER; + UUID u1 = UUID.randomUUID(); + UUID u2 = UUID.randomUUID(); + UUID u3 = UUID.randomUUID(); + UUID u4 = UUID.randomUUID(); + UUID u5 = UUID.randomUUID(); + UUID u6 = UUID.randomUUID(); + UUID u7 = UUID.randomUUID(); + UUID u8 = UUID.randomUUID(); + UUID u9 = UUID.randomUUID(); + UUID u10 = UUID.randomUUID(); + return """ + + + %s + %s + + + %s + %s + + + %s + %s + + + %s + %s + + + %s + %s + + """.formatted(n, u1, u2, n, u3, u4, n, u5, u6, n, u7, u8, n, u9, u10); + } + + /** + * Сериализует MetaDataObject в XML и записывает в файл. + * + * @param path путь к .xml файлу + * @param object корневой JAXB MetaDataObject (подсистема, справочник, конфигурация и т.д.) + * @throws JAXBException при ошибке маршаллинга + * @throws java.io.IOException при ошибке записи файла + */ + public static void write(Path path, MetaDataObject object) + throws JAXBException, java.io.IOException { + Marshaller m = JAXB_CONTEXT.createMarshaller(); + m.setProperty(Marshaller.JAXB_ENCODING, StandardCharsets.UTF_8.name()); + m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); + m.setProperty("org.glassfish.jaxb.namespacePrefixMapper", new DesignerNamespacePrefixMapper()); + JAXBElement root = new ObjectFactory().createMetaDataObject(object); + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + m.marshal(root, buffer); + String xml = buffer.toString(StandardCharsets.UTF_8); + xml = makeMDClassesDefaultNamespace(xml); + try (OutputStream out = Files.newOutputStream(path)) { + out.write(xml.getBytes(StandardCharsets.UTF_8)); + } + } + + /** + * Приводит XML к виду выгрузки платформы 1С: дефолтный неймспейс MDClasses, без ns2, + * у Configuration только uuid (без formatVersion), первым дочерним — InternalInfo. + */ + private static String makeMDClassesDefaultNamespace(String xml) { + xml = xml.replace("xmlns=\"" + NS_XCF_READABLE + "\"", "xmlns:xr=\"" + NS_XCF_READABLE + "\""); + xml = xml.replace("xmlns:ns2=\"" + NS_MDCLASSES + "\"", "xmlns=\"" + NS_MDCLASSES + "\""); + xml = xml.replace(")\\s*\\n\\s*", + "$1\n " + buildConfigurationInternalInfoBlock() + "\n "); + // Catalog: InternalInfo с GeneratedType (Object, Ref, Selection, List, Manager) + xml = xml.replaceFirst( + "()\\s*\\n\\s*", + "$1\n " + buildCatalogInternalInfoBlock() + "\n "); + // Подставить имя справочника из первого тега + if (xml.contains(CATALOG_NAME_PLACEHOLDER)) { + Matcher m = NAME_TAG.matcher(xml); + if (m.find()) { + xml = xml.replace(CATALOG_NAME_PLACEHOLDER, m.group(1)); + } + } + return xml; + } +} diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/DesignerNamespacePrefixMapper.java b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/DesignerNamespacePrefixMapper.java new file mode 100644 index 000000000..daadd9567 --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/DesignerNamespacePrefixMapper.java @@ -0,0 +1,27 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import org.glassfish.jaxb.runtime.marshaller.NamespacePrefixMapper; + +/** + * Задаёт префиксы неймспейсов при маршалинге Designer XML (дефолтный неймспейс MDClasses без префикса). + */ +public final class DesignerNamespacePrefixMapper extends NamespacePrefixMapper { + + private static final String MDCLASSES_NS = "http://v8.1c.ru/8.3/MDClasses"; + + @Override + public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) { + if (MDCLASSES_NS.equals(namespaceUri)) { + return requirePrefix ? "v8" : ""; + } + return suggestion != null ? suggestion : null; + } +} diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/DesignerPathResolver.java b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/DesignerPathResolver.java new file mode 100644 index 000000000..b19727aba --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/DesignerPathResolver.java @@ -0,0 +1,80 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import com.github._1c_syntax.bsl.mdo.MD; +import com.github._1c_syntax.bsl.reader.designer.DesignerReader; +import com.github._1c_syntax.bsl.types.MDOType; +import org.apache.commons.io.FilenameUtils; + +import java.nio.file.Path; +import java.nio.file.Paths; + +/** + * Разрешение путей к XML-файлам объектов метаданных в формате Designer. + */ +public final class DesignerPathResolver { + + private DesignerPathResolver() { + } + + /** + * Путь к файлу Configuration.xml в корне выгрузки. + * + * @param rootPath корень выгрузки (каталог, в котором лежит Configuration.xml) + * @return путь к Configuration.xml + */ + public static Path configurationPath(Path rootPath) { + return rootPath.resolve(DesignerReader.CONFIGURATION_MDO_PATH); + } + + /** + * Путь к XML-файлу объекта. Для вложенной подсистемы задаётся путь к .xml родителя. + * + * @param rootPath корень выгрузки + * @param md объект метаданных + * @param parentSubsystemPath путь к .xml родительской подсистемы или null + * @return путь к .xml файлу + */ + public static Path pathForObject(Path rootPath, MD md, Path parentSubsystemPath) { + MDOType type = md.getMdoType(); + String name = md.getName(); + if (type == MDOType.SUBSYSTEM && parentSubsystemPath != null) { + Path parentDir = Paths.get( + FilenameUtils.getFullPathNoEndSeparator(parentSubsystemPath.toString()), + FilenameUtils.getBaseName(parentSubsystemPath.toString())); + return parentDir.resolve(type.groupName()).resolve(name + ".xml"); + } + return rootPath.resolve(type.groupName()).resolve(name + ".xml"); + } + + /** + * Путь к XML-файлу объекта верхнего уровня. + * + * @param rootPath корень выгрузки + * @param md объект метаданных + * @return путь к .xml файлу + */ + public static Path pathForObject(Path rootPath, MD md) { + return pathForObject(rootPath, md, null); + } + + /** + * Путь к XML-файлу формы (например Catalogs/Имя/Forms/ИмяФормы.xml). + * + * @param rootPath корень выгрузки + * @param ownerGroup группа владельца (Catalogs, Documents и т.д.) + * @param ownerName имя владельца + * @param formName имя формы + * @return путь к .xml файлу формы + */ + public static Path pathForForm(Path rootPath, String ownerGroup, String ownerName, String formName) { + return rootPath.resolve(ownerGroup).resolve(ownerName).resolve("Forms").resolve(formName + ".xml"); + } +} diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/DocumentJournalToJaxbConverter.java b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/DocumentJournalToJaxbConverter.java new file mode 100644 index 000000000..ed2044fc5 --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/DocumentJournalToJaxbConverter.java @@ -0,0 +1,62 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import com.github._1c_syntax.bsl.mdo.DocumentJournal; +import com.github._1c_syntax.bsl.mdo.children.ObjectForm; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.DocumentJournalChildObjects; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.DocumentJournalProperties; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.MetaDataObject; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ObjectFactory; + +/** + * Преобразует журнал документов mdclasses в JAXB-DTO для записи Designer XML. + */ +public final class DocumentJournalToJaxbConverter { + + private static final ObjectFactory FACTORY = new ObjectFactory(); + + private DocumentJournalToJaxbConverter() { + } + + /** + * Собирает JAXB MetaDataObject из журнала документов. + * + * @param dj журнал документов из модели mdclasses + * @return корневой элемент для маршаллинга в Designer XML + */ + public static MetaDataObject toMetaDataObject(DocumentJournal dj) { + MetaDataObject root = FACTORY.createMetaDataObject(); + root.setVersion(JaxbWriteDefaults.DEFAULT_FORMAT_VERSION); + com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.DocumentJournal inner = FACTORY.createDocumentJournal(); + inner.setUuid(dj.getUuid() != null ? dj.getUuid() : ""); + inner.setProperties(buildProperties(dj)); + inner.setChildObjects(buildChildObjects(dj)); + root.setDocumentJournal(inner); + return root; + } + + private static DocumentJournalProperties buildProperties(DocumentJournal dj) { + DocumentJournalProperties p = FACTORY.createDocumentJournalProperties(); + p.setName(dj.getName()); + p.setSynonym(JaxbWriteDefaults.localStringType(JaxbWriteUtils.contentForLocalString(dj.getSynonym()))); + p.setComment(dj.getComment() != null ? dj.getComment() : ""); + return p; + } + + private static DocumentJournalChildObjects buildChildObjects(DocumentJournal dj) { + DocumentJournalChildObjects co = FACTORY.createDocumentJournalChildObjects(); + if (dj.getForms() != null) { + for (ObjectForm form : dj.getForms()) { + co.getForm().add(form.getName() != null ? form.getName() : ""); + } + } + return co; + } +} diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/DocumentToJaxbConverter.java b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/DocumentToJaxbConverter.java new file mode 100644 index 000000000..80e1b4625 --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/DocumentToJaxbConverter.java @@ -0,0 +1,62 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import com.github._1c_syntax.bsl.mdo.Document; +import com.github._1c_syntax.bsl.mdo.children.ObjectForm; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.DocumentChildObjects; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.DocumentProperties; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.MetaDataObject; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ObjectFactory; + +/** + * Преобразует модель документа mdclasses в JAXB-DTO для записи Designer XML. + */ +public final class DocumentToJaxbConverter { + + private static final ObjectFactory FACTORY = new ObjectFactory(); + + private DocumentToJaxbConverter() { + } + + /** + * Собирает JAXB MetaDataObject из документа mdclasses. + * + * @param document документ из модели mdclasses + * @return корневой элемент для маршаллинга в Designer XML + */ + public static MetaDataObject toMetaDataObject(Document document) { + MetaDataObject root = FACTORY.createMetaDataObject(); + root.setVersion(JaxbWriteDefaults.DEFAULT_FORMAT_VERSION); + com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.Document inner = FACTORY.createDocument(); + inner.setUuid(document.getUuid() != null ? document.getUuid() : ""); + inner.setProperties(buildProperties(document)); + inner.setChildObjects(buildChildObjects(document)); + root.setDocument(inner); + return root; + } + + private static DocumentProperties buildProperties(Document d) { + DocumentProperties p = FACTORY.createDocumentProperties(); + p.setName(d.getName()); + p.setSynonym(JaxbWriteDefaults.localStringType(JaxbWriteUtils.contentForLocalString(d.getSynonym()))); + p.setComment(d.getComment() != null ? d.getComment() : ""); + return p; + } + + private static DocumentChildObjects buildChildObjects(Document d) { + DocumentChildObjects co = FACTORY.createDocumentChildObjects(); + if (d.getForms() != null) { + for (ObjectForm form : d.getForms()) { + co.getForm().add(form.getName() != null ? form.getName() : ""); + } + } + return co; + } +} diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/EnumToJaxbConverter.java b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/EnumToJaxbConverter.java new file mode 100644 index 000000000..76a1a6292 --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/EnumToJaxbConverter.java @@ -0,0 +1,91 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import com.github._1c_syntax.bsl.mdo.children.EnumValue; +import com.github._1c_syntax.bsl.mdo.children.ObjectForm; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.EnumChildObjects; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.EnumProperties; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.EnumValueProperties; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.MetaDataObject; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ObjectFactory; + +/** + * Преобразует модель перечисления mdclasses в JAXB-DTO для записи Designer XML. + */ +public final class EnumToJaxbConverter { + + private static final ObjectFactory FACTORY = new ObjectFactory(); + + private EnumToJaxbConverter() { + } + + /** + * Собирает JAXB MetaDataObject из перечисления mdclasses. + * + * @param anEnum перечисление из модели mdclasses (mdo.Enum) + * @return корневой элемент для маршаллинга в Designer XML + */ + public static MetaDataObject toMetaDataObject(com.github._1c_syntax.bsl.mdo.Enum anEnum) { + MetaDataObject root = FACTORY.createMetaDataObject(); + root.setVersion(JaxbWriteDefaults.DEFAULT_FORMAT_VERSION); + com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.Enum inner = FACTORY.createEnum(); + inner.setUuid(anEnum.getUuid() != null ? anEnum.getUuid() : ""); + inner.setProperties(buildProperties(anEnum)); + inner.setChildObjects(buildChildObjects(anEnum)); + root.setEnum(inner); + return root; + } + + private static EnumProperties buildProperties(com.github._1c_syntax.bsl.mdo.Enum e) { + EnumProperties p = FACTORY.createEnumProperties(); + p.setName(e.getName()); + p.setSynonym(JaxbWriteDefaults.localStringType(JaxbWriteUtils.contentForLocalString(e.getSynonym()))); + p.setComment(e.getComment() != null ? e.getComment() : ""); + p.setObjectBelonging(JaxbWriteDefaults.objectBelongingNative()); + p.setUseStandardCommands(false); + p.setStandardAttributes(JaxbWriteDefaults.emptyStandardAttributeDescriptions()); + p.setCharacteristics(JaxbWriteDefaults.emptyCharacteristicsDescriptions()); + p.setQuickChoice(false); + p.setChoiceMode(JaxbWriteDefaults.choiceModeFromForm()); + p.setDefaultListForm(""); + p.setDefaultChoiceForm(""); + p.setAuxiliaryListForm(""); + p.setAuxiliaryChoiceForm(""); + p.setManagerModule(""); + p.setListPresentation(JaxbWriteDefaults.localStringType("")); + p.setExtendedListPresentation(JaxbWriteDefaults.localStringType("")); + p.setExplanation(JaxbWriteDefaults.localStringType(JaxbWriteUtils.contentForLocalString(e.getExplanation()))); + p.setChoiceHistoryOnInput(JaxbWriteDefaults.choiceHistoryOnInputAuto()); + return p; + } + + private static EnumChildObjects buildChildObjects(com.github._1c_syntax.bsl.mdo.Enum e) { + EnumChildObjects co = FACTORY.createEnumChildObjects(); + if (e.getEnumValues() != null) { + for (EnumValue ev : e.getEnumValues()) { + com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.EnumValue jaxbEv = FACTORY.createEnumValue(); + jaxbEv.setUuid(ev.getUuid() != null ? ev.getUuid() : ""); + EnumValueProperties evProps = FACTORY.createEnumValueProperties(); + evProps.setName(ev.getName()); + evProps.setSynonym(JaxbWriteDefaults.localStringType(JaxbWriteUtils.contentForLocalString(ev.getSynonym()))); + evProps.setComment(ev.getComment() != null ? ev.getComment() : ""); + evProps.setObjectBelonging(JaxbWriteDefaults.objectBelongingNative()); + jaxbEv.setProperties(evProps); + co.getEnumValue().add(jaxbEv); + } + } + if (e.getForms() != null) { + for (ObjectForm form : e.getForms()) { + co.getForm().add(form.getName() != null ? form.getName() : ""); + } + } + return co; + } +} diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/ExchangePlanToJaxbConverter.java b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/ExchangePlanToJaxbConverter.java new file mode 100644 index 000000000..9a3b1b57f --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/ExchangePlanToJaxbConverter.java @@ -0,0 +1,62 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import com.github._1c_syntax.bsl.mdo.ExchangePlan; +import com.github._1c_syntax.bsl.mdo.children.ObjectForm; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ExchangePlanChildObjects; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ExchangePlanProperties; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.MetaDataObject; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ObjectFactory; + +/** + * Преобразует план обмена mdclasses в JAXB-DTO для записи Designer XML. + */ +public final class ExchangePlanToJaxbConverter { + + private static final ObjectFactory FACTORY = new ObjectFactory(); + + private ExchangePlanToJaxbConverter() { + } + + /** + * Собирает JAXB MetaDataObject из плана обмена. + * + * @param ep план обмена из модели mdclasses + * @return корневой элемент для маршаллинга в Designer XML + */ + public static MetaDataObject toMetaDataObject(ExchangePlan ep) { + MetaDataObject root = FACTORY.createMetaDataObject(); + root.setVersion(JaxbWriteDefaults.DEFAULT_FORMAT_VERSION); + com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ExchangePlan inner = FACTORY.createExchangePlan(); + inner.setUuid(ep.getUuid() != null ? ep.getUuid() : ""); + inner.setProperties(buildProperties(ep)); + inner.setChildObjects(buildChildObjects(ep)); + root.setExchangePlan(inner); + return root; + } + + private static ExchangePlanProperties buildProperties(ExchangePlan ep) { + ExchangePlanProperties p = FACTORY.createExchangePlanProperties(); + p.setName(ep.getName()); + p.setSynonym(JaxbWriteDefaults.localStringType(JaxbWriteUtils.contentForLocalString(ep.getSynonym()))); + p.setComment(ep.getComment() != null ? ep.getComment() : ""); + return p; + } + + private static ExchangePlanChildObjects buildChildObjects(ExchangePlan ep) { + ExchangePlanChildObjects co = FACTORY.createExchangePlanChildObjects(); + if (ep.getForms() != null) { + for (ObjectForm form : ep.getForms()) { + co.getForm().add(form.getName() != null ? form.getName() : ""); + } + } + return co; + } +} diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/FilterCriterionToJaxbConverter.java b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/FilterCriterionToJaxbConverter.java new file mode 100644 index 000000000..35a23656c --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/FilterCriterionToJaxbConverter.java @@ -0,0 +1,62 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import com.github._1c_syntax.bsl.mdo.FilterCriterion; +import com.github._1c_syntax.bsl.mdo.children.ObjectForm; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.FilterCriterionChildObjects; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.FilterCriterionProperties; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.MetaDataObject; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ObjectFactory; + +/** + * Преобразует критерий отбора mdclasses в JAXB-DTO для записи Designer XML. + */ +public final class FilterCriterionToJaxbConverter { + + private static final ObjectFactory FACTORY = new ObjectFactory(); + + private FilterCriterionToJaxbConverter() { + } + + /** + * Собирает JAXB MetaDataObject из критерия отбора. + * + * @param fc критерий отбора из модели mdclasses + * @return корневой элемент для маршаллинга в Designer XML + */ + public static MetaDataObject toMetaDataObject(FilterCriterion fc) { + MetaDataObject root = FACTORY.createMetaDataObject(); + root.setVersion(JaxbWriteDefaults.DEFAULT_FORMAT_VERSION); + com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.FilterCriterion inner = FACTORY.createFilterCriterion(); + inner.setUuid(fc.getUuid() != null ? fc.getUuid() : ""); + inner.setProperties(buildProperties(fc)); + inner.setChildObjects(buildChildObjects(fc)); + root.setFilterCriterion(inner); + return root; + } + + private static FilterCriterionProperties buildProperties(FilterCriterion fc) { + FilterCriterionProperties p = FACTORY.createFilterCriterionProperties(); + p.setName(fc.getName()); + p.setSynonym(JaxbWriteDefaults.localStringType(JaxbWriteUtils.contentForLocalString(fc.getSynonym()))); + p.setComment(fc.getComment() != null ? fc.getComment() : ""); + return p; + } + + private static FilterCriterionChildObjects buildChildObjects(FilterCriterion fc) { + FilterCriterionChildObjects co = FACTORY.createFilterCriterionChildObjects(); + if (fc.getForms() != null) { + for (ObjectForm form : fc.getForms()) { + co.getForm().add(form.getName() != null ? form.getName() : ""); + } + } + return co; + } +} diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/FormToJaxbConverter.java b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/FormToJaxbConverter.java new file mode 100644 index 000000000..43985114b --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/FormToJaxbConverter.java @@ -0,0 +1,63 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import com.github._1c_syntax.bsl.mdo.children.ObjectForm; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.Form; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.FormProperties; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.MetaDataObject; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ObjectFactory; +import com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_enums.FormType; + +/** + * Преобразует форму объекта (ObjectForm) в JAXB MetaDataObject с Form для записи в отдельный XML-файл. + */ +public final class FormToJaxbConverter { + + private static final ObjectFactory FACTORY = new ObjectFactory(); + + private FormToJaxbConverter() { + } + + /** + * Собирает JAXB MetaDataObject с одной формой для записи в Catalogs/Имя/Forms/ИмяФормы.xml и т.д. + * + * @param form форма из модели mdclasses (справочник, документ и т.д.) + * @return корневой MetaDataObject для маршаллинга + */ + public static MetaDataObject toMetaDataObject(ObjectForm form) { + MetaDataObject root = FACTORY.createMetaDataObject(); + root.setVersion(JaxbWriteDefaults.DEFAULT_FORMAT_VERSION); + Form inner = FACTORY.createForm(); + inner.setUuid(form.getUuid() != null && !form.getUuid().isEmpty() + ? form.getUuid() + : java.util.UUID.randomUUID().toString().toLowerCase()); + inner.setProperties(buildProperties(form)); + root.setForm(inner); + return root; + } + + private static FormProperties buildProperties(ObjectForm f) { + FormProperties p = FACTORY.createFormProperties(); + p.setName(f.getName() != null ? f.getName() : ""); + p.setSynonym(JaxbWriteDefaults.localStringType(JaxbWriteUtils.contentForLocalString(f.getSynonym()))); + p.setComment(f.getComment() != null ? f.getComment() : ""); + p.setObjectBelonging(JaxbWriteDefaults.objectBelongingNative()); + p.setFormType(formTypeToJaxb(f.getFormType())); + p.setIncludeHelpInContents(Boolean.FALSE); + return p; + } + + private static FormType formTypeToJaxb(com.github._1c_syntax.bsl.mdo.support.FormType ft) { + if (ft == null) { + return FormType.MANAGED; + } + return ft == com.github._1c_syntax.bsl.mdo.support.FormType.ORDINARY ? FormType.ORDINARY : FormType.MANAGED; + } +} diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/InformationRegisterToJaxbConverter.java b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/InformationRegisterToJaxbConverter.java new file mode 100644 index 000000000..bd3348d1c --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/InformationRegisterToJaxbConverter.java @@ -0,0 +1,62 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import com.github._1c_syntax.bsl.mdo.InformationRegister; +import com.github._1c_syntax.bsl.mdo.children.ObjectForm; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.InformationRegisterChildObjects; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.InformationRegisterProperties; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.MetaDataObject; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ObjectFactory; + +/** + * Преобразует регистр сведений mdclasses в JAXB-DTO для записи Designer XML. + */ +public final class InformationRegisterToJaxbConverter { + + private static final ObjectFactory FACTORY = new ObjectFactory(); + + private InformationRegisterToJaxbConverter() { + } + + /** + * Собирает JAXB MetaDataObject из регистра сведений. + * + * @param ir регистр сведений из модели mdclasses + * @return корневой элемент для маршаллинга в Designer XML + */ + public static MetaDataObject toMetaDataObject(InformationRegister ir) { + MetaDataObject root = FACTORY.createMetaDataObject(); + root.setVersion(JaxbWriteDefaults.DEFAULT_FORMAT_VERSION); + com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.InformationRegister inner = FACTORY.createInformationRegister(); + inner.setUuid(ir.getUuid() != null ? ir.getUuid() : ""); + inner.setProperties(buildProperties(ir)); + inner.setChildObjects(buildChildObjects(ir)); + root.setInformationRegister(inner); + return root; + } + + private static InformationRegisterProperties buildProperties(InformationRegister ir) { + InformationRegisterProperties p = FACTORY.createInformationRegisterProperties(); + p.setName(ir.getName()); + p.setSynonym(JaxbWriteDefaults.localStringType(JaxbWriteUtils.contentForLocalString(ir.getSynonym()))); + p.setComment(ir.getComment() != null ? ir.getComment() : ""); + return p; + } + + private static InformationRegisterChildObjects buildChildObjects(InformationRegister ir) { + InformationRegisterChildObjects co = FACTORY.createInformationRegisterChildObjects(); + if (ir.getForms() != null) { + for (ObjectForm form : ir.getForms()) { + co.getForm().add(form.getName() != null ? form.getName() : ""); + } + } + return co; + } +} diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/JaxbWriteDefaults.java b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/JaxbWriteDefaults.java new file mode 100644 index 000000000..364e2507c --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/JaxbWriteDefaults.java @@ -0,0 +1,114 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import com.github._1c_syntax.bsl.mdclasses.jaxb.v8_1_data_core.LocalStringItemType; +import com.github._1c_syntax.bsl.mdclasses.jaxb.v8_1_data_core.LocalStringType; +import com.github._1c_syntax.bsl.mdclasses.jaxb.v8_2_managed_application_logform.ChoiceHistoryOnInput; +import com.github._1c_syntax.bsl.mdclasses.jaxb.v8_2_managed_application_logform.OnMainServerUnavalableBehavior; +import com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_enums.AccumulationRegisterType; +import com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_enums.CalculationRegisterPeriodicity; +import com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_enums.ChoiceMode; +import com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_enums.DefaultDataLockControlMode; +import com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_enums.FullTextSearchUsing; +import com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_enums.ObjectBelonging; +import com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_readable.CharacteristicsDescriptions; +import com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_readable.FieldList; +import com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_readable.MDListType; +import com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_readable.Picture; +import com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_readable.StandardAttributeDescriptions; + +/** + * Значения по умолчанию для JAXB-типов при записи Designer XML. + */ +public final class JaxbWriteDefaults { + + /** Версия формата выгрузки Designer XML (атрибут version в MetaDataObject). */ + public static final String DEFAULT_FORMAT_VERSION = "2.20"; + + private static final String DEFAULT_LANG = "ru"; + + private JaxbWriteDefaults() { + } + + /** LocalStringType с одним элементом (язык ru). */ + public static LocalStringType localStringType(String content) { + LocalStringType t = new LocalStringType(); + LocalStringItemType item = new LocalStringItemType(); + item.setLang(DEFAULT_LANG); + item.setContent(content != null ? content : ""); + t.getItem().add(item); + return t; + } + + /** Пустой MDListType. */ + public static MDListType emptyMDListType() { + return new MDListType(); + } + + /** Пустая картинка (все поля null/false). */ + public static Picture emptyPicture() { + return new Picture(); + } + + /** ObjectBelonging = Native. */ + public static ObjectBelonging objectBelongingNative() { + return ObjectBelonging.NATIVE; + } + + /** Пустое описание стандартных реквизитов. */ + public static StandardAttributeDescriptions emptyStandardAttributeDescriptions() { + return new StandardAttributeDescriptions(); + } + + /** Пустое описание характеристик. */ + public static CharacteristicsDescriptions emptyCharacteristicsDescriptions() { + return new CharacteristicsDescriptions(); + } + + /** ChoiceMode = FromForm. */ + public static ChoiceMode choiceModeFromForm() { + return ChoiceMode.FROM_FORM; + } + + /** ChoiceHistoryOnInput = Auto. */ + public static ChoiceHistoryOnInput choiceHistoryOnInputAuto() { + return ChoiceHistoryOnInput.AUTO; + } + + /** DefaultDataLockControlMode = Automatic. */ + public static DefaultDataLockControlMode defaultDataLockControlModeAutomatic() { + return DefaultDataLockControlMode.AUTOMATIC; + } + + /** FullTextSearchUsing = DontUse. */ + public static FullTextSearchUsing fullTextSearchDontUse() { + return FullTextSearchUsing.DONT_USE; + } + + /** AccumulationRegisterType = Balance. */ + public static AccumulationRegisterType accumulationRegisterTypeBalance() { + return AccumulationRegisterType.BALANCE; + } + + /** CalculationRegisterPeriodicity = Year. */ + public static CalculationRegisterPeriodicity calculationRegisterPeriodicityYear() { + return CalculationRegisterPeriodicity.YEAR; + } + + /** Пустой FieldList. */ + public static FieldList emptyFieldList() { + return new FieldList(); + } + + /** OnMainServerUnavalableBehavior = Auto (для команд). */ + public static OnMainServerUnavalableBehavior onMainServerUnavalableBehaviorAuto() { + return OnMainServerUnavalableBehavior.AUTO; + } +} diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/JaxbWriteUtils.java b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/JaxbWriteUtils.java new file mode 100644 index 000000000..2ab4902fb --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/JaxbWriteUtils.java @@ -0,0 +1,40 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import com.github._1c_syntax.bsl.types.MultiLanguageString; + +/** + * Вспомогательные методы для записи JAXB в формате Designer XML. + */ +public final class JaxbWriteUtils { + + private static final String DEFAULT_LANG = "ru"; + + private JaxbWriteUtils() { + } + + /** + * Возвращает текст для поля v8:content в LocalStringType: значение для языка {@value #DEFAULT_LANG}, + * при отсутствии — первое доступное через {@link MultiLanguageString#getAny()}. + * + * @param ml многоязычная строка (синоним, пояснение и т.д.) + * @return текст для v8:content или пустая строка + */ + public static String contentForLocalString(MultiLanguageString ml) { + if (ml == null || ml.isEmpty()) { + return ""; + } + String forLang = ml.get(DEFAULT_LANG); + if (forLang != null && !forLang.isEmpty()) { + return forLang; + } + return ml.getAny(); + } +} diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/LanguageToJaxbConverter.java b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/LanguageToJaxbConverter.java new file mode 100644 index 000000000..ffcf4b2aa --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/LanguageToJaxbConverter.java @@ -0,0 +1,51 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import com.github._1c_syntax.bsl.mdo.Language; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.LanguageProperties; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.MetaDataObject; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ObjectFactory; + +/** + * Преобразует язык mdclasses в JAXB-DTO для записи Designer XML. + */ +public final class LanguageToJaxbConverter { + + private static final ObjectFactory FACTORY = new ObjectFactory(); + + private LanguageToJaxbConverter() { + } + + /** + * Собирает JAXB MetaDataObject из языка. + * + * @param language язык из модели mdclasses + * @return корневой элемент для маршаллинга в Designer XML + */ + public static MetaDataObject toMetaDataObject(Language language) { + MetaDataObject root = FACTORY.createMetaDataObject(); + root.setVersion(JaxbWriteDefaults.DEFAULT_FORMAT_VERSION); + com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.Language inner = FACTORY.createLanguage(); + inner.setUuid(language.getUuid() != null ? language.getUuid() : ""); + inner.setProperties(buildProperties(language)); + root.setLanguage(inner); + return root; + } + + private static LanguageProperties buildProperties(Language l) { + LanguageProperties p = FACTORY.createLanguageProperties(); + p.setName(l.getName()); + p.setSynonym(JaxbWriteDefaults.localStringType(JaxbWriteUtils.contentForLocalString(l.getSynonym()))); + p.setComment(l.getComment() != null ? l.getComment() : ""); + p.setObjectBelonging(JaxbWriteDefaults.objectBelongingNative()); + p.setLanguageCode(l.getLanguageCode() != null ? l.getLanguageCode() : ""); + return p; + } +} diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/MDClassesJaxbWriter.java b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/MDClassesJaxbWriter.java new file mode 100644 index 000000000..a7653e791 --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/MDClassesJaxbWriter.java @@ -0,0 +1,291 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import com.github._1c_syntax.bsl.mdo.AccumulationRegister; +import com.github._1c_syntax.bsl.mdo.AccountingRegister; +import com.github._1c_syntax.bsl.mdo.BusinessProcess; +import com.github._1c_syntax.bsl.mdo.CalculationRegister; +import com.github._1c_syntax.bsl.mdo.Catalog; +import com.github._1c_syntax.bsl.mdo.children.ObjectForm; +import com.github._1c_syntax.bsl.mdo.ChartOfAccounts; +import com.github._1c_syntax.bsl.mdo.CommandGroup; +import com.github._1c_syntax.bsl.mdo.ChartOfCalculationTypes; +import com.github._1c_syntax.bsl.mdo.ChartOfCharacteristicTypes; +import com.github._1c_syntax.bsl.mdo.CommonModule; +import com.github._1c_syntax.bsl.mdo.DataProcessor; +import com.github._1c_syntax.bsl.mdo.Document; +import com.github._1c_syntax.bsl.mdo.DocumentJournal; +import com.github._1c_syntax.bsl.mdo.ExchangePlan; +import com.github._1c_syntax.bsl.mdo.FilterCriterion; +import com.github._1c_syntax.bsl.mdo.InformationRegister; +import com.github._1c_syntax.bsl.mdo.Language; +import com.github._1c_syntax.bsl.mdo.MD; +import com.github._1c_syntax.bsl.mdo.Report; +import com.github._1c_syntax.bsl.mdo.Role; +import com.github._1c_syntax.bsl.mdo.SettingsStorage; +import com.github._1c_syntax.bsl.mdo.Subsystem; +import com.github._1c_syntax.bsl.mdo.Task; +import com.github._1c_syntax.bsl.types.MDOType; +import com.github._1c_syntax.bsl.mdclasses.Configuration; + +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.MetaDataObject; + +import jakarta.xml.bind.JAXBException; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.BiFunction; +import java.util.function.Function; + +/** + * Запись объектов метаданных конфигурации 1С в Designer XML через JAXB. + */ +public final class MDClassesJaxbWriter { + + private record TypeWriter(MDOType type, Function> getList) {} + + private static final List LIST_TYPE_WRITERS = List.of( + new TypeWriter(MDOType.LANGUAGE, Configuration::getLanguages), + new TypeWriter(MDOType.COMMAND_GROUP, Configuration::getCommandGroups), + new TypeWriter(MDOType.ROLE, Configuration::getRoles), + new TypeWriter(MDOType.REPORT, Configuration::getReports), + new TypeWriter(MDOType.TASK, Configuration::getTasks), + new TypeWriter(MDOType.FILTER_CRITERION, Configuration::getFilterCriteria), + new TypeWriter(MDOType.DATA_PROCESSOR, Configuration::getDataProcessors), + new TypeWriter(MDOType.INFORMATION_REGISTER, Configuration::getInformationRegisters), + new TypeWriter(MDOType.ACCOUNTING_REGISTER, Configuration::getAccountingRegisters), + new TypeWriter(MDOType.ACCUMULATION_REGISTER, Configuration::getAccumulationRegisters), + new TypeWriter(MDOType.CALCULATION_REGISTER, Configuration::getCalculationRegisters), + new TypeWriter(MDOType.DOCUMENT_JOURNAL, Configuration::getDocumentJournals), + new TypeWriter(MDOType.EXCHANGE_PLAN, Configuration::getExchangePlans), + new TypeWriter(MDOType.CHART_OF_ACCOUNTS, Configuration::getChartsOfAccounts), + new TypeWriter(MDOType.CHART_OF_CHARACTERISTIC_TYPES, Configuration::getChartsOfCharacteristicTypes), + new TypeWriter(MDOType.CHART_OF_CALCULATION_TYPES, Configuration::getChartsOfCalculationTypes), + new TypeWriter(MDOType.SETTINGS_STORAGE, Configuration::getSettingsStorages), + new TypeWriter(MDOType.BUSINESS_PROCESS, Configuration::getBusinessProcesses), + new TypeWriter(MDOType.DOCUMENT, Configuration::getDocuments), + new TypeWriter(MDOType.ENUM, Configuration::getEnums), + new TypeWriter(MDOType.COMMON_MODULE, Configuration::getCommonModules) + ); + + private static final Map> CONVERTERS = new HashMap<>(); + + static { + CONVERTERS.put(MDOType.SUBSYSTEM, (md, cfg) -> SubsystemToJaxbConverter.toMetaDataObject((Subsystem) md)); + CONVERTERS.put(MDOType.CATALOG, (md, cfg) -> + CatalogToJaxbConverter.toMetaDataObject((Catalog) md, defaultCommandGroupRef(cfg))); + CONVERTERS.put(MDOType.ENUM, (md, cfg) -> EnumToJaxbConverter.toMetaDataObject((com.github._1c_syntax.bsl.mdo.Enum) md)); + CONVERTERS.put(MDOType.COMMON_MODULE, (md, cfg) -> CommonModuleToJaxbConverter.toMetaDataObject((CommonModule) md)); + CONVERTERS.put(MDOType.DOCUMENT, (md, cfg) -> DocumentToJaxbConverter.toMetaDataObject((Document) md)); + CONVERTERS.put(MDOType.ROLE, (md, cfg) -> RoleToJaxbConverter.toMetaDataObject((Role) md)); + CONVERTERS.put(MDOType.LANGUAGE, (md, cfg) -> LanguageToJaxbConverter.toMetaDataObject((Language) md)); + CONVERTERS.put(MDOType.COMMAND_GROUP, (md, cfg) -> CommandGroupToJaxbConverter.toMetaDataObject((CommandGroup) md)); + CONVERTERS.put(MDOType.REPORT, (md, cfg) -> ReportToJaxbConverter.toMetaDataObject((Report) md)); + CONVERTERS.put(MDOType.TASK, (md, cfg) -> TaskToJaxbConverter.toMetaDataObject((Task) md)); + CONVERTERS.put(MDOType.FILTER_CRITERION, (md, cfg) -> FilterCriterionToJaxbConverter.toMetaDataObject((FilterCriterion) md)); + CONVERTERS.put(MDOType.DATA_PROCESSOR, (md, cfg) -> DataProcessorToJaxbConverter.toMetaDataObject((DataProcessor) md)); + CONVERTERS.put(MDOType.INFORMATION_REGISTER, (md, cfg) -> InformationRegisterToJaxbConverter.toMetaDataObject((InformationRegister) md)); + CONVERTERS.put(MDOType.ACCOUNTING_REGISTER, (md, cfg) -> AccountingRegisterToJaxbConverter.toMetaDataObject((AccountingRegister) md)); + CONVERTERS.put(MDOType.ACCUMULATION_REGISTER, (md, cfg) -> AccumulationRegisterToJaxbConverter.toMetaDataObject((AccumulationRegister) md)); + CONVERTERS.put(MDOType.CALCULATION_REGISTER, (md, cfg) -> CalculationRegisterToJaxbConverter.toMetaDataObject((CalculationRegister) md)); + CONVERTERS.put(MDOType.DOCUMENT_JOURNAL, (md, cfg) -> DocumentJournalToJaxbConverter.toMetaDataObject((DocumentJournal) md)); + CONVERTERS.put(MDOType.EXCHANGE_PLAN, (md, cfg) -> ExchangePlanToJaxbConverter.toMetaDataObject((ExchangePlan) md)); + CONVERTERS.put(MDOType.CHART_OF_ACCOUNTS, (md, cfg) -> ChartOfAccountsToJaxbConverter.toMetaDataObject((ChartOfAccounts) md)); + CONVERTERS.put(MDOType.CHART_OF_CHARACTERISTIC_TYPES, (md, cfg) -> + ChartOfCharacteristicTypesToJaxbConverter.toMetaDataObject((ChartOfCharacteristicTypes) md)); + CONVERTERS.put(MDOType.CHART_OF_CALCULATION_TYPES, (md, cfg) -> + ChartOfCalculationTypesToJaxbConverter.toMetaDataObject((ChartOfCalculationTypes) md)); + CONVERTERS.put(MDOType.SETTINGS_STORAGE, (md, cfg) -> SettingsStorageToJaxbConverter.toMetaDataObject((SettingsStorage) md)); + CONVERTERS.put(MDOType.BUSINESS_PROCESS, (md, cfg) -> BusinessProcessToJaxbConverter.toMetaDataObject((BusinessProcess) md)); + } + + private static String defaultCommandGroupRef(Configuration c) { + if (c == null || c.getCommandGroups() == null || c.getCommandGroups().isEmpty()) { + return null; + } + return c.getCommandGroups().get(0).getMdoRef(); + } + + private MDClassesJaxbWriter() { + } + + /** + * Записывает объект метаданных в XML-файл в формате Designer. + * + * @param path путь к .xml файлу + * @param md объект метаданных + * @throws IllegalArgumentException если тип объекта не поддерживается + * @throws JAXBException при ошибке сериализации + * @throws IOException при ошибке записи файла + */ + public static void writeObjectJaxb(Path path, MD md) throws JAXBException, IOException { + writeObjectJaxb(path, md, null); + } + + /** + * Записывает объект метаданных в XML. Для справочников при передаче конфигурации + * используется первая группа команд как группа по умолчанию для команд. + * + * @param path путь к .xml файлу + * @param md объект метаданных + * @param configuration конфигурация или null + */ + public static void writeObjectJaxb(Path path, MD md, Configuration configuration) throws JAXBException, IOException { + var converter = CONVERTERS.get(md.getMdoType()); + if (converter == null) { + throw new IllegalArgumentException("JAXB writer does not support type: " + md.getMdoType()); + } + DesignerJaxbWriter.write(path, converter.apply(md, configuration)); + } + + /** + * Записывает корневую конфигурацию в Configuration.xml. + * + * @param path путь к файлу (например Configuration.xml) + * @param configuration конфигурация + */ + public static void writeConfigurationJaxb(Path path, Configuration configuration) + throws JAXBException, IOException { + var jaxb = ConfigurationToJaxbConverter.toMetaDataObject(configuration); + DesignerJaxbWriter.write(path, jaxb); + } + + /** + * Возвращает путь к XML-файлу объекта в дереве Designer. + * + * @param rootPath корень выгрузки + * @param md объект метаданных + * @return путь к .xml файлу + */ + public static Path getPathForObject(Path rootPath, MD md) { + return DesignerPathResolver.pathForObject(rootPath, md); + } + + /** + * Возвращает путь к XML-файлу объекта с учётом родительской подсистемы (для вложенных подсистем). + * + * @param rootPath корень выгрузки + * @param md объект метаданных + * @param parentSubsystemPath путь к .xml родительской подсистемы или null + * @return путь к .xml файлу + */ + public static Path getPathForObject(Path rootPath, MD md, Path parentSubsystemPath) { + return DesignerPathResolver.pathForObject(rootPath, md, parentSubsystemPath); + } + + /** + * Записывает конфигурацию в папку в формате Designer (Configuration.xml и дочерние объекты). + * + * @param rootPath корень выгрузки + * @param configuration конфигурация для записи + */ + public static void writeConfigurationToFolder(Path rootPath, Configuration configuration) + throws JAXBException, IOException { + writeConfigurationToFolder(rootPath, configuration, WriteOptions.defaults()); + } + + /** + * Записывает конфигурацию в папку с заданными опциями. + * + * @param rootPath корень выгрузки + * @param configuration конфигурация для записи + * @param options опции (фильтр типов и т.д.) или null для записи всего + */ + public static void writeConfigurationToFolder(Path rootPath, Configuration configuration, + WriteOptions options) throws JAXBException, IOException { + Path configPath = DesignerPathResolver.configurationPath(rootPath); + Files.createDirectories(configPath.getParent()); + writeConfigurationJaxb(configPath, configuration); + + Set filter = options != null ? options.getTypeFilter() : null; + + writeSubsystemsIfAllowed(rootPath, configuration, filter); + writeCatalogsIfAllowed(rootPath, configuration, filter); + + for (TypeWriter tw : LIST_TYPE_WRITERS) { + if (shouldWriteType(filter, tw.type())) { + writeList(rootPath, tw.getList().apply(configuration)); + } + } + } + + private static boolean shouldWriteType(Set filter, MDOType type) { + return filter == null || filter.contains(type); + } + + private static void writeSubsystemsIfAllowed(Path rootPath, Configuration configuration, Set filter) + throws JAXBException, IOException { + if (configuration.getSubsystems() == null || !shouldWriteType(filter, MDOType.SUBSYSTEM)) { + return; + } + for (Subsystem s : configuration.getSubsystems()) { + writeSubsystemRecursive(rootPath, s, null); + } + } + + private static void writeCatalogsIfAllowed(Path rootPath, Configuration configuration, Set filter) + throws JAXBException, IOException { + if (configuration.getCatalogs() == null || !shouldWriteType(filter, MDOType.CATALOG)) { + return; + } + for (Catalog c : configuration.getCatalogs()) { + Path path = DesignerPathResolver.pathForObject(rootPath, c); + Files.createDirectories(path.getParent()); + writeObjectJaxb(path, c, configuration); + writeCatalogForms(rootPath, c); + } + } + + private static void writeList(Path rootPath, List list) throws JAXBException, IOException { + if (list == null) { + return; + } + for (MD md : list) { + Path path = DesignerPathResolver.pathForObject(rootPath, md); + Files.createDirectories(path.getParent()); + writeObjectJaxb(path, md); + } + } + + private static void writeCatalogForms(Path rootPath, Catalog catalog) throws JAXBException, IOException { + if (catalog.getForms() == null) { + return; + } + for (ObjectForm form : catalog.getForms()) { + String formName = form.getName(); + if (formName == null || formName.isEmpty()) { + continue; + } + Path formPath = DesignerPathResolver.pathForForm(rootPath, "Catalogs", catalog.getName(), formName); + Files.createDirectories(formPath.getParent()); + var jaxb = FormToJaxbConverter.toMetaDataObject(form); + DesignerJaxbWriter.write(formPath, jaxb); + } + } + + private static void writeSubsystemRecursive(Path rootPath, Subsystem subsystem, Path parentSubsystemPath) + throws JAXBException, IOException { + Path path = DesignerPathResolver.pathForObject(rootPath, subsystem, parentSubsystemPath); + Files.createDirectories(path.getParent()); + writeObjectJaxb(path, subsystem); + + List children = subsystem.getSubsystems(); + if (children != null && !children.isEmpty()) { + for (Subsystem child : children) { + writeSubsystemRecursive(rootPath, child, path); + } + } + } +} diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/ReportToJaxbConverter.java b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/ReportToJaxbConverter.java new file mode 100644 index 000000000..ecf45bc42 --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/ReportToJaxbConverter.java @@ -0,0 +1,62 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import com.github._1c_syntax.bsl.mdo.Report; +import com.github._1c_syntax.bsl.mdo.children.ObjectForm; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.MetaDataObject; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ObjectFactory; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ReportChildObjects; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ReportProperties; + +/** + * Преобразует отчёт mdclasses в JAXB-DTO для записи Designer XML. + */ +public final class ReportToJaxbConverter { + + private static final ObjectFactory FACTORY = new ObjectFactory(); + + private ReportToJaxbConverter() { + } + + /** + * Собирает JAXB MetaDataObject из отчёта. + * + * @param report отчёт из модели mdclasses + * @return корневой элемент для маршаллинга в Designer XML + */ + public static MetaDataObject toMetaDataObject(Report report) { + MetaDataObject root = FACTORY.createMetaDataObject(); + root.setVersion(JaxbWriteDefaults.DEFAULT_FORMAT_VERSION); + com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.Report inner = FACTORY.createReport(); + inner.setUuid(report.getUuid() != null ? report.getUuid() : ""); + inner.setProperties(buildProperties(report)); + inner.setChildObjects(buildChildObjects(report)); + root.setReport(inner); + return root; + } + + private static ReportProperties buildProperties(Report r) { + ReportProperties p = FACTORY.createReportProperties(); + p.setName(r.getName()); + p.setSynonym(JaxbWriteDefaults.localStringType(JaxbWriteUtils.contentForLocalString(r.getSynonym()))); + p.setComment(r.getComment() != null ? r.getComment() : ""); + return p; + } + + private static ReportChildObjects buildChildObjects(Report r) { + ReportChildObjects co = FACTORY.createReportChildObjects(); + if (r.getForms() != null) { + for (ObjectForm form : r.getForms()) { + co.getForm().add(form.getName() != null ? form.getName() : ""); + } + } + return co; + } +} diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/RoleToJaxbConverter.java b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/RoleToJaxbConverter.java new file mode 100644 index 000000000..78416610e --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/RoleToJaxbConverter.java @@ -0,0 +1,51 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import com.github._1c_syntax.bsl.mdo.Role; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.MetaDataObject; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ObjectFactory; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.RoleProperties; + +/** + * Преобразует роль mdclasses в JAXB-DTO для записи Designer XML. + */ +public final class RoleToJaxbConverter { + + private static final ObjectFactory FACTORY = new ObjectFactory(); + + private RoleToJaxbConverter() { + } + + /** + * Собирает JAXB MetaDataObject из роли. + * + * @param role роль из модели mdclasses + * @return корневой элемент для маршаллинга в Designer XML + */ + public static MetaDataObject toMetaDataObject(Role role) { + MetaDataObject root = FACTORY.createMetaDataObject(); + root.setVersion(JaxbWriteDefaults.DEFAULT_FORMAT_VERSION); + com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.Role inner = FACTORY.createRole(); + inner.setUuid(role.getUuid() != null ? role.getUuid() : ""); + inner.setProperties(buildProperties(role)); + root.setRole(inner); + return root; + } + + private static RoleProperties buildProperties(Role r) { + RoleProperties p = FACTORY.createRoleProperties(); + p.setName(r.getName()); + p.setSynonym(JaxbWriteDefaults.localStringType(JaxbWriteUtils.contentForLocalString(r.getSynonym()))); + p.setComment(r.getComment() != null ? r.getComment() : ""); + p.setObjectBelonging(JaxbWriteDefaults.objectBelongingNative()); + p.setRights(""); + return p; + } +} diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/SettingsStorageToJaxbConverter.java b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/SettingsStorageToJaxbConverter.java new file mode 100644 index 000000000..8f307a8a0 --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/SettingsStorageToJaxbConverter.java @@ -0,0 +1,50 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import com.github._1c_syntax.bsl.mdo.SettingsStorage; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.MetaDataObject; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ObjectFactory; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.SettingsStorageProperties; + +/** + * Преобразует хранилище настроек mdclasses в JAXB-DTO для записи Designer XML. + */ +public final class SettingsStorageToJaxbConverter { + + private static final ObjectFactory FACTORY = new ObjectFactory(); + + private SettingsStorageToJaxbConverter() { + } + + /** + * Собирает JAXB MetaDataObject из хранилища настроек. + * + * @param ss хранилище настроек из модели mdclasses + * @return корневой элемент для маршаллинга в Designer XML + */ + public static MetaDataObject toMetaDataObject(SettingsStorage ss) { + MetaDataObject root = FACTORY.createMetaDataObject(); + root.setVersion(JaxbWriteDefaults.DEFAULT_FORMAT_VERSION); + com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.SettingsStorage inner = FACTORY.createSettingsStorage(); + inner.setUuid(ss.getUuid() != null ? ss.getUuid() : ""); + inner.setProperties(buildProperties(ss)); + inner.setChildObjects(FACTORY.createSettingsStorageChildObjects()); + root.setSettingsStorage(inner); + return root; + } + + private static SettingsStorageProperties buildProperties(SettingsStorage ss) { + SettingsStorageProperties p = FACTORY.createSettingsStorageProperties(); + p.setName(ss.getName()); + p.setSynonym(JaxbWriteDefaults.localStringType(JaxbWriteUtils.contentForLocalString(ss.getSynonym()))); + p.setComment(ss.getComment() != null ? ss.getComment() : ""); + return p; + } +} diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/SubsystemToJaxbConverter.java b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/SubsystemToJaxbConverter.java new file mode 100644 index 000000000..c5772316b --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/SubsystemToJaxbConverter.java @@ -0,0 +1,85 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import com.github._1c_syntax.bsl.mdo.Subsystem; +import com.github._1c_syntax.bsl.types.MdoReference; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.MetaDataObject; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ObjectFactory; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.SubsystemChildObjects; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.SubsystemProperties; +import com.github._1c_syntax.bsl.mdclasses.jaxb.v8_3_xcf_readable.MDListType; + +/** + * Преобразует модель подсистемы mdclasses в JAXB-DTO для записи Designer XML. + */ +public final class SubsystemToJaxbConverter { + + private static final ObjectFactory FACTORY = new ObjectFactory(); + + private SubsystemToJaxbConverter() { + } + + /** + * Собирает JAXB MetaDataObject из подсистемы mdclasses. + * + * @param subsystem подсистема из модели mdclasses + * @return корневой элемент для маршаллинга в Designer XML + */ + public static MetaDataObject toMetaDataObject(Subsystem subsystem) { + MetaDataObject root = FACTORY.createMetaDataObject(); + root.setVersion(JaxbWriteDefaults.DEFAULT_FORMAT_VERSION); + com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.Subsystem inner = FACTORY.createSubsystem(); + inner.setUuid(subsystem.getUuid() != null ? subsystem.getUuid() : ""); + inner.setProperties(buildProperties(subsystem)); + inner.setChildObjects(buildChildObjects(subsystem)); + root.setSubsystem(inner); + return root; + } + + private static SubsystemChildObjects buildChildObjects(Subsystem s) { + SubsystemChildObjects co = new SubsystemChildObjects(); + if (s.getSubsystems() != null) { + for (Subsystem child : s.getSubsystems()) { + co.getSubsystem().add(child.getName()); + } + } + return co; + } + + private static SubsystemProperties buildProperties(Subsystem s) { + SubsystemProperties p = new SubsystemProperties(); + p.setName(s.getName()); + p.setSynonym(JaxbWriteDefaults.localStringType(JaxbWriteUtils.contentForLocalString(s.getSynonym()))); + p.setComment(s.getComment() != null ? s.getComment() : ""); + p.setObjectBelonging(JaxbWriteDefaults.objectBelongingNative()); + p.setIncludeHelpInContents(s.isIncludeHelpInContents()); + p.setHelp(""); + p.setIncludeInCommandInterface(s.isIncludeInCommandInterface()); + p.setCommandInterface(""); + p.setExplanation(JaxbWriteDefaults.localStringType(JaxbWriteUtils.contentForLocalString(s.getExplanation()))); + p.setPicture(JaxbWriteDefaults.emptyPicture()); + MDListType content = JaxbWriteDefaults.emptyMDListType(); + if (s.getContent() != null && !s.getContent().isEmpty()) { + for (MdoReference ref : s.getContent()) { + content.getItem().add(shortNameFromMdoRef(ref.getMdoRef())); + } + } + p.setContent(content); + return p; + } + + private static String shortNameFromMdoRef(String mdoRef) { + if (mdoRef == null) { + return ""; + } + int dot = mdoRef.indexOf('.'); + return dot >= 0 ? mdoRef.substring(dot + 1) : mdoRef; + } +} diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/TaskToJaxbConverter.java b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/TaskToJaxbConverter.java new file mode 100644 index 000000000..2f9a6c943 --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/TaskToJaxbConverter.java @@ -0,0 +1,62 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import com.github._1c_syntax.bsl.mdo.Task; +import com.github._1c_syntax.bsl.mdo.children.ObjectForm; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.MetaDataObject; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.ObjectFactory; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.TaskChildObjects; +import com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.TaskProperties; + +/** + * Преобразует задачу mdclasses в JAXB-DTO для записи Designer XML. + */ +public final class TaskToJaxbConverter { + + private static final ObjectFactory FACTORY = new ObjectFactory(); + + private TaskToJaxbConverter() { + } + + /** + * Собирает JAXB MetaDataObject из задачи. + * + * @param task задача из модели mdclasses + * @return корневой элемент для маршаллинга в Designer XML + */ + public static MetaDataObject toMetaDataObject(Task task) { + MetaDataObject root = FACTORY.createMetaDataObject(); + root.setVersion(JaxbWriteDefaults.DEFAULT_FORMAT_VERSION); + com.github._1c_syntax.bsl.mdclasses.jaxb.mdclasses.Task inner = FACTORY.createTask(); + inner.setUuid(task.getUuid() != null ? task.getUuid() : ""); + inner.setProperties(buildProperties(task)); + inner.setChildObjects(buildChildObjects(task)); + root.setTask(inner); + return root; + } + + private static TaskProperties buildProperties(Task t) { + TaskProperties p = FACTORY.createTaskProperties(); + p.setName(t.getName()); + p.setSynonym(JaxbWriteDefaults.localStringType(JaxbWriteUtils.contentForLocalString(t.getSynonym()))); + p.setComment(t.getComment() != null ? t.getComment() : ""); + return p; + } + + private static TaskChildObjects buildChildObjects(Task t) { + TaskChildObjects co = FACTORY.createTaskChildObjects(); + if (t.getForms() != null) { + for (ObjectForm form : t.getForms()) { + co.getForm().add(form.getName() != null ? form.getName() : ""); + } + } + return co; + } +} diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/WriteOptions.java b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/WriteOptions.java new file mode 100644 index 000000000..b762f48a0 --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/WriteOptions.java @@ -0,0 +1,95 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import com.github._1c_syntax.bsl.types.MDOType; + +import java.util.Set; + +/** + * Опции записи конфигурации в формате Designer. + */ +public final class WriteOptions { + + private final boolean useShortNamesInChildObjects; + private final String version; + private final Set typeFilter; + + private WriteOptions(Builder builder) { + this.useShortNamesInChildObjects = builder.useShortNamesInChildObjects; + this.version = builder.version; + this.typeFilter = builder.typeFilter; + } + + /** + * Использовать короткие имена (имя объекта) в ChildObjects вместо полной MDO-ссылки. + * По умолчанию true (как в выгрузке платформы). + */ + public boolean isUseShortNamesInChildObjects() { + return useShortNamesInChildObjects; + } + + /** + * Версия формата выгрузки в атрибуте version корневого MetaDataObject (например "2.20", "2.27"). + * Не путать с версией платформы (8.3). По умолчанию {@link JaxbWriteDefaults#DEFAULT_FORMAT_VERSION}. + */ + public String getVersion() { + return version; + } + + /** + * Фильтр типов метаданных для записи в папку. Если null — записываются все поддерживаемые типы. + * Позволяет выгружать только выбранные типы (например, только Catalogs и Documents). + */ + public Set getTypeFilter() { + return typeFilter; + } + + /** Создаёт построитель опций записи. */ + public static Builder builder() { + return new Builder(); + } + + /** + * Опции по умолчанию: короткие имена, версия формата выгрузки по умолчанию, без фильтра типов. + */ + public static WriteOptions defaults() { + return builder().build(); + } + + /** Построитель опций записи конфигурации. */ + public static final class Builder { + private boolean useShortNamesInChildObjects = true; + private String version = JaxbWriteDefaults.DEFAULT_FORMAT_VERSION; + private Set typeFilter = null; + + public Builder useShortNamesInChildObjects(boolean useShortNamesInChildObjects) { + this.useShortNamesInChildObjects = useShortNamesInChildObjects; + return this; + } + + /** + * Версия формата выгрузки (2.20, 2.27 и т.д.). Если null — используется {@link JaxbWriteDefaults#DEFAULT_FORMAT_VERSION}. + */ + public Builder version(String version) { + this.version = version != null ? version : JaxbWriteDefaults.DEFAULT_FORMAT_VERSION; + return this; + } + + public Builder typeFilter(Set typeFilter) { + this.typeFilter = typeFilter; + return this; + } + + /** Создаёт опции записи. */ + public WriteOptions build() { + return new WriteOptions(this); + } + } +} diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/package-info.java b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/package-info.java new file mode 100644 index 000000000..24ee0359d --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/package-info.java @@ -0,0 +1,13 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ + +/** + * Запись метаданных конфигурации 1С в формат Designer XML через JAXB-модель (XSD). + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; diff --git a/src/main/xsd/v8.3.27/catalog.xml b/src/main/xsd/v8.3.27/catalog.xml new file mode 100644 index 000000000..92810b008 --- /dev/null +++ b/src/main/xsd/v8.3.27/catalog.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/main/xsd/v8.3.27/v8.1c.ru-8.1-data-core.xsd b/src/main/xsd/v8.3.27/v8.1c.ru-8.1-data-core.xsd new file mode 100644 index 000000000..b3eda6021 --- /dev/null +++ b/src/main/xsd/v8.3.27/v8.1c.ru-8.1-data-core.xsd @@ -0,0 +1,398 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/xsd/v8.3.27/v8.1c.ru-8.1-data-enterprise.xsd b/src/main/xsd/v8.3.27/v8.1c.ru-8.1-data-enterprise.xsd new file mode 100644 index 000000000..acc5fc337 --- /dev/null +++ b/src/main/xsd/v8.3.27/v8.1c.ru-8.1-data-enterprise.xsd @@ -0,0 +1,390 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/xsd/v8.3.27/v8.1c.ru-8.1-data-ui.xsd b/src/main/xsd/v8.3.27/v8.1c.ru-8.1-data-ui.xsd new file mode 100644 index 000000000..c21db763a --- /dev/null +++ b/src/main/xsd/v8.3.27/v8.1c.ru-8.1-data-ui.xsd @@ -0,0 +1,424 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/xsd/v8.3.27/v8.1c.ru-8.2-data-bsl.xsd b/src/main/xsd/v8.3.27/v8.1c.ru-8.2-data-bsl.xsd new file mode 100644 index 000000000..04a4dca3f --- /dev/null +++ b/src/main/xsd/v8.3.27/v8.1c.ru-8.2-data-bsl.xsd @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/xsd/v8.3.27/v8.1c.ru-8.2-data-spreadsheet.xsd b/src/main/xsd/v8.3.27/v8.1c.ru-8.2-data-spreadsheet.xsd new file mode 100644 index 000000000..e861a7b37 --- /dev/null +++ b/src/main/xsd/v8.3.27/v8.1c.ru-8.2-data-spreadsheet.xsd @@ -0,0 +1,693 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/xsd/v8.3.27/v8.1c.ru-8.2-managed-application-cmi.xsd b/src/main/xsd/v8.3.27/v8.1c.ru-8.2-managed-application-cmi.xsd new file mode 100644 index 000000000..8432fd5f2 --- /dev/null +++ b/src/main/xsd/v8.3.27/v8.1c.ru-8.2-managed-application-cmi.xsd @@ -0,0 +1,275 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/xsd/v8.3.27/v8.1c.ru-8.2-managed-application-core.xsd b/src/main/xsd/v8.3.27/v8.1c.ru-8.2-managed-application-core.xsd new file mode 100644 index 000000000..e53008587 --- /dev/null +++ b/src/main/xsd/v8.3.27/v8.1c.ru-8.2-managed-application-core.xsd @@ -0,0 +1,1109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/xsd/v8.3.27/v8.1c.ru-8.2-managed-application-logform.xsd b/src/main/xsd/v8.3.27/v8.1c.ru-8.2-managed-application-logform.xsd new file mode 100644 index 000000000..5c702da19 --- /dev/null +++ b/src/main/xsd/v8.3.27/v8.1c.ru-8.2-managed-application-logform.xsd @@ -0,0 +1,2023 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/xsd/v8.3.27/v8.1c.ru-8.2-managed-application-modules.xsd b/src/main/xsd/v8.3.27/v8.1c.ru-8.2-managed-application-modules.xsd new file mode 100644 index 000000000..19fe81ec1 --- /dev/null +++ b/src/main/xsd/v8.3.27/v8.1c.ru-8.2-managed-application-modules.xsd @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/xsd/v8.3.27/v8.1c.ru-8.2-uobjects.xsd b/src/main/xsd/v8.3.27/v8.1c.ru-8.2-uobjects.xsd new file mode 100644 index 000000000..caf59e910 --- /dev/null +++ b/src/main/xsd/v8.3.27/v8.1c.ru-8.2-uobjects.xsd @@ -0,0 +1,379 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/xsd/v8.3.27/v8.1c.ru-8.3-MDClasses.xsd b/src/main/xsd/v8.3.27/v8.1c.ru-8.3-MDClasses.xsd new file mode 100644 index 000000000..ab9fa1e17 --- /dev/null +++ b/src/main/xsd/v8.3.27/v8.1c.ru-8.3-MDClasses.xsd @@ -0,0 +1,2859 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/xsd/v8.3.27/v8.1c.ru-8.3-xcf-enums.xsd b/src/main/xsd/v8.3.27/v8.1c.ru-8.3-xcf-enums.xsd new file mode 100644 index 000000000..69938da6a --- /dev/null +++ b/src/main/xsd/v8.3.27/v8.1c.ru-8.3-xcf-enums.xsd @@ -0,0 +1,593 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/xsd/v8.3.27/v8.1c.ru-8.3-xcf-predef.xsd b/src/main/xsd/v8.3.27/v8.1c.ru-8.3-xcf-predef.xsd new file mode 100644 index 000000000..50ef5f236 --- /dev/null +++ b/src/main/xsd/v8.3.27/v8.1c.ru-8.3-xcf-predef.xsd @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/xsd/v8.3.27/v8.1c.ru-8.3-xcf-readable.xsd b/src/main/xsd/v8.3.27/v8.1c.ru-8.3-xcf-readable.xsd new file mode 100644 index 000000000..fc4fc2771 --- /dev/null +++ b/src/main/xsd/v8.3.27/v8.1c.ru-8.3-xcf-readable.xsd @@ -0,0 +1,271 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/xsd/v8.5/bindings.xjb b/src/main/xsd/v8.5/bindings.xjb new file mode 100644 index 000000000..af79674b5 --- /dev/null +++ b/src/main/xsd/v8.5/bindings.xjb @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/xsd/v8.5/catalog.xml b/src/main/xsd/v8.5/catalog.xml new file mode 100644 index 000000000..92810b008 --- /dev/null +++ b/src/main/xsd/v8.5/catalog.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/main/xsd/v8.5/v8.1c.ru-8.1-data-core.xsd b/src/main/xsd/v8.5/v8.1c.ru-8.1-data-core.xsd new file mode 100644 index 000000000..b3eda6021 --- /dev/null +++ b/src/main/xsd/v8.5/v8.1c.ru-8.1-data-core.xsd @@ -0,0 +1,398 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/xsd/v8.5/v8.1c.ru-8.1-data-enterprise.xsd b/src/main/xsd/v8.5/v8.1c.ru-8.1-data-enterprise.xsd new file mode 100644 index 000000000..455548932 --- /dev/null +++ b/src/main/xsd/v8.5/v8.1c.ru-8.1-data-enterprise.xsd @@ -0,0 +1,441 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/xsd/v8.5/v8.1c.ru-8.1-data-ui.xsd b/src/main/xsd/v8.5/v8.1c.ru-8.1-data-ui.xsd new file mode 100644 index 000000000..03c4a15a1 --- /dev/null +++ b/src/main/xsd/v8.5/v8.1c.ru-8.1-data-ui.xsd @@ -0,0 +1,436 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/xsd/v8.5/v8.1c.ru-8.2-data-bsl.xsd b/src/main/xsd/v8.5/v8.1c.ru-8.2-data-bsl.xsd new file mode 100644 index 000000000..04a4dca3f --- /dev/null +++ b/src/main/xsd/v8.5/v8.1c.ru-8.2-data-bsl.xsd @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/xsd/v8.5/v8.1c.ru-8.2-data-spreadsheet.xsd b/src/main/xsd/v8.5/v8.1c.ru-8.2-data-spreadsheet.xsd new file mode 100644 index 000000000..441c2e7aa --- /dev/null +++ b/src/main/xsd/v8.5/v8.1c.ru-8.2-data-spreadsheet.xsd @@ -0,0 +1,710 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/xsd/v8.5/v8.1c.ru-8.2-managed-application-cmi.xsd b/src/main/xsd/v8.5/v8.1c.ru-8.2-managed-application-cmi.xsd new file mode 100644 index 000000000..2ab4a5a8b --- /dev/null +++ b/src/main/xsd/v8.5/v8.1c.ru-8.2-managed-application-cmi.xsd @@ -0,0 +1,278 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/xsd/v8.5/v8.1c.ru-8.2-managed-application-core.xsd b/src/main/xsd/v8.5/v8.1c.ru-8.2-managed-application-core.xsd new file mode 100644 index 000000000..373a860ac --- /dev/null +++ b/src/main/xsd/v8.5/v8.1c.ru-8.2-managed-application-core.xsd @@ -0,0 +1,1161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/xsd/v8.5/v8.1c.ru-8.2-managed-application-logform.xsd b/src/main/xsd/v8.5/v8.1c.ru-8.2-managed-application-logform.xsd new file mode 100644 index 000000000..84c1fca9d --- /dev/null +++ b/src/main/xsd/v8.5/v8.1c.ru-8.2-managed-application-logform.xsd @@ -0,0 +1,2363 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/xsd/v8.5/v8.1c.ru-8.2-managed-application-modules.xsd b/src/main/xsd/v8.5/v8.1c.ru-8.2-managed-application-modules.xsd new file mode 100644 index 000000000..19fe81ec1 --- /dev/null +++ b/src/main/xsd/v8.5/v8.1c.ru-8.2-managed-application-modules.xsd @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/xsd/v8.5/v8.1c.ru-8.2-uobjects.xsd b/src/main/xsd/v8.5/v8.1c.ru-8.2-uobjects.xsd new file mode 100644 index 000000000..caf59e910 --- /dev/null +++ b/src/main/xsd/v8.5/v8.1c.ru-8.2-uobjects.xsd @@ -0,0 +1,379 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/xsd/v8.5/v8.1c.ru-8.3-MDClasses.xsd b/src/main/xsd/v8.5/v8.1c.ru-8.3-MDClasses.xsd new file mode 100644 index 000000000..c2b234ccb --- /dev/null +++ b/src/main/xsd/v8.5/v8.1c.ru-8.3-MDClasses.xsd @@ -0,0 +1,2899 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/xsd/v8.5/v8.1c.ru-8.3-xcf-enums.xsd b/src/main/xsd/v8.5/v8.1c.ru-8.3-xcf-enums.xsd new file mode 100644 index 000000000..98aae3565 --- /dev/null +++ b/src/main/xsd/v8.5/v8.1c.ru-8.3-xcf-enums.xsd @@ -0,0 +1,608 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/xsd/v8.5/v8.1c.ru-8.3-xcf-predef.xsd b/src/main/xsd/v8.5/v8.1c.ru-8.3-xcf-predef.xsd new file mode 100644 index 000000000..50ef5f236 --- /dev/null +++ b/src/main/xsd/v8.5/v8.1c.ru-8.3-xcf-predef.xsd @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/xsd/v8.5/v8.1c.ru-8.3-xcf-readable.xsd b/src/main/xsd/v8.5/v8.1c.ru-8.3-xcf-readable.xsd new file mode 100644 index 000000000..fc4fc2771 --- /dev/null +++ b/src/main/xsd/v8.5/v8.1c.ru-8.3-xcf-readable.xsd @@ -0,0 +1,271 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/DesignerJaxbWriterTest.java b/src/test/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/DesignerJaxbWriterTest.java new file mode 100644 index 000000000..505064a15 --- /dev/null +++ b/src/test/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/DesignerJaxbWriterTest.java @@ -0,0 +1,149 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + * + * MDClasses is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * MDClasses is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with MDClasses. + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import com.github._1c_syntax.bsl.mdo.Catalog; +import com.github._1c_syntax.bsl.mdo.MD; +import com.github._1c_syntax.bsl.mdo.Role; +import com.github._1c_syntax.bsl.mdo.Subsystem; +import com.github._1c_syntax.bsl.types.MDOType; +import com.github._1c_syntax.bsl.mdclasses.Configuration; +import com.github._1c_syntax.bsl.mdclasses.MDCReadSettings; +import com.github._1c_syntax.bsl.mdclasses.MDClasses; +import com.github._1c_syntax.bsl.reader.MDOReader; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Set; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class DesignerJaxbWriterTest { + + private static final Path DESIGNER_CF = Path.of("src/test/resources/ext/designer/mdclasses/src/cf"); + + @Test + void writeSubsystemRoundTrip(@TempDir Path tempDir) throws Exception { + MD mdo = (MD) MDOReader.read(DESIGNER_CF, "Subsystems.ПерваяПодсистема", MDCReadSettings.DEFAULT); + assertThat(mdo).isInstanceOf(Subsystem.class); + + Path out = tempDir.resolve("Subsystems.ПерваяПодсистема.xml"); + MDClassesJaxbWriter.writeObjectJaxb(out, mdo); + + assertThat(out).exists(); + String xml = Files.readString(out); + assertThat(xml).contains("MetaDataObject"); + assertThat(xml).contains("Subsystem"); + assertThat(xml).contains("http://v8.1c.ru/8.3/MDClasses"); + assertThat(xml).contains("version=\"" + JaxbWriteDefaults.DEFAULT_FORMAT_VERSION + "\""); + assertThat(xml).contains("ПерваяПодсистема"); + } + + @Test + void writeCatalogRoundTrip(@TempDir Path tempDir) throws Exception { + MD mdo = (MD) MDOReader.read(DESIGNER_CF, "Catalogs.Справочник1", MDCReadSettings.DEFAULT); + assertThat(mdo).isInstanceOf(Catalog.class); + + Path out = tempDir.resolve("Catalogs.Справочник1.xml"); + MDClassesJaxbWriter.writeObjectJaxb(out, mdo); + + assertThat(out).exists(); + String xml = Files.readString(out); + assertThat(xml).contains("MetaDataObject"); + assertThat(xml).contains("Catalog"); + assertThat(xml).contains("http://v8.1c.ru/8.3/MDClasses"); + assertThat(xml).contains("Справочник1"); + } + + @Test + void writeConfigurationRoundTrip(@TempDir Path tempDir) throws Exception { + var mdc = MDClasses.createConfiguration(DESIGNER_CF, MDCReadSettings.DEFAULT); + assertThat(mdc).isInstanceOf(Configuration.class); + Configuration cf = (Configuration) mdc; + + Path out = tempDir.resolve("Configuration.xml"); + MDClassesJaxbWriter.writeConfigurationJaxb(out, cf); + + assertThat(out).exists(); + String xml = Files.readString(out); + assertThat(xml).contains("MetaDataObject"); + assertThat(xml).contains("Configuration"); + assertThat(xml).contains("http://v8.1c.ru/8.3/MDClasses"); + } + + @Test + void writeUnsupportedTypeThrows() { + // Use a type not yet supported by JAXB writer (e.g. Constant, SessionParameter) + MD mdo = (MD) MDOReader.read(DESIGNER_CF, "Constants.Константа1", MDCReadSettings.DEFAULT); + assertThat(mdo).isNotNull(); + + assertThatThrownBy(() -> MDClassesJaxbWriter.writeObjectJaxb(Path.of("out.xml"), mdo)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("does not support type"); + } + + @Test + void writeRoleRoundTrip(@TempDir Path tempDir) throws Exception { + MD mdo = (MD) MDOReader.read(DESIGNER_CF, "Roles.Роль1", MDCReadSettings.DEFAULT); + assertThat(mdo).isInstanceOf(Role.class); + + Path out = tempDir.resolve("Roles").resolve("Роль1.xml"); + Files.createDirectories(out.getParent()); + MDClassesJaxbWriter.writeObjectJaxb(out, mdo); + + assertThat(out).exists(); + String xml = Files.readString(out); + assertThat(xml).contains("MetaDataObject"); + assertThat(xml).contains("Role"); + assertThat(xml).contains("Роль1"); + } + + @Test + void writeConfigurationToFolderWithTypeFilter(@TempDir Path tempDir) throws Exception { + Configuration cf = (Configuration) MDClasses.createConfiguration(DESIGNER_CF, MDCReadSettings.DEFAULT); + WriteOptions options = WriteOptions.builder() + .typeFilter(Set.of(MDOType.CATALOG, MDOType.DOCUMENT)) + .build(); + + MDClassesJaxbWriter.writeConfigurationToFolder(tempDir, cf, options); + + assertThat(tempDir.resolve("Configuration.xml")).exists(); + assertThat(tempDir.resolve("Catalogs").resolve("Справочник1.xml")).exists(); + assertThat(tempDir.resolve("Documents").resolve("Документ1.xml")).exists(); + assertThat(tempDir.resolve("Subsystems")).doesNotExist(); + } + + @Test + void writeConfigurationToFolderFull(@TempDir Path tempDir) throws Exception { + Configuration cf = (Configuration) MDClasses.createConfiguration(DESIGNER_CF, MDCReadSettings.DEFAULT); + MDClassesJaxbWriter.writeConfigurationToFolder(tempDir, cf); + + assertThat(tempDir.resolve("Configuration.xml")).exists(); + assertThat(tempDir.resolve("Subsystems")).isDirectory(); + assertThat(tempDir.resolve("Catalogs")).isDirectory(); + assertThat(tempDir.resolve("Documents")).isDirectory(); + assertThat(tempDir.resolve("Roles").resolve("Роль1.xml")).exists(); + } +} diff --git a/src/test/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/DesignerPathResolverTest.java b/src/test/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/DesignerPathResolverTest.java new file mode 100644 index 000000000..1a6118839 --- /dev/null +++ b/src/test/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/DesignerPathResolverTest.java @@ -0,0 +1,75 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import com.github._1c_syntax.bsl.mdo.MD; +import com.github._1c_syntax.bsl.mdo.Subsystem; +import com.github._1c_syntax.bsl.mdclasses.MDCReadSettings; +import com.github._1c_syntax.bsl.reader.MDOReader; +import org.junit.jupiter.api.Test; + +import java.nio.file.Path; + +import static org.assertj.core.api.Assertions.assertThat; + +class DesignerPathResolverTest { + + private static final Path DESIGNER_CF = Path.of("src/test/resources/ext/designer/mdclasses/src/cf"); + private static final Path ROOT = Path.of("out"); + + @Test + void configurationPath() { + Path p = DesignerPathResolver.configurationPath(ROOT); + assertThat(p).isEqualTo(ROOT.resolve("Configuration.xml")); + } + + @Test + void pathForObjectSubsystemTopLevel() { + MD mdo = (MD) MDOReader.read(DESIGNER_CF, "Subsystems.ПерваяПодсистема", MDCReadSettings.DEFAULT); + assertThat(mdo).isNotNull(); + + Path p = DesignerPathResolver.pathForObject(ROOT, mdo); + assertThat(p).isEqualTo(ROOT.resolve("Subsystems").resolve("ПерваяПодсистема.xml")); + } + + @Test + void pathForObjectCatalog() { + MD mdo = (MD) MDOReader.read(DESIGNER_CF, "Catalogs.Справочник1", MDCReadSettings.DEFAULT); + assertThat(mdo).isNotNull(); + + Path p = DesignerPathResolver.pathForObject(ROOT, mdo); + assertThat(p).isEqualTo(ROOT.resolve("Catalogs").resolve("Справочник1.xml")); + } + + @Test + void pathForObjectNestedSubsystem() { + MD parent = (MD) MDOReader.read(DESIGNER_CF, "Subsystems.ПерваяПодсистема", MDCReadSettings.DEFAULT); + assertThat(parent).isInstanceOf(Subsystem.class); + Subsystem parentSub = (Subsystem) parent; + var children = parentSub.getSubsystems(); + if (children == null || children.isEmpty()) { + return; + } + MD child = children.get(0); + Path parentPath = ROOT.resolve("Subsystems").resolve("ПерваяПодсистема.xml"); + + Path childPath = DesignerPathResolver.pathForObject(ROOT, child, parentPath); + assertThat(childPath).isEqualTo(ROOT.resolve("Subsystems").resolve("ПерваяПодсистема") + .resolve("Subsystems").resolve(child.getName() + ".xml")); + } + + @Test + void getPathForObjectViaFacade() { + MD mdo = (MD) MDOReader.read(DESIGNER_CF, "Documents.Документ1", MDCReadSettings.DEFAULT); + assertThat(mdo).isNotNull(); + + Path p = MDClassesJaxbWriter.getPathForObject(ROOT, mdo); + assertThat(p).isEqualTo(ROOT.resolve("Documents").resolve("Документ1.xml")); + } +} diff --git a/src/test/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/JaxbWriterExampleTest.java b/src/test/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/JaxbWriterExampleTest.java new file mode 100644 index 000000000..94a30f797 --- /dev/null +++ b/src/test/java/com/github/_1c_syntax/bsl/mdclasses/jaxb/write/JaxbWriterExampleTest.java @@ -0,0 +1,64 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2026 + * Tymko Oleg , Maximov Valery and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + * + * MDClasses is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * MDClasses is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with MDClasses. + */ +package com.github._1c_syntax.bsl.mdclasses.jaxb.write; + +import com.github._1c_syntax.bsl.mdclasses.Configuration; +import com.github._1c_syntax.bsl.mdclasses.MDCReadSettings; +import com.github._1c_syntax.bsl.mdclasses.MDClasses; +import org.junit.jupiter.api.Test; + +import java.nio.file.Files; +import java.nio.file.Path; + +/** + * Пример полной записи конфигурации в папку для ручной проверки в Конфигураторе 1С. + * Результат в {@code build/jaxb-example-output/}: Configuration.xml, Languages/, Subsystems/ (в т.ч. вложенные), + * Catalogs/, и прочие объекты по дереву конфигурации. + *

+ * Формы справочников записываются в отдельные файлы Catalogs/Имя/Forms/ИмяФормы.xml. + *

+ * Запуск: {@code ./gradlew test --tests "com.github._1c_syntax.bsl.mdclasses.jaxb.write.JaxbWriterExampleTest.writeExampleToBuildDir"} + */ +class JaxbWriterExampleTest { + + private static final Path DESIGNER_CF = Path.of("src/test/resources/ext/designer/mdclasses/src/cf"); + private static final Path OUTPUT_DIR = Path.of("build/jaxb-example-output"); + + @Test + void writeExampleToBuildDir() throws Exception { + Configuration cf = (Configuration) MDClasses.createConfiguration(DESIGNER_CF, MDCReadSettings.DEFAULT); + MDClassesJaxbWriter.writeConfigurationToFolder(OUTPUT_DIR, cf); + + Path configPath = OUTPUT_DIR.resolve("Configuration.xml"); + assert Files.exists(configPath) : "Configuration.xml"; + assert Files.exists(OUTPUT_DIR.resolve("Languages").resolve("Русский.xml")) : "Languages/Русский.xml"; + assert Files.exists(OUTPUT_DIR.resolve("Subsystems").resolve("ПерваяПодсистема.xml")) : "Subsystems/ПерваяПодсистема.xml"; + assert Files.exists(OUTPUT_DIR.resolve("Subsystems").resolve("ВтораяПодсистема.xml")) : "Subsystems/ВтораяПодсистема.xml"; + Path nestedSub = OUTPUT_DIR.resolve("Subsystems").resolve("ПерваяПодсистема").resolve("Subsystems").resolve("ПодчиненнаяПодсистема.xml"); + assert Files.exists(nestedSub) : "Subsystems/ПерваяПодсистема/Subsystems/ПодчиненнаяПодсистема.xml"; + assert Files.exists(OUTPUT_DIR.resolve("Catalogs").resolve("Справочник1.xml")) : "Catalogs/Справочник1.xml"; + Path formsDir = OUTPUT_DIR.resolve("Catalogs").resolve("Справочник1").resolve("Forms"); + assert Files.exists(formsDir.resolve("ФормаЭлемента.xml")) : "Catalogs/Справочник1/Forms/ФормаЭлемента.xml"; + assert Files.exists(formsDir.resolve("ФормаСписка.xml")) : "Catalogs/Справочник1/Forms/ФормаСписка.xml"; + assert Files.exists(formsDir.resolve("ФормаВыбора.xml")) : "Catalogs/Справочник1/Forms/ФормаВыбора.xml"; + } +}