1
0
mirror of https://github.com/1C-Company/v8-code-style.git synced 2024-11-28 09:33:06 +02:00

#1178 Использование экспортных переменных в модулях объектов (#1179)

Использование таких переменных сложно контролировать
This commit is contained in:
Artem Iliukhin 2022-10-27 17:11:23 +03:00 committed by GitHub
parent 8afbb3dc09
commit a51e9bb6bb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 265 additions and 0 deletions

View File

@ -18,6 +18,7 @@
#### Код модулей
- Добавление типизированного значения в не типизированную коллекцию
- Использование экспортных переменных в модулях объекта
- Использование конструкции "Новый Шрифт"
- Проверка наличия префикса расширения в имени переменной расширения
- Проверка наличия префикса расширения в методе расширения.

View File

@ -0,0 +1,43 @@
# Using export variables in modules
In most cases, instead of variable program modules, more appropriate development tools of the 1C:Enterprise platform should be used.
Since the scope (use) of such variables is difficult to control, they often become a source of hard-to-reproduce errors.
## Noncompliant Code Example
```bsl
Var ConvertFiles Export;
Procedure BeforeWrite(Cancel)
If FileConversion Then
...
EndProcedure
// calling code
FileObject.FileConversion = True;
FileObject.Write();
```
## Compliant Solution
```bsl
Procedure BeforeWrite(Cancel)
If AdditionalProperties.Property("FileConversion") Then
...
EndProcedure
// calling code
FileObject.AdditionalProperties.Insert("FileConversion", True);
FileObject.Write();
```
## See

View File

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

View File

@ -311,6 +311,10 @@
category="com.e1c.v8codestyle.bsl"
class="com.e1c.v8codestyle.internal.bsl.ExecutableExtensionFactory:com.e1c.v8codestyle.bsl.check.ModuleStructureVariablesInRegionCheck">
</check>
<check
category="com.e1c.v8codestyle.bsl"
class="com.e1c.v8codestyle.bsl.check.ExportVariableInObjectModuleCheck">
</check>
<check
category="com.e1c.v8codestyle.bsl"
class="com.e1c.v8codestyle.bsl.check.NewFontCheck">

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;
import static com._1c.g5.v8.dt.bsl.model.BslPackage.Literals.MODULE;
import org.eclipse.core.runtime.IProgressMonitor;
import com._1c.g5.v8.dt.bsl.model.BslPackage;
import com._1c.g5.v8.dt.bsl.model.DeclareStatement;
import com._1c.g5.v8.dt.bsl.model.ExplicitVariable;
import com._1c.g5.v8.dt.bsl.model.Module;
import com._1c.g5.v8.dt.bsl.model.ModuleType;
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;
/**
* Checks a variable was found in the object module.
*
* @author Artem Iliukhin
*/
public class ExportVariableInObjectModuleCheck
extends BasicCheck
{
private static final String CHECK_ID = "object-module-export-variable"; //$NON-NLS-1$
@Override
public String getCheckId()
{
return CHECK_ID;
}
@Override
protected void configureCheck(CheckConfigurer builder)
{
builder.title(Messages.ExportVariableInObjectModuleCheck_Title)
.description(Messages.ExportVariableInObjectModuleCheck_Description)
.complexity(CheckComplexity.NORMAL)
.severity(IssueSeverity.MINOR)
.issueType(IssueType.WARNING)
.extension(new StandardCheckExtension(639, getCheckId(), BslPlugin.PLUGIN_ID))
.extension(ModuleTypeFilter.onlyTypes(ModuleType.OBJECT_MODULE))
.module()
.checkedObjectType(MODULE);
}
@Override
protected void check(Object object, ResultAcceptor resultAceptor, ICheckParameters parameters,
IProgressMonitor monitor)
{
Module module = (Module)object;
for (DeclareStatement ds : module.allDeclareStatements())
{
for (ExplicitVariable expliciteVar : ds.getVariables())
{
if (expliciteVar.isExport())
{
resultAceptor.addIssue(Messages.ExportVariableInObjectModuleCheck_Issue, expliciteVar,
BslPackage.Literals.EXPLICIT_VARIABLE__EXPORT);
}
}
}
}
}

