From 58aa9a90310bc14dec0055df0968c0c8caad7242 Mon Sep 17 00:00:00 2001 From: Artem Iliukhin <20300020+iArtemv@users.noreply.github.com> Date: Mon, 20 Mar 2023 01:34:33 -0700 Subject: [PATCH] =?UTF-8?q?#1200=20=D0=A0=D0=B5=D0=BA=D0=BE=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=B4=D1=83=D0=B5=D1=82=D1=81=D1=8F=20=D0=B8=D1=81=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20=D0=A0?= =?UTF-8?q?=D0=B5=D0=BA=D0=B2=D0=B8=D0=B7=D0=B8=D1=82=D0=A4=D0=BE=D1=80?= =?UTF-8?q?=D0=BC=D1=8B=D0=92=D0=97=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20(#1201)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + .../markdown/ru/using-form-data-to-value.md | 27 +++++++ .../markdown/using-form-data-to-value.md | 27 +++++++ bundles/com.e1c.v8codestyle.bsl/plugin.xml | 4 + .../e1c/v8codestyle/bsl/check/Messages.java | 6 ++ .../bsl/check/UsingFormDataToValueCheck.java | 71 ++++++++++++++++ .../v8codestyle/bsl/check/messages.properties | 6 ++ .../bsl/check/messages_ru.properties | 6 ++ .../resources/using-form-data-to-value.bsl | 3 + .../itests/UsingFormDataToValueCheckTest.java | 81 +++++++++++++++++++ 10 files changed, 232 insertions(+) create mode 100644 bundles/com.e1c.v8codestyle.bsl/markdown/ru/using-form-data-to-value.md create mode 100644 bundles/com.e1c.v8codestyle.bsl/markdown/using-form-data-to-value.md create mode 100644 bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/UsingFormDataToValueCheck.java create mode 100644 tests/com.e1c.v8codestyle.bsl.itests/resources/using-form-data-to-value.bsl create mode 100644 tests/com.e1c.v8codestyle.bsl.itests/src/com/e1c/v8codestyle/bsl/check/itests/UsingFormDataToValueCheckTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 0831c8c2..a4a75f75 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ #### Код модулей +- Проверка использования метода ДанныеФормыВЗначение вместо РеквизитФормыВЗначение - В проверку использования нерекомендуемых методов (use-non-recommended-method) добавлен метод ПолучитьФорму(GetForm) - Использование устаревшего метода Найти - Отсутствует комментарий к экспортной процедуре (функции) diff --git a/bundles/com.e1c.v8codestyle.bsl/markdown/ru/using-form-data-to-value.md b/bundles/com.e1c.v8codestyle.bsl/markdown/ru/using-form-data-to-value.md new file mode 100644 index 00000000..d10c7d1c --- /dev/null +++ b/bundles/com.e1c.v8codestyle.bsl/markdown/ru/using-form-data-to-value.md @@ -0,0 +1,27 @@ +# Использование РеквизитФормыВЗначение и ДанныеФормыВЗначение + +В большинстве случаев в модулях форм следует использовать метод формы РеквизитФормыВЗначение вместо метода ДанныеФормыВЗначение. + +Рекомендация обусловлена соображениями унификации прикладного кода и тем, что синтаксис метода РеквизитФормыВЗначение проще, +чем у ДанныеФормыВЗначение (а следовательно, меньше вероятность ошибки). +В ДанныеФормыВЗначение необходимо дополнительно передавать тип значения, а для РеквизитФормыВЗначение это не обязательно, +а в практическом плане - избыточно. + +Наличие в платформе 1С:Предприятие метода формы РеквизитФормыВЗначение (наряду с методом глобального контекста ДанныеФормыВЗначение) +объясняется только удобством его применения. С точки зрения эффективности и результата методы работают одинаково. + +## Неправильно + +```bsl +ТаблицаПодписей = ДанныеФормыВЗначение(ТаблицаПодписей, Тип("ТаблицаЗначений")); +``` + +## Правильно + +```bsl +ТаблицаПодписей = РеквизитФормыВЗначение("ТаблицаПодписей"); +``` + +## См. + +- [Использование РеквизитФормыВЗначение и ДанныеФормыВЗначение](https://its.1c.ru/db/v8std#content:409:hdoc) diff --git a/bundles/com.e1c.v8codestyle.bsl/markdown/using-form-data-to-value.md b/bundles/com.e1c.v8codestyle.bsl/markdown/using-form-data-to-value.md new file mode 100644 index 00000000..135c0783 --- /dev/null +++ b/bundles/com.e1c.v8codestyle.bsl/markdown/using-form-data-to-value.md @@ -0,0 +1,27 @@ +# Using FormAttributeToValue and FormDataToValue + +In most cases, FormAttributeToValue is preferable to FormDataToValue. + +Sticking to this recommendation will help you to keep the code consistent with other 1C:Enterprise applications. Also, +FormAttributeToValue has simpler syntax, that is, less chance to make a code mistake. +FormDataToValue requires the data type to be specified explicitly. + +In contrast, FormAttributeToValue doesn't require data type to be specified. + +1C:Enterprise supports both the FormAttributeToValue and FormDataToValue methods, +but the last-mentioned is considered more usable. In terms of efficiency and output, the methods are equal. + +## Noncompliant Code Example + +```bsl +SignaturesTable = FormDataToValue(SignaturesTable, Type("ValueTable")); +``` + +## Compliant Solution + +```bsl +SignaturesTable = FormAttributeToValue("SignaturesTable"); +``` + +## See +[Using FormAttributeToValue and FormDataToValue](https://kb.1ci.com/1C_Enterprise_Platform/Guides/Developer_Guides/1C_Enterprise_Development_Standards/Code_conventions/Using_applied_objects_and_universal_value_collections/Using_FormAttributeToValue_and_FormDataToValue) diff --git a/bundles/com.e1c.v8codestyle.bsl/plugin.xml b/bundles/com.e1c.v8codestyle.bsl/plugin.xml index 82234e66..0a72b6df 100644 --- a/bundles/com.e1c.v8codestyle.bsl/plugin.xml +++ b/bundles/com.e1c.v8codestyle.bsl/plugin.xml @@ -347,6 +347,10 @@ category="com.e1c.v8codestyle.bsl" class="com.e1c.v8codestyle.internal.bsl.ExecutableExtensionFactory:com.e1c.v8codestyle.bsl.check.DeprecatedProcedureOutsideDeprecatedRegionCheck"> + + 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 b78de021..19c53c85 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 @@ -372,6 +372,12 @@ final class Messages public static String MissingTemporaryFileDeletionCheck_title; + public static String FormDataToValueCheck_Description; + + public static String FormDataToValueCheck_Issue; + + public static String FormDataToValueCheck_Title; + public static String FormModulePragmaCheck_description; public static String FormModulePragmaCheck_Form_module_compilation_pragma_used; diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/UsingFormDataToValueCheck.java b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/UsingFormDataToValueCheck.java new file mode 100644 index 00000000..0ed1dafa --- /dev/null +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/UsingFormDataToValueCheck.java @@ -0,0 +1,71 @@ +/******************************************************************************* + * 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 + * 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.STATIC_FEATURE_ACCESS; + +import org.eclipse.core.runtime.IProgressMonitor; + +import com._1c.g5.v8.dt.bsl.model.StaticFeatureAccess; +import com.e1c.g5.v8.dt.check.CheckComplexity; +import com.e1c.g5.v8.dt.check.ICheckParameters; +import com.e1c.g5.v8.dt.check.components.BasicCheck; +import com.e1c.g5.v8.dt.check.settings.IssueSeverity; +import com.e1c.g5.v8.dt.check.settings.IssueType; +import com.e1c.v8codestyle.check.StandardCheckExtension; +import com.e1c.v8codestyle.internal.bsl.BslPlugin; + +/** + * Checking the use of the FormDataToValue method that is not recommended. + * + * @author Artem Iliukhin + */ +public class UsingFormDataToValueCheck + extends BasicCheck +{ + + private static final String CHECK_ID = "using-form-data-to-value"; //$NON-NLS-1$ + private static final String NAME = "FormDataToValue"; //$NON-NLS-1$ + private static final String NAME_RU = "ДанныеФормыВЗначение"; //$NON-NLS-1$ + + @Override + public String getCheckId() + { + return CHECK_ID; + } + + @Override + protected void configureCheck(CheckConfigurer builder) + { + builder.title(Messages.FormDataToValueCheck_Title) + .description(Messages.FormDataToValueCheck_Description) + .complexity(CheckComplexity.NORMAL) + .severity(IssueSeverity.TRIVIAL) + .issueType(IssueType.CODE_STYLE) + .extension(new StandardCheckExtension(409, getCheckId(), BslPlugin.PLUGIN_ID)) + .module() + .checkedObjectType(STATIC_FEATURE_ACCESS); + } + + @Override + protected void check(Object object, ResultAcceptor resultAceptor, ICheckParameters parameters, + IProgressMonitor monitor) + { + StaticFeatureAccess featureAccess = (StaticFeatureAccess)object; + String name = featureAccess.getName(); + if (NAME.equalsIgnoreCase(name) || NAME_RU.equalsIgnoreCase(name)) + { + resultAceptor.addIssue(Messages.FormDataToValueCheck_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 61eaef42..af5d4598 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 @@ -170,6 +170,12 @@ ExtensionVariablePrefixCheck_Title = Extension variable does not have extension ExtensionVariablePrefixCheck_Variable_0_should_have_1_prefix = The variable "{0}" should have "{1}" prefix +FormDataToValueCheck_Description = Using FormDataToValue instead FormAttributeToValue + +FormDataToValueCheck_Issue = Use FormAttributeToValue instead FormDataToValue + +FormDataToValueCheck_Title = Using FormDataToValue instead FormAttributeToValue + FormModuleMissingPragmaCheck_Missing_compilation_directives = Missing compilation directives FormModuleMissingPragmaCheck_description = Always use compilation pragma in form module 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 2f109120..893af48b 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 @@ -170,6 +170,12 @@ ExportProcedureMissingCommentCheck_title=Отсутствует коммента ExtensionVariablePrefixCheck_Variable_0_should_have_1_prefix = Переменная "{0}" должна иметь префикс "{1}" +FormDataToValueCheck_Description = Использование ДанныеФормыВЗначение вместо РеквизитФормыВЗначение + +FormDataToValueCheck_Issue = Рекомендуется использовать РеквизитФормыВЗначение вместо ДанныеФормыВЗначение + +FormDataToValueCheck_Title = Использование ДанныеФормыВЗначение вместо РеквизитФормыВЗначение + FormModuleMissingPragmaCheck_Missing_compilation_directives = Пропущена директива компиляции FormModuleMissingPragmaCheck_description = Всегда использовать директивы компиляции в модуле формы diff --git a/tests/com.e1c.v8codestyle.bsl.itests/resources/using-form-data-to-value.bsl b/tests/com.e1c.v8codestyle.bsl.itests/resources/using-form-data-to-value.bsl new file mode 100644 index 00000000..193897d9 --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/resources/using-form-data-to-value.bsl @@ -0,0 +1,3 @@ +Procedure NonCompliant() + SignaturesTable = FormDataToValue(SignaturesTable, Type("ValueTable")); +EndProcedure diff --git a/tests/com.e1c.v8codestyle.bsl.itests/src/com/e1c/v8codestyle/bsl/check/itests/UsingFormDataToValueCheckTest.java b/tests/com.e1c.v8codestyle.bsl.itests/src/com/e1c/v8codestyle/bsl/check/itests/UsingFormDataToValueCheckTest.java new file mode 100644 index 00000000..44ad9f46 --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/src/com/e1c/v8codestyle/bsl/check/itests/UsingFormDataToValueCheckTest.java @@ -0,0 +1,81 @@ +/******************************************************************************* + * 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 + * 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.assertNotNull; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +import com._1c.g5.v8.bm.core.IBmObject; +import com._1c.g5.v8.dt.bsl.model.Module; +import com._1c.g5.v8.dt.metadata.mdclass.AbstractForm; +import com._1c.g5.v8.dt.validation.marker.IExtraInfoKeys; +import com._1c.g5.v8.dt.validation.marker.Marker; +import com.e1c.v8codestyle.bsl.check.UsingFormDataToValueCheck; + +/** + * The test for {@link UsingFormDataToValueCheck} check. + * + * @author Artem Iliukhin + */ +public class UsingFormDataToValueCheckTest + extends AbstractSingleModuleTestBase +{ + private static final String PROJECT_NAME = "CommonForm"; + + private static final String FQN = "CommonForm.Form.Form"; + + private static final String COMMON_FORM_FILE_NAME = "/src/CommonForms/Form/Module.bsl"; + + /** + * Instantiates a new form data to value check test. + */ + public UsingFormDataToValueCheckTest() + { + super(UsingFormDataToValueCheck.class); + } + + @Override + protected String getTestConfigurationName() + { + return PROJECT_NAME; + } + + @Override + protected String getModuleFileName() + { + return COMMON_FORM_FILE_NAME; + } + + @Override + protected Module getModule() + { + IBmObject mdObject = getTopObjectByFqn(FQN, getProject()); + assertTrue(mdObject instanceof AbstractForm); + Module module = ((AbstractForm)mdObject).getModule(); + assertNotNull(module); + + return module; + } + + @Test + public void testFormModuleHasPragma() throws Exception + { + updateModule(FOLDER_RESOURCE + "using-form-data-to-value.bsl"); + + Marker marker = getModuleFirstMarker(); + assertEquals("2", marker.getExtraInfo().get(IExtraInfoKeys.TEXT_EXTRA_INFO_LINE_KEY)); + } +}