diff --git a/docs/diagnostics/UsingFindElementByString.md b/docs/diagnostics/UsingFindElementByString.md index 4acff08d202..52de8359277 100644 --- a/docs/diagnostics/UsingFindElementByString.md +++ b/docs/diagnostics/UsingFindElementByString.md @@ -1,20 +1,30 @@ -# Использование методов "НайтиПоНаименованию" и "НайтиПоКоду" (UsingFindElementByString) +# Использование методов "НайтиПоНаименованию", "НайтиПоКоду" и "НайтиПоНомеру" (UsingFindElementByString) ## Описание диагностики -Запрещено использовать методы поиска элементов "НайтиПоНаименованию" или "НайтиПоКоду". +Правило находит использование методов `НайтиПоНаименованию`, `НайтиПоКоду` или `НайтиПоНомеру` с указанием конкретных и +уникальных номеров, кодов и названий элементов или документов. +Скорее всего, подобный код не будет работать в других ИБ, что приведет к ошибкам выполнения. +Возможно, в финальный код попал тестовый код, что также не рекомендовано. + +Константные значения данных из ИБ рекомендуется указывать в константах ИБ, предопределенных элементах метаданных. ## Примеры +Неправильно: ```bsl Должность = Справочники.Должности.НайтиПоНаименованию("Ведущий бухгалтер"); ``` +или +```bsl +Должность = Справочники.Должности.НайтиПоКоду("00-0000001"); +``` или ```bsl -Должность = Справочники.Должности.НайтиПоКоду("00-0000001"); +ОбъектНазначения = Документы.ПередачаТоваровМеждуОрганизациями.НайтиПоНомеру("0000-000001", ТекущаяДата()); ``` Допустимо использование: @@ -24,3 +34,7 @@ ```bsl Справочники.КлассификаторБанков.НайтиПоКоду(СведенияОБанке.БИК); ``` + +```bsl +Документы.Реализация.НайтиПоНомеру(НомерДокумента); +``` diff --git a/docs/en/diagnostics/UsingFindElementByString.md b/docs/en/diagnostics/UsingFindElementByString.md index 56136068be1..0737366e318 100644 --- a/docs/en/diagnostics/UsingFindElementByString.md +++ b/docs/en/diagnostics/UsingFindElementByString.md @@ -1,4 +1,4 @@ -# Using FindByName and FindByCode (UsingFindElementByString) +# Using FindByName, FindByCode and FindByNumber (UsingFindElementByString) ## Description diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingFindElementByStringDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingFindElementByStringDiagnostic.java index 7414902952d..a27e32a0bb4 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingFindElementByStringDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingFindElementByStringDiagnostic.java @@ -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( @@ -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 || diff --git a/src/main/resources/com/github/_1c_syntax/bsl/languageserver/configuration/parameters-schema.json b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/configuration/parameters-schema.json index 9310767b6eb..731344ad533 100644 --- a/src/main/resources/com/github/_1c_syntax/bsl/languageserver/configuration/parameters-schema.json +++ b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/configuration/parameters-schema.json @@ -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": { diff --git a/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingFindElementByStringDiagnostic_en.properties b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingFindElementByStringDiagnostic_en.properties index 7f80282befe..06f19a2a603 100644 --- a/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingFindElementByStringDiagnostic_en.properties +++ b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingFindElementByStringDiagnostic_en.properties @@ -1,2 +1,2 @@ diagnosticMessage=Don't use method "%s" and finding by string. -diagnosticName=Using FindByName and FindByCode \ No newline at end of file +diagnosticName=Using FindByName, FindByCode and FindByNumber \ No newline at end of file diff --git a/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingFindElementByStringDiagnostic_ru.properties b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingFindElementByStringDiagnostic_ru.properties index 6ae96c597d6..476a7617437 100644 --- a/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingFindElementByStringDiagnostic_ru.properties +++ b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingFindElementByStringDiagnostic_ru.properties @@ -1,2 +1,2 @@ diagnosticMessage=Не следует использовать метод "%s" и поиск по строке -diagnosticName=Использование методов "НайтиПоНаименованию" и "НайтиПоКоду" \ No newline at end of file +diagnosticName=Использование методов "НайтиПоНаименованию", "НайтиПоКоду" и "НайтиПоНомеру" \ No newline at end of file diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingFindElementByStringDiagnosticTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingFindElementByStringDiagnosticTest.java index 617e91e0408..414745dfb23 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingFindElementByStringDiagnosticTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingFindElementByStringDiagnosticTest.java @@ -42,7 +42,7 @@ void runTest() { List diagnostics = getDiagnostics(); // then - assertThat(diagnostics).hasSize(6); + assertThat(diagnostics).hasSize(9); assertThat(diagnostics, true) .hasRange(7, 38, 7, 78) .hasRange(9, 40, 9, 61) @@ -50,8 +50,9 @@ void runTest() { .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) ; - } - } diff --git a/src/test/resources/diagnostics/UsingFindElementByStringDiagnostic.bsl b/src/test/resources/diagnostics/UsingFindElementByStringDiagnostic.bsl index 2f6d4784cac..8b0ac99391e 100644 --- a/src/test/resources/diagnostics/UsingFindElementByStringDiagnostic.bsl +++ b/src/test/resources/diagnostics/UsingFindElementByStringDiagnostic.bsl @@ -30,4 +30,18 @@ А = Справочники.Валюты.Функция( Справочники.Валюты.НайтиПоНаименованию("777") // сработает ); -КонецПроцедуры \ No newline at end of file +КонецПроцедуры + +Процедура Тест3() + + Наименование = "333"; // Пока не сработает + Значение = Документы.Реализация.НайтиПоНомеру(Наименование); + + ОбъектНазначения = Документы.ПередачаТоваровМеждуОрганизациями.НайтиПоНомеру("0000-000001", ТекущаяДата()); // замечание + + Значение3 = БизнесПроцессы.БП1.НайтиПоНомеру(333); // замечание + + А = Документы.Реализация.Функция( + Документы.Реализация.НайтиПоНомеру("333") // замечание + ); +КонецПроцедуры