1
0
mirror of https://github.com/1C-Company/v8-code-style.git synced 2025-12-03 17:26:16 +02:00

#1200 Рекомендуется использовать РеквизитФормыВЗначение (#1201)

This commit is contained in:
Artem Iliukhin
2023-03-20 01:34:33 -07:00
committed by GitHub
parent 08216f15bd
commit 58aa9a9031
10 changed files with 232 additions and 0 deletions

View File

@@ -20,6 +20,7 @@
#### Код модулей
- Проверка использования метода ДанныеФормыВЗначение вместо РеквизитФормыВЗначение
- В проверку использования нерекомендуемых методов (use-non-recommended-method) добавлен метод ПолучитьФорму(GetForm)
- Использование устаревшего метода Найти
- Отсутствует комментарий к экспортной процедуре (функции)

View File

@@ -0,0 +1,27 @@
# Использование РеквизитФормыВЗначение и ДанныеФормыВЗначение
В большинстве случаев в модулях форм следует использовать метод формы РеквизитФормыВЗначение вместо метода ДанныеФормыВЗначение.
Рекомендация обусловлена соображениями унификации прикладного кода и тем, что синтаксис метода РеквизитФормыВЗначение проще,
чем у ДанныеФормыВЗначение (а следовательно, меньше вероятность ошибки).
В ДанныеФормыВЗначение необходимо дополнительно передавать тип значения, а для РеквизитФормыВЗначение это не обязательно,
а в практическом плане - избыточно.
Наличие в платформе 1С:Предприятие метода формы РеквизитФормыВЗначение (наряду с методом глобального контекста ДанныеФормыВЗначение)
объясняется только удобством его применения. С точки зрения эффективности и результата методы работают одинаково.
## Неправильно
```bsl
ТаблицаПодписей = ДанныеФормыВЗначение(ТаблицаПодписей, Тип("ТаблицаЗначений"));
```
## Правильно
```bsl
ТаблицаПодписей = РеквизитФормыВЗначение("ТаблицаПодписей");
```
## См.
- [Использование РеквизитФормыВЗначение и ДанныеФормыВЗначение](https://its.1c.ru/db/v8std#content:409:hdoc)

View File

@@ -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)

View File

@@ -347,6 +347,10 @@
category="com.e1c.v8codestyle.bsl"
class="com.e1c.v8codestyle.internal.bsl.ExecutableExtensionFactory:com.e1c.v8codestyle.bsl.check.DeprecatedProcedureOutsideDeprecatedRegionCheck">
</check>
<check
category="com.e1c.v8codestyle.bsl"
class="com.e1c.v8codestyle.bsl.check.UsingFormDataToValueCheck">
</check>
<check
category="com.e1c.v8codestyle.bsl"
class="com.e1c.v8codestyle.internal.bsl.ExecutableExtensionFactory:com.e1c.v8codestyle.bsl.check.ExportProcedureMissingCommentCheck">

View File

@@ -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;

View File

@@ -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);
}
}
}

View File

@@ -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

View File

@@ -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 = Всегда использовать директивы компиляции в модуле формы

View File

@@ -0,0 +1,3 @@
Procedure NonCompliant()
SignaturesTable = FormDataToValue(SignaturesTable, Type("ValueTable"));
EndProcedure

View File

@@ -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));
}
}