Skip to content

Commit

Permalink
замечания на ПоискПоНомеру с параметром-литералом
Browse files Browse the repository at this point in the history
- доработан код, тесты, название и описание правила
- precommit

1c-syntax#3191
  • Loading branch information
artbear committed Nov 30, 2023
1 parent 1c83f52 commit 38b4853
Show file tree
Hide file tree
Showing 8 changed files with 44 additions and 16 deletions.
20 changes: 17 additions & 3 deletions docs/diagnostics/UsingFindElementByString.md
Original file line number Diff line number Diff line change
@@ -1,20 +1,30 @@
# Использование методов "НайтиПоНаименованию" и "НайтиПоКоду" (UsingFindElementByString)
# Использование методов "НайтиПоНаименованию", "НайтиПоКоду" и "НайтиПоНомеру" (UsingFindElementByString)

<!-- Блоки выше заполняются автоматически, не трогать -->
## Описание диагностики

Запрещено использовать методы поиска элементов "НайтиПоНаименованию" или "НайтиПоКоду".
Правило находит использование методов `НайтиПоНаименованию`, `НайтиПоКоду` или `НайтиПоНомеру` с указанием конкретных и
уникальных номеров, кодов и названий элементов или документов.
Скорее всего, подобный код не будет работать в других ИБ, что приведет к ошибкам выполнения.
Возможно, в финальный код попал тестовый код, что также не рекомендовано.

Константные значения данных из ИБ рекомендуется указывать в константах ИБ, предопределенных элементах метаданных.

## Примеры

Неправильно:
```bsl
Должность = Справочники.Должности.НайтиПоНаименованию("Ведущий бухгалтер");
```
или
```bsl
Должность = Справочники.Должности.НайтиПоКоду("00-0000001");
```

или

```bsl
Должность = Справочники.Должности.НайтиПоКоду("00-0000001");
ОбъектНазначения = Документы.ПередачаТоваровМеждуОрганизациями.НайтиПоНомеру("0000-000001", ТекущаяДата());
```

Допустимо использование:
Expand All @@ -24,3 +34,7 @@
```bsl
Справочники.КлассификаторБанков.НайтиПоКоду(СведенияОБанке.БИК);
```

```bsl
Документы.Реализация.НайтиПоНомеру(НомерДокумента);
```
2 changes: 1 addition & 1 deletion docs/en/diagnostics/UsingFindElementByString.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Using FindByName and FindByCode (UsingFindElementByString)
# Using FindByName, FindByCode and FindByNumber (UsingFindElementByString)

<!-- Блоки выше заполняются автоматически, не трогать -->
## Description
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
import com.github._1c_syntax.utils.CaseInsensitivePattern;
import org.antlr.v4.runtime.tree.ParseTree;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

@DiagnosticMetadata(
Expand All @@ -48,13 +47,13 @@
public class UsingFindElementByStringDiagnostic extends AbstractVisitorDiagnostic {

private final Pattern pattern = CaseInsensitivePattern.compile(
"(НайтиПоНаименованию|FindByDescription|НайтиПоКоду|FindByCode)"
"(НайтиПоНаименованию|FindByDescription|НайтиПоКоду|FindByCode|НайтиПоНомеру|FindByNumber)"
);

@Override
public ParseTree visitMethodCall(BSLParser.MethodCallContext ctx) {
Matcher matcher = pattern.matcher(ctx.methodName().getText());
if (matcher.find()) {
var matcher = pattern.matcher(ctx.methodName().getText());
if (matcher.matches()) {
BSLParser.CallParamContext param = ctx.doCall().callParamList().callParam().get(0);
if (param.children == null ||
param.getStart().getType() == BSLParser.STRING ||
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1947,13 +1947,13 @@
"$id": "#/definitions/UsingExternalCodeTools"
},
"UsingFindElementByString": {
"description": "Using FindByName and FindByCode",
"description": "Using FindByName, FindByCode and FindByNumber",
"default": true,
"type": [
"boolean",
"object"
],
"title": "Using FindByName and FindByCode",
"title": "Using FindByName, FindByCode and FindByNumber",
"$id": "#/definitions/UsingFindElementByString"
},
"UsingGoto": {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
diagnosticMessage=Don't use method "%s" and finding by string.
diagnosticName=Using FindByName and FindByCode
diagnosticName=Using FindByName, FindByCode and FindByNumber
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
diagnosticMessage=Не следует использовать метод "%s" и поиск по строке
diagnosticName=Использование методов "НайтиПоНаименованию" и "НайтиПоКоду"
diagnosticName=Использование методов "НайтиПоНаименованию", "НайтиПоКоду" и "НайтиПоНомеру"
Original file line number Diff line number Diff line change
Expand Up @@ -42,16 +42,17 @@ void runTest() {
List<Diagnostic> diagnostics = getDiagnostics();

// then
assertThat(diagnostics).hasSize(6);
assertThat(diagnostics).hasSize(9);
assertThat(diagnostics, true)
.hasRange(7, 38, 7, 78)
.hasRange(9, 40, 9, 61)
.hasRange(13, 27, 13, 59)
.hasRange(24, 35, 24, 53)
.hasRange(27, 35, 27, 51)
.hasRange(30, 27, 30, 53)
.hasRange(39, 67, 110)
.hasRange(41, 35, 53)
.hasRange(44, 29, 49)
;

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,18 @@
А = Справочники.Валюты.Функция(
Справочники.Валюты.НайтиПоНаименованию("777") // сработает
);
КонецПроцедуры
КонецПроцедуры

Процедура Тест3()

Наименование = "333"; // Пока не сработает
Значение = Документы.Реализация.НайтиПоНомеру(Наименование);

ОбъектНазначения = Документы.ПередачаТоваровМеждуОрганизациями.НайтиПоНомеру("0000-000001", ТекущаяДата()); // замечание

Значение3 = БизнесПроцессы.БП1.НайтиПоНомеру(333); // замечание

А = Документы.Реализация.Функция(
Документы.Реализация.НайтиПоНомеру("333") // замечание
);
КонецПроцедуры

0 comments on commit 38b4853

Please sign in to comment.