From 2ef51fd7e585788fe3ddcf4915ee20fa34726bcb Mon Sep 17 00:00:00 2001 From: Ivan Karlo Date: Thu, 27 Nov 2025 13:55:57 +0300 Subject: [PATCH 1/4] =?UTF-8?q?feat(mdo):=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BF=D0=BE=D0=BB=D1=8F=20checkUniq?= =?UTF-8?q?ue=20=D0=B8=20codeSeries=20=D0=B2=20=D0=BA=D0=BB=D0=B0=D1=81?= =?UTF-8?q?=D1=81=20Catalog?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавлены поля для управления проверкой уникальности кода справочника: - checkUnique: определяет, нужно ли проверять уникальность кода - codeSeries: определяет область действия уникальности кода Изменения: - Добавлены поля checkUnique и codeSeries в класс Catalog с значениями по умолчанию - Добавлена регистрация CodeSeries в ExtendXStream для сериализации - Добавлен импорт CodeSeries в Catalog Значение по умолчанию для checkUnique: false (код должен быть уникальным) Значение по умолчанию для codeSeries: WHOLE_CATALOG --- .../github/_1c_syntax/bsl/mdo/Catalog.java | 19 +++++ .../bsl/mdo/support/CodeSeries.java | 83 +++++++++++++++++++ .../reader/common/xstream/ExtendXStream.java | 2 + 3 files changed, 104 insertions(+) create mode 100644 src/main/java/com/github/_1c_syntax/bsl/mdo/support/CodeSeries.java 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() { From 2ff7111dd9f3fa2a850b2c876de4b96673fc58f2 Mon Sep 17 00:00:00 2001 From: Ivan Karlo Date: Thu, 27 Nov 2025 13:56:21 +0300 Subject: [PATCH 2/4] =?UTF-8?q?test(fixtures):=20=D0=BE=D0=B1=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D1=84=D0=B8=D0=BA=D1=81=D1=82?= =?UTF-8?q?=D1=83=D1=80=D1=8B=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D0=B5=D0=B9=20checkUnique=20=D0=B8=20codeSeries?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Обновлены JSON фикстуры для добавления полей checkUnique и codeSeries: - mdclasses: Catalogs.Справочник1.json, Configuration.json - mdclasses_3_24: Configuration_edt.json - ssl_3_1: Catalogs.ВерсииФайлов.json, Catalogs.Заметки.json и их _edt версии Исправлено значение checkUnique в фикстуре Catalogs.Заметки_edt.json с true на false (соответствует реальному значению в XML файле) --- ...0\260\320\262\320\276\321\207\320\275\320\270\320\2721.json" | 2 ++ ...0\320\262\320\276\321\207\320\275\320\270\320\2721_edt.json" | 2 ++ src/test/resources/fixtures/mdclasses/Configuration.json | 2 ++ src/test/resources/fixtures/mdclasses/Configuration_edt.json | 2 ++ .../resources/fixtures/mdclasses_3_24/Configuration_edt.json | 2 ++ ...20\270\320\244\320\260\320\271\320\273\320\276\320\262.json" | 2 ++ ...70\320\244\320\260\320\271\320\273\320\276\320\262_edt.json" | 2 ++ ...20\227\320\260\320\274\320\265\321\202\320\272\320\270.json" | 2 ++ ...27\320\260\320\274\320\265\321\202\320\272\320\270_edt.json" | 2 ++ 9 files changed, 18 insertions(+) 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": { From 0a284f74c7a446d4aae1b067d44001db4d0fe7b8 Mon Sep 17 00:00:00 2001 From: Ivan Karlo Date: Thu, 27 Nov 2025 13:56:40 +0300 Subject: [PATCH 3/4] =?UTF-8?q?test(catalog):=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=20=D1=82=D0=B5=D1=81=D1=82=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8?= =?UTF-8?q?=20checkUnique=20=3D=20false?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавлен параметризованный тест testCheckUniqueFalse для проверки, что поле checkUnique установлено в false для справочника "Заметки" в обоих форматах (Designer и EDT). Также выполнена очистка кода: - Удален закомментированный метод checkExtInfo - Обновлен .gitignore (добавлены bin/ и .vscode/) --- .../_1c_syntax/bsl/mdo/CatalogTest.java | 36 +++++++++++++------ 1 file changed, 25 insertions(+), 11 deletions(-) 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 +} From d8e4aabff86efe0626b44ebc6806770733db0fed Mon Sep 17 00:00:00 2001 From: Ivan Karlo Date: Thu, 27 Nov 2025 13:57:15 +0300 Subject: [PATCH 4/4] =?UTF-8?q?chore(git):=20=D0=9E=D0=B1=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=20.gitignore,=20=D0=B2=D0=BA=D0=BB?= =?UTF-8?q?=D1=8E=D1=87=D0=B5=D0=BD=D1=8B=20=D0=BA=D0=B0=D1=82=D0=B0=D0=BB?= =?UTF-8?q?=D0=BE=D0=B3=D0=B8=20bin/=20=D0=B8=20.vscode/.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) 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/