diff --git a/CHANGELOG.md b/CHANGELOG.md index 16dc3e58..f76ec5c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ #### Код модулей - Добавление типизированного значения в не типизированную коллекцию +- Использование экспортных переменных в модулях объекта - Использование конструкции "Новый Шрифт" - Проверка наличия префикса расширения в имени переменной расширения - Проверка наличия префикса расширения в методе расширения. diff --git a/bundles/com.e1c.v8codestyle.bsl/markdown/object-module-export-variable.md b/bundles/com.e1c.v8codestyle.bsl/markdown/object-module-export-variable.md new file mode 100644 index 00000000..90b47187 --- /dev/null +++ b/bundles/com.e1c.v8codestyle.bsl/markdown/object-module-export-variable.md @@ -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 + diff --git a/bundles/com.e1c.v8codestyle.bsl/markdown/ru/object-module-export-variable.md b/bundles/com.e1c.v8codestyle.bsl/markdown/ru/object-module-export-variable.md new file mode 100644 index 00000000..3115cd83 --- /dev/null +++ b/bundles/com.e1c.v8codestyle.bsl/markdown/ru/object-module-export-variable.md @@ -0,0 +1,46 @@ +# Использование переменных в программных модулях + +В большинстве случаев, вместо переменных программных модулей следует использовать более подходящие средства разработки платформы 1С:Предприятие. +Поскольку область видимости (использования) таких переменных сложно контролировать, +то они зачастую становятся источником трудновоспроизводимых ошибок. + +## Неправильно + +```bsl + +Перем КонвертацияФайлов Экспорт; + +Процедура ПередЗаписью(Отказ) + + Если КонвертацияФайлов Тогда + ... + +КонецПроцедуры + +// вызывающий код +ФайлОбъект.КонвертацияФайлов = Истина; +ФайлОбъект.Записать(); + +``` + +## Правильно + +```bsl + +Процедура ПередЗаписью(Отказ) + + Если ДополнительныеСвойства.Свойство("КонвертацияФайлов") Тогда + ... + +КонецПроцедуры + +// вызывающий код +ФайлОбъект.ДополнительныеСвойства.Вставить("КонвертацияФайлов", Истина); +ФайлОбъект.Записать(); + +``` + +## См. + +- [Использование переменных в программных модулях](https://its.1c.ru/db/v8std/content/639/hdoc) + diff --git a/bundles/com.e1c.v8codestyle.bsl/plugin.xml b/bundles/com.e1c.v8codestyle.bsl/plugin.xml index 742f6438..9441a80d 100644 --- a/bundles/com.e1c.v8codestyle.bsl/plugin.xml +++ b/bundles/com.e1c.v8codestyle.bsl/plugin.xml @@ -311,6 +311,10 @@ category="com.e1c.v8codestyle.bsl" class="com.e1c.v8codestyle.internal.bsl.ExecutableExtensionFactory:com.e1c.v8codestyle.bsl.check.ModuleStructureVariablesInRegionCheck"> + + diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/ExportVariableInObjectModuleCheck.java b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/ExportVariableInObjectModuleCheck.java new file mode 100644 index 00000000..4f0e6d21 --- /dev/null +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/ExportVariableInObjectModuleCheck.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; + +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); + } + } + } + } +} 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 bbd19616..5e4e2db3 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 @@ -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; 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 8295932c..cd566c44 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 @@ -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 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 b82e180a..bb2206be 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 @@ -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=Переменная расширения должна содержать в имени префикс расширения diff --git a/tests/com.e1c.v8codestyle.bsl.itests/resources/object-module-export-variable.bsl b/tests/com.e1c.v8codestyle.bsl.itests/resources/object-module-export-variable.bsl new file mode 100644 index 00000000..ca0ed007 --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/resources/object-module-export-variable.bsl @@ -0,0 +1,7 @@ +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +Перем А Экспорт; + +#Иначе +ВызватьИсключение НСтр("ru = 'Недопустимый вызов объекта на клиенте.'"); +#КонецЕсли \ No newline at end of file diff --git a/tests/com.e1c.v8codestyle.bsl.itests/src/com/e1c/v8codestyle/bsl/check/itests/ExportVariableInObjectModuleCheckTest.java b/tests/com.e1c.v8codestyle.bsl.itests/src/com/e1c/v8codestyle/bsl/check/itests/ExportVariableInObjectModuleCheckTest.java new file mode 100644 index 00000000..ef28c031 --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/src/com/e1c/v8codestyle/bsl/check/itests/ExportVariableInObjectModuleCheckTest.java @@ -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 markers = getModuleMarkers(); + assertEquals(1, markers.size()); + + assertEquals("3", markers.get(0).getExtraInfo().get(IExtraInfoKeys.TEXT_EXTRA_INFO_LINE_KEY)); + } +}