1
0
mirror of https://github.com/1C-Company/v8-code-style.git synced 2025-12-01 17:10:47 +02:00

Включение проверки запросов в цикле, так как найден стандарт (#844)

* Включение проверки запросов в цикле, так как найден стандарт
* Описание проверки по стандарту 436
This commit is contained in:
Александр Капралов
2021-12-24 00:49:50 +03:00
committed by GitHub
parent a447dbd8b8
commit 5f736c7f8e
3 changed files with 92 additions and 2 deletions

View File

@@ -1,8 +1,54 @@
# Query in loop
It is recommended that you merge queries that address related data into a single query.
## Noncompliant Code Example
```bsl
// BanksToProcessing - contains an array of banks
InidividualQuery = New Query;
InidividualQuery.Text =
"SELECT
| BankAccounts.Ref AS Account
|FROM
| Catalog.BankAccounts AS BankAccounts
|WHERE
| BankAccounts.Bank = &Bank");
For Each Bank From BanksToProcess Do
InidividualQuery .SetParameter("Bank", Bank);
AccountsSelection = InidividualQuery .Execute().Select();
While AccountsSelection.Next() Do
ProcessBankAccounts(AccountsSelection.Account);
EndDo;
EndDo;
```
## Compliant Solution
```bsl
// BanksToProcess - contains an array of banks
MergedQuery = New Query;
MergedQuery.Text =
"SELECT
| BankAccounts.Ref AS Account
|FROM
| Catalog.BankAccounts AS BankAccounts
|WHERE
| BankAccounts.Bank B(&BanksToProcess)";
MergedQuery.SetParameter("BanksToProcess", BanksToProcess);
AccountsSelection = MergedQuery.Execute().Select();
While AccountsSelection.Next() Do
ProcessBankAccounts(AccountsSelection.Account);
EndDo;
```
## See
https://support.1ci.com/hc/en-us/articles/360011001620-Multiple-execution-of-the-similar-queries
https://support.1ci.com/hc/en-us/articles/360011001540-Rounding-arithmetic-results-in-queries

View File

@@ -1,9 +1,54 @@
# Запрос в цикле
Рекомендуется получать все необходимые однотипные данные одним запросом, вместо выполнения серии запросов.
## Неправильно
```bsl
// БанкиДляОбработки - содержит массив банков, счета в которых необходимо обработать
ЧастныйЗапрос = Новый Запрос;
ЧастныйЗапрос.Текст =
"ВЫБРАТЬ
| БанковскиеСчета.Ссылка КАК Счет
|ИЗ
| Справочник.БанковскиеСчета КАК БанковскиеСчета
|ГДЕ
| БанковскиеСчета.Банк = &Банк";
Для Каждого Банк Из БанкиДляОбработки Цикл
ЧастныйЗапрос.УстановитьПараметр("Банк", Банк);
ВыборкаСчетов = ЧастныйЗапрос.Выполнить().Выбрать();
Пока ВыборкаСчетов.Следующий() Цикл
ОбработатьСчетаВБанке(ВыборкаСчетов.Счет);
КонецЦикла;
КонецЦикла;
```
## Правильно
```bsl
// БанкиДляОбработки - содержит массив банков, счета в которых необходимо обработать
ОбщийЗапрос = Новый Запрос;
ОбщийЗапрос.Текст =
"ВЫБРАТЬ
| БанковскиеСчета.Ссылка КАК Счет
|ИЗ
| Справочник.БанковскиеСчета КАК БанковскиеСчета
|ГДЕ
| БанковскиеСчета.Банк В(&БанкиДляОбработки)";
ОбщийЗапрос.УстановитьПараметр("БанкиДляОбработки", БанкиДляОбработки);
ВыборкаСчетов = ОбщийЗапрос.Выполнить().Выбрать();
Пока ВыборкаСчетов.Следующий() Цикл
ОбработатьСчетаВБанке(ВыборкаСчетов.Счет);
КонецЦикла;
```
## См.
https://its.1c.ru/db/pubqlang#content:150:hdoc
https://its.1c.ru/db/v8std/content/436/hdoc
https://its.1c.ru/db/pubqlang#content:150:hdoc

View File

@@ -112,7 +112,6 @@ public class QueryInLoopCheck
//@formatter:off
builder.title(Messages.QueryInLoop_title)
.description(Messages.QueryInLoop_description)
.disable()
.complexity(CheckComplexity.NORMAL)
.severity(IssueSeverity.CRITICAL)
.issueType(IssueType.PERFORMANCE)