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