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

Для проверки экспортных методов добавлены доп параметры

This commit is contained in:
Artem Iliukhin 2022-02-14 18:41:31 +03:00
parent 2e4dcb0011
commit 7b970c41fc
8 changed files with 115 additions and 11 deletions

View File

@ -1,7 +1,12 @@
# Restrictions on the use of export procedures and functions in a command and form modules
Do not embed export procedures and functions in modules of commands and forms.
You cannot address such modules from external code, so embedded export procedures and functions become dysfunctional.
Do not place export procedures and functions in command and form modules.
To implement export procedures and functions, it is recommended that you use object modules, object manager modules, or
common modules.
Recommended once a form is opened, don't address form methods and properties.
An exception to this rule are export procedures that handle notifications (NotifyDescription.ProcedureName).
## Noncompliant Code Example
@ -22,3 +27,5 @@ EndProcedure
## See
- [Restrictions on the use of export procedures and functions](https://support.1ci.com/hc/en-us/articles/360011002940-Restrictions-on-the-use-of-export-procedures-and-functions)
- [Rules for creating form modules](https://support.1ci.com/hc/en-us/articles/360011003920-Rules-for-creating-form-modules)
- [Opening forms](https://support.1ci.com/hc/en-us/articles/360011003960-Opening-forms)

View File

@ -1,9 +1,12 @@
# Ограничения на использование экспортных процедур и функций в модуле команд и форм
Не следует размещать экспортные процедуры и функции в модулях команд и
форм. К этим модулям нет возможности обращаться из внешнего по
отношению к ним кода, поэтому экспортные процедуры и функции в этих
модулях не имеют смысла.
Не следует размещать экспортные процедуры и функции в модулях команд и форм.
Для реализации экспортных процедур и функций рекомендуется использовать модули объектов, модули менеджеров объектов или
общие модули.
Так же, рекомендуется избегать обращения к методам и свойствам формы после ее открытия.
Исключения из этого правила составляют экспортные процедуры-обработчики оповещений (ОписаниеОповещения.ИмяПроцедуры).
## Неправильно
@ -23,3 +26,5 @@
## См.
- [Ограничения на использование экспортных процедур и функций](https://its.1c.ru/db/v8std#content:544:hdoc)
- [Правила создания модулей форм](https://its.1c.ru/db/v8std#content:630:hdoc)
- [Открытие форм](https://its.1c.ru/db/v8std#content:404:hdoc)

View File

@ -233,7 +233,7 @@
</check>
<check
category="com.e1c.v8codestyle.bsl"
class="com.e1c.v8codestyle.bsl.check.ExportMethodInCommandFormModuleCheck">
class="com.e1c.v8codestyle.internal.bsl.ExecutableExtensionFactory:com.e1c.v8codestyle.bsl.check.ExportMethodInCommandFormModuleCheck">
</check>
<check
category="com.e1c.v8codestyle.bsl"

View File

@ -14,14 +14,18 @@ package com.e1c.v8codestyle.bsl.check;
import static com._1c.g5.v8.dt.bsl.model.BslPackage.Literals.MODULE;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.EcoreUtil2;
import com._1c.g5.v8.dt.bsl.common.IBslPreferences;
import com._1c.g5.v8.dt.bsl.model.BslPackage;
import com._1c.g5.v8.dt.bsl.model.Expression;
import com._1c.g5.v8.dt.bsl.model.Method;
@ -30,6 +34,8 @@ import com._1c.g5.v8.dt.bsl.model.ModuleType;
import com._1c.g5.v8.dt.bsl.model.OperatorStyleCreator;
import com._1c.g5.v8.dt.bsl.model.StringLiteral;
import com._1c.g5.v8.dt.common.StringUtils;
import com._1c.g5.v8.dt.mcore.Environmental;
import com._1c.g5.v8.dt.mcore.util.Environments;
import com._1c.g5.v8.dt.mcore.util.McoreUtil;
import com.e1c.g5.v8.dt.check.CheckComplexity;
import com.e1c.g5.v8.dt.check.ICheckParameters;
@ -38,9 +44,10 @@ 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;
import com.google.inject.Inject;
/**
* Checks an export procedure or function was found in the command module.
* Checks an export procedure or function was found in the command or form module.
*
* @author Artem Iliukhin
*/
@ -48,9 +55,27 @@ public final class ExportMethodInCommandFormModuleCheck
extends BasicCheck
{
private static final String PATTERN_EXCLUDE = "^(?U)(Подключаемый|Attachable)_.*$"; //$NON-NLS-1$
private static final String TYPE_NAME = "NotifyDescription"; //$NON-NLS-1$
private static final String CHECK_ID = "export-method-in-command-form-module"; //$NON-NLS-1$
private static final String PARAMETER_NOTIFY_METHODS_EXCLUSION = "notifyDescriptionMethods"; //$NON-NLS-1$
private static final String PARAMETER_EXCLUDE_METHOD_NAME_PATTERN = "excludeModuleMethodNamePattern"; //$NON-NLS-1$
private static final String PARAMETER_CHECK_FORM_SERVER_METHODS = "checkFormServerMethods"; //$NON-NLS-1$
private static final String PARAMETER_CHECK_FORM_CLIENT_METHODS = "checkFormClientMethods"; //$NON-NLS-1$
private final IBslPreferences bslPreferences;
/**
* Instantiates a new export method in command form module check.
*
* @param bslPreferences the BSL preferences service, cannot be {@code null}.
*/
@Inject
public ExportMethodInCommandFormModuleCheck(IBslPreferences bslPreferences)
{
super();
this.bslPreferences = bslPreferences;
}
@Override
public String getCheckId()
@ -69,6 +94,12 @@ public final class ExportMethodInCommandFormModuleCheck
.extension(new StandardCheckExtension(getCheckId(), BslPlugin.PLUGIN_ID))
.module()
.checkedObjectType(MODULE)
.parameter(PARAMETER_CHECK_FORM_SERVER_METHODS, Boolean.class, Boolean.TRUE.toString(),
Messages.ExportMethodInCommandFormModuleCheck_CheckServerMethodForm)
.parameter(PARAMETER_CHECK_FORM_CLIENT_METHODS, Boolean.class, Boolean.FALSE.toString(),
Messages.ExportMethodInCommandFormModuleCheck_CheckClientMethodForm)
.parameter(PARAMETER_EXCLUDE_METHOD_NAME_PATTERN, String.class, PATTERN_EXCLUDE,
Messages.ExportMethodInCommandFormModuleCheck_ExludeMethodNamePattern)
.parameter(PARAMETER_NOTIFY_METHODS_EXCLUSION, String.class, StringUtils.EMPTY,
Messages.ExportMethodInCommandFormModuleCheck_Notify_description_methods);
}
@ -79,7 +110,12 @@ public final class ExportMethodInCommandFormModuleCheck
{
Module module = (Module)object;
ModuleType type = module.getModuleType();
if (type != ModuleType.COMMAND_MODULE && type != ModuleType.FORM_MODULE)
boolean serverMethodCheck =
parameters.getBoolean(PARAMETER_CHECK_FORM_SERVER_METHODS) && type == ModuleType.FORM_MODULE;
boolean clientMethodCheck =
parameters.getBoolean(PARAMETER_CHECK_FORM_CLIENT_METHODS) && type == ModuleType.FORM_MODULE;
boolean commandModule = type == ModuleType.COMMAND_MODULE;
if (!commandModule && !(serverMethodCheck || clientMethodCheck))
{
return;
}
@ -94,7 +130,25 @@ public final class ExportMethodInCommandFormModuleCheck
if (method.isExport())
{
exportMethods.put(method.getName(), method);
if (commandModule)
{
exportMethods.put(method.getName(), method);
}
else if (serverMethodCheck && clientMethodCheck)
{
exportMethods.put(method.getName(), method);
}
else if (serverMethodCheck ^ clientMethodCheck)
{
Environmental environmental = EcoreUtil2.getContainerOfType(method, Environmental.class);
Environments enivronmetsObject = environmental.environments();
Environments checkingEnvs = bslPreferences.getLoadEnvs(method)
.intersect(serverMethodCheck ? Environments.ALL_SERVERS : Environments.ALL_CLIENTS);
if (enivronmetsObject.containsAny(checkingEnvs))
{
exportMethods.put(method.getName(), method);
}
}
}
}
@ -110,6 +164,24 @@ public final class ExportMethodInCommandFormModuleCheck
return;
}
String excludeNamePattern = parameters.getString(PARAMETER_EXCLUDE_METHOD_NAME_PATTERN);
if (!StringUtils.isEmpty(excludeNamePattern))
{
for (Iterator<Entry<String, Method>> it = exportMethods.entrySet().iterator(); it.hasNext();)
{
Map.Entry<String, Method> entry = it.next();
if (isExcludeName(entry.getKey(), excludeNamePattern))
{
it.remove();
}
}
}
if (exportMethods.isEmpty())
{
return;
}
for (TreeIterator<EObject> iterator = module.eAllContents(); iterator.hasNext();)
{
if (monitor.isCanceled())
@ -145,4 +217,9 @@ public final class ExportMethodInCommandFormModuleCheck
BslPackage.Literals.METHOD__EXPORT);
}
}
private boolean isExcludeName(String name, String excludeNamePattern)
{
return StringUtils.isNotEmpty(excludeNamePattern) && name.matches(excludeNamePattern);
}
}

View File

@ -70,6 +70,12 @@ final class Messages
public static String EventHandlerBooleanParamCheck_title;
public static String ExportMethodInCommandFormModuleCheck_CheckClientMethodForm;
public static String ExportMethodInCommandFormModuleCheck_CheckServerMethodForm;
public static String ExportMethodInCommandFormModuleCheck_ExludeMethodNamePattern;
public static String ExportMethodInCommandFormModuleCheck_Notify_description_methods;
public static String ExportMethodInCommandModule_Do_not_emded_export_method_in_modules_of_command_des;

View File

@ -70,6 +70,9 @@ EventHandlerBooleanParamCheck_description = Use event handler boolean parameter
EventHandlerBooleanParamCheck_title = Use event handler boolean parameter
ExportMethodInCommandFormModuleCheck_CheckClientMethodForm=Check the client method of the form
ExportMethodInCommandFormModuleCheck_CheckServerMethodForm=Check the server method of the form
ExportMethodInCommandFormModuleCheck_ExludeMethodNamePattern=Exclude method name pattern
ExportMethodInCommandFormModuleCheck_Notify_description_methods=Comma-separated list of excluded notification method names
ExportMethodInCommandModule_Do_not_emded_export_method_in_modules_of_command_des=Do not embed export procedures and functions in modules of commands and forms. You cannot address such modules from external code, so embedded export procedures and functions become dysfunctional.

View File

@ -70,6 +70,12 @@ EventHandlerBooleanParamCheck_description = Использование буле
EventHandlerBooleanParamCheck_title = Использование булевого параметра обработчика события
ExportMethodInCommandFormModuleCheck_CheckClientMethodForm=Проверить клиентский метод формы
ExportMethodInCommandFormModuleCheck_CheckServerMethodForm=Проверить серверный метод формы
ExportMethodInCommandFormModuleCheck_ExludeMethodNamePattern=Шаблон исключаемых имен методов
ExportMethodInCommandFormModuleCheck_Notify_description_methods=Список исключаемых имен методов оповещения, разделенные запятой
ExportMethodInCommandModule_Do_not_emded_export_method_in_modules_of_command_des=Не следует размещать экспортные процедуры и функции в модулях команд и форм. К этим модулям нет возможности обращаться из внешнего по отношению к ним кода, поэтому экспортные процедуры и функции в этих модулях не имеют смысла.