diff --git a/bundles/com.e1c.v8codestyle.bsl/markdown/query-in-loop.md b/bundles/com.e1c.v8codestyle.bsl/markdown/query-in-loop.md index 3f9b811b..46676a0b 100644 --- a/bundles/com.e1c.v8codestyle.bsl/markdown/query-in-loop.md +++ b/bundles/com.e1c.v8codestyle.bsl/markdown/query-in-loop.md @@ -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 diff --git a/bundles/com.e1c.v8codestyle.bsl/markdown/ru/query-in-loop.md b/bundles/com.e1c.v8codestyle.bsl/markdown/ru/query-in-loop.md index 5060dbda..41a22b1c 100644 --- a/bundles/com.e1c.v8codestyle.bsl/markdown/ru/query-in-loop.md +++ b/bundles/com.e1c.v8codestyle.bsl/markdown/ru/query-in-loop.md @@ -1,9 +1,54 @@ # Запрос в цикле +Рекомендуется получать все необходимые однотипные данные одним запросом, вместо выполнения серии запросов. + ## Неправильно +```bsl +// БанкиДляОбработки - содержит массив банков, счета в которых необходимо обработать + +ЧастныйЗапрос = Новый Запрос; +ЧастныйЗапрос.Текст = +"ВЫБРАТЬ +| БанковскиеСчета.Ссылка КАК Счет +|ИЗ +| Справочник.БанковскиеСчета КАК БанковскиеСчета +|ГДЕ +| БанковскиеСчета.Банк = &Банк"; + +Для Каждого Банк Из БанкиДляОбработки Цикл + ЧастныйЗапрос.УстановитьПараметр("Банк", Банк); + ВыборкаСчетов = ЧастныйЗапрос.Выполнить().Выбрать(); + Пока ВыборкаСчетов.Следующий() Цикл + ОбработатьСчетаВБанке(ВыборкаСчетов.Счет); + КонецЦикла; +КонецЦикла; +``` + ## Правильно +```bsl +// БанкиДляОбработки - содержит массив банков, счета в которых необходимо обработать + +ОбщийЗапрос = Новый Запрос; +ОбщийЗапрос.Текст = +"ВЫБРАТЬ +| БанковскиеСчета.Ссылка КАК Счет +|ИЗ +| Справочник.БанковскиеСчета КАК БанковскиеСчета +|ГДЕ +| БанковскиеСчета.Банк В(&БанкиДляОбработки)"; + +ОбщийЗапрос.УстановитьПараметр("БанкиДляОбработки", БанкиДляОбработки); + +ВыборкаСчетов = ОбщийЗапрос.Выполнить().Выбрать(); +Пока ВыборкаСчетов.Следующий() Цикл + ОбработатьСчетаВБанке(ВыборкаСчетов.Счет); +КонецЦикла; +``` + ## См. -https://its.1c.ru/db/pubqlang#content:150:hdoc \ No newline at end of file +https://its.1c.ru/db/v8std/content/436/hdoc + +https://its.1c.ru/db/pubqlang#content:150:hdoc diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/QueryInLoopCheck.java b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/QueryInLoopCheck.java index 4d065614..4c46902a 100644 --- a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/QueryInLoopCheck.java +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/QueryInLoopCheck.java @@ -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)