1
0
mirror of https://github.com/1C-Company/v8-code-style.git synced 2025-07-17 13:07:50 +02:00

Merge branch 'master' of github.com:1C-Company/v8-code-style into edt-2023-1

This commit is contained in:
Alexander Tretyakevich
2023-03-27 12:40:08 +07:00
78 changed files with 2306 additions and 12 deletions

View File

@ -13,13 +13,20 @@
- Документ не имеет реквизита "Комментарий"
- Реквизит "Комментарий" имеет корректный тип
- В документе, предполагающем проведение, не установлен флаг "Привилегированный режим при проведении / отмене проведения"
- Проверка наличия буквы "ё" в имени, синониме или комментарии объекта метаданных
#### Формы
#### Код модулей
- Проверка использования метода ДанныеФормыВЗначение вместо РеквизитФормыВЗначение
- В проверку использования нерекомендуемых методов (use-non-recommended-method) добавлен метод ПолучитьФорму(GetForm)
- Использование устаревшего метода Найти
- Отсутствует комментарий к экспортной процедуре (функции)
- Документирующий комментарий не содержит секцию "Описание" для экспортной процедуры (функции)
- Проверка корректного наименования переменных
- Обращение к несуществующему параметру формы
#### Запросы
@ -33,6 +40,7 @@
### Исправленные ошибки
- Требование к программному продукту: Для переменных общих модулей проверялся префикс расширения и диагностировалась ошибка
- При анализе расположения устаревших методов учитывался только сценарий расположения устаревшей области в программном интерфейса, теперь учитывается еще и служебный программный интерфейс
## 0.4.0

View File