View File

@ -140,6 +140,12 @@ final class Messages
public static String ExportMethodInCommandModule_Do_not_use_export_method_in_commands_module;
public static String ExportVariableInObjectModuleCheck_Description;
public static String ExportVariableInObjectModuleCheck_Issue;
public static String ExportVariableInObjectModuleCheck_Title;
public static String ExtensionVariablePrefixCheck_Description;
public static String ExtensionVariablePrefixCheck_Title;

View File

@ -137,6 +137,12 @@ ExportMethodInCommandModule_Do_not_emded_export_method_in_modules_of_command_res
ExportMethodInCommandModule_Do_not_use_export_method_in_commands_module=Restrictions on the use of export procedures and functions
ExportVariableInObjectModuleCheck_Description=Use of an export variable is not recommended
ExportVariableInObjectModuleCheck_Issue=It's not recommended to use the export variable in the object module
ExportVariableInObjectModuleCheck_Title=Use of an export variable is not recommended
ExtensionVariablePrefixCheck_Description=The variable in the module of the extension object does not have a prefix corresponding to the prefix of the extension itself
ExtensionVariablePrefixCheck_Title=Extension variable does not have extension prefix

View File

@ -146,6 +146,12 @@ ExportMethodInCommandModule_Do_not_emded_export_method_in_modules_of_command_res
ExportMethodInCommandModule_Do_not_use_export_method_in_commands_module=Ограничения на использование экспортных процедур и функций
ExportVariableInObjectModuleCheck_Description=Использование экспортной переменной не рекомендовано
ExportVariableInObjectModuleCheck_Issue=Не рекомендуется использовать экспортную переменную в модуле объекта
ExportVariableInObjectModuleCheck_Title=Использование экспортной переменной не рекомендовано
ExtensionVariablePrefixCheck_Description=Переменная модуля расширения должна в имени содержать префикс расширения
ExtensionVariablePrefixCheck_Title=Переменная расширения должна содержать в имени префикс расширения

View File

@ -0,0 +1,7 @@
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
Перем А Экспорт;
#Иначе
ВызватьИсключение НСтр("ru = 'Недопустимый вызов объекта на клиенте.'");
#КонецЕсли

View File

@ -0,0 +1,65 @@
/*******************************************************************************
* 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 java.util.List;
import org.junit.Test;
import com._1c.g5.v8.dt.validation.marker.IExtraInfoKeys;
import com._1c.g5.v8.dt.validation.marker.Marker;
import com.e1c.v8codestyle.bsl.check.ExportVariableInObjectModuleCheck;
/**
* Tests for {@link ExportVariableInObjectModuleCheck} check.
*
* @author Artem Iliukhin
*/
public class ExportVariableInObjectModuleCheckTest
extends AbstractSingleModuleTestBase
{
private static final String PROJECT_NAME = "CatalogModules";
private static final String MODULE_FILE_NAME = "/src/Catalogs/TestCatalog/ObjectModule.bsl";
public ExportVariableInObjectModuleCheckTest()
{
super(ExportVariableInObjectModuleCheck.class);
}
@Override
protected String getTestConfigurationName()
{
return PROJECT_NAME;
}
@Override
protected String getModuleFileName()
{
return MODULE_FILE_NAME;
}
@Test
public void testExportVariable() throws Exception
{
updateModule(FOLDER_RESOURCE + "object-module-export-variable.bsl");
List<Marker> markers = getModuleMarkers();
assertEquals(1, markers.size());
assertEquals("3", markers.get(0).getExtraInfo().get(IExtraInfoKeys.TEXT_EXTRA_INFO_LINE_KEY));
}
}