From 894f8bef79bc830b69e46dedf1d0cd41d5e86595 Mon Sep 17 00:00:00 2001 From: IvanSergeev Date: Mon, 27 Oct 2025 17:55:37 +0400 Subject: [PATCH 01/11] =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=9E=D0=BF=D0=B5=D1=80=D0=B0=D1=82=D0=BE=D1=80?= =?UTF-8?q?=20"=D0=9F=D0=B5=D1=80=D0=B5=D0=B9=D1=82=D0=B8"=20=D0=BD=D0=B5?= =?UTF-8?q?=20=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=B8=D0=B2=D0=B0?= =?UTF-8?q?=D0=B5=D1=82=D1=81=D1=8F=20=D0=BF=D0=BB=D0=B0=D1=82=D1=84=D0=BE?= =?UTF-8?q?=D1=80=D0=BC=D0=BE=D0=B9=20=D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D0=B5?= =?UTF-8?q?=20=D0=B2=D0=B5=D0=B1-=D0=BA=D0=BB=D0=B8=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bundles/com.e1c.v8codestyle.bsl/plugin.xml | 4 + .../e1c/v8codestyle/bsl/check/Messages.java | 4 + .../check/NotSupportGotoOperatorWebCheck.java | 154 ++++++++++++++++++ .../v8codestyle/bsl/check/messages.properties | 6 + .../bsl/check/messages_ru.properties | 6 + .../not-support-goto-operator-after.bsl | 13 ++ .../not-support-goto-operator-before.bsl | 13 ++ ...pport-goto-operator-in-if-preprocessor.bsl | 15 ++ .../resources/not-support-goto-operator.bsl | 11 ++ .../resources/support-goto-operator.bsl | 11 ++ 10 files changed, 237 insertions(+) create mode 100644 bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/NotSupportGotoOperatorWebCheck.java create mode 100644 tests/com.e1c.v8codestyle.bsl.itests/resources/not-support-goto-operator-after.bsl create mode 100644 tests/com.e1c.v8codestyle.bsl.itests/resources/not-support-goto-operator-before.bsl create mode 100644 tests/com.e1c.v8codestyle.bsl.itests/resources/not-support-goto-operator-in-if-preprocessor.bsl create mode 100644 tests/com.e1c.v8codestyle.bsl.itests/resources/not-support-goto-operator.bsl create mode 100644 tests/com.e1c.v8codestyle.bsl.itests/resources/support-goto-operator.bsl diff --git a/bundles/com.e1c.v8codestyle.bsl/plugin.xml b/bundles/com.e1c.v8codestyle.bsl/plugin.xml index 84f46c15..d74745c4 100644 --- a/bundles/com.e1c.v8codestyle.bsl/plugin.xml +++ b/bundles/com.e1c.v8codestyle.bsl/plugin.xml @@ -387,6 +387,10 @@ category="com.e1c.v8codestyle.bsl" class="com.e1c.v8codestyle.internal.bsl.ExecutableExtensionFactory:com.e1c.v8codestyle.bsl.comment.check.ExportProcedureCommentDescriptionCheck"> + + diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/Messages.java b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/Messages.java index f5d3b1d2..bfb1b6b4 100644 --- a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/Messages.java +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/Messages.java @@ -311,6 +311,10 @@ final class Messages public static String StructureCtorTooManyKeysCheck_Maximum_structure_constructor_keys; public static String StructureCtorTooManyKeysCheck_Structure_constructor_has_more_than__0__keys; public static String StructureCtorTooManyKeysCheck_title; + + public static String NotSupportGotoOperatorWebCheck_Title; + public static String NotSupportGotoOperatorWebCheck_Description; + public static String NotSupportGotoOperatorWebCheck_Issue; public static String NewColorCheck_Use_style_elements; diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/NotSupportGotoOperatorWebCheck.java b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/NotSupportGotoOperatorWebCheck.java new file mode 100644 index 00000000..885f1edf --- /dev/null +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/NotSupportGotoOperatorWebCheck.java @@ -0,0 +1,154 @@ +/******************************************************************************* + * Copyright (C) 2025, 1C-Soft LLC and others. + * + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * 1C-Soft LLC - initial API and implementation + *******************************************************************************/ + +package com.e1c.v8codestyle.bsl.check; + +import static com._1c.g5.v8.dt.bsl.model.BslPackage.Literals.GOTO_STATEMENT; + +import java.util.List; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.emf.common.util.EList; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.xtext.EcoreUtil2; +import org.eclipse.xtext.nodemodel.ICompositeNode; +import org.eclipse.xtext.nodemodel.util.NodeModelUtils; + +import com._1c.g5.v8.dt.bsl.model.GotoStatement; +import com._1c.g5.v8.dt.bsl.model.IfPreprocessor; +import com._1c.g5.v8.dt.bsl.model.IfPreprocessorDeclareStatement; +import com._1c.g5.v8.dt.bsl.model.Method; +import com._1c.g5.v8.dt.bsl.model.Module; +import com._1c.g5.v8.dt.bsl.model.ModuleType; +import com._1c.g5.v8.dt.bsl.model.util.BslUtil; +import com._1c.g5.v8.dt.mcore.util.Environments; +import com.e1c.g5.v8.dt.check.CheckComplexity; +import com.e1c.g5.v8.dt.check.ICheckParameters; +import com.e1c.g5.v8.dt.check.components.ModuleTopObjectNameFilterExtension; +import com.e1c.g5.v8.dt.check.settings.IssueSeverity; +import com.e1c.g5.v8.dt.check.settings.IssueType; +import com.e1c.v8codestyle.check.CommonSenseCheckExtension; +import com.e1c.v8codestyle.internal.bsl.BslPlugin; + +/** + * The check Goto operator in client code + * @author Ivan Sergeev + */ + +public class NotSupportGotoOperatorWebCheck + extends AbstractModuleStructureCheck +{ + + private static final String CHECK_ID = "not-support-goto-operator"; //$NON-NLS-1$ + + public NotSupportGotoOperatorWebCheck() + { + super(); + } + + @Override + public String getCheckId() + { + return CHECK_ID; + } + + @Override + protected void configureCheck(CheckConfigurer builder) + { + builder.title(Messages.NotSupportGotoOperatorWebCheck_Title) + .description(Messages.NotSupportGotoOperatorWebCheck_Description) + .complexity(CheckComplexity.NORMAL) + .severity(IssueSeverity.CRITICAL) + .issueType(IssueType.CODE_STYLE) + .extension(new ModuleTopObjectNameFilterExtension()) + .extension(new CommonSenseCheckExtension(getCheckId(), BslPlugin.PLUGIN_ID)) + .module() + .checkedObjectType(GOTO_STATEMENT); + } + + @Override + protected void check(Object object, ResultAcceptor resultAcceptor, ICheckParameters parameters, + IProgressMonitor monitor) + { + if (object instanceof GotoStatement) + { + EObject eObject = (EObject)object; + Module module = EcoreUtil2.getContainerOfType(eObject, Module.class); + Method method = EcoreUtil2.getContainerOfType(eObject, Method.class); + String pragmas = method.getPragmas().get(0).getSymbol(); + + if (module.getModuleType() == ModuleType.COMMON_MODULE) + { + if (module.environments().containsAll(Environments.ORDINARY_CLIENTS)) + { + resultAcceptor.addIssue(Messages.NotSupportGotoOperatorWebCheck_Issue, object); + } + } + else if (pragmas.toLowerCase().contains("AtClient".toLowerCase()) //$NON-NLS-1$ + || pragmas.toLowerCase().contains("НаКлиенте".toLowerCase())) //$NON-NLS-1$ + { + List allItems = BslUtil.getAllIfPreprocessorsFromBlock(method); + if (allItems.isEmpty()) + { + resultAcceptor.addIssue(Messages.NotSupportGotoOperatorWebCheck_Issue, object); + return; + } + for (IfPreprocessor ifPreprocessor : allItems) + { + if (ifPreprocessor instanceof IfPreprocessorDeclareStatement) + { + ICompositeNode node = NodeModelUtils.findActualNodeFor(ifPreprocessor); + if (node == null) + { + return; + } + if (node.getText().toLowerCase().contains("Перейти".toLowerCase())) //$NON-NLS-1$ + { + checkPreprocessorIf(ifPreprocessor, resultAcceptor, object); + } + else + { + resultAcceptor.addIssue(Messages.NotSupportGotoOperatorWebCheck_Issue, object); + } + } + else + { + resultAcceptor.addIssue(Messages.NotSupportGotoOperatorWebCheck_Issue, object); + } + } + + } + } + } + + protected void checkPreprocessorIf(IfPreprocessor ifPreprocessor, ResultAcceptor resultAcceptor, Object object) + { + EList listStatement = ifPreprocessor.eContents(); + for (EObject eObject : listStatement) + { + ICompositeNode node = NodeModelUtils.findActualNodeFor(eObject); + if (node == null) + { + return; + } + if (node.getText().toLowerCase().contains("Перейти".toLowerCase())) //$NON-NLS-1$ + { + if (!node.getText().toLowerCase().contains("НЕ ВебКлиент".toLowerCase()) //$NON-NLS-1$ + & !node.getText().toLowerCase().contains("NOT WebClient".toLowerCase())) //$NON-NLS-1$ + { + resultAcceptor.addIssue(Messages.NotSupportGotoOperatorWebCheck_Issue, object); + } + } + } + } +} diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/messages.properties b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/messages.properties index 2b2d397b..c36f7f13 100644 --- a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/messages.properties +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/messages.properties @@ -376,6 +376,12 @@ NewFontCheck_Issue = To change the font you should use style elements NewFontCheck_Title = Using the "New Font" construction +NotSupportGotoOperatorWebCheck_Title = Check not support GoTo operator in web client + +NotSupportGotoOperatorWebCheck_Description = Check not support GoTo operator in web client + +NotSupportGotoOperatorWebCheck_Issue = GoTo operator is not supported in the web client + NotifyDescriptionToServerProcedureCheck_Notify_description_procedure_should_be_export = Notify description procedure should exist and be export NotifyDescriptionToServerProcedureCheck_Notify_description_to_Server_procedure = Notify description to Server procedure diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/messages_ru.properties b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/messages_ru.properties index 9eadbaf3..bf4fdef2 100644 --- a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/messages_ru.properties +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/messages_ru.properties @@ -376,6 +376,12 @@ NewFontCheck_Issue = Для изменения шрифта следует ис NewFontCheck_Title = Использование конструкции "Новый Шрифт" +NotSupportGotoOperatorWebCheck_Title = Проверка не поддерживающегося оператора "Перейти" в веб-клиенте + +NotSupportGotoOperatorWebCheck_Description = Проверка не поддерживающегося оператора "Перейти" в веб-клиенте + +NotSupportGotoOperatorWebCheck_Issue = Оператор "Перейти" не поддерживается в режиме веб-клиента + NotifyDescriptionToServerProcedureCheck_Notify_description_procedure_should_be_export = Процедура описания оповещения должна существовать и быть экспортной NotifyDescriptionToServerProcedureCheck_Notify_description_to_Server_procedure = Описание оповещения на серверную процедуру diff --git a/tests/com.e1c.v8codestyle.bsl.itests/resources/not-support-goto-operator-after.bsl b/tests/com.e1c.v8codestyle.bsl.itests/resources/not-support-goto-operator-after.bsl new file mode 100644 index 00000000..e0f0a79f --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/resources/not-support-goto-operator-after.bsl @@ -0,0 +1,13 @@ + +#Region Abcd + +&AtClient +Procedure Aaaa() + +Test = 2; + +Goto ~Label; + +EndProcedure + +#EndRegion diff --git a/tests/com.e1c.v8codestyle.bsl.itests/resources/not-support-goto-operator-before.bsl b/tests/com.e1c.v8codestyle.bsl.itests/resources/not-support-goto-operator-before.bsl new file mode 100644 index 00000000..cca646b7 --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/resources/not-support-goto-operator-before.bsl @@ -0,0 +1,13 @@ + +#Region Abcd + +&AtClient +Procedure Aaaa() + +Goto ~Label; +A = 1; + +EndProcedure + +#EndRegion + diff --git a/tests/com.e1c.v8codestyle.bsl.itests/resources/not-support-goto-operator-in-if-preprocessor.bsl b/tests/com.e1c.v8codestyle.bsl.itests/resources/not-support-goto-operator-in-if-preprocessor.bsl new file mode 100644 index 00000000..32f0aba0 --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/resources/not-support-goto-operator-in-if-preprocessor.bsl @@ -0,0 +1,15 @@ + +#Region Abcd + +&AtClient +Procedure Aaaa() + +#If NOT MobileClient Then + +Goto ~Label; + +#EndIf; + +EndProcedure + +#EndRegion diff --git a/tests/com.e1c.v8codestyle.bsl.itests/resources/not-support-goto-operator.bsl b/tests/com.e1c.v8codestyle.bsl.itests/resources/not-support-goto-operator.bsl new file mode 100644 index 00000000..b9e16301 --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/resources/not-support-goto-operator.bsl @@ -0,0 +1,11 @@ + +#Region Abcd + +&AtClient +Procedure Aaaa() + +Goto ~Label; + +EndProcedure + +#EndRegion diff --git a/tests/com.e1c.v8codestyle.bsl.itests/resources/support-goto-operator.bsl b/tests/com.e1c.v8codestyle.bsl.itests/resources/support-goto-operator.bsl new file mode 100644 index 00000000..452db535 --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/resources/support-goto-operator.bsl @@ -0,0 +1,11 @@ + +#Region Abcd + +&AtServer +Procedure Aaaa() + +Goto ~Label; + +EndProcedure + +#EndRegion From d16285f8612390452c9080e26e4b870a809f720f Mon Sep 17 00:00:00 2001 From: IvanSergeev Date: Tue, 28 Oct 2025 10:01:27 +0400 Subject: [PATCH 02/11] add test --- .../NotSupportGotoOperatorCheckTest.java | 119 ++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 tests/com.e1c.v8codestyle.bsl.itests/src/com/e1c/v8codestyle/bsl/check/itests/NotSupportGotoOperatorCheckTest.java diff --git a/tests/com.e1c.v8codestyle.bsl.itests/src/com/e1c/v8codestyle/bsl/check/itests/NotSupportGotoOperatorCheckTest.java b/tests/com.e1c.v8codestyle.bsl.itests/src/com/e1c/v8codestyle/bsl/check/itests/NotSupportGotoOperatorCheckTest.java new file mode 100644 index 00000000..5b0a0b40 --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/src/com/e1c/v8codestyle/bsl/check/itests/NotSupportGotoOperatorCheckTest.java @@ -0,0 +1,119 @@ +/******************************************************************************* + * Copyright (C) 2025, 1C-Soft LLC and others. + * + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * 1C-Soft LLC - initial API and implementation + *******************************************************************************/ +package com.e1c.v8codestyle.bsl.check.itests; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.util.List; + +import org.junit.Test; + +import com._1c.g5.v8.dt.validation.marker.Marker; +import com._1c.g5.v8.dt.validation.marker.StandardExtraInfo; +import com.e1c.v8codestyle.bsl.check.NotSupportGotoOperatorWebCheck; + +/** + * Tests for {@link NotSupportGotoOperatorWebCheck} check. + * + * @author Ivan Sergeev + */ +public class NotSupportGotoOperatorCheckTest + extends AbstractSingleModuleTestBase +{ + + public NotSupportGotoOperatorCheckTest() + { + super(NotSupportGotoOperatorWebCheck.class); + } + + /** + * Test not support goto operator. + * + * @throws Exception the exception + */ + @Test + public void testNotSupportGoToOperator() throws Exception + { + updateModule(FOLDER_RESOURCE + "not-support-goto-operator.bsl"); + + List markers = getModuleMarkers(); + assertEquals(1, markers.size()); + Marker marker = markers.get(0); + assertEquals(Integer.valueOf(7), marker.getExtraInfo().get(StandardExtraInfo.TEXT_LINE)); + } + + /** + * Test operator after another operator. + * + * @throws Exception the exception + */ + @Test + public void testOperatorAfter() throws Exception + { + updateModule(FOLDER_RESOURCE + "not-support-goto-operator-after.bsl"); + + List markers = getModuleMarkers(); + assertEquals(1, markers.size()); + Marker marker = markers.get(0); + assertEquals(Integer.valueOf(9), marker.getExtraInfo().get(StandardExtraInfo.TEXT_LINE)); + } + + /** + * Test operator before another operator. + * + * @throws Exception the exception + */ + @Test + public void testOperatorBefore() throws Exception + { + updateModule(FOLDER_RESOURCE + "not-support-goto-operator-before.bsl"); + + List markers = getModuleMarkers(); + assertEquals(1, markers.size()); + Marker marker = markers.get(0); + assertEquals(Integer.valueOf(7), marker.getExtraInfo().get(StandardExtraInfo.TEXT_LINE)); + } + + /** + * Test operator in if preprocessor. + * + * @throws Exception the exception + */ + @Test + public void testOperatorInIfPreprocessor() throws Exception + { + updateModule(FOLDER_RESOURCE + "not-support-goto-operator-in-if-preprocessor.bsl"); + + List markers = getModuleMarkers(); + assertEquals(1, markers.size()); + Marker marker = markers.get(0); + assertEquals(Integer.valueOf(9), marker.getExtraInfo().get(StandardExtraInfo.TEXT_LINE)); + + } + + /** + * Test operator goto support. + * + * @throws Exception the exception + */ + @Test + public void testSupportOperator() throws Exception + { + updateModule(FOLDER_RESOURCE + "support-goto-operator.bsl"); + + List markers = getModuleMarkers(); + assertTrue(markers.isEmpty()); + + } +} From 692675df794c39097069282e8d3a5973555c4399 Mon Sep 17 00:00:00 2001 From: Ivan Sergeev <55486074+alonthedark@users.noreply.github.com> Date: Tue, 28 Oct 2025 10:04:59 +0400 Subject: [PATCH 03/11] Update NotSupportGotoOperatorWebCheck.java --- .../v8codestyle/bsl/check/NotSupportGotoOperatorWebCheck.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/NotSupportGotoOperatorWebCheck.java b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/NotSupportGotoOperatorWebCheck.java index 885f1edf..dbbfa063 100644 --- a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/NotSupportGotoOperatorWebCheck.java +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/NotSupportGotoOperatorWebCheck.java @@ -141,7 +141,8 @@ public class NotSupportGotoOperatorWebCheck { return; } - if (node.getText().toLowerCase().contains("Перейти".toLowerCase())) //$NON-NLS-1$ + if (node.getText().toLowerCase().contains("Перейти".toLowerCase()) //$NON-NLS-1$ + | node.getText().toLowerCase().contains("GoTo".toLowerCase())) //$NON-NLS-1$ { if (!node.getText().toLowerCase().contains("НЕ ВебКлиент".toLowerCase()) //$NON-NLS-1$ & !node.getText().toLowerCase().contains("NOT WebClient".toLowerCase())) //$NON-NLS-1$ From 33a48cb6e266786c1b947088ba1e6116ca5bf278 Mon Sep 17 00:00:00 2001 From: IvanSergeev Date: Thu, 6 Nov 2025 15:27:42 +0400 Subject: [PATCH 04/11] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bundles/com.e1c.v8codestyle.bsl/plugin.xml | 2 +- .../check/NotSupportGotoOperatorWebCheck.java | 84 +++---------------- 2 files changed, 11 insertions(+), 75 deletions(-) diff --git a/bundles/com.e1c.v8codestyle.bsl/plugin.xml b/bundles/com.e1c.v8codestyle.bsl/plugin.xml index d74745c4..49b39d37 100644 --- a/bundles/com.e1c.v8codestyle.bsl/plugin.xml +++ b/bundles/com.e1c.v8codestyle.bsl/plugin.xml @@ -389,7 +389,7 @@ + class="com.e1c.v8codestyle.internal.bsl.ExecutableExtensionFactory:com.e1c.v8codestyle.bsl.check.NotSupportGotoOperatorWebCheck"> allItems = BslUtil.getAllIfPreprocessorsFromBlock(method); - if (allItems.isEmpty()) - { - resultAcceptor.addIssue(Messages.NotSupportGotoOperatorWebCheck_Issue, object); - return; - } - for (IfPreprocessor ifPreprocessor : allItems) - { - if (ifPreprocessor instanceof IfPreprocessorDeclareStatement) - { - ICompositeNode node = NodeModelUtils.findActualNodeFor(ifPreprocessor); - if (node == null) - { - return; - } - if (node.getText().toLowerCase().contains("Перейти".toLowerCase())) //$NON-NLS-1$ - { - checkPreprocessorIf(ifPreprocessor, resultAcceptor, object); - } - else - { - resultAcceptor.addIssue(Messages.NotSupportGotoOperatorWebCheck_Issue, object); - } - } - else - { - resultAcceptor.addIssue(Messages.NotSupportGotoOperatorWebCheck_Issue, object); - } - } - - } - } - } - - protected void checkPreprocessorIf(IfPreprocessor ifPreprocessor, ResultAcceptor resultAcceptor, Object object) - { - EList listStatement = ifPreprocessor.eContents(); - for (EObject eObject : listStatement) - { - ICompositeNode node = NodeModelUtils.findActualNodeFor(eObject); - if (node == null) - { - return; - } - if (node.getText().toLowerCase().contains("Перейти".toLowerCase()) //$NON-NLS-1$ - | node.getText().toLowerCase().contains("GoTo".toLowerCase())) //$NON-NLS-1$ - { - if (!node.getText().toLowerCase().contains("НЕ ВебКлиент".toLowerCase()) //$NON-NLS-1$ - & !node.getText().toLowerCase().contains("NOT WebClient".toLowerCase())) //$NON-NLS-1$ + if (envir.environments().contains(Environment.WEB_CLIENT)) { resultAcceptor.addIssue(Messages.NotSupportGotoOperatorWebCheck_Issue, object); } From 52d439a2b1716e4735780d327bddb023c5da7cbc Mon Sep 17 00:00:00 2001 From: Ivan Sergeev <55486074+alonthedark@users.noreply.github.com> Date: Thu, 13 Nov 2025 10:05:54 +0400 Subject: [PATCH 05/11] Update NotSupportGotoOperatorWebCheck.java --- .../bsl/check/NotSupportGotoOperatorWebCheck.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/NotSupportGotoOperatorWebCheck.java b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/NotSupportGotoOperatorWebCheck.java index 991309b1..ee9436a6 100644 --- a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/NotSupportGotoOperatorWebCheck.java +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/NotSupportGotoOperatorWebCheck.java @@ -36,7 +36,6 @@ import com.google.inject.Inject; * The check Goto operator in client code * @author Ivan Sergeev */ - public class NotSupportGotoOperatorWebCheck extends AbstractModuleStructureCheck { @@ -81,6 +80,10 @@ public class NotSupportGotoOperatorWebCheck Environmental envir = EcoreUtil2.getContainerOfType(eObject, Environmental.class); if (bslPreferences.getLoadEnvs(eObject).contains(Environment.WEB_CLIENT)) { + if (envir == null) + { + return; + } if (envir.environments().contains(Environment.WEB_CLIENT)) { resultAcceptor.addIssue(Messages.NotSupportGotoOperatorWebCheck_Issue, object); From 182ee3b4bcfa5ba10c572b87b676b475fa4d9a50 Mon Sep 17 00:00:00 2001 From: Ivan Sergeev <55486074+alonthedark@users.noreply.github.com> Date: Thu, 13 Nov 2025 15:54:23 +0400 Subject: [PATCH 06/11] Update NotSupportGotoOperatorWebCheck.java --- .../v8codestyle/bsl/check/NotSupportGotoOperatorWebCheck.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/NotSupportGotoOperatorWebCheck.java b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/NotSupportGotoOperatorWebCheck.java index ee9436a6..c624039c 100644 --- a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/NotSupportGotoOperatorWebCheck.java +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/NotSupportGotoOperatorWebCheck.java @@ -40,7 +40,7 @@ public class NotSupportGotoOperatorWebCheck extends AbstractModuleStructureCheck { - private static final String CHECK_ID = "not-support-goto-operator"; //$NON-NLS-1$ + private static final String CHECK_ID = "not-support-goto-operator-webclient"; //$NON-NLS-1$ @Inject private IBslPreferences bslPreferences; From 3891027670acfe13612aff023bc759c49ef95bb1 Mon Sep 17 00:00:00 2001 From: IvanSergeev Date: Thu, 20 Nov 2025 16:38:34 +0400 Subject: [PATCH 07/11] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BE=D0=BA?= =?UTF-8?q?=20=D0=B8=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=82=D0=BE=D1=80=D0=B0=20=D0=9F?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=B9=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../not-support-goto-operator-webclient.md | 25 ++++++++++ .../ru/not-support-goto-operator-webclient.md | 30 ++++++++++++ .../markdown/ru/self-assign.md | 20 ++++++++ .../markdown/self-assign.md | 15 ++++++ .../NotSupportGotoOperatorCheckTest.java | 8 ++++ .../NotSupportGotoOperatorCheckTest/.project | 18 ++++++++ .../org.eclipse.core.resources.prefs | 2 + .../DT-INF/PROJECT.PMF | 2 + .../CommonModule/CommonModule.mdo | 12 +++++ .../src/Configuration/CommandInterface.cmi | 2 + .../src/Configuration/Configuration.mdo | 46 +++++++++++++++++++ .../MainSectionCommandInterface.cmi | 2 + 12 files changed, 182 insertions(+) create mode 100644 bundles/com.e1c.v8codestyle.bsl/markdown/not-support-goto-operator-webclient.md create mode 100644 bundles/com.e1c.v8codestyle.bsl/markdown/ru/not-support-goto-operator-webclient.md create mode 100644 bundles/com.e1c.v8codestyle.bsl/markdown/ru/self-assign.md create mode 100644 bundles/com.e1c.v8codestyle.bsl/markdown/self-assign.md create mode 100644 tests/com.e1c.v8codestyle.bsl.itests/workspace/NotSupportGotoOperatorCheckTest/.project create mode 100644 tests/com.e1c.v8codestyle.bsl.itests/workspace/NotSupportGotoOperatorCheckTest/.settings/org.eclipse.core.resources.prefs create mode 100644 tests/com.e1c.v8codestyle.bsl.itests/workspace/NotSupportGotoOperatorCheckTest/DT-INF/PROJECT.PMF create mode 100644 tests/com.e1c.v8codestyle.bsl.itests/workspace/NotSupportGotoOperatorCheckTest/src/CommonModules/CommonModule/CommonModule.mdo create mode 100644 tests/com.e1c.v8codestyle.bsl.itests/workspace/NotSupportGotoOperatorCheckTest/src/Configuration/CommandInterface.cmi create mode 100644 tests/com.e1c.v8codestyle.bsl.itests/workspace/NotSupportGotoOperatorCheckTest/src/Configuration/Configuration.mdo create mode 100644 tests/com.e1c.v8codestyle.bsl.itests/workspace/NotSupportGotoOperatorCheckTest/src/Configuration/MainSectionCommandInterface.cmi diff --git a/bundles/com.e1c.v8codestyle.bsl/markdown/not-support-goto-operator-webclient.md b/bundles/com.e1c.v8codestyle.bsl/markdown/not-support-goto-operator-webclient.md new file mode 100644 index 00000000..11ed94b2 --- /dev/null +++ b/bundles/com.e1c.v8codestyle.bsl/markdown/not-support-goto-operator-webclient.md @@ -0,0 +1,25 @@ +# Unsupported Goto operator + +Do not use the GoTo operator in common modules with the "Client (managed application)" flag selected, +command modules, and client code of managed form modules as this method is not supported in the web client. + +## Noncompliant Code Example + +If ChartOfCalculationTypes = Object.ChartOfCalculationTypes Then + + GoTo ~ChartOfCalculationTypes; + + EndIf; + +## Compliant Solution: + +If ChartOfCalculationTypes = Object.ChartOfCalculationTypes Then + + ProcessChartOfCalculationTypes(); + + EndIf; + + ## See + +[GoTo operator](https://kb.1ci.com/1C_Enterprise_Platform/Guides/Developer_Guides/1C_Enterprise_Development_Standards/Code_conventions/Using_1C_Enterprise_language_structures/GoTo_operator/?language=en) + \ No newline at end of file diff --git a/bundles/com.e1c.v8codestyle.bsl/markdown/ru/not-support-goto-operator-webclient.md b/bundles/com.e1c.v8codestyle.bsl/markdown/ru/not-support-goto-operator-webclient.md new file mode 100644 index 00000000..3ae891b2 --- /dev/null +++ b/bundles/com.e1c.v8codestyle.bsl/markdown/ru/not-support-goto-operator-webclient.md @@ -0,0 +1,30 @@ +# Ограничение на использование оператора Перейти + +В коде на встроенном языке не рекомендуется использовать оператор Перейти, так как необдуманное использование +данного оператора приводит к получению запутанных, плохо структурированных модулей, по тексту которых затруднительно +понять порядок исполнения и взаимозависимость фрагментов. Вместо оператора Перейти рекомендуется использовать +другие конструкции встроенного языка. + +## Неправильно + +Например, неправильно: + + Если ПланВидовРасчета = Объект.ПланВидовРасчета Тогда + + Перейти ~ПланВидовРасчета; + + КонецЕсли; + +## Правильно + +Например, правельно: + + Если ПланВидовРасчета = Объект.ПланВидовРасчета Тогда + + ОбработатьПланВидовРасчета(); + + КонецЕсли; + + ## См. + +- [Ограничение на использование оператора Перейти](https://its.1c.ru/db/v8std#content:547:hdoc:2) \ No newline at end of file diff --git a/bundles/com.e1c.v8codestyle.bsl/markdown/ru/self-assign.md b/bundles/com.e1c.v8codestyle.bsl/markdown/ru/self-assign.md new file mode 100644 index 00000000..88d4e280 --- /dev/null +++ b/bundles/com.e1c.v8codestyle.bsl/markdown/ru/self-assign.md @@ -0,0 +1,20 @@ +# Присвоение переменной самой себе + +Присвоение переменной самой себе не имеет смысла и обычно указывает на ошибку. + +## Неправильно + +Например, неправильно: + +П1 = ""; +П1 = П1; + +## Правильно + +Например, правельно: + +П1 = ""; + + ## См. + +- [Присвоение переменной самой себе](https://1c-syntax.github.io/bsl-language-server/diagnostics/SelfAssign/) \ No newline at end of file diff --git a/bundles/com.e1c.v8codestyle.bsl/markdown/self-assign.md b/bundles/com.e1c.v8codestyle.bsl/markdown/self-assign.md new file mode 100644 index 00000000..efec0034 --- /dev/null +++ b/bundles/com.e1c.v8codestyle.bsl/markdown/self-assign.md @@ -0,0 +1,15 @@ +# Self assigne variable + +Assigning a variable to itself is meaningless and usually indicates an error. + +## Noncompliant Code Example + +Например, неправильно: + +P1 = ""; +P1 = P1; + +## Compliant Solution + +P1 = ""; + diff --git a/tests/com.e1c.v8codestyle.bsl.itests/src/com/e1c/v8codestyle/bsl/check/itests/NotSupportGotoOperatorCheckTest.java b/tests/com.e1c.v8codestyle.bsl.itests/src/com/e1c/v8codestyle/bsl/check/itests/NotSupportGotoOperatorCheckTest.java index 5b0a0b40..089a7f9c 100644 --- a/tests/com.e1c.v8codestyle.bsl.itests/src/com/e1c/v8codestyle/bsl/check/itests/NotSupportGotoOperatorCheckTest.java +++ b/tests/com.e1c.v8codestyle.bsl.itests/src/com/e1c/v8codestyle/bsl/check/itests/NotSupportGotoOperatorCheckTest.java @@ -31,12 +31,19 @@ import com.e1c.v8codestyle.bsl.check.NotSupportGotoOperatorWebCheck; public class NotSupportGotoOperatorCheckTest extends AbstractSingleModuleTestBase { + private static final String PROJECT_NAME = "NotSupportGotoOperatorCheckTest"; public NotSupportGotoOperatorCheckTest() { super(NotSupportGotoOperatorWebCheck.class); } + @Override + protected String getTestConfigurationName() + { + return PROJECT_NAME; + } + /** * Test not support goto operator. * @@ -47,6 +54,7 @@ public class NotSupportGotoOperatorCheckTest { updateModule(FOLDER_RESOURCE + "not-support-goto-operator.bsl"); + List markers = getModuleMarkers(); assertEquals(1, markers.size()); Marker marker = markers.get(0); diff --git a/tests/com.e1c.v8codestyle.bsl.itests/workspace/NotSupportGotoOperatorCheckTest/.project b/tests/com.e1c.v8codestyle.bsl.itests/workspace/NotSupportGotoOperatorCheckTest/.project new file mode 100644 index 00000000..a637a5cc --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/workspace/NotSupportGotoOperatorCheckTest/.project @@ -0,0 +1,18 @@ + + + StructureModule + + + + + + org.eclipse.xtext.ui.shared.xtextBuilder + + + + + + org.eclipse.xtext.ui.shared.xtextNature + com._1c.g5.v8.dt.core.V8ConfigurationNature + + diff --git a/tests/com.e1c.v8codestyle.bsl.itests/workspace/NotSupportGotoOperatorCheckTest/.settings/org.eclipse.core.resources.prefs b/tests/com.e1c.v8codestyle.bsl.itests/workspace/NotSupportGotoOperatorCheckTest/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/workspace/NotSupportGotoOperatorCheckTest/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/tests/com.e1c.v8codestyle.bsl.itests/workspace/NotSupportGotoOperatorCheckTest/DT-INF/PROJECT.PMF b/tests/com.e1c.v8codestyle.bsl.itests/workspace/NotSupportGotoOperatorCheckTest/DT-INF/PROJECT.PMF new file mode 100644 index 00000000..6835f1cd --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/workspace/NotSupportGotoOperatorCheckTest/DT-INF/PROJECT.PMF @@ -0,0 +1,2 @@ +Manifest-Version: 1.0 +Runtime-Version: 8.3.19 diff --git a/tests/com.e1c.v8codestyle.bsl.itests/workspace/NotSupportGotoOperatorCheckTest/src/CommonModules/CommonModule/CommonModule.mdo b/tests/com.e1c.v8codestyle.bsl.itests/workspace/NotSupportGotoOperatorCheckTest/src/CommonModules/CommonModule/CommonModule.mdo new file mode 100644 index 00000000..64185c1e --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/workspace/NotSupportGotoOperatorCheckTest/src/CommonModules/CommonModule/CommonModule.mdo @@ -0,0 +1,12 @@ + + + CommonModule + + en + Common module + + true + true + true + true + diff --git a/tests/com.e1c.v8codestyle.bsl.itests/workspace/NotSupportGotoOperatorCheckTest/src/Configuration/CommandInterface.cmi b/tests/com.e1c.v8codestyle.bsl.itests/workspace/NotSupportGotoOperatorCheckTest/src/Configuration/CommandInterface.cmi new file mode 100644 index 00000000..0cf6de8a --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/workspace/NotSupportGotoOperatorCheckTest/src/Configuration/CommandInterface.cmi @@ -0,0 +1,2 @@ + + diff --git a/tests/com.e1c.v8codestyle.bsl.itests/workspace/NotSupportGotoOperatorCheckTest/src/Configuration/Configuration.mdo b/tests/com.e1c.v8codestyle.bsl.itests/workspace/NotSupportGotoOperatorCheckTest/src/Configuration/Configuration.mdo new file mode 100644 index 00000000..05bf56ec --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/workspace/NotSupportGotoOperatorCheckTest/src/Configuration/Configuration.mdo @@ -0,0 +1,46 @@ + + + StructureModule + + en + Structure module + + + + + + + + + 8.3.20 + ManagedApplication + PersonalComputer + + + true + + + OSBackup + true + + + Language.English + Managed + NotAutoFree + DontUse + DontUse + 8.3.20 + + English + + en + English + + en + + CommonModule.CommonModule + EventSubscription.EventSubscription + Catalog.CatalogInRegion + Catalog.CatalogInRegionWrongMethod + Catalog.CatalogInWrongRegion + diff --git a/tests/com.e1c.v8codestyle.bsl.itests/workspace/NotSupportGotoOperatorCheckTest/src/Configuration/MainSectionCommandInterface.cmi b/tests/com.e1c.v8codestyle.bsl.itests/workspace/NotSupportGotoOperatorCheckTest/src/Configuration/MainSectionCommandInterface.cmi new file mode 100644 index 00000000..0cf6de8a --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/workspace/NotSupportGotoOperatorCheckTest/src/Configuration/MainSectionCommandInterface.cmi @@ -0,0 +1,2 @@ + + From f691e7bdc9e1019f5decbc67f3229ad9c5391d9e Mon Sep 17 00:00:00 2001 From: IvanSergeev Date: Thu, 20 Nov 2025 16:41:59 +0400 Subject: [PATCH 08/11] 1 --- .../ModuleStructureEventFormRegionsCheck.java | 154 ++++++++---------- 1 file changed, 69 insertions(+), 85 deletions(-) diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/ModuleStructureEventFormRegionsCheck.java b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/ModuleStructureEventFormRegionsCheck.java index 169ee66e..5ce4c7e6 100644 --- a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/ModuleStructureEventFormRegionsCheck.java +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/ModuleStructureEventFormRegionsCheck.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2022, 1C-Soft LLC and others. + * Copyright (C) 2025, 1C-Soft LLC and others. * * This program and the accompanying materials are made * available under the terms of the Eclipse Public License 2.0 @@ -12,7 +12,8 @@ *******************************************************************************/ package com.e1c.v8codestyle.bsl.check; -import static com._1c.g5.v8.dt.bsl.model.BslPackage.Literals.METHOD; +import static com._1c.g5.v8.dt.bsl.model.BslPackage.Literals.MODULE; +import static com._1c.g5.v8.dt.mcore.McorePackage.Literals.NAMED_ELEMENT__NAME; import java.text.MessageFormat; import java.util.List; @@ -20,8 +21,8 @@ import java.util.Map; import java.util.Optional; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; -import org.eclipse.xtext.EcoreUtil2; import com._1c.g5.v8.dt.bsl.model.Method; import com._1c.g5.v8.dt.bsl.model.Module; @@ -39,7 +40,6 @@ import com._1c.g5.v8.dt.form.model.FormField; import com._1c.g5.v8.dt.form.model.GroupExtInfo; import com._1c.g5.v8.dt.form.model.Table; import com._1c.g5.v8.dt.lcore.util.CaseInsensitiveString; -import com._1c.g5.v8.dt.mcore.McorePackage; import com._1c.g5.v8.dt.metadata.mdclass.ScriptVariant; import com.e1c.g5.v8.dt.check.CheckComplexity; import com.e1c.g5.v8.dt.check.ICheckParameters; @@ -101,7 +101,7 @@ public class ModuleStructureEventFormRegionsCheck .extension(new StandardCheckExtension(455, getCheckId(), BslPlugin.PLUGIN_ID)) .extension(ModuleTypeFilter.onlyTypes(ModuleType.FORM_MODULE)) .module() - .checkedObjectType(METHOD) + .checkedObjectType(MODULE) .parameter(PARAMETER_EXCLUDE_METHOD_NAME_PATTERN, String.class, PATTERN_EXCLUDE, Messages.ModuleStructureEventFormRegionsCheck_Excluded_method_names) .parameter(MULTILEVEL_NESTING_OF_REGIONS, Boolean.class, DEFAULT_CHECK_NESTING_OF_REGIONS, @@ -109,60 +109,61 @@ public class ModuleStructureEventFormRegionsCheck } @Override - protected void check(Object object, ResultAcceptor result, ICheckParameters parameters, - IProgressMonitor monitor) + protected void check(Object object, ResultAcceptor result, ICheckParameters parameters, IProgressMonitor monitor) { if (monitor.isCanceled()) { return; } - Method method = (Method)object; - IV8Project project = v8ProjectManager.getProject(method); + Module module = (Module)object; + IV8Project project = v8ProjectManager.getProject(module); ScriptVariant scriptVariant = project.getScriptVariant(); - Module module = EcoreUtil2.getContainerOfType(method, Module.class); if (module == null) { return; } - - String methodName = method.getName(); - if (methodName == null) - { - return; - } - - String excludeNamePattern = parameters.getString(PARAMETER_EXCLUDE_METHOD_NAME_PATTERN); - if (!StringUtils.isEmpty(excludeNamePattern) && isExcludeName(methodName, excludeNamePattern)) - { - return; - } - - boolean multilevel = parameters.getBoolean(MULTILEVEL_NESTING_OF_REGIONS); - - Optional region = multilevel ? getTopParentRegion(method) : getFirstParentRegion(method); - if (region.isEmpty()) - { - return; - } - - String regionName = region.get().getName(); + EList methods = module.allMethods(); Map> eventHandlers = bslEventsService.getEventHandlersContainer(module); - List containers = eventHandlers.get(new CaseInsensitiveString(methodName)); - if (containers == null) + for (Method method : methods) { - if (isEventHandlerRegion(scriptVariant, regionName)) + String methodName = method.getName(); + if (methodName == null) { - addIssueShouldNotBeInRegion(result, methodName, regionName); + continue; } - return; - } - check(result, containers, regionName, methodName, scriptVariant, monitor); + String excludeNamePattern = parameters.getString(PARAMETER_EXCLUDE_METHOD_NAME_PATTERN); + if (!StringUtils.isEmpty(excludeNamePattern) && isExcludeName(methodName, excludeNamePattern)) + { + continue; + } + + boolean multilevel = parameters.getBoolean(MULTILEVEL_NESTING_OF_REGIONS); + + Optional region = + multilevel ? getTopParentRegion(method) : getFirstParentRegion(method); + if (region.isEmpty()) + { + continue; + } + + String regionName = region.get().getName(); + List containers = eventHandlers.get(new CaseInsensitiveString(methodName)); + if (containers == null) + { + if (isEventHandlerRegion(scriptVariant, regionName)) + { + addIssueShouldNotBeInRegion(result, methodName, regionName, method); + } + continue; + } + check(result, containers, regionName, methodName, scriptVariant, monitor, method); + } } private void check(ResultAcceptor result, List containers, String regionName, String methodName, - ScriptVariant scriptVariant, IProgressMonitor monitor) + ScriptVariant scriptVariant, IProgressMonitor monitor, EObject method) { for (EObject obj : containers) { @@ -173,33 +174,33 @@ public class ModuleStructureEventFormRegionsCheck if (obj instanceof FormCommandHandlerContainer) { - addIssueCommand(result, regionName, methodName, scriptVariant); + addIssueCommand(result, regionName, methodName, scriptVariant, method); } else if (obj instanceof EventHandlerContainer) { EventHandlerContainer container = (EventHandlerContainer)obj; - check(result, container, regionName, methodName, scriptVariant); + check(result, container, regionName, methodName, scriptVariant, method); } } } private void check(ResultAcceptor result, EventHandlerContainer container, String regionName, String methodName, - ScriptVariant scriptVariant) + ScriptVariant scriptVariant, EObject method) { EventHandlerContainer object = getContainer(container); if (object instanceof Table) { - addIssueTable(result, ((Table)object).getName(), regionName, methodName, scriptVariant); + addIssueTable(result, ((Table)object).getName(), regionName, methodName, scriptVariant, method); } else if (object instanceof FormField || object instanceof DecorationExtInfo || object instanceof GroupExtInfo) { - addIssueItem(result, regionName, methodName, scriptVariant); + addIssueItem(result, regionName, methodName, scriptVariant, method); } else if (object instanceof Form) { - addIssueForm(result, regionName, methodName, scriptVariant); + addIssueForm(result, regionName, methodName, scriptVariant, method); } } @@ -234,78 +235,62 @@ public class ModuleStructureEventFormRegionsCheck } private void addIssueCommand(ResultAcceptor result, String regionName, String methodName, - ScriptVariant scriptVariant) + ScriptVariant scriptVariant, EObject method) { - if (!isCommandHandlerRegion(regionName, scriptVariant)) + if (!ModuleStructureSection.FORM_COMMAND_EVENT_HANDLERS.getName(scriptVariant).equalsIgnoreCase(regionName)) { String defRegionName = ModuleStructureSection.FORM_COMMAND_EVENT_HANDLERS.getName(scriptVariant); - addIssueShouldBeInRegion(result, methodName, defRegionName); + addIssueShouldBeInRegion(result, methodName, defRegionName, method); } } private void addIssueTable(ResultAcceptor result, String tableName, String regionName, String methodName, - ScriptVariant scriptVariant) + ScriptVariant scriptVariant, EObject method) { - if (!isTableHandlerRegion(scriptVariant, regionName, tableName)) + if (!(ModuleStructureSection.FORM_TABLE_ITEMS_EVENT_HANDLERS.getName(scriptVariant) + tableName) + .equalsIgnoreCase(regionName)) { String defRegionName = ModuleStructureSection.FORM_TABLE_ITEMS_EVENT_HANDLERS.getName(scriptVariant) + tableName; - addIssueShouldBeInRegion(result, methodName, defRegionName); + addIssueShouldBeInRegion(result, methodName, defRegionName, method); } } - private void addIssueForm(ResultAcceptor result, String regionName, String methodName, ScriptVariant scriptVariant) + private void addIssueForm(ResultAcceptor result, String regionName, String methodName, ScriptVariant scriptVariant, + EObject method) { - if (!isFormHandlerRegion(regionName, scriptVariant)) + if (!ModuleStructureSection.FORM_EVENT_HANDLERS.getName(scriptVariant).equalsIgnoreCase(regionName)) { addIssueShouldBeInRegion(result, methodName, - ModuleStructureSection.FORM_EVENT_HANDLERS.getName(scriptVariant)); + ModuleStructureSection.FORM_EVENT_HANDLERS.getName(scriptVariant), method); } } - private void addIssueItem(ResultAcceptor result, String regionName, String methodName, ScriptVariant scriptVariant) + private void addIssueItem(ResultAcceptor result, String regionName, String methodName, ScriptVariant scriptVariant, + EObject method) { - if (!isFormHeaderHandlerRegion(regionName, scriptVariant)) + if (!ModuleStructureSection.FORM_HEADER_ITEMS_EVENT_HANDLERS.getName(scriptVariant) + .equalsIgnoreCase(regionName)) { addIssueShouldBeInRegion(result, methodName, - ModuleStructureSection.FORM_HEADER_ITEMS_EVENT_HANDLERS.getName(scriptVariant)); + ModuleStructureSection.FORM_HEADER_ITEMS_EVENT_HANDLERS.getName(scriptVariant), method); } } - private void addIssueShouldBeInRegion(ResultAcceptor result, String methodName, String defaultRegionName) + private void addIssueShouldBeInRegion(ResultAcceptor result, String methodName, String defaultRegionName, + EObject method) { result.addIssue(MessageFormat.format( Messages.ModuleStructureEventFormRegionsCheck_Event_method__0__should_be_placed_in_the_region__1, - methodName, defaultRegionName), McorePackage.Literals.NAMED_ELEMENT__NAME); + methodName, defaultRegionName), method, NAMED_ELEMENT__NAME); } - private void addIssueShouldNotBeInRegion(ResultAcceptor result, String methodName, String regionName) + private void addIssueShouldNotBeInRegion(ResultAcceptor result, String methodName, String regionName, + EObject method) { result.addIssue(MessageFormat.format( Messages.ModuleStructureEventFormRegionsCheck_Event_method__0__can_not_be_placed_in_the_region__1, - methodName, regionName), McorePackage.Literals.NAMED_ELEMENT__NAME); - } - - private boolean isCommandHandlerRegion(String regionName, ScriptVariant scriptVariant) - { - return ModuleStructureSection.FORM_COMMAND_EVENT_HANDLERS.getName(scriptVariant).equalsIgnoreCase(regionName); - } - - private boolean isTableHandlerRegion(ScriptVariant scriptVariant, String regionName, String tableName) - { - return (ModuleStructureSection.FORM_TABLE_ITEMS_EVENT_HANDLERS.getName(scriptVariant) + tableName) - .equalsIgnoreCase(regionName); - } - - private boolean isFormHeaderHandlerRegion(String regionName, ScriptVariant scriptVariant) - { - return ModuleStructureSection.FORM_HEADER_ITEMS_EVENT_HANDLERS.getName(scriptVariant) - .equalsIgnoreCase(regionName); - } - - private boolean isFormHandlerRegion(String regionName, ScriptVariant scriptVariant) - { - return ModuleStructureSection.FORM_EVENT_HANDLERS.getName(scriptVariant).equalsIgnoreCase(regionName); + methodName, regionName), method, NAMED_ELEMENT__NAME); } private boolean isEventHandlerRegion(ScriptVariant scriptVariant, String regionName) @@ -322,5 +307,4 @@ public class ModuleStructureEventFormRegionsCheck { return StringUtils.isNotEmpty(excludeNamePattern) && name.matches(excludeNamePattern); } - } From 8e4bab02aa15e12f013adbf9c74417afc842e6aa Mon Sep 17 00:00:00 2001 From: Ivan Sergeev <55486074+alonthedark@users.noreply.github.com> Date: Thu, 20 Nov 2025 16:55:18 +0400 Subject: [PATCH 09/11] ModuleStructureEventFormRegionsCheck.java --- .../ModuleStructureEventFormRegionsCheck.java | 160 ++++++++++-------- 1 file changed, 88 insertions(+), 72 deletions(-) diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/ModuleStructureEventFormRegionsCheck.java b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/ModuleStructureEventFormRegionsCheck.java index 5ce4c7e6..169ee66e 100644 --- a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/ModuleStructureEventFormRegionsCheck.java +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/ModuleStructureEventFormRegionsCheck.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (C) 2025, 1C-Soft LLC and others. + * Copyright (C) 2022, 1C-Soft LLC and others. * * This program and the accompanying materials are made * available under the terms of the Eclipse Public License 2.0 @@ -12,8 +12,7 @@ *******************************************************************************/ package com.e1c.v8codestyle.bsl.check; -import static com._1c.g5.v8.dt.bsl.model.BslPackage.Literals.MODULE; -import static com._1c.g5.v8.dt.mcore.McorePackage.Literals.NAMED_ELEMENT__NAME; +import static com._1c.g5.v8.dt.bsl.model.BslPackage.Literals.METHOD; import java.text.MessageFormat; import java.util.List; @@ -21,8 +20,8 @@ import java.util.Map; import java.util.Optional; import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; +import org.eclipse.xtext.EcoreUtil2; import com._1c.g5.v8.dt.bsl.model.Method; import com._1c.g5.v8.dt.bsl.model.Module; @@ -40,6 +39,7 @@ import com._1c.g5.v8.dt.form.model.FormField; import com._1c.g5.v8.dt.form.model.GroupExtInfo; import com._1c.g5.v8.dt.form.model.Table; import com._1c.g5.v8.dt.lcore.util.CaseInsensitiveString; +import com._1c.g5.v8.dt.mcore.McorePackage; import com._1c.g5.v8.dt.metadata.mdclass.ScriptVariant; import com.e1c.g5.v8.dt.check.CheckComplexity; import com.e1c.g5.v8.dt.check.ICheckParameters; @@ -101,7 +101,7 @@ public class ModuleStructureEventFormRegionsCheck .extension(new StandardCheckExtension(455, getCheckId(), BslPlugin.PLUGIN_ID)) .extension(ModuleTypeFilter.onlyTypes(ModuleType.FORM_MODULE)) .module() - .checkedObjectType(MODULE) + .checkedObjectType(METHOD) .parameter(PARAMETER_EXCLUDE_METHOD_NAME_PATTERN, String.class, PATTERN_EXCLUDE, Messages.ModuleStructureEventFormRegionsCheck_Excluded_method_names) .parameter(MULTILEVEL_NESTING_OF_REGIONS, Boolean.class, DEFAULT_CHECK_NESTING_OF_REGIONS, @@ -109,61 +109,60 @@ public class ModuleStructureEventFormRegionsCheck } @Override - protected void check(Object object, ResultAcceptor result, ICheckParameters parameters, IProgressMonitor monitor) + protected void check(Object object, ResultAcceptor result, ICheckParameters parameters, + IProgressMonitor monitor) { if (monitor.isCanceled()) { return; } - Module module = (Module)object; - IV8Project project = v8ProjectManager.getProject(module); + Method method = (Method)object; + IV8Project project = v8ProjectManager.getProject(method); ScriptVariant scriptVariant = project.getScriptVariant(); + Module module = EcoreUtil2.getContainerOfType(method, Module.class); if (module == null) { return; } - EList methods = module.allMethods(); - Map> eventHandlers = bslEventsService.getEventHandlersContainer(module); - for (Method method : methods) + + String methodName = method.getName(); + if (methodName == null) { - String methodName = method.getName(); - if (methodName == null) - { - continue; - } - - String excludeNamePattern = parameters.getString(PARAMETER_EXCLUDE_METHOD_NAME_PATTERN); - if (!StringUtils.isEmpty(excludeNamePattern) && isExcludeName(methodName, excludeNamePattern)) - { - continue; - } - - boolean multilevel = parameters.getBoolean(MULTILEVEL_NESTING_OF_REGIONS); - - Optional region = - multilevel ? getTopParentRegion(method) : getFirstParentRegion(method); - if (region.isEmpty()) - { - continue; - } - - String regionName = region.get().getName(); - List containers = eventHandlers.get(new CaseInsensitiveString(methodName)); - if (containers == null) - { - if (isEventHandlerRegion(scriptVariant, regionName)) - { - addIssueShouldNotBeInRegion(result, methodName, regionName, method); - } - continue; - } - check(result, containers, regionName, methodName, scriptVariant, monitor, method); + return; } + + String excludeNamePattern = parameters.getString(PARAMETER_EXCLUDE_METHOD_NAME_PATTERN); + if (!StringUtils.isEmpty(excludeNamePattern) && isExcludeName(methodName, excludeNamePattern)) + { + return; + } + + boolean multilevel = parameters.getBoolean(MULTILEVEL_NESTING_OF_REGIONS); + + Optional region = multilevel ? getTopParentRegion(method) : getFirstParentRegion(method); + if (region.isEmpty()) + { + return; + } + + String regionName = region.get().getName(); + Map> eventHandlers = bslEventsService.getEventHandlersContainer(module); + List containers = eventHandlers.get(new CaseInsensitiveString(methodName)); + if (containers == null) + { + if (isEventHandlerRegion(scriptVariant, regionName)) + { + addIssueShouldNotBeInRegion(result, methodName, regionName); + } + return; + } + + check(result, containers, regionName, methodName, scriptVariant, monitor); } private void check(ResultAcceptor result, List containers, String regionName, String methodName, - ScriptVariant scriptVariant, IProgressMonitor monitor, EObject method) + ScriptVariant scriptVariant, IProgressMonitor monitor) { for (EObject obj : containers) { @@ -174,33 +173,33 @@ public class ModuleStructureEventFormRegionsCheck if (obj instanceof FormCommandHandlerContainer) { - addIssueCommand(result, regionName, methodName, scriptVariant, method); + addIssueCommand(result, regionName, methodName, scriptVariant); } else if (obj instanceof EventHandlerContainer) { EventHandlerContainer container = (EventHandlerContainer)obj; - check(result, container, regionName, methodName, scriptVariant, method); + check(result, container, regionName, methodName, scriptVariant); } } } private void check(ResultAcceptor result, EventHandlerContainer container, String regionName, String methodName, - ScriptVariant scriptVariant, EObject method) + ScriptVariant scriptVariant) { EventHandlerContainer object = getContainer(container); if (object instanceof Table) { - addIssueTable(result, ((Table)object).getName(), regionName, methodName, scriptVariant, method); + addIssueTable(result, ((Table)object).getName(), regionName, methodName, scriptVariant); } else if (object instanceof FormField || object instanceof DecorationExtInfo || object instanceof GroupExtInfo) { - addIssueItem(result, regionName, methodName, scriptVariant, method); + addIssueItem(result, regionName, methodName, scriptVariant); } else if (object instanceof Form) { - addIssueForm(result, regionName, methodName, scriptVariant, method); + addIssueForm(result, regionName, methodName, scriptVariant); } } @@ -235,62 +234,78 @@ public class ModuleStructureEventFormRegionsCheck } private void addIssueCommand(ResultAcceptor result, String regionName, String methodName, - ScriptVariant scriptVariant, EObject method) + ScriptVariant scriptVariant) { - if (!ModuleStructureSection.FORM_COMMAND_EVENT_HANDLERS.getName(scriptVariant).equalsIgnoreCase(regionName)) + if (!isCommandHandlerRegion(regionName, scriptVariant)) { String defRegionName = ModuleStructureSection.FORM_COMMAND_EVENT_HANDLERS.getName(scriptVariant); - addIssueShouldBeInRegion(result, methodName, defRegionName, method); + addIssueShouldBeInRegion(result, methodName, defRegionName); } } private void addIssueTable(ResultAcceptor result, String tableName, String regionName, String methodName, - ScriptVariant scriptVariant, EObject method) + ScriptVariant scriptVariant) { - if (!(ModuleStructureSection.FORM_TABLE_ITEMS_EVENT_HANDLERS.getName(scriptVariant) + tableName) - .equalsIgnoreCase(regionName)) + if (!isTableHandlerRegion(scriptVariant, regionName, tableName)) { String defRegionName = ModuleStructureSection.FORM_TABLE_ITEMS_EVENT_HANDLERS.getName(scriptVariant) + tableName; - addIssueShouldBeInRegion(result, methodName, defRegionName, method); + addIssueShouldBeInRegion(result, methodName, defRegionName); } } - private void addIssueForm(ResultAcceptor result, String regionName, String methodName, ScriptVariant scriptVariant, - EObject method) + private void addIssueForm(ResultAcceptor result, String regionName, String methodName, ScriptVariant scriptVariant) { - if (!ModuleStructureSection.FORM_EVENT_HANDLERS.getName(scriptVariant).equalsIgnoreCase(regionName)) + if (!isFormHandlerRegion(regionName, scriptVariant)) { addIssueShouldBeInRegion(result, methodName, - ModuleStructureSection.FORM_EVENT_HANDLERS.getName(scriptVariant), method); + ModuleStructureSection.FORM_EVENT_HANDLERS.getName(scriptVariant)); } } - private void addIssueItem(ResultAcceptor result, String regionName, String methodName, ScriptVariant scriptVariant, - EObject method) + private void addIssueItem(ResultAcceptor result, String regionName, String methodName, ScriptVariant scriptVariant) { - if (!ModuleStructureSection.FORM_HEADER_ITEMS_EVENT_HANDLERS.getName(scriptVariant) - .equalsIgnoreCase(regionName)) + if (!isFormHeaderHandlerRegion(regionName, scriptVariant)) { addIssueShouldBeInRegion(result, methodName, - ModuleStructureSection.FORM_HEADER_ITEMS_EVENT_HANDLERS.getName(scriptVariant), method); + ModuleStructureSection.FORM_HEADER_ITEMS_EVENT_HANDLERS.getName(scriptVariant)); } } - private void addIssueShouldBeInRegion(ResultAcceptor result, String methodName, String defaultRegionName, - EObject method) + private void addIssueShouldBeInRegion(ResultAcceptor result, String methodName, String defaultRegionName) { result.addIssue(MessageFormat.format( Messages.ModuleStructureEventFormRegionsCheck_Event_method__0__should_be_placed_in_the_region__1, - methodName, defaultRegionName), method, NAMED_ELEMENT__NAME); + methodName, defaultRegionName), McorePackage.Literals.NAMED_ELEMENT__NAME); } - private void addIssueShouldNotBeInRegion(ResultAcceptor result, String methodName, String regionName, - EObject method) + private void addIssueShouldNotBeInRegion(ResultAcceptor result, String methodName, String regionName) { result.addIssue(MessageFormat.format( Messages.ModuleStructureEventFormRegionsCheck_Event_method__0__can_not_be_placed_in_the_region__1, - methodName, regionName), method, NAMED_ELEMENT__NAME); + methodName, regionName), McorePackage.Literals.NAMED_ELEMENT__NAME); + } + + private boolean isCommandHandlerRegion(String regionName, ScriptVariant scriptVariant) + { + return ModuleStructureSection.FORM_COMMAND_EVENT_HANDLERS.getName(scriptVariant).equalsIgnoreCase(regionName); + } + + private boolean isTableHandlerRegion(ScriptVariant scriptVariant, String regionName, String tableName) + { + return (ModuleStructureSection.FORM_TABLE_ITEMS_EVENT_HANDLERS.getName(scriptVariant) + tableName) + .equalsIgnoreCase(regionName); + } + + private boolean isFormHeaderHandlerRegion(String regionName, ScriptVariant scriptVariant) + { + return ModuleStructureSection.FORM_HEADER_ITEMS_EVENT_HANDLERS.getName(scriptVariant) + .equalsIgnoreCase(regionName); + } + + private boolean isFormHandlerRegion(String regionName, ScriptVariant scriptVariant) + { + return ModuleStructureSection.FORM_EVENT_HANDLERS.getName(scriptVariant).equalsIgnoreCase(regionName); } private boolean isEventHandlerRegion(ScriptVariant scriptVariant, String regionName) @@ -307,4 +322,5 @@ public class ModuleStructureEventFormRegionsCheck { return StringUtils.isNotEmpty(excludeNamePattern) && name.matches(excludeNamePattern); } + } From 014a60541ee1a5672958a82c6988f6dbc4f7a7eb Mon Sep 17 00:00:00 2001 From: Ivan Sergeev <55486074+alonthedark@users.noreply.github.com> Date: Fri, 21 Nov 2025 10:51:52 +0400 Subject: [PATCH 10/11] fix self-assign.md --- bundles/com.e1c.v8codestyle.bsl/markdown/self-assign.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/bundles/com.e1c.v8codestyle.bsl/markdown/self-assign.md b/bundles/com.e1c.v8codestyle.bsl/markdown/self-assign.md index efec0034..2bd4e02a 100644 --- a/bundles/com.e1c.v8codestyle.bsl/markdown/self-assign.md +++ b/bundles/com.e1c.v8codestyle.bsl/markdown/self-assign.md @@ -4,8 +4,6 @@ Assigning a variable to itself is meaningless and usually indicates an error. ## Noncompliant Code Example -Например, неправильно: - P1 = ""; P1 = P1; From d96d82575ca084fdcb9a1d87ba76c933af01b831 Mon Sep 17 00:00:00 2001 From: Ivan Sergeev <55486074+alonthedark@users.noreply.github.com> Date: Fri, 21 Nov 2025 10:53:00 +0400 Subject: [PATCH 11/11] Update not-support-goto-operator-webclient.md --- .../markdown/ru/not-support-goto-operator-webclient.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/bundles/com.e1c.v8codestyle.bsl/markdown/ru/not-support-goto-operator-webclient.md b/bundles/com.e1c.v8codestyle.bsl/markdown/ru/not-support-goto-operator-webclient.md index 3ae891b2..183a20e7 100644 --- a/bundles/com.e1c.v8codestyle.bsl/markdown/ru/not-support-goto-operator-webclient.md +++ b/bundles/com.e1c.v8codestyle.bsl/markdown/ru/not-support-goto-operator-webclient.md @@ -4,6 +4,9 @@ данного оператора приводит к получению запутанных, плохо структурированных модулей, по тексту которых затруднительно понять порядок исполнения и взаимозависимость фрагментов. Вместо оператора Перейти рекомендуется использовать другие конструкции встроенного языка. +Запрещается использовать оператор Перейти в общих модулях с признаком +"Клиент (управляемое приложение)", модулях команд и в клиентском коде модулей управляемых форм, так как данный метод +не поддерживается платформой 1С:Предприятие в режиме веб-клиента. ## Неправильно @@ -27,4 +30,4 @@ ## См. -- [Ограничение на использование оператора Перейти](https://its.1c.ru/db/v8std#content:547:hdoc:2) \ No newline at end of file +- [Ограничение на использование оператора Перейти](https://its.1c.ru/db/v8std#content:547:hdoc:2)