@ -0,0 +1,28 @@
# Rules for variable names generation
1. To name a variable, use conventional terms related to the respective subject area so
that the variable's name would be descriptive and convey its purpose to the reader.
2. Variable names mustn't contain spaces, even when it is composed of a few words.
Each word in a variable name starts with a capital letter, including pronounces and prepositions.
3. Variable names mustn't start with an underscore.
4. Variable names must contain more than one character, except for loop counters.
It is allowed to assign loop counters with single-character names.
5. Name Boolean variables so that the name would convey the true state of the variable.
## Invalid variable name examples
```bsl
arrOfAtrribute, _SetTypeDoc, nS
```
## Correct variable name examples
```bsl
Var DialogWorkingCatalog;
Var NumberOfPacksInTheBox;
NewDocumentRef;
```
## See
- [Rules for variable names generation](https://kb.1ci.com/1C_Enterprise_Platform/Guides/Developer_Guides/1C_Enterprise_Development_Standards/Code_conventions/Module_formatting/Rules_for_variable_names_generation/)

View File

@ -0,0 +1,68 @@
# Documentation comment has no "Description" section for export procedure (function)
In the **Description section**, explain the purpose of the procedure or function in a short, but clear way,
so that the reader would understand its behavior without looking into the source code.
Here, you can also include the description of its mechanics and links to related procedures and functions.
If the procedure or function has no parameters, this can be the only comment section.
The description text must not be identical to the name of the function or procedure.
Start the description with a verb. For functions, usually, the description starts with "Returns."
If returning a result is not the main purpose of the function,
start the section with a verb that describes the main purpose.
For example, "Validates," "Compares," or "Calculates."
Don't start the description with excessive words like "Procedure" or its name.
## Noncompliant Code Example
```bsl
#Region Public
// Parameters:
// RoleNames - String - comma-separated names of roles whose availability is checked.
//
// Returns:
// Boolean - True if at least one of the passed roles is available to the current user or the
// current user has administrative rights.
//
// Example:
// If RolesAvailable("UseReportMailingLists,SendMail") Then ...
//
Function RolesAvailable(RoleNames) Export
// code here
EndFunction
#EndRegion
```
## Compliant Solution
```bsl
#Region Public
// Defines the availability of RoleNames roles to the current user,
// as well as the availability of administrator rights.
//
// Parameters:
// RoleNames - String - comma-separated names of roles whose availability is checked.
//
// Returns:
// Boolean - True if at least one of the passed roles is available to the current user or the
// current user has administrative rights.
//
// Example:
// If RolesAvailable("UseReportMailingLists,SendMail") Then ...
//
Function RolesAvailable(RoleNames) Export
// code here
EndFunction
#EndRegion
```
## See
- [Procedure and function descriptions](https://kb.1ci.com/1C_Enterprise_Platform/Guides/Developer_Guides/1C_Enterprise_Development_Standards/Code_conventions/Module_formatting/Procedure_and_function_description)

View File

@ -0,0 +1,50 @@
# Export procedure (function) should be described by adding comment
Procedures and functions that belong to **program interface of modules** are required to have comments.
Such procedures and functions are intended to be used in other functional subsystems (or in other applications)
that might be in the scope of responsibility of other developers, and they should, therefore, be properly documented.
## Noncompliant Code Example
```bsl
#Region Public
Function RolesAvailable(RoleNames) Export
// code here
EndFunction
#EndRegion
```
## Compliant Solution
```bsl
#Region Public
// Defines the availability of RoleNames roles to the current user,
// as well as the availability of administrator rights.
//
// Parameters:
// RoleNames - String - comma-separated names of roles whose availability is checked.
//
// Returns:
// Boolean - True if at least one of the passed roles is available to the current user or the
// current user has administrative rights.
//
// Example:
// If RolesAvailable("UseReportMailingLists,SendMail") Then ...
//
Function RolesAvailable(RoleNames) Export
// code here
EndFunction
#EndRegion
```
## See
- [Procedure and function descriptions](https://1c-dn.com/library/procedure_and_function_descriptions/)

View File

@ -4,6 +4,8 @@ Make sure your configuration does not contain unused metadata objects, such as c
command interface sections, and other. Also it must not contain the code of common modules, procedures,
functions, and variables, which is not used in the configuration and for integration with other systems.
The check searches for all references to the method, so it can take a long time.
## Noncompliant Code Example
```bsl

View File

@ -0,0 +1,28 @@
# Правила образования имен переменных
1. Имена переменных следует образовывать от терминов предметной области таким образом, чтобы из имени
переменной было понятно ее назначение.
2. Имена следует образовывать путем удаления пробелов между словами. При этом, каждое слово в имени
пишется с прописной буквы. Предлоги и местоимения из одной буквы также пишутся прописными буквами.
3. Имена переменных запрещается начинать с подчеркивания.
4. Имена переменных не должны состоять из одного символа. Использование односимвольных имен переменных
допускается только для счетчиков циклов..
5. Переменные, отражающие состояние некоторого флага, следует называть так, как пишется истинное значение этого флага.
## Примеры некорректных имен переменных
```bsl
массРеквизитов, _СоотвВидИмя, нС
```
## Примеры корректных имен переменных
```bsl
Перем ДиалогРаботыСКаталогом;
Перем КоличествоПачекВКоробке;
НовыйДокументСсылка;
```
## См.
- [Правила образования имен переменных](https://its.1c.ru/db/v8std#content:454:hdoc:3)

View File

@ -0,0 +1,68 @@
# Документирующий комментарий не содержит секцию "Описание" для экспортной процедуры (функции)
**Секция "Описание"** содержит описание назначения процедуры (функции),
достаточное для понимания сценариев ее использования без просмотра ее исходного кода.
Также может содержать краткое описание принципов работы и перекрестные ссылки на связанные процедуры и функции.
Может быть единственной секцией для процедур без параметров.
Описание не должно совпадать с именем процедуры (функции).
Для процедур и функций секция должна начинаться с глагола. Для функций это, как правило:
«Возвращает…». В тех случаях, когда возвращаемый результат является не основным в работе функции, –
то с основного действия, например: «Проверяет…», «Сравнивает…», «Вычисляет…» и т.п.
Не рекомендуется начинать описание с избыточных слов «Процедура...», «Функция...»,
а также с имени самой процедуры (функции), от удаления которых смысл не меняется.
## Неправильно
```bsl
#Область ПрограммныйИнтерфейс
// Параметры:
// ИменаРолей - Строка - имена ролей, доступность которых проверяется, разделенные запятыми.
//
// Возвращаемое значение:
// Булево - Истина, если хотя бы одна из переданных ролей доступна текущему пользователю,
// либо у него есть административные права.
//
// Пример:
// Если РолиДоступны("ИспользованиеРассылокОтчетов,ОтправкаПоПочте") Тогда ...
//
Функция РолиДоступны(ИменаРолей) Экспорт
// код
КонецФункции
#КонецОбласти
```
## Правильно
```bsl
#Область ПрограммныйИнтерфейс
// Определяет доступность ролей ИменаРолей текущему пользователю,
// а также доступность административных прав.
//
// Параметры:
// ИменаРолей - Строка - имена ролей, доступность которых проверяется, разделенные запятыми.
//
// Возвращаемое значение:
// Булево - Истина, если хотя бы одна из переданных ролей доступна текущему пользователю,
// либо у него есть административные права.
//
// Пример:
// Если РолиДоступны("ИспользованиеРассылокОтчетов,ОтправкаПоПочте") Тогда ...
//
Функция РолиДоступны(ИменаРолей) Экспорт
// код
КонецФункции
#КонецОбласти
```
## См.
- [Описание процедур и функций](https://its.1c.ru/db/v8std#content:453:hdoc:2)

View File

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

View File

@ -3,6 +3,8 @@
Исключением являются экспортные методы, расположенные в области "ПрограммныйИнтерфейс",
т.к. эти методы часто могут использоваться другими конфигурациями (библиотеками).
Проверка выполняет поиск всех ссылок на метод, поэтому может выполняться длительное время.
## Неправильно
```bsl

View File

@ -0,0 +1,14 @@
# Обращение к несуществующему параметру формы
Параметры формы следует объявлять явно на закладке Параметры редактора формы.
В таком случае в коде обработчика ПриСозданииНаСервере не требуется проверять
наличие свойств у структуры Параметры, а сам состав параметров формы явно задекларирован
(поэтому их не требуется восстанавливать, изучая весь код обработчика ПриСозданииНаСервере).
## Неправильно
## Правильно
## См.
- [Открытие параметризированных форм](https://its.1c.ru/db/v8std#content:741:hdoc)

View File

@ -12,6 +12,10 @@
ОбщаяФорма1 = ПолучитьФорму("ОбщаяФорма.ОбщаяФорма1");
```
```bsl
Найти(Сотрудник.Имя, "Иван");
```
## Правильно
```bsl
@ -24,8 +28,13 @@
ОткрытьФорму("ОбщаяФорма.ОбщаяФорма1);
```
```bsl
СтрНайти(Сотрудник.Имя, "Иван");
```
## См.
- [Ограничение на использование метода Сообщить](https://its.1c.ru/db/v8std#content:418:hdoc)
- [Работа в разных часовых поясах](https://its.1c.ru/db/v8std#content:643:hdoc:2.1)
- [Открытие форм](https://its.1c.ru/db/v8std#content:404:hdoc:1)
- [Открытие форм](https://its.1c.ru/db/v8std#content:404:hdoc:1)
- [Переход на платформу 1С:Предприятие 8.3](https://its.1c.ru/db/metod8dev#content:5293:hdoc)

View File

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

View File

@ -0,0 +1,14 @@
# Unknown form parameter access
For parameterizable forms, all parameters must be provided in the form's parameter set.
By this, all the form's parametrization options are described in the parameter set in a declarative way.
Specify the parameters in the code that opens the form (OpenForm).
## Noncompliant Code Example
## Compliant Solution
## См.
- [Opening form](https://kb.1ci.com/1C_Enterprise_Platform/Guides/Developer_Guides/1C_Enterprise_Development_Standards/Designing_user_interfaces/Implementation_of_form/Opening_forms/?language=en)

View File

@ -12,6 +12,10 @@ Date = CurrentDate();
CommonForm1 = GetForm("CommonForm.CommonForm1");
```
```bsl
Find(Catalog.Name, "Joy");
```
## Compliant Solution
```bsl
@ -24,8 +28,13 @@ Date = CurrentSessionDate();
OpenForm("CommonForm.CommonForm1");
```
```bsl
StrFind(Catalog.Name, "Joy");
```
## See
- [Restriction on the use of the Message method](https://its.1c.ru/db/v8std#content:418:hdoc)
- [Working in different time zones](https://its.1c.ru/db/v8std#content:643:hdoc:2.1)
- [Opening forms](https://kb.1ci.com/1C_Enterprise_Platform/Guides/Developer_Guides/1C_Enterprise_Development_Standards/Designing_user_interfaces/Implementation_of_form/Opening_forms/?language=en)
- [Opening forms](https://kb.1ci.com/1C_Enterprise_Platform/Guides/Developer_Guides/1C_Enterprise_Development_Standards/Designing_user_interfaces/Implementation_of_form/Opening_forms/?language=en)
- [Version 8.3](https://kb.1ci.com/1C_Enterprise_Platform/What___s_New/What___s_New/Version_8.3.6/?language=en)

View File

@ -0,0 +1,27 @@
# Using FormAttributeToValue and FormDataToValue
In most cases, FormAttributeToValue is preferable to FormDataToValue.
Sticking to this recommendation will help you to keep the code consistent with other 1C:Enterprise applications. Also,
FormAttributeToValue has simpler syntax, that is, less chance to make a code mistake.
FormDataToValue requires the data type to be specified explicitly.
In contrast, FormAttributeToValue doesn't require data type to be specified.
1C:Enterprise supports both the FormAttributeToValue and FormDataToValue methods,
but the last-mentioned is considered more usable. In terms of efficiency and output, the methods are equal.
## Noncompliant Code Example
```bsl
SignaturesTable = FormDataToValue(SignaturesTable, Type("ValueTable"));
```
## Compliant Solution
```bsl
SignaturesTable = FormAttributeToValue("SignaturesTable");
```
## See
[Using FormAttributeToValue and FormDataToValue](https://kb.1ci.com/1C_Enterprise_Platform/Guides/Developer_Guides/1C_Enterprise_Development_Standards/Code_conventions/Using_applied_objects_and_universal_value_collections/Using_FormAttributeToValue_and_FormDataToValue)

View File

@ -347,6 +347,26 @@
category="com.e1c.v8codestyle.bsl"
class="com.e1c.v8codestyle.internal.bsl.ExecutableExtensionFactory:com.e1c.v8codestyle.bsl.check.DeprecatedProcedureOutsideDeprecatedRegionCheck">
</check>
<check
category="com.e1c.v8codestyle.bsl"
class="com.e1c.v8codestyle.internal.bsl.ExecutableExtensionFactory:com.e1c.v8codestyle.bsl.check.UnknownFormParameterAccessCheck">
</check>
<check
category="com.e1c.v8codestyle.bsl"
class="com.e1c.v8codestyle.bsl.check.VariableNameInvalidCheck">
</check>
<check
category="com.e1c.v8codestyle.bsl"
class="com.e1c.v8codestyle.bsl.check.UsingFormDataToValueCheck">
</check>
<check
category="com.e1c.v8codestyle.bsl"
class="com.e1c.v8codestyle.internal.bsl.ExecutableExtensionFactory:com.e1c.v8codestyle.bsl.check.ExportProcedureMissingCommentCheck">
</check>
<check
category="com.e1c.v8codestyle.bsl"
class="com.e1c.v8codestyle.internal.bsl.ExecutableExtensionFactory:com.e1c.v8codestyle.bsl.comment.check.ExportProcedureCommentDescriptionCheck">
</check>
</extension>
<extension
point="org.eclipse.core.runtime.preferences">

View File

@ -125,6 +125,7 @@ public class DeprecatedProcedureOutsideDeprecatedRegionCheck
return false;
}
return regionFirst.get().getName().equals(ModuleStructureSection.DEPRECATED_REGION.getName(scriptVariant))
&& regionTop.get().getName().equals(ModuleStructureSection.PUBLIC.getName(scriptVariant));
&& (regionTop.get().getName().equals(ModuleStructureSection.PUBLIC.getName(scriptVariant))
|| regionTop.get().getName().equals(ModuleStructureSection.INTERNAL.getName(scriptVariant)));
}
}

View File

@ -0,0 +1,111 @@
/*******************************************************************************
* 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.METHOD;
import java.text.MessageFormat;
import java.util.Optional;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.xtext.nodemodel.ILeafNode;
import org.eclipse.xtext.nodemodel.INode;
import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
import com._1c.g5.v8.dt.bsl.documentation.comment.BslCommentUtils;
import com._1c.g5.v8.dt.bsl.model.Method;
import com._1c.g5.v8.dt.bsl.model.RegionPreprocessor;
import com._1c.g5.v8.dt.mcore.McorePackage;
import com.e1c.g5.v8.dt.check.CheckComplexity;
import com.e1c.g5.v8.dt.check.ICheckParameters;
import com.e1c.g5.v8.dt.check.settings.IssueSeverity;
import com.e1c.g5.v8.dt.check.settings.IssueType;
import com.e1c.v8codestyle.bsl.ModuleStructureSection;
import com.e1c.v8codestyle.check.StandardCheckExtension;
import com.e1c.v8codestyle.internal.bsl.BslPlugin;
/**
* Check that comment is added to the export procedure (function)
*
* @author Olga Bozhko
*/
public class ExportProcedureMissingCommentCheck
extends AbstractModuleStructureCheck
{
private static final String CHECK_ID = "export-procedure-missing-comment"; //$NON-NLS-1$
@Override
public String getCheckId()
{
return CHECK_ID;
}
@Override
protected void configureCheck(CheckConfigurer builder)
{
builder.title(Messages.ExportProcedureMissingCommentCheck_title)
.description(Messages.ExportProcedureMissingCommentCheck_description)
.complexity(CheckComplexity.NORMAL)
.severity(IssueSeverity.MINOR)
.issueType(IssueType.CODE_STYLE)
.extension(new StandardCheckExtension(453, getCheckId(), BslPlugin.PLUGIN_ID))
.module()
.checkedObjectType(METHOD);
}
@Override
protected void check(Object object, ResultAcceptor resultAceptor, ICheckParameters parameters,
IProgressMonitor monitor)
{
Method method = (Method)object;
if (method.isExport() && verifyTopRegion(getTopParentRegion(method))
&& isMethodHasNoComment(NodeModelUtils.findActualNodeFor(method)))
{
resultAceptor.addIssue(
MessageFormat.format(Messages.ExportProcedureMissingCommentCheck_Export_procedure_missing_comment,
method.getName()),
McorePackage.Literals.NAMED_ELEMENT__NAME);
}
}
private static boolean verifyTopRegion(Optional<RegionPreprocessor> regionTop)
{
if (regionTop.isEmpty())
{
return false;
}
return regionTop.get().getName().equals(ModuleStructureSection.PUBLIC.getNames()[0])
|| regionTop.get().getName().equals(ModuleStructureSection.PUBLIC.getNames()[1]);
}
private static boolean isMethodHasNoComment(INode root)
{
if (root != null)
{
boolean lastNodeIsComment = false;
for (ILeafNode node : root.getLeafNodes())
{
if (node.isHidden())
{
lastNodeIsComment = BslCommentUtils.isCommentNode(node);
}
else
{
return !lastNodeIsComment;
}
}
}
return true;
}
}

View File

@ -169,6 +169,12 @@ final class Messages
public static String ExportMethodInCommandModule_Do_not_use_export_method_in_commands_module;
public static String ExportProcedureMissingCommentCheck_description;
public static String ExportProcedureMissingCommentCheck_Export_procedure_missing_comment;
public static String ExportProcedureMissingCommentCheck_title;
public static String ExportVariableInObjectModuleCheck_Description;
public static String ExportVariableInObjectModuleCheck_Issue;
@ -338,6 +344,12 @@ final class Messages
public static String RollbackTransactionCheck_Transactions_is_broken_des;
public static String UnknownFormParameterAccessCheck_description;
public static String UnknownFormParameterAccessCheck_title;
public static String UnknownFormParameterAccessCheck_Unknown_form_parameter_access;
public static String UseNonRecommendedMethods_description;
public static String UseNonRecommendedMethods_message;
@ -366,6 +378,12 @@ final class Messages
public static String MissingTemporaryFileDeletionCheck_title;
public static String FormDataToValueCheck_Description;
public static String FormDataToValueCheck_Issue;
public static String FormDataToValueCheck_Title;
public static String FormModulePragmaCheck_description;
public static String FormModulePragmaCheck_Form_module_compilation_pragma_used;
@ -422,6 +440,14 @@ final class Messages
public static String LockOutOfTry_Method_lock_out_of_try;
public static String VariableNameInvalidCheck_description;
public static String VariableNameInvalidCheck_message_variable_length_is_less_than;
public static String VariableNameInvalidCheck_param_MIN_NAME_LENGTH_PARAM_title;
public static String VariableNameInvalidCheck_title;
public static String VariableNameInvalidCheck_variable_name_is_invalid;
public static String VariableNameInvalidCheck_variable_name_must_start_with_a_capital_letter;
public static String VariableNameInvalidCheck_variable_name_starts_with_an_underline;
static
{
// initialize resource bundle
@ -432,4 +458,4 @@ final class Messages
{
// N/A
}
}
}

View File

@ -0,0 +1,144 @@
/*******************************************************************************
* Copyright (C) 2023, 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.DYNAMIC_FEATURE_ACCESS;
import static com._1c.g5.v8.dt.bsl.model.BslPackage.Literals.FEATURE_ACCESS__NAME;
import static com._1c.g5.v8.dt.mcore.McorePackage.Literals.CONTAINING_SOURCE_DERIVED_PROPERTY__CONTAINING_SOURCE;
import static com._1c.g5.v8.dt.mcore.McorePackage.Literals.DERIVED_PROPERTY__SOURCE;
import java.text.MessageFormat;
import java.util.Collection;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.xtext.EcoreUtil2;
import com._1c.g5.v8.dt.bsl.model.DynamicFeatureAccess;
import com._1c.g5.v8.dt.bsl.model.Expression;
import com._1c.g5.v8.dt.bsl.model.FeatureEntry;
import com._1c.g5.v8.dt.bsl.model.ModuleType;
import com._1c.g5.v8.dt.bsl.model.StaticFeatureAccess;
import com._1c.g5.v8.dt.bsl.resource.DynamicFeatureAccessComputer;
import com._1c.g5.v8.dt.mcore.ContainingSourceDerivedProperty;
import com._1c.g5.v8.dt.mcore.DerivedProperty;
import com._1c.g5.v8.dt.mcore.Environmental;
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;
import com.google.inject.Inject;
/**
* Check the use unknown form parameter access in form module
* @author Vadim Goncharov
*/
public class UnknownFormParameterAccessCheck
extends BasicCheck
{
private static final String CHECK_ID = "unknown-form-parameter-access"; //$NON-NLS-1$
private static final String PARAMETERS_KEYWORD = "Parameters"; //$NON-NLS-1$
private static final String PARAMETERS_KEYWORD_RU = "Параметры"; //$NON-NLS-1$
private final DynamicFeatureAccessComputer dynamicComputer;
/**
* Instantiates a new unknown form parameter access check.
*
* @param dynamicComputer the dynamic computer, cannot be {@code null}
*/
@Inject
public UnknownFormParameterAccessCheck(DynamicFeatureAccessComputer dynamicComputer)
{
super();
this.dynamicComputer = dynamicComputer;
}
@Override
public String getCheckId()
{
return CHECK_ID;
}
@Override
protected void configureCheck(CheckConfigurer builder)
{
builder.title(Messages.UnknownFormParameterAccessCheck_title)
.description(Messages.UnknownFormParameterAccessCheck_description)
.complexity(CheckComplexity.NORMAL)
.severity(IssueSeverity.MINOR)
.issueType(IssueType.CODE_STYLE)
.extension(new StandardCheckExtension(741, getCheckId(), BslPlugin.PLUGIN_ID))
.extension(ModuleTypeFilter.onlyTypes(ModuleType.FORM_MODULE))
.module()
.checkedObjectType(DYNAMIC_FEATURE_ACCESS);
}
@Override
protected void check(Object object, ResultAcceptor resultAcceptor, ICheckParameters parameters,
IProgressMonitor monitor)
{
DynamicFeatureAccess dfa = (DynamicFeatureAccess)object;
String dfaName = dfa.getName();
Expression src = dfa.getSource();
if (!(src instanceof StaticFeatureAccess) || !isFormParameterAccess((StaticFeatureAccess)src)
|| monitor.isCanceled())
{
return;
}
Environmental envs = EcoreUtil2.getContainerOfType(dfa, Environmental.class);
if (!monitor.isCanceled() && isEmptySource(dynamicComputer.resolveObject(dfa, envs.environments())))
{
resultAcceptor.addIssue(
MessageFormat.format(Messages.UnknownFormParameterAccessCheck_Unknown_form_parameter_access, dfaName),
dfa, FEATURE_ACCESS__NAME);
}
}
private boolean isFormParameterAccess(StaticFeatureAccess sfa)
{
String name = sfa.getName();
return name.equalsIgnoreCase(PARAMETERS_KEYWORD) || name.equalsIgnoreCase(PARAMETERS_KEYWORD_RU);
}
// TODO replace this method with BslUtil after 2022.2+
private static boolean isEmptySource(Collection<FeatureEntry> features)
{
if (features.isEmpty())
{
return true;
}
return features.stream().allMatch(e -> {
if (e.getFeature() instanceof ContainingSourceDerivedProperty)
{
return e.getFeature().eGet(CONTAINING_SOURCE_DERIVED_PROPERTY__CONTAINING_SOURCE, false) == null;
}
else if (e.getFeature() instanceof DerivedProperty)
{
return e.getFeature().eGet(DERIVED_PROPERTY__SOURCE, false) == null;
}
return false;
});
}
}

View File

@ -52,6 +52,8 @@ public class UseNonRecommendedMethodCheck
"ТекущаяДата", //$NON-NLS-1$
"Message", //$NON-NLS-1$
"Сообщить", //$NON-NLS-1$
"Find", //$NON-NLS-1$
"Найти", //$NON-NLS-1$
"ПолучитьФорму", //$NON-NLS-1$
"GetForm"); //$NON-NLS-1$

View File

@ -0,0 +1,71 @@
/*******************************************************************************
* 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.STATIC_FEATURE_ACCESS;
import org.eclipse.core.runtime.IProgressMonitor;
import com._1c.g5.v8.dt.bsl.model.StaticFeatureAccess;
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;
/**
* Checking the use of the FormDataToValue method that is not recommended.
*
* @author Artem Iliukhin
*/
public class UsingFormDataToValueCheck
extends BasicCheck
{
private static final String CHECK_ID = "using-form-data-to-value"; //$NON-NLS-1$
private static final String NAME = "FormDataToValue"; //$NON-NLS-1$
private static final String NAME_RU = "ДанныеФормыВЗначение"; //$NON-NLS-1$
@Override
public String getCheckId()
{
return CHECK_ID;
}
@Override
protected void configureCheck(CheckConfigurer builder)
{
builder.title(Messages.FormDataToValueCheck_Title)
.description(Messages.FormDataToValueCheck_Description)
.complexity(CheckComplexity.NORMAL)
.severity(IssueSeverity.TRIVIAL)
.issueType(IssueType.CODE_STYLE)
.extension(new StandardCheckExtension(409, getCheckId(), BslPlugin.PLUGIN_ID))
.module()
.checkedObjectType(STATIC_FEATURE_ACCESS);
}
@Override
protected void check(Object object, ResultAcceptor resultAceptor, ICheckParameters parameters,
IProgressMonitor monitor)
{
StaticFeatureAccess featureAccess = (StaticFeatureAccess)object;
String name = featureAccess.getName();
if (NAME.equalsIgnoreCase(name) || NAME_RU.equalsIgnoreCase(name))
{
resultAceptor.addIssue(Messages.FormDataToValueCheck_Issue, object);
}
}
}

View File

@ -0,0 +1,164 @@
/*******************************************************************************
* Copyright (C) 2023, 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
* Vadim Goncharov - issue #385
*******************************************************************************/
package com.e1c.v8codestyle.bsl.check;
import static com._1c.g5.v8.dt.bsl.model.BslPackage.Literals.DECLARE_STATEMENT;
import static com._1c.g5.v8.dt.bsl.model.BslPackage.Literals.STATIC_FEATURE_ACCESS;
import static com._1c.g5.v8.dt.bsl.model.BslPackage.Literals.VARIABLE;
import static com._1c.g5.v8.dt.mcore.McorePackage.Literals.NAMED_ELEMENT__NAME;
import java.text.MessageFormat;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.xtext.EcoreUtil2;
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.ForStatement;
import com._1c.g5.v8.dt.bsl.model.StaticFeatureAccess;
import com._1c.g5.v8.dt.bsl.model.Variable;
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;
/**
* Check that variable name is correct.
* @author Vadim Goncharov
*/
public class VariableNameInvalidCheck
extends BasicCheck
{
private static final String CHECK_ID = "bsl-variable-name-invalid"; //$NON-NLS-1$
private static final String MIN_NAME_LENGTH_PARAM_NAME = "minNameLength"; //$NON-NLS-1$
private static final Integer MIN_NAME_LENGTH_DEFAULT = 3;
private static final String UNDERLINE_SYM = "_"; //$NON-NLS-1$
/**
* Instantiates a new instance of filter by variable name.
*/
public VariableNameInvalidCheck()
{
super();
}
@Override
public String getCheckId()
{
return CHECK_ID;
}
@Override
protected void configureCheck(CheckConfigurer builder)
{
builder.title(Messages.VariableNameInvalidCheck_title)
.description(Messages.VariableNameInvalidCheck_description)
.complexity(CheckComplexity.NORMAL)
.severity(IssueSeverity.MINOR)
.issueType(IssueType.CODE_STYLE)
.extension(new StandardCheckExtension(454, getCheckId(), BslPlugin.PLUGIN_ID))
.module()
.checkedObjectType(VARIABLE, STATIC_FEATURE_ACCESS, DECLARE_STATEMENT)
.parameter(MIN_NAME_LENGTH_PARAM_NAME, Integer.class, MIN_NAME_LENGTH_DEFAULT.toString(),
Messages.VariableNameInvalidCheck_param_MIN_NAME_LENGTH_PARAM_title);
}
@Override
protected void check(Object object, ResultAcceptor resultAceptor, ICheckParameters parameters,
IProgressMonitor monitor)
{
int minLength = parameters.getInt(MIN_NAME_LENGTH_PARAM_NAME);
if (minLength <= 0)
{
minLength = MIN_NAME_LENGTH_DEFAULT;
}
if (object instanceof Variable)
{
checkVariable((Variable)object, minLength, resultAceptor);
}
else if (object instanceof DeclareStatement)
{
for (ExplicitVariable variable : ((DeclareStatement)object).getVariables())
{
if (monitor.isCanceled())
{
return;
}
checkVariable(variable, minLength, resultAceptor);
}
}
else if (object instanceof StaticFeatureAccess)
{
Variable variable = ((StaticFeatureAccess)object).getImplicitVariable();
if (variable == null || monitor.isCanceled())
{
return;
}
if (!isForStatementAccessVariable(variable))
{
checkVariable(variable, minLength, resultAceptor);
}
}
}
private void checkVariable(Variable variable, int minLength, ResultAcceptor resultAceptor)
{
String name = variable.getName();
int nameLength = name.length();
String msgTemplate = Messages.VariableNameInvalidCheck_variable_name_is_invalid;
String msg = null;
if (nameLength < minLength)
{
msg = MessageFormat.format(msgTemplate, name, MessageFormat
.format(Messages.VariableNameInvalidCheck_message_variable_length_is_less_than, minLength));
resultAceptor.addIssue(msg, variable, NAMED_ELEMENT__NAME);
}
if (name.startsWith(UNDERLINE_SYM))
{
msg = MessageFormat.format(msgTemplate, name,
Messages.VariableNameInvalidCheck_variable_name_starts_with_an_underline);
resultAceptor.addIssue(msg, variable, NAMED_ELEMENT__NAME);
}
else if (!Character.isUpperCase(name.charAt(0)))
{
msg = MessageFormat.format(msgTemplate, name,
Messages.VariableNameInvalidCheck_variable_name_must_start_with_a_capital_letter);
resultAceptor.addIssue(msg, variable, NAMED_ELEMENT__NAME);
}
}
private boolean isForStatementAccessVariable(Variable variable)
{
return EcoreUtil2.getContainerOfType(variable, ForStatement.class) != null;
}
}

View File

@ -156,6 +156,12 @@ ExtensionMethodPrefixCheck_Description = The procedure (function) in the module
ExtensionMethodPrefixCheck_Ext_method__0__should_have__1__prefix = The method "{0}" should have "{1}" prefix
ExportProcedureMissingCommentCheck_description=Export procedure (function) should be described by adding comment
ExportProcedureMissingCommentCheck_Export_procedure_missing_comment=Export procedure (function) "{0}" should be described by adding comment
ExportProcedureMissingCommentCheck_title=Export procedure (function) should be described by adding comment
ExtensionMethodPrefixCheck_Title = Extension method does not have extension prefix
ExtensionVariablePrefixCheck_Description = The variable in the module of the extension object does not have a prefix corresponding to the prefix of the extension itself
@ -164,6 +170,12 @@ ExtensionVariablePrefixCheck_Title = Extension variable does not have extension
ExtensionVariablePrefixCheck_Variable_0_should_have_1_prefix = The variable "{0}" should have "{1}" prefix
FormDataToValueCheck_Description = Using FormDataToValue instead FormAttributeToValue
FormDataToValueCheck_Issue = Use FormAttributeToValue instead FormDataToValue
FormDataToValueCheck_Title = Using FormDataToValue instead FormAttributeToValue
FormModuleMissingPragmaCheck_Missing_compilation_directives = Missing compilation directives
FormModuleMissingPragmaCheck_description = Always use compilation pragma in form module
@ -438,6 +450,12 @@ StructureCtorTooManyKeysCheck_description = Check structure constructor has too
StructureCtorTooManyKeysCheck_title = Structure constructor has too many keys
UnknownFormParameterAccessCheck_Unknown_form_parameter_access = Unknown form parameter "{0}" access
UnknownFormParameterAccessCheck_description = Unknown form parameter access
UnknownFormParameterAccessCheck_title = Unknown form parameter access
UseNonRecommendedMethods_description = Using non-recommended methods
UseNonRecommendedMethods_message = Using non-recommended method
@ -445,3 +463,17 @@ UseNonRecommendedMethods_message = Using non-recommended method
UseNonRecommendedMethods_parameter = List of non-recommended methods
UseNonRecommendedMethods_title = Using non-recommended methods
VariableNameInvalidCheck_description=Variable name is invalid
VariableNameInvalidCheck_message_variable_length_is_less_than=variable length is less than {0}
VariableNameInvalidCheck_param_MIN_NAME_LENGTH_PARAM_title=Min. lenght of variable name
VariableNameInvalidCheck_title=Variable name is invalid
VariableNameInvalidCheck_variable_name_is_invalid=Variable name {0} is invalid: {1}
VariableNameInvalidCheck_variable_name_must_start_with_a_capital_letter=variable name must start with a capital letter
VariableNameInvalidCheck_variable_name_starts_with_an_underline=variable name starts with an underline

View File

@ -162,8 +162,20 @@ ExtensionVariablePrefixCheck_Description = Переменная модуля р
ExtensionVariablePrefixCheck_Title = Переменная расширения должна содержать в имени префикс расширения
ExportProcedureMissingCommentCheck_description=Отсутствует комментарий к экспортной процедуре (функции)
ExportProcedureMissingCommentCheck_Export_procedure_missing_comment=Отсутствует комментарий к экспортной процедуре (функции) "{0}"
ExportProcedureMissingCommentCheck_title=Отсутствует комментарий к экспортной процедуре (функции)
ExtensionVariablePrefixCheck_Variable_0_should_have_1_prefix = Переменная "{0}" должна иметь префикс "{1}"
FormDataToValueCheck_Description = Использование ДанныеФормыВЗначение вместо РеквизитФормыВЗначение
FormDataToValueCheck_Issue = Рекомендуется использовать РеквизитФормыВЗначение вместо ДанныеФормыВЗначение
FormDataToValueCheck_Title = Использование ДанныеФормыВЗначение вместо РеквизитФормыВЗначение
FormModuleMissingPragmaCheck_Missing_compilation_directives = Пропущена директива компиляции
FormModuleMissingPragmaCheck_description = Всегда использовать директивы компиляции в модуле формы
@ -438,6 +450,12 @@ StructureCtorTooManyKeysCheck_description = Проверка конструкт
StructureCtorTooManyKeysCheck_title = Конструктор структуры содержит слишком много ключей
UnknownFormParameterAccessCheck_Unknown_form_parameter_access = Обращение к несуществующему параметру формы "{0}"
UnknownFormParameterAccessCheck_description = Обращение к несуществующему параметру формы
UnknownFormParameterAccessCheck_title = Обращение к несуществующему параметру формы
UseNonRecommendedMethods_description = Использование не рекомендованных методов
UseNonRecommendedMethods_message = Используется не рекомендуемый метод
@ -445,3 +463,17 @@ UseNonRecommendedMethods_message = Используется не рекомен
UseNonRecommendedMethods_parameter = Список дополнительных не рекомендуемых методов для проверки
UseNonRecommendedMethods_title = Использование не рекомендуемых методов
VariableNameInvalidCheck_description = Имя переменной введено некорректно
VariableNameInvalidCheck_message_variable_length_is_less_than = длина переменной меньше, чем {0}
VariableNameInvalidCheck_param_MIN_NAME_LENGTH_PARAM_title = Мин. длина переменной
VariableNameInvalidCheck_title = Имя переменной введено некорректно
VariableNameInvalidCheck_variable_name_is_invalid = Имя переменной {0} введено некорректно: {1}
VariableNameInvalidCheck_variable_name_must_start_with_a_capital_letter = имя переменной должно начинаться с заглавной буквы
VariableNameInvalidCheck_variable_name_starts_with_an_underline = имя переменной начинается с символа подчеркивания

View File

@ -0,0 +1,123 @@
/*******************************************************************************
* 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.comment.check;
import static com._1c.g5.v8.dt.mcore.McorePackage.Literals.NAMED_ELEMENT__NAME;
import java.text.MessageFormat;
import java.util.Optional;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.ecore.EObject;
import com._1c.g5.v8.dt.bsl.documentation.comment.BslDocumentationComment;
import com._1c.g5.v8.dt.bsl.documentation.comment.IDescriptionPart;
import com._1c.g5.v8.dt.bsl.model.PreprocessorItem;
import com._1c.g5.v8.dt.bsl.model.RegionPreprocessor;
import com.e1c.g5.v8.dt.check.CheckComplexity;
import com.e1c.g5.v8.dt.check.ICheckParameters;
import com.e1c.g5.v8.dt.check.settings.IssueSeverity;
import com.e1c.g5.v8.dt.check.settings.IssueType;
import com.e1c.v8codestyle.bsl.ModuleStructureSection;
import com.e1c.v8codestyle.check.StandardCheckExtension;
import com.e1c.v8codestyle.internal.bsl.BslPlugin;
/**
* Check that comment for the export procedure (function) contains Description section
*
* @author Olga Bozhko
*/
public class ExportProcedureCommentDescriptionCheck
extends AbstractDocCommentTypeCheck
{
private static final String CHECK_ID = "doc-comment-export-procedure-description-section"; //$NON-NLS-1$
@Override
public String getCheckId()
{
return CHECK_ID;
}
@Override
protected void configureCheck(CheckConfigurer builder)
{
builder.title(Messages.ExportMethodCommentDescriptionCheck_title)
.description(Messages.ExportMethodCommentDescriptionCheck_description)
.complexity(CheckComplexity.NORMAL)
.severity(IssueSeverity.MINOR)
.issueType(IssueType.CODE_STYLE)
.extension(new StandardCheckExtension(453, getCheckId(), BslPlugin.PLUGIN_ID))
.delegate(BslDocumentationComment.class);
}
@Override
protected void checkDocumentationCommentObject(IDescriptionPart object, BslDocumentationComment root,
DocumentationCommentResultAcceptor resultAceptor, ICheckParameters parameters, IProgressMonitor monitor)
{
if (!root.getMethod().isExport())
{
return;
}
BslDocumentationComment docComment = (BslDocumentationComment)object;
BslDocumentationComment.Description description = docComment.getDescription();
if (description != null && description.getParts().isEmpty()
&& verifyTopRegion(getTopParentRegion(root.getMethod())))
{
resultAceptor.addIssue(MessageFormat.format(
Messages.ExportMethodCommentDescriptionCheck_Missing_Description_in_export_procedure_comment,
root.getMethod().getName()), root.getMethod(), NAMED_ELEMENT__NAME);
}
}
private static Optional<RegionPreprocessor> getTopParentRegion(EObject object)
{
EObject parent = object.eContainer();
PreprocessorItem lastItem = null;
RegionPreprocessor region = null;
do
{
if (parent instanceof RegionPreprocessor)
{
RegionPreprocessor parentRegion = (RegionPreprocessor)parent;
if (lastItem != null && parentRegion.getItem().equals(lastItem))
{
region = parentRegion;
}
else
{
lastItem = null;
}
}
else if (parent instanceof PreprocessorItem)
{
lastItem = (PreprocessorItem)parent;
}
parent = parent.eContainer();
}
while (parent != null);
return Optional.ofNullable(region);
}
private static boolean verifyTopRegion(Optional<RegionPreprocessor> regionTop)
{
if (regionTop.isEmpty())
{
return false;
}
return regionTop.get().getName().equals(ModuleStructureSection.PUBLIC.getNames()[0])
|| regionTop.get().getName().equals(ModuleStructureSection.PUBLIC.getNames()[1]);
}
}

View File

@ -32,6 +32,9 @@ final class Messages
public static String ExportFunctionReturnSectionCheck_description;
public static String ExportFunctionReturnSectionCheck_Export_function_return_section_required;
public static String ExportFunctionReturnSectionCheck_title;
public static String ExportMethodCommentDescriptionCheck_description;
public static String ExportMethodCommentDescriptionCheck_Missing_Description_in_export_procedure_comment;
public static String ExportMethodCommentDescriptionCheck_title;
public static String FieldDefinitionNameCheck_description;
public static String FieldDefinitionNameCheck_Field_name__N__is_incorrect_name;
public static String FieldDefinitionNameCheck_title;

View File

@ -32,6 +32,12 @@ ExportFunctionReturnSectionCheck_description = Documentation comment return sect
ExportFunctionReturnSectionCheck_title = Documentation comment return section for export function
ExportMethodCommentDescriptionCheck_description=Missing Description section in the comment for export procedure (function)
ExportMethodCommentDescriptionCheck_Missing_Description_in_export_procedure_comment=Missing Description section in the comment for export procedure (function) "{0}"
ExportMethodCommentDescriptionCheck_title=Missing Description section in the comment for export procedure (function)
FieldDefinitionNameCheck_Field_name__N__is_incorrect_name = Field name "{0}" is incorrect name
FieldDefinitionNameCheck_description = Documentation comment field is correct name

View File

@ -32,6 +32,12 @@ ExportFunctionReturnSectionCheck_description = Секция возвращаем
ExportFunctionReturnSectionCheck_title = Секция возвращаемого значения документирующего комментария для экспортной функции
ExportMethodCommentDescriptionCheck_description=В комментарии к экспортной процедуре (функции) отсутствует секция "Описание"
ExportMethodCommentDescriptionCheck_Missing_Description_in_export_procedure_comment=В комментарии к экспортной процедуре (функции) "{0}" отсутствует секция "Описание"
ExportMethodCommentDescriptionCheck_title=В комментарии к экспортной процедуре (функции) отсутствует секция "Описание"
FieldDefinitionNameCheck_Field_name__N__is_incorrect_name = Имя поля "{0}" является некорректным
FieldDefinitionNameCheck_description = Поле документирующего комментария является корректным именем

View File

@ -0,0 +1,12 @@
# Check Russian Yo letter "ё" in the name, synonym or comment of metadata object
In Russian locale, it is not allowed to use the letter "ё" in names, synonyms and comments of metadata objects.
## Noncompliant Code Example
## Compliant Solution
## See
[Name, synonym, and comment (in Russian)](https://its.1c.ru/db/v8std#content:474:hdoc)

View File

@ -0,0 +1,12 @@
# Проверка наличия буквы "ё" в имени, синониме или комментарии объекта метаданных
В именах, синонимах и комментариях объектов метаданных не допускается использовать букву "ё".
## Неправильно
## Правильно
## См.
[Имя, синоним, комментарий](https://its.1c.ru/db/v8std#content:474:hdoc)

View File

@ -8,4 +8,5 @@
## Правильно
## См.
[Безопасное хранение паролей](https://its.1c.ru/db/v8std#content:740:hdoc:2)

View File

@ -8,4 +8,5 @@ avoid storing passwords or any other confidential information in the infobase.
## Compliant Solution
## See
[Secure password storage](https://support.1ci.com/hc/en-us/articles/360011003100-Secure-password-storage)

View File

@ -110,6 +110,10 @@
category="com.e1c.v8codestyle.md"
class="com.e1c.v8codestyle.internal.md.ExecutableExtensionFactory:com.e1c.v8codestyle.md.check.ExtensionMdObjectNamePrefixCheck">
</check>
<check
category="com.e1c.v8codestyle.md"
class="com.e1c.v8codestyle.internal.md.ExecutableExtensionFactory:com.e1c.v8codestyle.md.check.MdObjectNameUnallowedLetterCheck">
</check>
<check
category="com.e1c.v8codestyle.md"
class="com.e1c.v8codestyle.md.check.DocumentPostInPrivilegedModeCheck">
@ -123,5 +127,5 @@
class="com.e1c.v8codestyle.md.check.MdObjectAttributeCommentNotExistCheck">
</check>
</extension>
</plugin>
</plugin>

View File

@ -0,0 +1,91 @@
/*******************************************************************************
* 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.md.check;
import static com._1c.g5.v8.dt.metadata.mdclass.MdClassPackage.Literals.MD_OBJECT;
import static com._1c.g5.v8.dt.metadata.mdclass.MdClassPackage.Literals.MD_OBJECT__COMMENT;
import static com._1c.g5.v8.dt.metadata.mdclass.MdClassPackage.Literals.MD_OBJECT__NAME;
import static com._1c.g5.v8.dt.metadata.mdclass.MdClassPackage.Literals.MD_OBJECT__SYNONYM;
import org.eclipse.core.runtime.IProgressMonitor;
import com._1c.g5.v8.dt.metadata.mdclass.MdObject;
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.components.TopObjectFilterExtension;
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.md.CorePlugin;
/**
* Check in Russian locale, names, synonyms and comments of metadata objects do not contain the letter "ё".
*
* @author Olga Bozhko
*/
public class MdObjectNameUnallowedLetterCheck
extends BasicCheck
{
private static final String CHECK_ID = "mdo-ru-name-unallowed-letter"; //$NON-NLS-1$
private static final String LANGUAGE_KEY_RU = "ru"; //$NON-NLS-1$
private static final String UNALLOWED_LETTER = "ё"; //$NON-NLS-1$
private static final String ISSUE_MESSAGE =
Messages.MdObjectNameUnallowedLetterCheck_Ru_locale_unallowed_letter_used_for_name_synonym_or_comment;
@Override
public String getCheckId()
{
return CHECK_ID;
}
@Override
protected void configureCheck(CheckConfigurer builder)
{
builder.title(Messages.MdObjectNameUnallowedLetterCheck_title)
.description(Messages.MdObjectNameUnallowedLetterCheck_description)
.complexity(CheckComplexity.NORMAL)
.severity(IssueSeverity.MINOR)
.extension(new TopObjectFilterExtension())
.issueType(IssueType.UI_STYLE)
.extension(new StandardCheckExtension(474, getCheckId(), CorePlugin.PLUGIN_ID))
.extension(new SkipAdoptedInExtensionMdObjectExtension())
.topObject(MD_OBJECT)
.features(MD_OBJECT__NAME, MD_OBJECT__SYNONYM, MD_OBJECT__COMMENT);
}
@Override
protected void check(Object object, ResultAcceptor resultAceptor, ICheckParameters parameters,
IProgressMonitor monitor)
{
MdObject mdObject = (MdObject)object;
if (hasUnallowedLetter(mdObject.getName()))
{
resultAceptor.addIssue(ISSUE_MESSAGE, MD_OBJECT__NAME);
}
if (hasUnallowedLetter(mdObject.getSynonym().get(LANGUAGE_KEY_RU)))
{
resultAceptor.addIssue(ISSUE_MESSAGE, MD_OBJECT__SYNONYM);
}
if (hasUnallowedLetter(mdObject.getComment()))
{
resultAceptor.addIssue(ISSUE_MESSAGE, MD_OBJECT__COMMENT);
}
}
private static boolean hasUnallowedLetter(String testableString)
{
return testableString != null && testableString.contains(UNALLOWED_LETTER);
}
}

View File

@ -76,6 +76,9 @@ final class Messages
public static String MdObjectNameLength_Maximum_name_length_description;
public static String MdObjectNameLength_message;
public static String MdObjectNameLength_title;
public static String MdObjectNameUnallowedLetterCheck_description;
public static String MdObjectNameUnallowedLetterCheck_Ru_locale_unallowed_letter_used_for_name_synonym_or_comment;
public static String MdObjectNameUnallowedLetterCheck_title;
public static String MdListObjectPresentationCheck_decription;
public static String MdListObjectPresentationCheck_Neither_Object_presentation_nor_List_presentation_is_not_filled;
public static String MdListObjectPresentationCheck_title;

View File

@ -111,6 +111,12 @@ MdObjectNameLength_message = Metadata object name should be less then {0}
MdObjectNameLength_title = Metadata object name length
MdObjectNameUnallowedLetterCheck_Ru_locale_unallowed_letter_used_for_name_synonym_or_comment = In Russian locale, name, synonym or comment of metadata object contain the unallowed letter
MdObjectNameUnallowedLetterCheck_description = In Russian locale name, synonym or comment of metadata object contain the unallowed letter
MdObjectNameUnallowedLetterCheck_title = In Russian locale name, synonym or comment of metadata object contain the unallowed letter
MdObjectNameWithoutSuffix_Name_suffix_list_title = Name suffix list, comma separated
MdOwnerAttributeSynonymEmpty_Description = Synonym of the 'Owner' or 'Parent' standard attribute is not specified

View File

@ -112,6 +112,12 @@ MdObjectNameLength_message = Длина имени объекта метадан
MdObjectNameLength_title = Длина имени объекта метаданных
MdObjectNameUnallowedLetterCheck_Ru_locale_unallowed_letter_used_for_name_synonym_or_comment = Имя, синоним или комментарий содержит букву “ё”
MdObjectNameUnallowedLetterCheck_description = Имя, синоним или комментарий содержит букву “ё”
MdObjectNameUnallowedLetterCheck_title = Имя, синоним или комментарий содержит букву “ё”
MdObjectNameWithoutSuffix_Name_suffix_list_title = Список суффиксов имени, разделенный запятой
MdOwnerAttributeSynonymEmpty_Description = Не задан синоним у стандартного свойства 'Владелец' или 'Родитель'

View File

@ -53,6 +53,7 @@
```
## См.
- [Эффективные условия запросов](https://its.1c.ru/db/v8std#content:658:hdoc)
- [Особенности использования в запросах оператора ПОДОБНО](https://its.1c.ru/db/v8std#content:726:hdoc)

View File

@ -1,7 +1,7 @@
# Проверки модулей 1С
Общее количество проверок: 78
Общее количество проверок: 81
| Код проверки | Наименование |
|--------------|--------------|
@ -19,6 +19,7 @@
| [doc-comment-complex-type-with-link](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/doc-comment-complex-type-with-link.md) | Поле документирующего комментария использует объявление сложного типа вместо ссылки на тип |
| [doc-comment-description-ends-on-dot](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/doc-comment-description-ends-on-dot.md) | Многострочное описание документирующего комментария оканчивается на точку |
| [doc-comment-export-function-return-section](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/doc-comment-export-function-return-section.md) | Секция возвращаемого значения документирующего комментария для экспортной функции |
| [doc-comment-export-procedure-description-section](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/doc-comment-export-procedure-description-section.md) | Документирующий комментарий не содержит секцию "Описание" для экспортной процедуры (функции) |
| [doc-comment-field-in-description-suggestion](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/doc-comment-field-in-description-suggestion.md) | Многострочное описание документирующего комментария содержит определение поля |
| [doc-comment-field-name](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/doc-comment-field-name.md) | Поле документирующего комментария является корректным именем |
| [doc-comment-field-type](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/doc-comment-field-type.md) | Поле документирующего комментария не имеет определения типа |
@ -35,6 +36,7 @@
| [empty-except-statement](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/empty-except-statement.md) | Конструкция "Попытка...Исключение...КонецПопытки" не содержит кода в исключении |
| [event-heandler-boolean-param](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/event-heandler-boolean-param.md) | Использование булевого параметра обработчика события |
| [export-method-in-command-form-module](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/export-method-in-command-form-module.md) | Ограничения на использование экспортных процедур и функций в модуле команд и форм |
| [export-procedure-missing-comment](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/export-procedure-missing-comment.md) | Отсутствует комментарий к экспортной процедуре (функции) |
| [extension-method-prefix](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/extension-method-prefix.md) | У метода отсутствует префикс расширения |
| [extension-variable-prefix](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/extension-variable-prefix.md) | У имени переменной отсутствует префикс расширения |
| [form-module-missing-pragma](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/form-module-missing-pragma.md) | Всегда использовать директивы компиляции в модуле формы |
@ -81,5 +83,6 @@
| [structure-consructor-value-type](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/structure-consructor-value-type.md) | Типизация значений в конструкторе структуры |
| [typed-value-adding-to-untyped-collection](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/typed-value-adding-to-untyped-collection.md) | Добавление типизированного значения в не типизированную коллекцию |
| [use-non-recommended-method](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/use-non-recommended-method.md) | Использование не рекомендуемых методов |
| [using-form-data-to-value](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/using-form-data-to-value.md) | Использование РеквизитФормыВЗначение и ДанныеФормыВЗначение |
| [using-isinrole](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/using-isinrole.md) | Использован метод "РольДоступна" |
| [variable-value-type](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/variable-value-type.md) | Переменная имеет тип значения |

View File

@ -1,11 +1,11 @@
# Индекс проверок
Общее количество проверок 1С:Стандарты разработки V8: 139
Общее количество проверок 1С:Стандарты разработки V8: 146
- form: 7
- md: 22
- bsl: 78
- md: 26
- bsl: 81
- ql: 8
- right: 24
@ -40,6 +40,7 @@
| [doc-comment-complex-type-with-link](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/doc-comment-complex-type-with-link.md) | Поле документирующего комментария использует объявление сложного типа вместо ссылки на тип |
| [doc-comment-description-ends-on-dot](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/doc-comment-description-ends-on-dot.md) | Многострочное описание документирующего комментария оканчивается на точку |
| [doc-comment-export-function-return-section](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/doc-comment-export-function-return-section.md) | Секция возвращаемого значения документирующего комментария для экспортной функции |
| [doc-comment-export-procedure-description-section](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/doc-comment-export-procedure-description-section.md) | Документирующий комментарий не содержит секцию "Описание" для экспортной процедуры (функции) |
| [doc-comment-field-in-description-suggestion](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/doc-comment-field-in-description-suggestion.md) | Многострочное описание документирующего комментария содержит определение поля |
| [doc-comment-field-name](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/doc-comment-field-name.md) | Поле документирующего комментария является корректным именем |
| [doc-comment-field-type](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/doc-comment-field-type.md) | Поле документирующего комментария не имеет определения типа |
@ -52,10 +53,12 @@
| [doc-comment-return-section-type](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/doc-comment-return-section-type.md) | Секция возвращаемого значения документирующего комментария содержит корректные типы |
| [doc-comment-type](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/doc-comment-type.md) | Определение типа документирующего комментария |
| [doc-comment-use-minus](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/doc-comment-use-minus.md) | Использование только дефис-минуса в документирующем комментарии |
| [document-post-in-privileged-mode](../../bundles/com.e1c.v8codestyle.md/markdown/ru/document-post-in-privileged-mode.md) | В документе, предполагающем проведение, не установлен флаг "Привилегированный режим при проведении / отмене проведения" |
| [dynamic-access-method-not-found](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/dynamic-access-method-not-found.md) | Метод в объекте не найден |
| [empty-except-statement](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/empty-except-statement.md) | Конструкция "Попытка...Исключение...КонецПопытки" не содержит кода в исключении |
| [event-heandler-boolean-param](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/event-heandler-boolean-param.md) | Использование булевого параметра обработчика события |
| [export-method-in-command-form-module](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/export-method-in-command-form-module.md) | Ограничения на использование экспортных процедур и функций в модуле команд и форм |
| [export-procedure-missing-comment](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/export-procedure-missing-comment.md) | Отсутствует комментарий к экспортной процедуре (функции) |
| [extension-md-object-prefix](../../bundles/com.e1c.v8codestyle.md/markdown/ru/extension-md-object-prefix.md) | У имени объекта отсутствует префикс расширения |
| [extension-method-prefix](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/extension-method-prefix.md) | У метода отсутствует префикс расширения |
| [extension-variable-prefix](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/extension-variable-prefix.md) | У имени переменной отсутствует префикс расширения |
@ -75,8 +78,11 @@
| [lock-out-of-try](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/lock-out-of-try.md) | Вызов "Заблокировать()" находится вне попытки |
| [manager-module-named-self-reference](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/manager-module-named-self-reference.md) | Избыточное обращение по собственному имени внутри модуля менеджера |
| [md-list-object-presentation](../../bundles/com.e1c.v8codestyle.md/markdown/ru/md-list-object-presentation.md) | Не заполнено ни представление объекта, ни представление списка |
| [md-object-attribute-comment-incorrect-type](../../bundles/com.e1c.v8codestyle.md/markdown/ru/md-object-attribute-comment-incorrect-type.md) | Реквизит «Комментарий» у документов |
| [md-object-attribute-comment-not-exist](../../bundles/com.e1c.v8codestyle.md/markdown/ru/md-object-attribute-comment-not-exist.md) | Документ не имеет реквизита "Комментарий" |
| [md-standard-attribute-synonym-empty](../../bundles/com.e1c.v8codestyle.md/markdown/ru/md-standard-attribute-synonym-empty.md) | Не задан синоним стандартного реквизита "Родитель" или "Владелец". |
| [mdo-name-length](../../bundles/com.e1c.v8codestyle.md/markdown/ru/mdo-name-length.md) | Длина имени объекта метаданных |
| [mdo-ru-name-unallowed-letter](../../bundles/com.e1c.v8codestyle.md/markdown/ru/mdo-ru-name-unallowed-letter.md) | Проверка наличия буквы "ё" в имени, синониме или комментарии объекта метаданных |
| [mdo-scheduled-job-description](../../bundles/com.e1c.v8codestyle.md/markdown/ru/mdo-scheduled-job-description.md) | Задано наименование предопределенного регламентного задания |
| [method-param-value-type](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/method-param-value-type.md) | Параметр метода имеет тип |
| [method-too-many-params](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/method-too-many-params.md) | Метод содержит слишком много параметров |
@ -150,5 +156,6 @@
| [typed-value-adding-to-untyped-collection](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/typed-value-adding-to-untyped-collection.md) | Добавление типизированного значения в не типизированную коллекцию |
| [unsafe-password-ib-storage](../../bundles/com.e1c.v8codestyle.md/markdown/ru/unsafe-password-ib-storage.md) | Небезопасное хранение паролей в информационной базе |
| [use-non-recommended-method](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/use-non-recommended-method.md) | Использование не рекомендуемых методов |
| [using-form-data-to-value](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/using-form-data-to-value.md) | Использование РеквизитФормыВЗначение и ДанныеФормыВЗначение |
| [using-isinrole](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/using-isinrole.md) | Использован метод "РольДоступна" |
| [variable-value-type](../../bundles/com.e1c.v8codestyle.bsl/markdown/ru/variable-value-type.md) | Переменная имеет тип значения |

View File

@ -25,6 +25,7 @@ doc-comment-collection-item-type
doc-comment-complex-type-with-link
doc-comment-description-ends-on-dot
doc-comment-export-function-return-section
doc-comment-export-procedure-description-section
doc-comment-field-in-description-suggestion
doc-comment-field-name
doc-comment-field-type
@ -37,10 +38,12 @@ doc-comment-ref-link
doc-comment-return-section-type
doc-comment-type
doc-comment-use-minus
document-post-in-privileged-mode
dynamic-access-method-not-found
empty-except-statement
event-heandler-boolean-param
export-method-in-command-form-module
export-procedure-missing-comment
extension-md-object-prefix
extension-method-prefix
extension-variable-prefix
@ -60,8 +63,11 @@ invocation-parameter-type-intersect
lock-out-of-try
manager-module-named-self-reference
md-list-object-presentation
md-object-attribute-comment-incorrect-type
md-object-attribute-comment-not-exist
md-standard-attribute-synonym-empty
mdo-name-length
mdo-ru-name-unallowed-letter
mdo-scheduled-job-description
method-param-value-type
method-too-many-params
@ -135,5 +141,6 @@ subsystem-synonym-too-long
typed-value-adding-to-untyped-collection
unsafe-password-ib-storage
use-non-recommended-method
using-form-data-to-value
using-isinrole
variable-value-type

View File

@ -1,7 +1,7 @@
# Проверки метаданных 1С
Общее количество проверок: 22
Общее количество проверок: 26
| Код проверки | Наименование |
|--------------|--------------|
@ -18,10 +18,14 @@
| [configuration-data-lock-mode](../../bundles/com.e1c.v8codestyle.md/markdown/ru/configuration-data-lock-mode.md) | Режим блокировки данных конфигурации |
| [db-object-anyref-type](../../bundles/com.e1c.v8codestyle.md/markdown/ru/db-object-anyref-type.md) | Реквизиты составного типа, такие как ЛюбаяСсылка и аналогичные |
| [db-object-ref-non-ref-type](../../bundles/com.e1c.v8codestyle.md/markdown/ru/db-object-ref-non-ref-type.md) | Реквизиты составного типа |
| [document-post-in-privileged-mode](../../bundles/com.e1c.v8codestyle.md/markdown/ru/document-post-in-privileged-mode.md) | В документе, предполагающем проведение, не установлен флаг "Привилегированный режим при проведении / отмене проведения" |
| [extension-md-object-prefix](../../bundles/com.e1c.v8codestyle.md/markdown/ru/extension-md-object-prefix.md) | У имени объекта отсутствует префикс расширения |
| [md-list-object-presentation](../../bundles/com.e1c.v8codestyle.md/markdown/ru/md-list-object-presentation.md) | Не заполнено ни представление объекта, ни представление списка |
| [md-object-attribute-comment-incorrect-type](../../bundles/com.e1c.v8codestyle.md/markdown/ru/md-object-attribute-comment-incorrect-type.md) | Реквизит «Комментарий» у документов |
| [md-object-attribute-comment-not-exist](../../bundles/com.e1c.v8codestyle.md/markdown/ru/md-object-attribute-comment-not-exist.md) | Документ не имеет реквизита "Комментарий" |
| [md-standard-attribute-synonym-empty](../../bundles/com.e1c.v8codestyle.md/markdown/ru/md-standard-attribute-synonym-empty.md) | Не задан синоним стандартного реквизита "Родитель" или "Владелец". |
| [mdo-name-length](../../bundles/com.e1c.v8codestyle.md/markdown/ru/mdo-name-length.md) | Длина имени объекта метаданных |
| [mdo-ru-name-unallowed-letter](../../bundles/com.e1c.v8codestyle.md/markdown/ru/mdo-ru-name-unallowed-letter.md) | Проверка наличия буквы "ё" в имени, синониме или комментарии объекта метаданных |
| [mdo-scheduled-job-description](../../bundles/com.e1c.v8codestyle.md/markdown/ru/mdo-scheduled-job-description.md) | Задано наименование предопределенного регламентного задания |
| [register-resource-precision](../../bundles/com.e1c.v8codestyle.md/markdown/ru/register-resource-precision.md) | Длина ресурса регистра накопления или бухгалтерии |
| [scheduled-job-periodicity-too-short](../../bundles/com.e1c.v8codestyle.md/markdown/ru/scheduled-job-periodicity-too-short.md) | Периодичность выполнения регламентного задания меньше одной минуты. |

View File

@ -0,0 +1,37 @@
Процедура ТестПодчеркивания()
Перем _ЯвнаяПеременнаяТестоваяПодчеркивание;
_НеявнаяПеременнаяПодчеркивание = 2;
КонецПроцедуры
Процедура ТестЗаглавнаяБуква()
Перем явнаяПеременнаяТестоваяНижнийРегистр;
неявнаяПеременнаяНижнийРегистр = 2;
КонецПроцедуры
Процедура ТестМинимальнаяДлина()
Перем ЯП;
НП = 2;
КонецПроцедуры
Процедура ТестКорректныеНаименования()
Перем ЯвнаяПеременнаяКорректноеНаименование;
НеявнаяПеременнаяКорректноеНаименование = 2;
КонецПроцедуры
Процедура ТестИтераторы()
МассивКонтрагентов = Новый Массив();
Для й = 0 По МассивКонтрагентов.ВГраница() Цикл
//Обработка массива
КонецЦикла;
Для Каждого Эл Из МассивКонтрагентов Цикл
//Обработка массива
КонецЦикла;
КонецПроцедуры
Процедура ТестИменаПараметровМетодов(Контрагенты)
КонецПроцедуры
Процедура ТестИменаПараметровМетодов2(_Контрагенты)
КонецПроцедуры

View File

@ -0,0 +1,14 @@
#Region Internal
#Region Deprecated
// Deprecated. Instead, use SupportedProcedure
Procedure DeprecatedProcedure() Export
DeprecatedProcedure()
EndProcedure
#EndRegion
#EndRegion

View File

@ -0,0 +1,18 @@
#Region Public
// Parameters:
// RoleNames - String - comma-separated names of roles whose availability is checked.
//
// Returns:
// Boolean - True if at least one of the passed roles is available to the current user or the
// current user has administrative rights.
//
// Example:
// If RolesAvailable("UseReportMailingLists,SendMail") Then ...
//
Function RolesAvailable(RoleNames) Export
// code here
EndFunction
#EndRegion

View File

@ -0,0 +1,21 @@
#Region Public
// Defines the availability of RoleNames roles to the current user,
// as well as the availability of administrator rights.
//
// Parameters:
// RoleNames - String - comma-separated names of roles whose availability is checked.
//
// Returns:
// Boolean - True if at least one of the passed roles is available to the current user or the
// current user has administrative rights.
//
// Example:
// If RolesAvailable("UseReportMailingLists,SendMail") Then ...
//
Function RolesAvailable(RoleNames) Export
// code here
EndFunction
#EndRegion

View File

@ -0,0 +1,7 @@
#Region Public
Procedure ExportProcedureWithoutComment() Export
ExportProcedureWithoutComment()
EndProcedure
#EndRegion

View File

@ -0,0 +1,20 @@
#Region Public
// Defines the availability of RoleNames roles to the current user,
// as well as the availability of administrator rights.
//
// Parameters:
// RoleNames - String - comma-separated names of roles whose availability is checked.
//
// Returns:
// Boolean - True if at least one of the passed roles is available to the current user or the
// current user has administrative rights.
//
// Example:
// If RolesAvailable("UseReportMailingLists,SendMail") Then ...
//
Function RolesAvailable(RoleNames) Export
// code here
EndFunction
#EndRegion

View File

@ -0,0 +1,7 @@
#Region Internal
Procedure ExportProcedureWithoutComment() Export
ExportProcedureWithoutComment()
EndProcedure
#EndRegion

View File

@ -0,0 +1,3 @@
Function FunctionName(Parameters) Export
Return Find("Test with word", "word");
EndFunction

View File

@ -0,0 +1,3 @@
Procedure NonCompliant()
SignaturesTable = FormDataToValue(SignaturesTable, Type("ValueTable"));
EndProcedure

View File

@ -56,7 +56,21 @@ public class DeprecatedProcedureOutsideDeprecatedRegionCheckTest
}
/**
* Test a deprecated method is placed a nested region in the Deprecated region of the Public region
* Test a deprecated method is placed in the Deprecated region of the Internal region in a common module area
*
* @throws Exception the exception
*/
@Test
public void testCompliantDeprecatedMethodInInternal() throws Exception
{
updateModule(FOLDER_RESOURCE + "deprecated-method-compliant2.bsl");
List<Marker> markers = getModuleMarkers();
assertTrue(markers.isEmpty());
}
/**
* Test a deprecated method is placed a nested region in the Deprecated region of the Public region
* in a common module area
*
* @throws Exception the exception

View File

@ -0,0 +1,86 @@
/*******************************************************************************
* 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 static org.junit.Assert.assertTrue;
import java.text.MessageFormat;
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.ExportProcedureMissingCommentCheck;
/**
* Tests for {@link ExportProcedureMissingCommentCheck} check.
*
* @author Olga Bozhko
*/
public class ExportProcedureMissingCommentCheckTest
extends AbstractSingleModuleTestBase
{
private static final String MESSAGE = "Export procedure (function) {0} should be described by adding comment";
private static final String EXPORT_PROCEDURE_NAME = "\"ExportProcedureWithoutComment\"";
public ExportProcedureMissingCommentCheckTest()
{
super(ExportProcedureMissingCommentCheck.class);
}
/**
* Test the comment is added to the export procedure
*
* @param @throws Exception the exceptions
*/
@Test
public void testExportMethodWithComment() throws Exception
{
updateModule(FOLDER_RESOURCE + "export-procedure-with-comment.bsl");
List<Marker> markers = getModuleMarkers();
assertTrue(markers.isEmpty());
}
/**
* Test the comment is not added to the export procedure
*
* @param @throws Exception the exceptions
*/
@Test
public void testExportMethodWithoutComment() throws Exception
{
updateModule(FOLDER_RESOURCE + "export-procedure-no-comment.bsl");
List<Marker> markers = getModuleMarkers();
assertEquals(1, markers.size());
assertEquals("3", markers.get(0).getExtraInfo().get(IExtraInfoKeys.TEXT_EXTRA_INFO_LINE_KEY));
assertEquals(MessageFormat.format(MESSAGE, EXPORT_PROCEDURE_NAME), markers.get(0).getMessage());
}
/**
* Test the comment is not added to the export procedure located not in Public Region
*
* @param @throws Exception the exceptions
*/
@Test
public void testNonPublicExportMethodWithoutComment() throws Exception
{
updateModule(FOLDER_RESOURCE + "non-public-export-procedure-no-comment.bsl");
List<Marker> markers = getModuleMarkers();
assertTrue(markers.isEmpty());
}
}

View File

@ -0,0 +1,74 @@
/*******************************************************************************
* Copyright (C) 2023, 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.UnknownFormParameterAccessCheck;
/**
* Test class for {@link UnknownFormParameterAccessCheck}.
* @author Vadim Goncharov
*/
public class UnknownFormParameterAccessCheckTest
extends AbstractSingleModuleTestBase
{
private static final String PROJECT_NAME = "UnknownFormParameterAccess";
private static final String COMMON_FORM_FILE_NAME = "/src/CommonForms/TestForm/Module.bsl";
public UnknownFormParameterAccessCheckTest()
{
super(UnknownFormParameterAccessCheck.class);
}
@Override
protected String getTestConfigurationName()
{
return PROJECT_NAME;
}
@Override
protected String getModuleFileName()
{
return COMMON_FORM_FILE_NAME;
}
/**
* Test the form module use unknown parameters access.
*
* @throws Exception the exception
*/
@Test
public void testFormModuleUnknownParametersAccess() throws Exception
{
List<Marker> markers = getModuleMarkers();
assertEquals(2, markers.size());
Marker marker = markers.get(0);
assertEquals("8", marker.getExtraInfo().get(IExtraInfoKeys.TEXT_EXTRA_INFO_LINE_KEY));
marker = markers.get(1);
assertEquals("10", marker.getExtraInfo().get(IExtraInfoKeys.TEXT_EXTRA_INFO_LINE_KEY));
}
}

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.itests;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
import com._1c.g5.v8.bm.core.IBmObject;
import com._1c.g5.v8.dt.bsl.model.Module;
import com._1c.g5.v8.dt.metadata.mdclass.AbstractForm;
import com._1c.g5.v8.dt.validation.marker.IExtraInfoKeys;
import com._1c.g5.v8.dt.validation.marker.Marker;
import com.e1c.v8codestyle.bsl.check.UsingFormDataToValueCheck;
/**
* The test for {@link UsingFormDataToValueCheck} check.
*
* @author Artem Iliukhin
*/
public class UsingFormDataToValueCheckTest
extends AbstractSingleModuleTestBase
{
private static final String PROJECT_NAME = "CommonForm";
private static final String FQN = "CommonForm.Form.Form";
private static final String COMMON_FORM_FILE_NAME = "/src/CommonForms/Form/Module.bsl";
/**
* Instantiates a new form data to value check test.
*/
public UsingFormDataToValueCheckTest()
{
super(UsingFormDataToValueCheck.class);
}
@Override
protected String getTestConfigurationName()
{
return PROJECT_NAME;
}
@Override
protected String getModuleFileName()
{
return COMMON_FORM_FILE_NAME;
}
@Override
protected Module getModule()
{
IBmObject mdObject = getTopObjectByFqn(FQN, getProject());
assertTrue(mdObject instanceof AbstractForm);
Module module = ((AbstractForm)mdObject).getModule();
assertNotNull(module);
return module;
}
@Test
public void testFormModuleHasPragma() throws Exception
{
updateModule(FOLDER_RESOURCE + "using-form-data-to-value.bsl");
Marker marker = getModuleFirstMarker();
assertEquals("2", marker.getExtraInfo().get(IExtraInfoKeys.TEXT_EXTRA_INFO_LINE_KEY));
}
}

View File

@ -0,0 +1,55 @@
package com.e1c.v8codestyle.bsl.check.itests;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.Arrays;
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.VariableNameInvalidCheck;
/**
* The test for class {@link VariableNameInvalidCheck}.
*
* @author Vadim Goncharov
*
*/
public class VariableNameInvalidCheckTest
extends AbstractSingleModuleTestBase
{
public VariableNameInvalidCheckTest()
{
super(VariableNameInvalidCheck.class);
}
/**
* Test use invalid variable name.
*
* @throws Exception the exception
*/
@Test
public void testVariableName() throws Exception
{
updateModule(FOLDER_RESOURCE + "bsl-variable-name-invalid.bsl");
List<Marker> markers = getModuleMarkers();
assertEquals(7, markers.size());
List<String> benchmarkLines = Arrays.asList("2", "3", "7", "8", "12", "13", "36");
List<String> markersLines = new ArrayList<>();
for (Marker m : markers)
{
markersLines.add(m.getExtraInfo().get(IExtraInfoKeys.TEXT_EXTRA_INFO_LINE_KEY));
}
assertEquals(true, markersLines.containsAll(benchmarkLines) && benchmarkLines.containsAll(markersLines));
}
}

View File

@ -0,0 +1,75 @@
/*******************************************************************************
* 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.comment.check.itests;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.text.MessageFormat;
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.itests.AbstractSingleModuleTestBase;
import com.e1c.v8codestyle.bsl.comment.check.ExportProcedureCommentDescriptionCheck;
/**
* Tests for {@link ExportProcedureCommentDescriptionCheck} check.
*
* @author Olga Bozhko
*/
public class ExportProcedureCommentDescriptionCheckTest
extends AbstractSingleModuleTestBase
{
private static final String MESSAGE =
"Missing Description section in the comment for export procedure (function) {0}";
private static final String EXPORT_FUNCTION_NAME = "\"RolesAvailable\"";
public ExportProcedureCommentDescriptionCheckTest()
{
super(ExportProcedureCommentDescriptionCheck.class);
}
/**
* Test the documentation comment for export procedure/functiion contains description section
*
* @throws Exception the exception
*/
@Test
public void testFunctionHasDescriptionSection() throws Exception
{
updateModule(FOLDER_RESOURCE + "doc-comment-export-function-with-description-section.bsl");
List<Marker> markers = getModuleMarkers();
assertTrue(markers.isEmpty());
}
/**
* Test the documentation comment for export procedure/function doesn't contain description section
*
* @throws Exception the exception
*/
@Test
public void testFunctionHasNoDescriptionSection() throws Exception
{
updateModule(FOLDER_RESOURCE + "doc-comment-export-function-no-description-section.bsl");
List<Marker> markers = getModuleMarkers();
assertEquals(1, markers.size());
Marker marker = markers.get(0);
assertEquals("14", marker.getExtraInfo().get(IExtraInfoKeys.TEXT_EXTRA_INFO_LINE_KEY));
assertEquals(MessageFormat.format(MESSAGE, EXPORT_FUNCTION_NAME), marker.getMessage());
}
}

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>UnknownFormParameterAccess</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
<nature>com._1c.g5.v8.dt.core.V8ConfigurationNature</nature>
</natures>
</projectDescription>

View File

@ -0,0 +1,2 @@
eclipse.preferences.version=1
encoding/<project>=UTF-8

View File

@ -0,0 +1,2 @@
Manifest-Version: 1.0
Runtime-Version: 8.3.19

View File

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8"?>
<form:Form xmlns:form="http://g5.1c.ru/v8/dt/form">
<autoCommandBar>
<name>FormCommandBar</name>
<id>-1</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<horizontalAlign>Left</horizontalAlign>
<autoFill>true</autoFill>
</autoCommandBar>
<handlers>
<event>OnCreateAtServer</event>
<name>OnCreateAtServer</name>
</handlers>
<autoTitle>true</autoTitle>
<autoUrl>true</autoUrl>
<group>Vertical</group>
<autoFillCheck>true</autoFillCheck>
<allowFormCustomize>true</allowFormCustomize>
<enabled>true</enabled>
<showTitle>true</showTitle>
<showCloseButton>true</showCloseButton>
<parameters>
<name>Parameter1</name>
<valueType>
<types>String</types>
<stringQualifiers/>
</valueType>
</parameters>
<parameters>
<name>Parameter2</name>
<valueType>
<types>String</types>
<stringQualifiers/>
</valueType>
</parameters>
<parameters>
<name>Parameter3</name>
<valueType>
<types>String</types>
<stringQualifiers/>
</valueType>
</parameters>
<commandInterface>
<navigationPanel/>
<commandBar/>
</commandInterface>
</form:Form>

View File

@ -0,0 +1,15 @@
&AtServer
Procedure OnCreateAtServer(Cancel, StandardProcessing)
P1 = Parameters.Parameter1;
P2 = Parameters.Parameter2;
P3 = Parameters.Parameter3;
P4 = Parameters.Parameter4;
If Parameters.Property("Parameter5") Then
P5 = Parameters.Parameter5;
EndIf;
//@skip-check unknown-form-parameter-access
P6 = Parameters.Parameter6;
EndProcedure

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonForm xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="8dc7cfba-d593-432a-b0c3-7ac2b5d38bd9">
<name>TestForm</name>
<synonym>
<key>en</key>
<value>Test form</value>
</synonym>
<usePurposes>PersonalComputer</usePurposes>
<usePurposes>MobileDevice</usePurposes>
</mdclass:CommonForm>

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<cmi:CommandInterface xmlns:cmi="http://g5.1c.ru/v8/dt/cmi"/>

View File

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:Configuration xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="6234ca5c-8e27-4656-945d-048f274720a1">
<name>UnknownFormParameterAccess</name>
<synonym>
<key>en</key>
<value>Unknown form parameter access</value>
</synonym>
<containedObjects classId="9cd510cd-abfc-11d4-9434-004095e12fc7" objectId="6b9561da-fe94-41a2-9388-44b1e2dfb672"/>
<containedObjects classId="9fcd25a0-4822-11d4-9414-008048da11f9" objectId="4748215e-a509-4cb7-ac81-d7a1ec6ca42d"/>
<containedObjects classId="e3687481-0a87-462c-a166-9f34594f9bba" objectId="c2e48825-e973-41eb-8f1d-5ec5f006a910"/>
<containedObjects classId="9de14907-ec23-4a07-96f0-85521cb6b53b" objectId="54d0cc7d-5970-41e0-b9f2-33a7e0360836"/>
<containedObjects classId="51f2d5d8-ea4d-4064-8892-82951750031e" objectId="64a8c69e-aa14-40b8-9097-5f1e9c54a0f6"/>
<containedObjects classId="e68182ea-4237-4383-967f-90c1e3370bc7" objectId="1f353d72-1841-437b-8b63-a08c470dd1ec"/>
<containedObjects classId="fb282519-d103-4dd3-bc12-cb271d631dfc" objectId="38d1b124-f2dc-44e6-b025-26bbe53c9bc1"/>
<configurationExtensionCompatibilityMode>8.3.19</configurationExtensionCompatibilityMode>
<defaultRunMode>ManagedApplication</defaultRunMode>
<usePurposes>PersonalComputer</usePurposes>
<usedMobileApplicationFunctionalities>
<functionality>
<use>true</use>
</functionality>
<functionality>
<functionality>OSBackup</functionality>
<use>true</use>
</functionality>
</usedMobileApplicationFunctionalities>
<defaultLanguage>Language.English</defaultLanguage>
<dataLockControlMode>Managed</dataLockControlMode>
<objectAutonumerationMode>NotAutoFree</objectAutonumerationMode>
<modalityUseMode>DontUse</modalityUseMode>
<synchronousPlatformExtensionAndAddInCallUseMode>DontUse</synchronousPlatformExtensionAndAddInCallUseMode>
<compatibilityMode>8.3.19</compatibilityMode>
<languages uuid="84439c11-320a-4cf4-8042-61fe3b450cb1">
<name>English</name>
<synonym>
<key>en</key>
<value>English</value>
</synonym>
<languageCode>en</languageCode>
</languages>
<commonForms>CommonForm.TestForm</commonForms>
</mdclass:Configuration>

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<cmi:CommandInterface xmlns:cmi="http://g5.1c.ru/v8/dt/cmi"/>

View File

@ -0,0 +1,106 @@
/*******************************************************************************
* 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.md.check.itests;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import org.junit.Test;
import com._1c.g5.v8.dt.core.platform.IDtProject;
import com._1c.g5.v8.dt.validation.marker.Marker;
import com.e1c.g5.v8.dt.testing.check.CheckTestBase;
import com.e1c.v8codestyle.md.check.MdObjectNameUnallowedLetterCheck;
/**
* Tests for {@link MdObjectNameUnallowedLetterCheck} check
*
* @author OlgaBozhko
*
*/
public class MdObjectNameUnallowedLetterCheckTest
extends CheckTestBase
{
private static final String CHECK_ID = "mdo-ru-name-unallowed-letter"; //$NON-NLS-1$
private static final String PROJECT_NAME = "MdObjectNameUnallowedLetter";
private static final String MESSAGE =
"In Russian locale, name, synonym or comment of metadata object contain the unallowed letter";
/**
* Test that md object name, synonym and comment do not contain unallowed letter "ё" (Ru locale)
*
* @throws Exception the exception
*/
@Test
public void testMdObjectNameNoUnallowedLetter() throws Exception
{
IDtProject dtProject = openProjectAndWaitForValidationFinish(PROJECT_NAME);
assertNotNull(dtProject);
long id = getTopObjectIdByFqn("Catalog.ТестовыйКаталог", dtProject);
Marker marker = getFirstMarker(CHECK_ID, id, dtProject);
assertNull(marker);
}
/**
* Test that md object name contains unallowed letter "ё" (Ru locale)
*
* @throws Exception the exception
*/
@Test
public void testMdObjectNameHasUnallowedLetter() throws Exception
{
IDtProject dtProject = openProjectAndWaitForValidationFinish(PROJECT_NAME);
assertNotNull(dtProject);
long id = getTopObjectIdByFqn("Catalog.ТестовыйКаталог_ё_имя", dtProject);
Marker marker = getFirstMarker(CHECK_ID, id, dtProject);
assertNotNull(marker);
assertEquals(marker.getMessage(), MESSAGE);
}
/**
* Test that md object synonym contains unallowed letter "ё" (Ru locale)
*
* @throws Exception the exception
*/
@Test
public void testMdObjectSynonymHasUnallowedLetter() throws Exception
{
IDtProject dtProject = openProjectAndWaitForValidationFinish(PROJECT_NAME);
assertNotNull(dtProject);
long id = getTopObjectIdByFqn("Catalog.ТестовыйКаталог_синоним", dtProject);
Marker marker = getFirstMarker(CHECK_ID, id, dtProject);
assertNotNull(marker);
assertEquals(marker.getMessage(), MESSAGE);
}
/**
* Test that md object comment contains unallowed letter "ё" (Ru locale)
*
* @throws Exception the exception
*/
@Test
public void testMdObjectCommentHasUnallowedLetter() throws Exception
{
IDtProject dtProject = openProjectAndWaitForValidationFinish(PROJECT_NAME);
assertNotNull(dtProject);
long id = getTopObjectIdByFqn("Catalog.ТестовыйКаталог_комментарий", dtProject);
Marker marker = getFirstMarker(CHECK_ID, id, dtProject);
assertNotNull(marker);
assertEquals(marker.getMessage(), MESSAGE);
}
}

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>MdObjectNameUnallowedLetter</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
<nature>com._1c.g5.v8.dt.core.V8ConfigurationNature</nature>
</natures>
</projectDescription>

View File

@ -0,0 +1,2 @@
eclipse.preferences.version=1
encoding/<project>=UTF-8

View File

@ -0,0 +1,2 @@
Manifest-Version: 1.0
Runtime-Version: 8.3.19

View File

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:Catalog xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="36ba5cf6-b579-431a-9f66-6640d73f9f37">
<producedTypes>
<objectType typeId="35de42a7-469b-4f3f-8c9b-0cfc2b6ec57f" valueTypeId="9efd60b8-1495-4acf-af4a-e9432c4dc5b4"/>
<refType typeId="cdc2d275-e18d-448d-a496-99c90347395a" valueTypeId="b1c7b91a-d456-4243-a03c-4a464b8e899d"/>
<selectionType typeId="d2cdeab3-4f0c-4faa-ad72-14bbb5adef4f" valueTypeId="61810606-50ae-4e1e-8880-53ff549236c1"/>
<listType typeId="b77c7b07-6d3f-4153-9865-8ddbb800cf35" valueTypeId="6e426ab0-9989-4686-b24b-3c3560cf0670"/>
<managerType typeId="6322be2b-8368-4699-9f53-1237a2f60e89" valueTypeId="f843b101-ae66-4eb4-9295-45449f4e5239"/>
</producedTypes>
<name>ТестовыйКаталог</name>
<synonym>
<key>ru</key>
<value>Тестовый каталог</value>
</synonym>
<useStandardCommands>true</useStandardCommands>
<inputByString>Catalog.ТестовыйКаталог.StandardAttribute.Code</inputByString>
<inputByString>Catalog.ТестовыйКаталог.StandardAttribute.Description</inputByString>
<fullTextSearchOnInputByString>DontUse</fullTextSearchOnInputByString>
<createOnInput>Use</createOnInput>
<dataLockControlMode>Managed</dataLockControlMode>
<fullTextSearch>Use</fullTextSearch>
<objectPresentation>
<key>ru</key>
<value>1</value>
</objectPresentation>
<levelCount>2</levelCount>
<foldersOnTop>true</foldersOnTop>
<codeLength>9</codeLength>
<descriptionLength>25</descriptionLength>
<codeType>String</codeType>
<codeAllowedLength>Variable</codeAllowedLength>
<checkUnique>true</checkUnique>
<autonumbering>true</autonumbering>
<defaultPresentation>AsDescription</defaultPresentation>
<editType>InDialog</editType>
<choiceMode>BothWays</choiceMode>
</mdclass:Catalog>

View File

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:Catalog xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="1ad2aba2-aea6-4e58-a3eb-f243ec84bceb">
<producedTypes>
<objectType typeId="f53604a9-2b8c-4793-9aa7-8f4da8a78831" valueTypeId="f9503cd1-fd45-4d9a-a128-756511bb55de"/>
<refType typeId="f3ef8059-06af-4e5c-86b4-209e8f65cf13" valueTypeId="b252a136-e1f0-43e9-8589-00102d2ba8b7"/>
<selectionType typeId="e229648b-ec16-43d8-b470-604d23cedbd9" valueTypeId="978a2d02-cff0-4bf5-a02c-62aa7c6843b6"/>
<listType typeId="26a87f3d-3832-4e1e-989f-c823d58f4ec9" valueTypeId="5ce1bac8-50a9-4fe7-b935-75e218beb7d4"/>
<managerType typeId="e7fbf22a-1d8e-4992-825d-5d0ebef5af36" valueTypeId="d5c4e733-4e8b-4662-9a9b-05a802931f7d"/>
</producedTypes>
<name>ТестовыйКаталог_комментарий</name>
<synonym>
<key>ru</key>
<value>Тестовый каталог комментарий</value>
</synonym>
<comment>ТестовыйКаталог_ё_комментарий</comment>
<useStandardCommands>true</useStandardCommands>
<inputByString>Catalog.ТестовыйКаталог_комментарий.StandardAttribute.Code</inputByString>
<inputByString>Catalog.ТестовыйКаталог_комментарий.StandardAttribute.Description</inputByString>
<fullTextSearchOnInputByString>DontUse</fullTextSearchOnInputByString>
<createOnInput>Use</createOnInput>
<dataLockControlMode>Managed</dataLockControlMode>
<fullTextSearch>Use</fullTextSearch>
<objectPresentation>
<key>ru</key>
<value>1</value>
</objectPresentation>
<levelCount>2</levelCount>
<foldersOnTop>true</foldersOnTop>
<codeLength>9</codeLength>
<descriptionLength>25</descriptionLength>
<codeType>String</codeType>
<codeAllowedLength>Variable</codeAllowedLength>
<checkUnique>true</checkUnique>
<autonumbering>true</autonumbering>
<defaultPresentation>AsDescription</defaultPresentation>
<editType>InDialog</editType>
<choiceMode>BothWays</choiceMode>
</mdclass:Catalog>

View File

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:Catalog xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="d5f9e89a-54b4-4f90-8366-ca7e1da45c1a">
<producedTypes>
<objectType typeId="dccfe4b2-98fb-45fe-8a98-9d37785a5120" valueTypeId="0e56efd8-9b3e-49bd-9b98-188f45b7a624"/>
<refType typeId="75150b58-4ff4-4115-851f-ef544f42a42d" valueTypeId="42bf34f3-8354-42d3-b556-11c5bfa7addc"/>
<selectionType typeId="cba8806c-b871-4d98-9162-b82a5a6c5896" valueTypeId="1a273781-e2e2-4c49-bb9c-43b5231fd3b4"/>
<listType typeId="1748e86d-01b6-4d52-9119-bafc9f79e1b1" valueTypeId="63042547-9011-40a1-a638-e4a1b403575f"/>
<managerType typeId="0d3261b2-99c9-4a45-bd04-43ceaa17e430" valueTypeId="adbb1328-0456-48c6-9636-3ae849ee92fd"/>
</producedTypes>
<name>ТестовыйКаталог_синоним</name>
<synonym>
<key>ru</key>
<value>Тестовый каталог ё синоним</value>
</synonym>
<useStandardCommands>true</useStandardCommands>
<inputByString>Catalog.ТестовыйКаталог_синоним.StandardAttribute.Code</inputByString>
<inputByString>Catalog.ТестовыйКаталог_синоним.StandardAttribute.Description</inputByString>
<fullTextSearchOnInputByString>DontUse</fullTextSearchOnInputByString>
<createOnInput>Use</createOnInput>
<dataLockControlMode>Managed</dataLockControlMode>
<fullTextSearch>Use</fullTextSearch>
<objectPresentation>
<key>ru</key>
<value>1</value>
</objectPresentation>
<levelCount>2</levelCount>
<foldersOnTop>true</foldersOnTop>
<codeLength>9</codeLength>
<descriptionLength>25</descriptionLength>
<codeType>String</codeType>
<codeAllowedLength>Variable</codeAllowedLength>
<checkUnique>true</checkUnique>
<autonumbering>true</autonumbering>
<defaultPresentation>AsDescription</defaultPresentation>
<editType>InDialog</editType>
<choiceMode>BothWays</choiceMode>
</mdclass:Catalog>

View File

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:Catalog xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="b2ee6a43-df0e-4285-8176-c18b6e241b93">
<producedTypes>
<objectType typeId="3e22bd6f-7750-4422-8b02-91a662f8f78e" valueTypeId="ccbb7362-df67-49f4-967c-12a82849dc54"/>
<refType typeId="df29049e-8d24-4a91-875c-2a2cffc7e359" valueTypeId="bc30dc0c-5984-4a89-989b-35c9c54aad91"/>
<selectionType typeId="9476418d-7fbb-4051-a7b8-6e4b750ec9c8" valueTypeId="548ecb1c-a491-4aa3-a765-a0355dc95d0b"/>
<listType typeId="fb2ad3de-9a62-40b4-857c-0406b01e0705" valueTypeId="741f1b6a-0913-44d9-9737-359dee40e17d"/>
<managerType typeId="c2d2e7ed-2eb1-4c84-84ca-f3a72c0948b1" valueTypeId="8302eeb7-0f61-4d95-bb16-a1c65491e9a7"/>
</producedTypes>
<name>ТестовыйКаталог_ё_имя</name>
<synonym>
<key>ru</key>
<value>Тестовый каталог</value>
</synonym>
<useStandardCommands>true</useStandardCommands>
<inputByString>Catalog.ТестовыйКаталог_ё_имя.StandardAttribute.Code</inputByString>
<inputByString>Catalog.ТестовыйКаталог_ё_имя.StandardAttribute.Description</inputByString>
<fullTextSearchOnInputByString>DontUse</fullTextSearchOnInputByString>
<createOnInput>Use</createOnInput>
<dataLockControlMode>Managed</dataLockControlMode>
<fullTextSearch>Use</fullTextSearch>
<objectPresentation>
<key>ru</key>
<value>1</value>
</objectPresentation>
<levelCount>2</levelCount>
<foldersOnTop>true</foldersOnTop>
<codeLength>9</codeLength>
<descriptionLength>25</descriptionLength>
<codeType>String</codeType>
<codeAllowedLength>Variable</codeAllowedLength>
<checkUnique>true</checkUnique>
<autonumbering>true</autonumbering>
<defaultPresentation>AsDescription</defaultPresentation>
<editType>InDialog</editType>
<choiceMode>BothWays</choiceMode>
</mdclass:Catalog>

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<cmi:CommandInterface xmlns:cmi="http://g5.1c.ru/v8/dt/cmi"/>

View File

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:Configuration xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="52fc997f-b6f0-4ff9-ac4c-96d06e01b36d">
<name>MdObjectNameUnallowedLetter</name>
<synonym>
<key>ru</key>
<value>Md object name unallowed letter</value>
</synonym>
<containedObjects classId="9cd510cd-abfc-11d4-9434-004095e12fc7" objectId="6391eb7f-d6e1-4614-a8eb-9186ff89f1a9"/>
<containedObjects classId="9fcd25a0-4822-11d4-9414-008048da11f9" objectId="f56c5439-a106-4d05-9a32-4b32958d9427"/>
<containedObjects classId="e3687481-0a87-462c-a166-9f34594f9bba" objectId="70760f62-8e17-4642-a514-af74dc4478bb"/>
<containedObjects classId="9de14907-ec23-4a07-96f0-85521cb6b53b" objectId="bd9aa895-f22f-4480-8d48-ec7650f91219"/>
<containedObjects classId="51f2d5d8-ea4d-4064-8892-82951750031e" objectId="e3bbdd1b-3d9b-4148-b4ea-9aa669b4ccc7"/>
<containedObjects classId="e68182ea-4237-4383-967f-90c1e3370bc7" objectId="884fbe5f-df0a-4a02-80cb-9a15fecda65b"/>
<containedObjects classId="fb282519-d103-4dd3-bc12-cb271d631dfc" objectId="5fa81625-81ed-4f4d-88d2-c6a38b0e0004"/>
<configurationExtensionCompatibilityMode>8.3.19</configurationExtensionCompatibilityMode>
<defaultRunMode>ManagedApplication</defaultRunMode>
<usePurposes>PersonalComputer</usePurposes>
<scriptVariant>Russian</scriptVariant>
<usedMobileApplicationFunctionalities>
<functionality>
<use>true</use>
</functionality>
<functionality>
<functionality>OSBackup</functionality>
<use>true</use>
</functionality>
</usedMobileApplicationFunctionalities>
<defaultLanguage>Language.English</defaultLanguage>
<dataLockControlMode>Managed</dataLockControlMode>
<objectAutonumerationMode>NotAutoFree</objectAutonumerationMode>
<modalityUseMode>DontUse</modalityUseMode>
<synchronousPlatformExtensionAndAddInCallUseMode>DontUse</synchronousPlatformExtensionAndAddInCallUseMode>
<compatibilityMode>8.3.19</compatibilityMode>
<languages uuid="8b10cd01-c878-4d58-bef3-0d10f2da0207">
<name>English</name>
<synonym>
<key>ru</key>
<value>English</value>
</synonym>
<languageCode>ru</languageCode>
</languages>
<catalogs>Catalog.ТестовыйКаталог</catalogs>
<catalogs>Catalog.ТестовыйКаталог_ё_имя</catalogs>
<catalogs>Catalog.ТестовыйКаталог_комментарий</catalogs>
<catalogs>Catalog.ТестовыйКаталог_синоним</catalogs>
</mdclass:Configuration>

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<cmi:CommandInterface xmlns:cmi="http://g5.1c.ru/v8/dt/cmi"/>