diff --git a/.gitignore b/.gitignore index da1741753..bc0e40a0f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ build/ +bin/ .gradle/ /.idea/sonarlint/ @@ -20,3 +21,5 @@ Gradle_*.xml **/ConfigDumpInfo.xml **/.metadata/ benchmark-results/** + +.vscode/ diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdo/Catalog.java b/src/main/java/com/github/_1c_syntax/bsl/mdo/Catalog.java index 904eaf629..a8098c0b8 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/mdo/Catalog.java +++ b/src/main/java/com/github/_1c_syntax/bsl/mdo/Catalog.java @@ -24,6 +24,7 @@ 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.children.ObjectTemplate; +import com.github._1c_syntax.bsl.mdo.support.CodeSeries; import com.github._1c_syntax.bsl.mdo.support.ObjectBelonging; import com.github._1c_syntax.bsl.mdo.support.RoleRight; import com.github._1c_syntax.bsl.mdo.utils.LazyLoader; @@ -114,6 +115,24 @@ public class Catalog implements ReferenceObject, AccessRightsOwner { @Singular("addOwners") List owners; + /** + * Проверять уникальность кода справочника. + * Определяет, нужно ли проверять уникальность кода справочника. + * Если значение равно false, то код справочника должен быть уникальным в пределах области, + * определяемой свойством {@link #codeSeries}. + */ + @Default + boolean checkUnique = false; + + /** + * Серия кодов справочника. + * Определяет область действия уникальности кода справочника. + * Значение по умолчанию: {@link CodeSeries#WHOLE_CATALOG}. + * Для формата EDT: если поле отсутствует, автоматически устанавливается значение WHOLE_CATALOG. + */ + @Default + CodeSeries codeSeries = CodeSeries.WHOLE_CATALOG; + /** * Возвращает перечень возможных прав доступа */ diff --git a/src/main/java/com/github/_1c_syntax/bsl/mdo/support/CodeSeries.java b/src/main/java/com/github/_1c_syntax/bsl/mdo/support/CodeSeries.java new file mode 100644 index 000000000..76c6554e4 --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/mdo/support/CodeSeries.java @@ -0,0 +1,83 @@ +/* + * This file is a part of MDClasses. + * + * Copyright (c) 2019 - 2025 + * 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.mdo.support; + +import java.util.Locale; +import java.util.Map; + +import com.github._1c_syntax.bsl.types.EnumWithName; +import com.github._1c_syntax.bsl.types.MultiName; + +import lombok.Getter; +import lombok.ToString; +import lombok.experimental.Accessors; + +/** + * Серия кодов справочника. + * Определяет область действия уникальности кода справочника. + */ +@ToString(of = "fullName") +public enum CodeSeries implements EnumWithName { + /** + * Весь справочник - уникальность кода проверяется во всем справочнике + */ + WHOLE_CATALOG("WholeCatalog", "ВесьСправочник"), + /** + * В пределах подчинения - уникальность кода проверяется в пределах подчинения + */ + WITHIN_SUBORDINATION("WithinSubordination", "ВПределахПодчинения"), + /** + * В пределах подчинения владельцу - уникальность кода проверяется в пределах подчинения владельцу + */ + WITHIN_OWNER_SUBORDINATION("WithinOwnerSubordination", "ВПределахПодчиненияВладельцу"); + + private static final Map KEYS = EnumWithName.computeKeys(values()); + + /** + * Полное имя элемента перечисления (на русском и английском языках) + */ + @Getter + @Accessors(fluent = true) + private final MultiName fullName; + + /** + * Конструктор элемента перечисления + * + * @param nameEn Английское имя элемента + * @param nameRu Русское имя элемента + */ + CodeSeries(String nameEn, String nameRu) { + this.fullName = MultiName.create(nameEn, nameRu); + } + + /** + * Ищет элемент перечисления по именам (рус, анг). + * Поиск выполняется без учета регистра. + * + * @param string Имя искомого элемента + * @return Найденное значение, если не найден - то WHOLE_CATALOG + */ + public static CodeSeries valueByName(String string) { + return KEYS.getOrDefault(string.toLowerCase(Locale.ROOT), WHOLE_CATALOG); + } +} + diff --git a/src/main/java/com/github/_1c_syntax/bsl/reader/common/xstream/ExtendXStream.java b/src/main/java/com/github/_1c_syntax/bsl/reader/common/xstream/ExtendXStream.java index 1b5890049..b2eb5fc33 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/reader/common/xstream/ExtendXStream.java +++ b/src/main/java/com/github/_1c_syntax/bsl/reader/common/xstream/ExtendXStream.java @@ -31,6 +31,7 @@ import com.github._1c_syntax.bsl.mdo.storage.form.FormElementType; import com.github._1c_syntax.bsl.mdo.support.ApplicationRunMode; import com.github._1c_syntax.bsl.mdo.support.AutoRecordType; +import com.github._1c_syntax.bsl.mdo.support.CodeSeries; import com.github._1c_syntax.bsl.mdo.support.ConfigurationExtensionPurpose; import com.github._1c_syntax.bsl.mdo.support.DataLockControlMode; import com.github._1c_syntax.bsl.mdo.support.DataSeparation; @@ -273,6 +274,7 @@ protected void setupConverters() { registerConverter(new EnumConverter<>(FormElementType.class)); registerConverter(new EnumConverter<>(InterfaceCompatibilityMode.class)); registerConverter(new EnumConverter<>(DateFractions.class)); + registerConverter(new EnumConverter<>(CodeSeries.class)); } private void init() { diff --git a/src/test/java/com/github/_1c_syntax/bsl/mdo/CatalogTest.java b/src/test/java/com/github/_1c_syntax/bsl/mdo/CatalogTest.java index 47e96c6c7..9c584e482 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/mdo/CatalogTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/mdo/CatalogTest.java @@ -156,6 +156,30 @@ void testSSL(ArgumentsAccessor argumentsAccessor) { assertThat(stdAttribute.getValueType().contains(PrimitiveValueType.STRING)).isTrue(); } + /** + * Проверяет, что для справочника "Заметки" поле checkUnique установлено в false. + *

+ * В формате Designer: в XML файле явно указано {@code false}. + * В формате EDT: в XML файле поле отсутствует, используется значение по умолчанию false. + * + * @param argumentsAccessor параметры теста (формат, имя пакета, ссылка на MDO, постфикс фикстуры) + */ + @ParameterizedTest + @CsvSource({ + "true, ssl_3_1, Catalogs.Заметки, _edt", + "false, ssl_3_1, Catalogs.Заметки" + }) + void testCheckUniqueFalse(ArgumentsAccessor argumentsAccessor) { + var mdo = MDTestUtils.getMDWithSimpleTest(argumentsAccessor); + assertThat(mdo) + .isInstanceOf(Catalog.class); + + var catalog = (Catalog) mdo; + assertThat(catalog.isCheckUnique()) + .as("Поле checkUnique должно быть false для справочника Заметки") + .isFalse(); + } + @ParameterizedTest @CsvSource({ "true, ssl_3_1, Catalogs.ВерсииФайлов, _edt", @@ -166,14 +190,4 @@ void testSSLFixture(ArgumentsAccessor argumentsAccessor) { assertThat(mdo) .isInstanceOf(Catalog.class); } - -// private void checkExtInfo(FormDataOLD formData) { -// var extInfo = (DynamicListExtInfo) formData.getAttributes().get(1).getExtInfo(); -// assertThat(extInfo) -// .isNotNull() -// .isInstanceOf(DynamicListExtInfo.class); -// -// assertThat(extInfo.isCustomQuery()).isTrue(); -// assertThat(extInfo.getQuery().getTextQuery()).isNotEmpty(); -// } -} \ No newline at end of file +} diff --git "a/src/test/resources/fixtures/mdclasses/Catalogs.\320\241\320\277\321\200\320\260\320\262\320\276\321\207\320\275\320\270\320\2721.json" "b/src/test/resources/fixtures/mdclasses/Catalogs.\320\241\320\277\321\200\320\260\320\262\320\276\321\207\320\275\320\270\320\2721.json" index e2711bf88..f8edfac7c 100644 --- "a/src/test/resources/fixtures/mdclasses/Catalogs.\320\241\320\277\321\200\320\260\320\262\320\276\321\207\320\275\320\270\320\2721.json" +++ "b/src/test/resources/fixtures/mdclasses/Catalogs.\320\241\320\277\321\200\320\260\320\262\320\276\321\207\320\275\320\270\320\2721.json" @@ -1219,6 +1219,8 @@ "name": "Справочник1", "objectBelonging": "OWN", "owners": [], + "checkUnique": true, + "codeSeries": "WHOLE_CATALOG", "possibleRights": [ { "default": { diff --git "a/src/test/resources/fixtures/mdclasses/Catalogs.\320\241\320\277\321\200\320\260\320\262\320\276\321\207\320\275\320\270\320\2721_edt.json" "b/src/test/resources/fixtures/mdclasses/Catalogs.\320\241\320\277\321\200\320\260\320\262\320\276\321\207\320\275\320\270\320\2721_edt.json" index 8af2c2973..0908be487 100644 --- "a/src/test/resources/fixtures/mdclasses/Catalogs.\320\241\320\277\321\200\320\260\320\262\320\276\321\207\320\275\320\270\320\2721_edt.json" +++ "b/src/test/resources/fixtures/mdclasses/Catalogs.\320\241\320\277\321\200\320\260\320\262\320\276\321\207\320\275\320\270\320\2721_edt.json" @@ -1219,6 +1219,8 @@ "name": "Справочник1", "objectBelonging": "OWN", "owners": [], + "checkUnique": true, + "codeSeries": "WHOLE_CATALOG", "possibleRights": [ { "default": { diff --git a/src/test/resources/fixtures/mdclasses/Configuration.json b/src/test/resources/fixtures/mdclasses/Configuration.json index 0cba799de..d2d77df2a 100644 --- a/src/test/resources/fixtures/mdclasses/Configuration.json +++ b/src/test/resources/fixtures/mdclasses/Configuration.json @@ -666,6 +666,8 @@ "explanation": { "@reference": "/com.github._1c_syntax.bsl.mdclasses.Configuration/XDTOPackages/com.github._1c_syntax.bsl.mdo.XDTOPackage/synonym" }, + "checkUnique": true, + "codeSeries": "WHOLE_CATALOG", "owners": [] } ], diff --git a/src/test/resources/fixtures/mdclasses/Configuration_edt.json b/src/test/resources/fixtures/mdclasses/Configuration_edt.json index 5cb8204b0..7f7a38da6 100644 --- a/src/test/resources/fixtures/mdclasses/Configuration_edt.json +++ b/src/test/resources/fixtures/mdclasses/Configuration_edt.json @@ -666,6 +666,8 @@ "explanation": { "@reference": "/com.github._1c_syntax.bsl.mdclasses.Configuration/XDTOPackages/com.github._1c_syntax.bsl.mdo.XDTOPackage/synonym" }, + "checkUnique": true, + "codeSeries": "WHOLE_CATALOG", "owners": [] } ], diff --git a/src/test/resources/fixtures/mdclasses_3_24/Configuration_edt.json b/src/test/resources/fixtures/mdclasses_3_24/Configuration_edt.json index f083d67a8..d39198871 100644 --- a/src/test/resources/fixtures/mdclasses_3_24/Configuration_edt.json +++ b/src/test/resources/fixtures/mdclasses_3_24/Configuration_edt.json @@ -666,6 +666,8 @@ "explanation": { "@reference": "/com.github._1c_syntax.bsl.mdclasses.Configuration/XDTOPackages/com.github._1c_syntax.bsl.mdo.XDTOPackage/synonym" }, + "checkUnique": true, + "codeSeries": "WHOLE_CATALOG", "owners": [] } ], diff --git "a/src/test/resources/fixtures/ssl_3_1/Catalogs.\320\222\320\265\321\200\321\201\320\270\320\270\320\244\320\260\320\271\320\273\320\276\320\262.json" "b/src/test/resources/fixtures/ssl_3_1/Catalogs.\320\222\320\265\321\200\321\201\320\270\320\270\320\244\320\260\320\271\320\273\320\276\320\262.json" index f70acb3ad..0b710aa54 100644 --- "a/src/test/resources/fixtures/ssl_3_1/Catalogs.\320\222\320\265\321\200\321\201\320\270\320\270\320\244\320\260\320\271\320\273\320\276\320\262.json" +++ "b/src/test/resources/fixtures/ssl_3_1/Catalogs.\320\222\320\265\321\200\321\201\320\270\320\270\320\244\320\260\320\271\320\273\320\276\320\262.json" @@ -2887,6 +2887,8 @@ "mdoRefRu": "Справочник.Файлы" } ], + "checkUnique": true, + "codeSeries": "WITHIN_OWNER_SUBORDINATION", "possibleRights": [ { "default": { diff --git "a/src/test/resources/fixtures/ssl_3_1/Catalogs.\320\222\320\265\321\200\321\201\320\270\320\270\320\244\320\260\320\271\320\273\320\276\320\262_edt.json" "b/src/test/resources/fixtures/ssl_3_1/Catalogs.\320\222\320\265\321\200\321\201\320\270\320\270\320\244\320\260\320\271\320\273\320\276\320\262_edt.json" index 2f8f24160..3041e89dd 100644 --- "a/src/test/resources/fixtures/ssl_3_1/Catalogs.\320\222\320\265\321\200\321\201\320\270\320\270\320\244\320\260\320\271\320\273\320\276\320\262_edt.json" +++ "b/src/test/resources/fixtures/ssl_3_1/Catalogs.\320\222\320\265\321\200\321\201\320\270\320\270\320\244\320\260\320\271\320\273\320\276\320\262_edt.json" @@ -2887,6 +2887,8 @@ "mdoRefRu": "Справочник.Файлы" } ], + "checkUnique": true, + "codeSeries": "WITHIN_OWNER_SUBORDINATION", "possibleRights": [ { "default": { diff --git "a/src/test/resources/fixtures/ssl_3_1/Catalogs.\320\227\320\260\320\274\320\265\321\202\320\272\320\270.json" "b/src/test/resources/fixtures/ssl_3_1/Catalogs.\320\227\320\260\320\274\320\265\321\202\320\272\320\270.json" index cd6c845e6..57661027a 100644 --- "a/src/test/resources/fixtures/ssl_3_1/Catalogs.\320\227\320\260\320\274\320\265\321\202\320\272\320\270.json" +++ "b/src/test/resources/fixtures/ssl_3_1/Catalogs.\320\227\320\260\320\274\320\265\321\202\320\272\320\270.json" @@ -2326,6 +2326,8 @@ "name": "Заметки", "objectBelonging": "OWN", "owners": [], + "checkUnique": false, + "codeSeries": "WHOLE_CATALOG", "possibleRights": [ { "default": { diff --git "a/src/test/resources/fixtures/ssl_3_1/Catalogs.\320\227\320\260\320\274\320\265\321\202\320\272\320\270_edt.json" "b/src/test/resources/fixtures/ssl_3_1/Catalogs.\320\227\320\260\320\274\320\265\321\202\320\272\320\270_edt.json" index d10e0fb29..dbf9d9968 100644 --- "a/src/test/resources/fixtures/ssl_3_1/Catalogs.\320\227\320\260\320\274\320\265\321\202\320\272\320\270_edt.json" +++ "b/src/test/resources/fixtures/ssl_3_1/Catalogs.\320\227\320\260\320\274\320\265\321\202\320\272\320\270_edt.json" @@ -2298,6 +2298,8 @@ "name": "Заметки", "objectBelonging": "OWN", "owners": [], + "checkUnique": false, + "codeSeries": "WHOLE_CATALOG", "possibleRights": [ { "default": {