mirror of
https://github.com/1C-Company/v8-code-style.git
synced 2024-11-28 09:33:06 +02:00
Использование таких переменных сложно контролировать
This commit is contained in:
parent
8afbb3dc09
commit
a51e9bb6bb
@ -18,6 +18,7 @@
|
||||
#### Код модулей
|
||||
|
||||
- Добавление типизированного значения в не типизированную коллекцию
|
||||
- Использование экспортных переменных в модулях объекта
|
||||
- Использование конструкции "Новый Шрифт"
|
||||
- Проверка наличия префикса расширения в имени переменной расширения
|
||||
- Проверка наличия префикса расширения в методе расширения.
|
||||
|
@ -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
|
||||
|
@ -0,0 +1,46 @@
|
||||
# Использование переменных в программных модулях
|
||||
|
||||
В большинстве случаев, вместо переменных программных модулей следует использовать более подходящие средства разработки платформы 1С:Предприятие.
|
||||
Поскольку область видимости (использования) таких переменных сложно контролировать,
|
||||
то они зачастую становятся источником трудновоспроизводимых ошибок.
|
||||
|
||||
## Неправильно
|
||||
|
||||
```bsl
|
||||
|
||||
Перем КонвертацияФайлов Экспорт;
|
||||
|
||||
Процедура ПередЗаписью(Отказ)
|
||||
|
||||
Если КонвертацияФайлов Тогда
|
||||
...
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
// вызывающий код
|
||||
ФайлОбъект.КонвертацияФайлов = Истина;
|
||||
ФайлОбъект.Записать();
|
||||
|
||||
```
|
||||
|
||||
## Правильно
|
||||
|
||||
```bsl
|
||||
|
||||
Процедура ПередЗаписью(Отказ)
|
||||
|
||||
Если ДополнительныеСвойства.Свойство("КонвертацияФайлов") Тогда
|
||||
...
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
// вызывающий код
|
||||
ФайлОбъект.ДополнительныеСвойства.Вставить("КонвертацияФайлов", Истина);
|
||||
ФайлОбъект.Записать();
|
||||
|
||||
```
|
||||
|
||||
## См.
|
||||
|
||||
- [Использование переменных в программных модулях](https://its.1c.ru/db/v8std/content/639/hdoc)
|
||||
|
@ -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">
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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=Переменная расширения должна содержать в имени префикс расширения
|
||||
|
@ -0,0 +1,7 @@
|
||||
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
|
||||
|
||||
Перем А Экспорт;
|
||||
|
||||
#Иначе
|
||||
ВызватьИсключение НСтр("ru = 'Недопустимый вызов объекта на клиенте.'");
|
||||
#КонецЕсли
|
@ -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));
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user