From 8fc4ef8a0067226da98c3b6a0f97bede07765e32 Mon Sep 17 00:00:00 2001 From: levon444 Date: Fri, 2 May 2025 12:01:05 +0400 Subject: [PATCH 01/12] =?UTF-8?q?=D0=97=D0=B0=D1=84=D0=B8=D0=BA=D1=81?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BB=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=88=D0=B0=D0=B1=D0=BB?= =?UTF-8?q?=D0=BE=D0=BD=D0=BD=D1=8B=D1=85=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/diagnostics/QueryNestedFieldsByDot.md | 16 ++++++++++++ docs/en/diagnostics/QueryNestedFieldsByDot.md | 16 ++++++++++++ .../QueryNestedFieldsByDotDiagnostic.java | 21 ++++++++++++++++ ...yNestedFieldsByDotDiagnostic_en.properties | 2 ++ ...yNestedFieldsByDotDiagnostic_ru.properties | 2 ++ .../QueryNestedFieldsByDotDiagnosticTest.java | 25 +++++++++++++++++++ .../QueryNestedFieldsByDotDiagnostic.bsl | 1 + 7 files changed, 83 insertions(+) create mode 100644 docs/diagnostics/QueryNestedFieldsByDot.md create mode 100644 docs/en/diagnostics/QueryNestedFieldsByDot.md create mode 100644 src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic.java create mode 100644 src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic_en.properties create mode 100644 src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic_ru.properties create mode 100644 src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnosticTest.java create mode 100644 src/test/resources/diagnostics/QueryNestedFieldsByDotDiagnostic.bsl diff --git a/docs/diagnostics/QueryNestedFieldsByDot.md b/docs/diagnostics/QueryNestedFieldsByDot.md new file mode 100644 index 00000000000..b7f69fe1632 --- /dev/null +++ b/docs/diagnostics/QueryNestedFieldsByDot.md @@ -0,0 +1,16 @@ +# (QueryNestedFieldsByDot) + + +## Описание диагностики + + +## Примеры + + +## Источники + + diff --git a/docs/en/diagnostics/QueryNestedFieldsByDot.md b/docs/en/diagnostics/QueryNestedFieldsByDot.md new file mode 100644 index 00000000000..7d8189b9721 --- /dev/null +++ b/docs/en/diagnostics/QueryNestedFieldsByDot.md @@ -0,0 +1,16 @@ +# (QueryNestedFieldsByDot) + + +## Description + + +## Examples + + +## Sources + + diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic.java new file mode 100644 index 00000000000..0f489e219dc --- /dev/null +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic.java @@ -0,0 +1,21 @@ +package com.github._1c_syntax.bsl.languageserver.diagnostics; + +import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticMetadata; +import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticSeverity; +import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticTag; +import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticType; + +@DiagnosticMetadata( + type = DiagnosticType.CODE_SMELL, + severity = DiagnosticSeverity.INFO, + minutesToFix = 1, + tags = { + DiagnosticTag.SQL, + DiagnosticTag.PERFOMANCE, + DiagnosticTag.DESIGN + } + +) +public class QueryNestedFieldsByDotDiagnostic extends AbstractVisitorDiagnostic { + +} diff --git a/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic_en.properties b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic_en.properties new file mode 100644 index 00000000000..66831715dfd --- /dev/null +++ b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic_en.properties @@ -0,0 +1,2 @@ +diagnosticMessage= +diagnosticName= diff --git a/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic_ru.properties b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic_ru.properties new file mode 100644 index 00000000000..40188ca542c --- /dev/null +++ b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic_ru.properties @@ -0,0 +1,2 @@ +diagnosticMessage=<Сообщение> +diagnosticName=<Имя диагностики> diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnosticTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnosticTest.java new file mode 100644 index 00000000000..46e4e1bd49e --- /dev/null +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnosticTest.java @@ -0,0 +1,25 @@ +package com.github._1c_syntax.bsl.languageserver.diagnostics; + +import org.eclipse.lsp4j.Diagnostic; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static com.github._1c_syntax.bsl.languageserver.util.Assertions.assertThat; + +class QueryNestedFieldsByDotDiagnosticTest extends AbstractDiagnosticTest { + QueryNestedFieldsByDotDiagnosticTest() { + super(QueryNestedFieldsByDotDiagnostic.class); + } + + @Test + void test() { + + List diagnostics = getDiagnostics(); + + assertThat(diagnostics).hasSize(1); + assertThat(diagnostics, true) + .hasRange(6, 0, 6, 20); + + } +} diff --git a/src/test/resources/diagnostics/QueryNestedFieldsByDotDiagnostic.bsl b/src/test/resources/diagnostics/QueryNestedFieldsByDotDiagnostic.bsl new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/src/test/resources/diagnostics/QueryNestedFieldsByDotDiagnostic.bsl @@ -0,0 +1 @@ + From 08db7f21ad0d0a89b8dcf3fa4bcc5ea33c5a715e Mon Sep 17 00:00:00 2001 From: levon444 Date: Sat, 3 May 2025 09:13:01 +0400 Subject: [PATCH 02/12] =?UTF-8?q?=D0=9E=D1=82=D0=BB=D0=B0=D0=B6=D0=B5?= =?UTF-8?q?=D0=BD=20=D1=84=D0=B0=D0=B9=D0=BB=20=D1=81=20=D1=82=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D0=BE=D0=B2=D1=8B=D0=BC=20=D0=BA=D0=BE=D0=B4=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../QueryNestedFieldsByDotDiagnostic.bsl | 142 ++++++++++++++++++ 1 file changed, 142 insertions(+) diff --git a/src/test/resources/diagnostics/QueryNestedFieldsByDotDiagnostic.bsl b/src/test/resources/diagnostics/QueryNestedFieldsByDotDiagnostic.bsl index 8b137891791..628ce3fc113 100644 --- a/src/test/resources/diagnostics/QueryNestedFieldsByDotDiagnostic.bsl +++ b/src/test/resources/diagnostics/QueryNestedFieldsByDotDiagnostic.bsl @@ -1 +1,143 @@ + //Проверяемые кейсы: + + //1.Базовое разыменование ссылочных полей в выборке (во временную таблицу или в результат запроса) Должна зафиксироваться ошибка + //2.Разыменование ссылочных полей в соединениях таблиц (Должна зафиксироваться ошибка) + //3.Разыменование ссылочных полей в виртуальных таблиц (Должна зафиксироваться ошибка) + //4.Агрегатные и иные функции над полем (Не должна фиксироваться ошибка) + //5.Конструкция "ВЫРАЗИТЬ" без разыменования итогового поля (Не должна фиксироваться ошибка) + //6.Конструкция "ВЫРАЗИТЬ" с разыменованием итогового поля (Должна фиксироваться ошибка) + //7.Разыменование ссылочных полей в секции "ГДЕ" (Должна фиксироваться ошибка) + + Процедура ПолучениеДанныхЗаказовКлиентов() + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ЗаказКлиентаТовары.Ссылка КАК Ссылка, + | ЗаказКлиентаТовары.Номенклатура КАК Номенклатура, + | ЗаказКлиентаТовары.Характеристика КАК Характеристика, + | ЗаказКлиентаТовары.Упаковка КАК Упаковка, + | ЗаказКлиентаТовары.Серия КАК Серия, + | ЗаказКлиентаТовары.Подразделение КАК Подразделение, + | ЗаказКлиентаТовары.Ссылка.Организация КАК Организация, //Ошибка №1 + | ЗаказКлиентаТовары.Ссылка.Контрагент КАК Контрагент, //Ошибка №1 + | ЗаказКлиентаТовары.Ссылка.Партнер КАК Партнер, //Ошибка №1 + | ЗаказКлиентаТовары.Ссылка.ОбъектРасчетов КАК ОбъектРасчетов //Ошибка №1 + |ПОМЕСТИТЬ ВТ_ДанныеЗаказовКлиента + |ИЗ + | Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары + |ГДЕ + | ЗаказКлиентаТовары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода //Ошибка №7 + | + |ИНДЕКСИРОВАТЬ ПО + | Контрагент, + | Партнер, + | ОбъектРасчетов, + | Организация + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | РасчетыСКлиентамиОбороты.АналитикаУчетаПоПартнерам КАК АналитикаУчетаПоПартнерам, + | РасчетыСКлиентамиОбороты.ОбъектРасчетов КАК ОбъектРасчетов, + | РасчетыСКлиентамиОбороты.Валюта КАК Валюта, + | РасчетыСКлиентамиОбороты.СуммаОборот КАК СуммаОборот, + | РасчетыСКлиентамиОбороты.КОплатеОборот КАК КОплатеОборот, + | РасчетыСКлиентамиОбороты.КОтгрузкеОборот КАК КОтгрузкеОборот, + | РасчетыСКлиентамиОбороты.ОтгружаетсяОборот КАК ОтгружаетсяОборот + |ПОМЕСТИТЬ ВТ_РасчетыСКлиентами + |ИЗ + | РегистрНакопления.РасчетыСКлиентами.Обороты( + | , + | , + | , + | (АналитикаУчетаПоПартнерам.Партнер, АналитикаУчетаПоПартнерам.Контрагент, АналитикаУчетаПоПартнерам.Организация //Ошибка №3 + |, ОбъектРасчетов) В + | (ВЫБРАТЬ + | ВТ_ДанныеЗаказовКлиента.Партнер КАК Партнер, + | ВТ_ДанныеЗаказовКлиента.Контрагент КАК Контрагент, + | ВТ_ДанныеЗаказовКлиента.Организация КАК Организация, + | ВТ_ДанныеЗаказовКлиента.ОбъектРасчетов КАК ОбъектРасчетов + | ИЗ + | ВТ_ДанныеЗаказовКлиента КАК ВТ_ДанныеЗаказовКлиента)) КАК РасчетыСКлиентамиОбороты + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | РасчетыСКлиентамиПланОтгрузокОбороты.АналитикаУчетаПоПартнерам КАК АналитикаУчетаПоПартнерам, + | РасчетыСКлиентамиПланОтгрузокОбороты.ОбъектРасчетов КАК ОбъектРасчетов, + | РасчетыСКлиентамиПланОтгрузокОбороты.ДокументПлан КАК ДокументПлан, + | РасчетыСКлиентамиПланОтгрузокОбороты.Валюта КАК Валюта, + | РасчетыСКлиентамиПланОтгрузокОбороты.СуммаОборот КАК СуммаОборот + |ПОМЕСТИТЬ ВТ_ПланОтгрузок + |ИЗ + | РегистрНакопления.РасчетыСКлиентамиПланОтгрузок.Обороты( + | , + | , + | , + | (ДокументПлан, ОбъектРасчетов) В + | (ВЫБРАТЬ + | ВТ_ДанныеЗаказовКлиента.Ссылка КАК Ссылка, + | ВТ_ДанныеЗаказовКлиента.ОбъектРасчетов КАК ОбъектРасчетов + | ИЗ + | ВТ_ДанныеЗаказовКлиента КАК ВТ_ДанныеЗаказовКлиента)) КАК РасчетыСКлиентамиПланОтгрузокОбороты + |; + | + // + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВТ_РасчетыСКлиентами.АналитикаУчетаПоПартнерам КАК АналитикаУчетаПоПартнерам, + | ВТ_РасчетыСКлиентами.ОбъектРасчетов КАК ОбъектРасчетов, + | ВТ_РасчетыСКлиентами.Валюта КАК Валюта, + | ВТ_РасчетыСКлиентами.СуммаОборот КАК СуммаОборот, + | ВТ_РасчетыСКлиентами.КОплатеОборот КАК КОплатеОборот, + | ВТ_РасчетыСКлиентами.КОтгрузкеОборот КАК КОтгрузкеОборот, + | ВТ_РасчетыСКлиентами.ОтгружаетсяОборот КАК ОтгружаетсяОборот, + | ВТ_ДанныеЗаказовКлиента.Номенклатура КАК Номенклатура, + | ВТ_ДанныеЗаказовКлиента.Характеристика КАК Характеристика, + | ВТ_ДанныеЗаказовКлиента.Упаковка КАК Упаковка, + | ЕСТЬNULL(ВТ_ДанныеЗаказовКлиента.Ссылка, ЗНАЧЕНИЕ(Документ.ЗаказКлиента.ПустаяСсылка)) КАК ЗаказКлиента //Контроль отсутствия ошибки, условие №4 + |ПОМЕСТИТЬ ВТ_РасчетыСКлиентамиРасш + |ИЗ + | ВТ_РасчетыСКлиентами КАК ВТ_РасчетыСКлиентами + | ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ДанныеЗаказовКлиента КАК ВТ_ДанныеЗаказовКлиента + | ПО ВТ_РасчетыСКлиентами.АналитикаУчетаПоПартнерам.Партнер = ВТ_ДанныеЗаказовКлиента.Партнер //Ошибка №2 + | И ВТ_РасчетыСКлиентами.АналитикаУчетаПоПартнерам.Контрагент = ВТ_ДанныеЗаказовКлиента.Контрагент //Ошибка №2 + | И ВТ_РасчетыСКлиентами.АналитикаУчетаПоПартнерам.Организация = ВТ_ДанныеЗаказовКлиента.Организация //Ошибка №2 + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВТ_РасчетыСКлиентамиРасш.АналитикаУчетаПоПартнерам КАК АналитикаУчетаПоПартнерам, + | ВТ_РасчетыСКлиентамиРасш.ОбъектРасчетов КАК ОбъектРасчетов, + | ВТ_РасчетыСКлиентамиРасш.ЗаказКлиента КАК ЗаказКлиента, + | ВТ_РасчетыСКлиентамиРасш.Номенклатура КАК Номенклатура, + | ВТ_РасчетыСКлиентамиРасш.Характеристика КАК Характеристика, + | ВТ_РасчетыСКлиентамиРасш.Упаковка КАК Упаковка, + | ВЫРАЗИТЬ(ВТ_ПланОтгрузок.ДокументПлан КАК Документ.ЗаказКлиента).Валюта КАК ВалютаДокумента, //Контроль отсутствия ошибки, условие №5 + | ВЫРАЗИТЬ(ВТ_ПланОтгрузок.ДокументПлан КАК Документ.ЗаказКлиента).Валюта.Наценка КАК НаценкаВалюыДокумента //Ошибка №6 + |ИЗ + | ВТ_РасчетыСКлиентамиРасш КАК ВТ_РасчетыСКлиентамиРасш + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ПланОтгрузок КАК ВТ_ПланОтгрузок + | ПО ВТ_РасчетыСКлиентамиРасш.АналитикаУчетаПоПартнерам = ВТ_ПланОтгрузок.АналитикаУчетаПоПартнерам + | И ВТ_РасчетыСКлиентамиРасш.ОбъектРасчетов = ВТ_ПланОтгрузок.ОбъектРасчетов + | И ВТ_РасчетыСКлиентамиРасш.ЗаказКлиента = ВТ_ПланОтгрузок.ДокументПлан"; + + Запрос.УстановитьПараметр("КонецПериода", КонецГода(ТекущаяДата())); + Запрос.УстановитьПараметр("НачалоПериода", НачалоГода(ТекущаяДата())); + + РезультатЗапроса = Запрос.Выполнить().Выгрузить(); + + КонецПроцедуры; + + //Итоговое ожидаемое количество срабатываний: + //Номер тест кейса | Число срабатываний + // №1 | 4 + // №2 | 3 + // №3 | 3 + // №4 | 0 + // №5 | 0 + // №6 | 1 + // №7 | 1 + //Итого: 12 From 645af07b824cd4657eebf4db0281e6df4b5eb10e Mon Sep 17 00:00:00 2001 From: levon444 Date: Sat, 3 May 2025 15:56:20 +0400 Subject: [PATCH 03/12] =?UTF-8?q?=D0=92=20=D1=82=D0=B5=D1=81=D1=82=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BA?= =?UTF-8?q?=D0=B5=D0=B9=D1=81=D1=8B=20=D1=81=D1=80=D0=B0=D0=B1=D0=B0=D1=82?= =?UTF-8?q?=D1=8B=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=BD=D0=B0=20=D0=B2?= =?UTF-8?q?=D0=B8=D1=80=D1=82=D1=83=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D1=85=20?= =?UTF-8?q?=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../QueryNestedFieldsByDotDiagnostic.bsl | 277 +++++++++--------- 1 file changed, 144 insertions(+), 133 deletions(-) diff --git a/src/test/resources/diagnostics/QueryNestedFieldsByDotDiagnostic.bsl b/src/test/resources/diagnostics/QueryNestedFieldsByDotDiagnostic.bsl index 628ce3fc113..f8f03329a69 100644 --- a/src/test/resources/diagnostics/QueryNestedFieldsByDotDiagnostic.bsl +++ b/src/test/resources/diagnostics/QueryNestedFieldsByDotDiagnostic.bsl @@ -1,143 +1,154 @@ - //Проверяемые кейсы: +//Проверяемые кейсы: - //1.Базовое разыменование ссылочных полей в выборке (во временную таблицу или в результат запроса) Должна зафиксироваться ошибка - //2.Разыменование ссылочных полей в соединениях таблиц (Должна зафиксироваться ошибка) - //3.Разыменование ссылочных полей в виртуальных таблиц (Должна зафиксироваться ошибка) - //4.Агрегатные и иные функции над полем (Не должна фиксироваться ошибка) - //5.Конструкция "ВЫРАЗИТЬ" без разыменования итогового поля (Не должна фиксироваться ошибка) - //6.Конструкция "ВЫРАЗИТЬ" с разыменованием итогового поля (Должна фиксироваться ошибка) - //7.Разыменование ссылочных полей в секции "ГДЕ" (Должна фиксироваться ошибка) +//1.Базовое разыменование ссылочных полей в выборке (во временную таблицу или в результат запроса) Должна зафиксироваться ошибка +//2.Разыменование ссылочных полей в соединениях таблиц (Должна зафиксироваться ошибка) +//3.Разыменование ссылочных полей в виртуальных таблиц (Должна зафиксироваться ошибка) +//4.Агрегатные и иные функции над полем (Не должна фиксироваться ошибка) +//5.Конструкция "ВЫРАЗИТЬ" без разыменования итогового поля (Не должна фиксироваться ошибка) +//6.Конструкция "ВЫРАЗИТЬ" с разыменованием итогового поля (Должна фиксироваться ошибка) +//7.Разыменование ссылочных полей в секции "ГДЕ" (Должна фиксироваться ошибка) - Процедура ПолучениеДанныхЗаказовКлиентов() +Процедура ПолучениеДанныхЗаказовКлиентов() - Запрос = Новый Запрос; - Запрос.Текст = + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ЗаказКлиентаТовары.Ссылка КАК Ссылка, + | ЗаказКлиентаТовары.Номенклатура КАК Номенклатура, + | ЗаказКлиентаТовары.Характеристика КАК Характеристика, + | ЗаказКлиентаТовары.Упаковка КАК Упаковка, + | ЗаказКлиентаТовары.Серия КАК Серия, + | ЗаказКлиентаТовары.Подразделение КАК Подразделение, + | ЗаказКлиентаТовары.Ссылка.Организация КАК Организация, + | ЗаказКлиентаТовары.Ссылка.Контрагент КАК Контрагент, + | ЗаказКлиентаТовары.Ссылка.Партнер КАК Партнер, + | ЗаказКлиентаТовары.Ссылка.ОбъектРасчетов КАК ОбъектРасчетов + |ПОМЕСТИТЬ ВТ_ДанныеЗаказовКлиента + |ИЗ + | Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары + |ГДЕ + | ЗаказКлиентаТовары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода + | + |ИНДЕКСИРОВАТЬ ПО + | Контрагент, + | Партнер, + | ОбъектРасчетов, + | Организация + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | РасчетыСКлиентамиОбороты.АналитикаУчетаПоПартнерам КАК АналитикаУчетаПоПартнерам, + | РасчетыСКлиентамиОбороты.ОбъектРасчетов КАК ОбъектРасчетов, + | РасчетыСКлиентамиОбороты.Валюта КАК Валюта, + | РасчетыСКлиентамиОбороты.СуммаОборот КАК СуммаОборот, + | РасчетыСКлиентамиОбороты.КОплатеОборот КАК КОплатеОборот, + | РасчетыСКлиентамиОбороты.КОтгрузкеОборот КАК КОтгрузкеОборот, + | РасчетыСКлиентамиОбороты.ОтгружаетсяОборот КАК ОтгружаетсяОборот + |ПОМЕСТИТЬ ВТ_РасчетыСКлиентами + |ИЗ + | РегистрНакопления.РасчетыСКлиентами.Обороты( + | &НачалоПериода, + | &КонецПериода, + | , + | (АналитикаУчетаПоПартнерам.Партнер, АналитикаУчетаПоПартнерам.Контрагент, АналитикаУчетаПоПартнерам.Организация, ОбъектРасчетов) В + | (ВЫБРАТЬ + | ВТ_ДанныеЗаказовКлиента.Партнер КАК Партнер, + | ВТ_ДанныеЗаказовКлиента.Контрагент КАК Контрагент, + | ВТ_ДанныеЗаказовКлиента.Организация КАК Организация, + | ВТ_ДанныеЗаказовКлиента.ОбъектРасчетов КАК ОбъектРасчетов + | ИЗ + | ВТ_ДанныеЗаказовКлиента КАК ВТ_ДанныеЗаказовКлиента)) КАК РасчетыСКлиентамиОбороты + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | РасчетыСКлиентамиПланОтгрузокОбороты.АналитикаУчетаПоПартнерам КАК АналитикаУчетаПоПартнерам, + | РасчетыСКлиентамиПланОтгрузокОбороты.ОбъектРасчетов КАК ОбъектРасчетов, + | РасчетыСКлиентамиПланОтгрузокОбороты.ДокументПлан КАК ДокументПлан, + | РасчетыСКлиентамиПланОтгрузокОбороты.Валюта КАК Валюта, + | РасчетыСКлиентамиПланОтгрузокОбороты.СуммаОборот КАК СуммаОборот + |ПОМЕСТИТЬ ВТ_ПланОтгрузок + |ИЗ + | РегистрНакопления.РасчетыСКлиентамиПланОтгрузок.Обороты( + | &НачалоПериода, + | &КонецПериода, + | , + | (ДокументПлан, ОбъектРасчетов) В + | (ВЫБРАТЬ + | ВТ_ДанныеЗаказовКлиента.Ссылка КАК Ссылка, + | ВТ_ДанныеЗаказовКлиента.ОбъектРасчетов КАК ОбъектРасчетов + | ИЗ + | ВТ_ДанныеЗаказовКлиента КАК ВТ_ДанныеЗаказовКлиента)) КАК РасчетыСКлиентамиПланОтгрузокОбороты + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВТ_РасчетыСКлиентами.АналитикаУчетаПоПартнерам КАК АналитикаУчетаПоПартнерам, + | ВТ_РасчетыСКлиентами.ОбъектРасчетов КАК ОбъектРасчетов, + | ВТ_РасчетыСКлиентами.Валюта КАК Валюта, + | ВТ_РасчетыСКлиентами.СуммаОборот КАК СуммаОборот, + | ВТ_РасчетыСКлиентами.КОплатеОборот КАК КОплатеОборот, + | ВТ_РасчетыСКлиентами.КОтгрузкеОборот КАК КОтгрузкеОборот, + | ВТ_РасчетыСКлиентами.ОтгружаетсяОборот КАК ОтгружаетсяОборот, + | ВТ_ДанныеЗаказовКлиента.Номенклатура КАК Номенклатура, + | ВТ_ДанныеЗаказовКлиента.Характеристика КАК Характеристика, + | ВТ_ДанныеЗаказовКлиента.Упаковка КАК Упаковка, + | ЕСТЬNULL(ВТ_ДанныеЗаказовКлиента.Ссылка, ЗНАЧЕНИЕ(Документ.ЗаказКлиента.ПустаяСсылка)) КАК ЗаказКлиента + |ПОМЕСТИТЬ ВТ_РасчетыСКлиентамиРасш + |ИЗ + | ВТ_РасчетыСКлиентами КАК ВТ_РасчетыСКлиентами + | ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ДанныеЗаказовКлиента КАК ВТ_ДанныеЗаказовКлиента + | ПО ВТ_РасчетыСКлиентами.АналитикаУчетаПоПартнерам.Партнер = ВТ_ДанныеЗаказовКлиента.Партнер + | И ВТ_РасчетыСКлиентами.АналитикаУчетаПоПартнерам.Контрагент = ВТ_ДанныеЗаказовКлиента.Контрагент + | И ВТ_РасчетыСКлиентами.АналитикаУчетаПоПартнерам.Организация = ВТ_ДанныеЗаказовКлиента.Организация + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ВТ_РасчетыСКлиентамиРасш.АналитикаУчетаПоПартнерам КАК АналитикаУчетаПоПартнерам, + | ВТ_РасчетыСКлиентамиРасш.ОбъектРасчетов КАК ОбъектРасчетов, + | ВТ_РасчетыСКлиентамиРасш.ЗаказКлиента КАК ЗаказКлиента, + | ВТ_РасчетыСКлиентамиРасш.Номенклатура КАК Номенклатура, + | ВТ_РасчетыСКлиентамиРасш.Характеристика КАК Характеристика, + | ВТ_РасчетыСКлиентамиРасш.Упаковка КАК Упаковка, + | ВЫРАЗИТЬ(ВТ_ПланОтгрузок.ДокументПлан КАК Документ.ЗаказКлиента).Валюта КАК ВалютаДокумента, + | ВЫРАЗИТЬ(ВТ_ПланОтгрузок.ДокументПлан КАК Документ.ЗаказКлиента).Валюта.Наценка КАК НаценкаВалюыДокумента + |ИЗ + | ВТ_РасчетыСКлиентамиРасш КАК ВТ_РасчетыСКлиентамиРасш + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ПланОтгрузок КАК ВТ_ПланОтгрузок + | ПО ВТ_РасчетыСКлиентамиРасш.АналитикаУчетаПоПартнерам = ВТ_ПланОтгрузок.АналитикаУчетаПоПартнерам + | И ВТ_РасчетыСКлиентамиРасш.ОбъектРасчетов = ВТ_ПланОтгрузок.ОбъектРасчетов + | И ВТ_РасчетыСКлиентамиРасш.ЗаказКлиента = ВТ_ПланОтгрузок.ДокументПлан"; + + Запрос.УстановитьПараметр("КонецПериода", КонецГода(ТекущаяДата())); + Запрос.УстановитьПараметр("НачалоПериода", НачалоГода(ТекущаяДата())); + + РезультатЗапроса = Запрос.Выполнить().Выгрузить(); + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ - | ЗаказКлиентаТовары.Ссылка КАК Ссылка, - | ЗаказКлиентаТовары.Номенклатура КАК Номенклатура, - | ЗаказКлиентаТовары.Характеристика КАК Характеристика, - | ЗаказКлиентаТовары.Упаковка КАК Упаковка, - | ЗаказКлиентаТовары.Серия КАК Серия, - | ЗаказКлиентаТовары.Подразделение КАК Подразделение, - | ЗаказКлиентаТовары.Ссылка.Организация КАК Организация, //Ошибка №1 - | ЗаказКлиентаТовары.Ссылка.Контрагент КАК Контрагент, //Ошибка №1 - | ЗаказКлиентаТовары.Ссылка.Партнер КАК Партнер, //Ошибка №1 - | ЗаказКлиентаТовары.Ссылка.ОбъектРасчетов КАК ОбъектРасчетов //Ошибка №1 - |ПОМЕСТИТЬ ВТ_ДанныеЗаказовКлиента - |ИЗ - | Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары - |ГДЕ - | ЗаказКлиентаТовары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода //Ошибка №7 - | - |ИНДЕКСИРОВАТЬ ПО - | Контрагент, - | Партнер, - | ОбъектРасчетов, - | Организация - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | РасчетыСКлиентамиОбороты.АналитикаУчетаПоПартнерам КАК АналитикаУчетаПоПартнерам, - | РасчетыСКлиентамиОбороты.ОбъектРасчетов КАК ОбъектРасчетов, - | РасчетыСКлиентамиОбороты.Валюта КАК Валюта, - | РасчетыСКлиентамиОбороты.СуммаОборот КАК СуммаОборот, - | РасчетыСКлиентамиОбороты.КОплатеОборот КАК КОплатеОборот, - | РасчетыСКлиентамиОбороты.КОтгрузкеОборот КАК КОтгрузкеОборот, - | РасчетыСКлиентамиОбороты.ОтгружаетсяОборот КАК ОтгружаетсяОборот - |ПОМЕСТИТЬ ВТ_РасчетыСКлиентами - |ИЗ - | РегистрНакопления.РасчетыСКлиентами.Обороты( - | , - | , - | , - | (АналитикаУчетаПоПартнерам.Партнер, АналитикаУчетаПоПартнерам.Контрагент, АналитикаУчетаПоПартнерам.Организация //Ошибка №3 - |, ОбъектРасчетов) В - | (ВЫБРАТЬ - | ВТ_ДанныеЗаказовКлиента.Партнер КАК Партнер, - | ВТ_ДанныеЗаказовКлиента.Контрагент КАК Контрагент, - | ВТ_ДанныеЗаказовКлиента.Организация КАК Организация, - | ВТ_ДанныеЗаказовКлиента.ОбъектРасчетов КАК ОбъектРасчетов - | ИЗ - | ВТ_ДанныеЗаказовКлиента КАК ВТ_ДанныеЗаказовКлиента)) КАК РасчетыСКлиентамиОбороты - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | РасчетыСКлиентамиПланОтгрузокОбороты.АналитикаУчетаПоПартнерам КАК АналитикаУчетаПоПартнерам, - | РасчетыСКлиентамиПланОтгрузокОбороты.ОбъектРасчетов КАК ОбъектРасчетов, - | РасчетыСКлиентамиПланОтгрузокОбороты.ДокументПлан КАК ДокументПлан, - | РасчетыСКлиентамиПланОтгрузокОбороты.Валюта КАК Валюта, - | РасчетыСКлиентамиПланОтгрузокОбороты.СуммаОборот КАК СуммаОборот - |ПОМЕСТИТЬ ВТ_ПланОтгрузок - |ИЗ - | РегистрНакопления.РасчетыСКлиентамиПланОтгрузок.Обороты( - | , - | , - | , - | (ДокументПлан, ОбъектРасчетов) В - | (ВЫБРАТЬ - | ВТ_ДанныеЗаказовКлиента.Ссылка КАК Ссылка, - | ВТ_ДанныеЗаказовКлиента.ОбъектРасчетов КАК ОбъектРасчетов - | ИЗ - | ВТ_ДанныеЗаказовКлиента КАК ВТ_ДанныеЗаказовКлиента)) КАК РасчетыСКлиентамиПланОтгрузокОбороты - |; - | - // - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | ВТ_РасчетыСКлиентами.АналитикаУчетаПоПартнерам КАК АналитикаУчетаПоПартнерам, - | ВТ_РасчетыСКлиентами.ОбъектРасчетов КАК ОбъектРасчетов, - | ВТ_РасчетыСКлиентами.Валюта КАК Валюта, - | ВТ_РасчетыСКлиентами.СуммаОборот КАК СуммаОборот, - | ВТ_РасчетыСКлиентами.КОплатеОборот КАК КОплатеОборот, - | ВТ_РасчетыСКлиентами.КОтгрузкеОборот КАК КОтгрузкеОборот, - | ВТ_РасчетыСКлиентами.ОтгружаетсяОборот КАК ОтгружаетсяОборот, - | ВТ_ДанныеЗаказовКлиента.Номенклатура КАК Номенклатура, - | ВТ_ДанныеЗаказовКлиента.Характеристика КАК Характеристика, - | ВТ_ДанныеЗаказовКлиента.Упаковка КАК Упаковка, - | ЕСТЬNULL(ВТ_ДанныеЗаказовКлиента.Ссылка, ЗНАЧЕНИЕ(Документ.ЗаказКлиента.ПустаяСсылка)) КАК ЗаказКлиента //Контроль отсутствия ошибки, условие №4 - |ПОМЕСТИТЬ ВТ_РасчетыСКлиентамиРасш - |ИЗ - | ВТ_РасчетыСКлиентами КАК ВТ_РасчетыСКлиентами - | ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ДанныеЗаказовКлиента КАК ВТ_ДанныеЗаказовКлиента - | ПО ВТ_РасчетыСКлиентами.АналитикаУчетаПоПартнерам.Партнер = ВТ_ДанныеЗаказовКлиента.Партнер //Ошибка №2 - | И ВТ_РасчетыСКлиентами.АналитикаУчетаПоПартнерам.Контрагент = ВТ_ДанныеЗаказовКлиента.Контрагент //Ошибка №2 - | И ВТ_РасчетыСКлиентами.АналитикаУчетаПоПартнерам.Организация = ВТ_ДанныеЗаказовКлиента.Организация //Ошибка №2 - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | ВТ_РасчетыСКлиентамиРасш.АналитикаУчетаПоПартнерам КАК АналитикаУчетаПоПартнерам, - | ВТ_РасчетыСКлиентамиРасш.ОбъектРасчетов КАК ОбъектРасчетов, - | ВТ_РасчетыСКлиентамиРасш.ЗаказКлиента КАК ЗаказКлиента, - | ВТ_РасчетыСКлиентамиРасш.Номенклатура КАК Номенклатура, - | ВТ_РасчетыСКлиентамиРасш.Характеристика КАК Характеристика, - | ВТ_РасчетыСКлиентамиРасш.Упаковка КАК Упаковка, - | ВЫРАЗИТЬ(ВТ_ПланОтгрузок.ДокументПлан КАК Документ.ЗаказКлиента).Валюта КАК ВалютаДокумента, //Контроль отсутствия ошибки, условие №5 - | ВЫРАЗИТЬ(ВТ_ПланОтгрузок.ДокументПлан КАК Документ.ЗаказКлиента).Валюта.Наценка КАК НаценкаВалюыДокумента //Ошибка №6 + | КурсыВалютСрезПоследних.Курс КАК Курс |ИЗ - | ВТ_РасчетыСКлиентамиРасш КАК ВТ_РасчетыСКлиентамиРасш - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ПланОтгрузок КАК ВТ_ПланОтгрузок - | ПО ВТ_РасчетыСКлиентамиРасш.АналитикаУчетаПоПартнерам = ВТ_ПланОтгрузок.АналитикаУчетаПоПартнерам - | И ВТ_РасчетыСКлиентамиРасш.ОбъектРасчетов = ВТ_ПланОтгрузок.ОбъектРасчетов - | И ВТ_РасчетыСКлиентамиРасш.ЗаказКлиента = ВТ_ПланОтгрузок.ДокументПлан"; + | РегистрСведений.КурсыВалют.СрезПоследних(&Период, Валюта = &Валюта) КАК КурсыВалютСрезПоследних"; - Запрос.УстановитьПараметр("КонецПериода", КонецГода(ТекущаяДата())); - Запрос.УстановитьПараметр("НачалоПериода", НачалоГода(ТекущаяДата())); + Запрос.УстановитьПараметр("Валюта", Справочники.Валюты.ПустаяСсылка()); + Запрос.УстановитьПараметр("Период", ТекущаяДата()); - РезультатЗапроса = Запрос.Выполнить().Выгрузить(); + РезультатЗапроса = Запрос.Выполнить(); - КонецПроцедуры; + ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); - //Итоговое ожидаемое количество срабатываний: - //Номер тест кейса | Число срабатываний - // №1 | 4 - // №2 | 3 - // №3 | 3 - // №4 | 0 - // №5 | 0 - // №6 | 1 - // №7 | 1 - //Итого: 12 +КонецПроцедуры; +//Итоговое ожидаемое количество срабатываний: +//Номер тест кейса | Число срабатываний +// №1 | 4 +// №2 | 3 +// №3 | 3 +// №4 | 0 +// №5 | 0 +// №6 | 1 +// №7 | 1 +//Итого: 12 \ No newline at end of file From 41883341e66c80bcfd46b70b2439d8e5172b9a99 Mon Sep 17 00:00:00 2001 From: levon444 Date: Sat, 3 May 2025 15:57:43 +0400 Subject: [PATCH 04/12] =?UTF-8?q?=D0=9E=D0=BF=D0=B8=D1=81=D0=B0=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BA=D0=B0=20=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../QueryNestedFieldsByDotDiagnosticTest.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnosticTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnosticTest.java index 46e4e1bd49e..ef7a3170591 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnosticTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnosticTest.java @@ -17,9 +17,19 @@ void test() { List diagnostics = getDiagnostics(); - assertThat(diagnostics).hasSize(1); + assertThat(diagnostics).hasSize(12); assertThat(diagnostics, true) - .hasRange(6, 0, 6, 20); - + .hasRange(21, 3, 21, 40) //Ошибка №1 + .hasRange(22, 3, 22, 39) //Ошибка №1 + .hasRange(23, 3, 23, 36) //Ошибка №1 + .hasRange(24, 3, 24, 43) //Ошибка №1 + .hasRange(29, 3, 29, 33) //Ошибка №7 + .hasRange(53, 6, 53, 39) //Ошибка №3 + .hasRange(53, 41, 53, 77) //Ошибка №3 + .hasRange(53, 79, 53, 116) //Ошибка №3 + .hasRange(103, 7, 103, 61) //Ошибка №2 + .hasRange(104, 7, 104, 64) //Ошибка №2 + .hasRange(105, 7, 105, 65) //Ошибка №2 + .hasRange(116, 3, 116, 86); //Ошибка №6 } } From 15ada237a35d38eaa058abab9b10f03908896f0e Mon Sep 17 00:00:00 2001 From: levon444 Date: Sun, 4 May 2025 14:37:34 +0400 Subject: [PATCH 05/12] =?UTF-8?q?=D0=9E=D0=BF=D0=B8=D1=81=D0=B0=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BE=D1=81=D0=BD=D0=BE=D0=B2=D0=BD=D0=B0=D1=8F=20?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=D0=B8=D0=BA=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D0=BA=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D1=81=D0=BE=D0=B2,=20=D0=BF=D0=B0=D1=80?= =?UTF-8?q?=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D0=BE=D0=B2=20=D0=B2=D0=B8=D1=80?= =?UTF-8?q?=D1=82=D1=83=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D1=85=20=D1=82=D0=B0?= =?UTF-8?q?=D0=B1=D0=BB=D0=B8=D1=86,=20=D1=83=D1=81=D0=BB=D0=BE=D0=B2?= =?UTF-8?q?=D0=B8=D0=B9=20=D0=BF=D1=80=D0=B8=D0=BE=D0=B1=D1=80=D0=B0=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20=D1=82=D0=B8=D0=BF=D0=BE?= =?UTF-8?q?=D0=B2,=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=B2=20=D0=B2=D0=B8=D1=80=D1=82=D1=83=D0=B0=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D1=8B=D1=85=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D0=B0=D1=85?= =?UTF-8?q?=20=D0=B8=20=D1=81=D0=BE=D0=B5=D0=B4=D0=B8=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../QueryNestedFieldsByDotDiagnostic.java | 45 ++++++++++++++++++- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic.java index 0f489e219dc..43f9b1582eb 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic.java @@ -4,6 +4,11 @@ import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticSeverity; import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticTag; import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticType; +import com.github._1c_syntax.bsl.parser.SDBLParser; +import org.antlr.v4.runtime.tree.ParseTree; + +import java.util.HashSet; +import java.util.Set; @DiagnosticMetadata( type = DiagnosticType.CODE_SMELL, @@ -11,11 +16,47 @@ minutesToFix = 1, tags = { DiagnosticTag.SQL, - DiagnosticTag.PERFOMANCE, + DiagnosticTag.PERFORMANCE, DiagnosticTag.DESIGN } ) -public class QueryNestedFieldsByDotDiagnostic extends AbstractVisitorDiagnostic { +public class QueryNestedFieldsByDotDiagnostic extends AbstractSDBLListenerDiagnostic { + + public boolean isVirtualTable = false; + private final Set columns = new HashSet<>(); + + @Override + public void enterQuery(SDBLParser.QueryContext ctx) { + isVirtualTable = false; + super.enterQuery(ctx); + } + + @Override + public void exitVirtualTableParameter(SDBLParser.VirtualTableParameterContext ctx) { + isVirtualTable = true; + super.exitVirtualTableParameter(ctx); + } + @Override + public void enterCastFunction(SDBLParser.CastFunctionContext ctx) { + super.enterCastFunction(ctx); + } + + @Override + public void enterFunctionCall(SDBLParser.FunctionCallContext ctx) { + if(ctx.identifier != null && ctx.columnNames.size() > 1){ + diagnosticStorage.addDiagnostic(ctx); + } + super.enterFunctionCall(ctx); + } + + @Override + public void enterColumn(SDBLParser.ColumnContext ctx) { + + if((isVirtualTable && ctx.columnNames.size() == 1 && ctx.mdoName != null) || ctx.columnNames.size() > 1){ + diagnosticStorage.addDiagnostic(ctx); + } + super.enterColumn(ctx); + } } From 485f3a62c1bdfc74beb38610e36c8433dd47cd51 Mon Sep 17 00:00:00 2001 From: levon444 Date: Sun, 4 May 2025 14:38:49 +0400 Subject: [PATCH 06/12] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D1=84=D1=80=D0=B0=D0=B3=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D1=8B=20=D0=BA=D0=BE=D0=B4=D0=B0=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=BB=D1=8C=D0=BD=D1=8B=D1=85=20?= =?UTF-8?q?=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B9=20=D1=81=20?= =?UTF-8?q?=D0=BD=D0=B5=D1=81=D0=BA=D0=BE=D0=BB=D1=8C=D0=BA=D0=B8=D0=BC?= =?UTF-8?q?=D0=B8=20=D0=BF=D0=BE=D0=BB=D1=8F=D0=BC=D0=B8=20=D0=BE=D0=B1?= =?UTF-8?q?=D1=8A=D0=B5=D0=BA=D1=82=D0=B0=20=D0=B2=20=D0=BE=D0=B4=D0=BD?= =?UTF-8?q?=D0=BE=D0=B9=20=D0=BA=D0=BE=D0=BB=D0=BE=D0=BD=D0=BA=D0=B5=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/diagnostics/QueryNestedFieldsByDotDiagnostic.bsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/resources/diagnostics/QueryNestedFieldsByDotDiagnostic.bsl b/src/test/resources/diagnostics/QueryNestedFieldsByDotDiagnostic.bsl index f8f03329a69..528308d05fa 100644 --- a/src/test/resources/diagnostics/QueryNestedFieldsByDotDiagnostic.bsl +++ b/src/test/resources/diagnostics/QueryNestedFieldsByDotDiagnostic.bsl @@ -18,7 +18,7 @@ | ЗаказКлиентаТовары.Характеристика КАК Характеристика, | ЗаказКлиентаТовары.Упаковка КАК Упаковка, | ЗаказКлиентаТовары.Серия КАК Серия, - | ЗаказКлиентаТовары.Подразделение КАК Подразделение, + | ЗаказКлиентаТовары.СуммаНДС + ЗаказКлиентаТовары.Сумма КАК СуммаСНДС, | ЗаказКлиентаТовары.Ссылка.Организация КАК Организация, | ЗаказКлиентаТовары.Ссылка.Контрагент КАК Контрагент, | ЗаказКлиентаТовары.Ссылка.Партнер КАК Партнер, From 0b5dc9f44e9db79a783c4c06c8d3f43dfcadf980 Mon Sep 17 00:00:00 2001 From: levon444 Date: Sun, 4 May 2025 15:29:00 +0400 Subject: [PATCH 07/12] =?UTF-8?q?=D0=A1=D0=BA=D0=BE=D1=80=D1=80=D0=B5?= =?UTF-8?q?=D0=BA=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D1=8B=20=D1=82?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D1=8B=20=D0=BD=D0=B0=20=D0=B2=D1=85=D0=BE?= =?UTF-8?q?=D0=B6=D0=B4=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=B0=D0=B6=D0=B4?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=20=D0=BA=D0=B5=D0=B9=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../diagnostics/QueryNestedFieldsByDotDiagnosticTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnosticTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnosticTest.java index ef7a3170591..9fb41084c8f 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnosticTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnosticTest.java @@ -27,9 +27,9 @@ void test() { .hasRange(53, 6, 53, 39) //Ошибка №3 .hasRange(53, 41, 53, 77) //Ошибка №3 .hasRange(53, 79, 53, 116) //Ошибка №3 - .hasRange(103, 7, 103, 61) //Ошибка №2 - .hasRange(104, 7, 104, 64) //Ошибка №2 - .hasRange(105, 7, 105, 65) //Ошибка №2 - .hasRange(116, 3, 116, 86); //Ошибка №6 + .hasRange(101, 7, 101, 61) //Ошибка №2 + .hasRange(102, 7, 102, 64) //Ошибка №2 + .hasRange(103, 7, 103, 65) //Ошибка №2 + .hasRange(115, 3, 115, 82); //Ошибка №6 } } From c1ce4f8f10771ccf5f94c6390ce885543c03ab7c Mon Sep 17 00:00:00 2001 From: levon444 Date: Sun, 4 May 2025 20:24:04 +0400 Subject: [PATCH 08/12] =?UTF-8?q?=D0=9E=D0=BF=D0=B8=D1=81=D0=B0=D0=BD?= =?UTF-8?q?=D1=8B=20=D1=81=D0=B2=D0=BE=D0=B9=D1=81=D1=82=D0=B2=D0=B0=20?= =?UTF-8?q?=D0=B4=D0=B8=D0=B0=D0=B3=D0=BD=D0=BE=D1=81=D1=82=D0=B8=D0=BA?= =?UTF-8?q?=D0=B8=20(=D0=B8=D0=BC=D1=8F=20=D0=B8=20=D1=81=D0=BE=D0=BE?= =?UTF-8?q?=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D0=B5),=20=D0=B4=D0=BE=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=BD=D0=BE=20=D0=B7=D0=B0=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D1=85=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=B4=D0=B8=D0=B0=D0=B3=D0=BD=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=B8=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../QueryNestedFieldsByDotDiagnostic.java | 17 +++++------------ ...eryNestedFieldsByDotDiagnostic_en.properties | 4 ++-- ...eryNestedFieldsByDotDiagnostic_ru.properties | 4 ++-- 3 files changed, 9 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic.java index 43f9b1582eb..6fcf8aca0b7 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic.java @@ -5,10 +5,6 @@ import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticTag; import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticType; import com.github._1c_syntax.bsl.parser.SDBLParser; -import org.antlr.v4.runtime.tree.ParseTree; - -import java.util.HashSet; -import java.util.Set; @DiagnosticMetadata( type = DiagnosticType.CODE_SMELL, @@ -24,7 +20,6 @@ public class QueryNestedFieldsByDotDiagnostic extends AbstractSDBLListenerDiagnostic { public boolean isVirtualTable = false; - private final Set columns = new HashSet<>(); @Override public void enterQuery(SDBLParser.QueryContext ctx) { @@ -38,15 +33,11 @@ public void exitVirtualTableParameter(SDBLParser.VirtualTableParameterContext ct super.exitVirtualTableParameter(ctx); } - @Override - public void enterCastFunction(SDBLParser.CastFunctionContext ctx) { - super.enterCastFunction(ctx); - } - @Override public void enterFunctionCall(SDBLParser.FunctionCallContext ctx) { if(ctx.identifier != null && ctx.columnNames.size() > 1){ - diagnosticStorage.addDiagnostic(ctx); + diagnosticStorage.addDiagnostic(ctx, + info.getMessage(ctx.getText())); } super.enterFunctionCall(ctx); } @@ -55,7 +46,9 @@ public void enterFunctionCall(SDBLParser.FunctionCallContext ctx) { public void enterColumn(SDBLParser.ColumnContext ctx) { if((isVirtualTable && ctx.columnNames.size() == 1 && ctx.mdoName != null) || ctx.columnNames.size() > 1){ - diagnosticStorage.addDiagnostic(ctx); + + diagnosticStorage.addDiagnostic(ctx, + info.getMessage(ctx.getText())); } super.enterColumn(ctx); } diff --git a/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic_en.properties b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic_en.properties index 66831715dfd..a468f1b2e66 100644 --- a/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic_en.properties +++ b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic_en.properties @@ -1,2 +1,2 @@ -diagnosticMessage= -diagnosticName= +diagnosticMessage=Detected access to reference data nested field by dot in database query text: "%s" +diagnosticName=Getting objects nested fields data by dot in database query text diff --git a/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic_ru.properties b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic_ru.properties index 40188ca542c..2ff7a41fae7 100644 --- a/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic_ru.properties +++ b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic_ru.properties @@ -1,2 +1,2 @@ -diagnosticMessage=<Сообщение> -diagnosticName=<Имя диагностики> +diagnosticMessage=Обнаружено разыменование ссылочного поля: "%s" +diagnosticName=Разыменование ссылочных полей запроса через точку From 4f43a625bce0903a0d8eb8b525bca32abbb8e5eb Mon Sep 17 00:00:00 2001 From: levon444 Date: Mon, 5 May 2025 12:39:00 +0400 Subject: [PATCH 09/12] =?UTF-8?q?=D0=9C=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=20?= =?UTF-8?q?=20=D0=B4=D0=B8=D0=B0=D0=B3=D0=BD=D0=BE=D1=81=D1=82=D0=B8=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=B4=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=80=D0=B8?= =?UTF-8?q?=D1=8F=D0=BC=D0=B8,=20=D0=BE=D0=BF=D1=82=D0=B8=D0=BC=D0=B8?= =?UTF-8?q?=D0=B7=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D1=8B=20=D1=83=D1=81?= =?UTF-8?q?=D0=BB=D0=BE=D0=B2=D0=B8=D1=8F=20=D1=80=D0=B5=D0=B3=D0=B8=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20=D0=BF=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D0=BE=D0=BA,=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BA=D0=B8=20=D1=83=D0=BF=D1=80=D0=BE=D1=89=D0=B5=D0=BD=D0=BE?= =?UTF-8?q?,=20=D0=B8=D1=81=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=BE=20?= =?UTF-8?q?=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=82=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B2=20=D1=81=D0=B2=D1=8F=D0=B7?= =?UTF-8?q?=D0=B8=20=D1=81=20=D1=82=D0=B5=D0=BC,=20=D1=87=D1=82=D0=BE=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D1=82=D0=B5=D0=BA=D1=81=D1=82,=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=B4=D0=B0=D0=B2=D0=B0=D0=B5=D0=BC=D1=8B?= =?UTF-8?q?=D0=B9=20=D0=B2=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BF=D0=BE=D0=BB=D0=BD=D0=BE=D1=81=D1=82=D1=8C?= =?UTF-8?q?=D1=8E=20=D0=B0=D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=B8=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=BA=D0=BE=D0=BD=D1=82=D0=B5=D0=BA=D1=81=D1=82=D1=83?= =?UTF-8?q?=20=D0=B4=D0=B8=D0=B0=D0=B3=D0=BD=D0=BE=D1=81=D1=82=D0=B8=D0=BA?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../QueryNestedFieldsByDotDiagnostic.java | 22 +++++++++++-------- ...yNestedFieldsByDotDiagnostic_en.properties | 2 +- ...yNestedFieldsByDotDiagnostic_ru.properties | 2 +- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic.java index 6fcf8aca0b7..5d783861c94 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic.java @@ -19,36 +19,40 @@ ) public class QueryNestedFieldsByDotDiagnostic extends AbstractSDBLListenerDiagnostic { + //Флаг обработки параметров виртуальной таблицы public boolean isVirtualTable = false; @Override public void enterQuery(SDBLParser.QueryContext ctx) { - isVirtualTable = false; + isVirtualTable = false; //Сбрасываем флаг при начале обработки запроса super.enterQuery(ctx); } @Override public void exitVirtualTableParameter(SDBLParser.VirtualTableParameterContext ctx) { - isVirtualTable = true; + isVirtualTable = true; //Взводим флаг при начале обработки параметров виртуальной таблицы super.exitVirtualTableParameter(ctx); } @Override public void enterFunctionCall(SDBLParser.FunctionCallContext ctx) { + //Контролируем разыменование в функциях (ВЫРАЗИТЬ, ЕСТЬNULL и т.д.) if(ctx.identifier != null && ctx.columnNames.size() > 1){ - diagnosticStorage.addDiagnostic(ctx, - info.getMessage(ctx.getText())); + diagnosticStorage.addDiagnostic(ctx); } super.enterFunctionCall(ctx); } @Override public void enterColumn(SDBLParser.ColumnContext ctx) { - - if((isVirtualTable && ctx.columnNames.size() == 1 && ctx.mdoName != null) || ctx.columnNames.size() > 1){ - - diagnosticStorage.addDiagnostic(ctx, - info.getMessage(ctx.getText())); + /*Если взведен флаг обработки виртуальной таблицы + и определен контекст метаданных, то проверяем заполненность контекста имен колонок. + В противном случае считаем что работаем со стандартным полем выборки или соединения + и выводим ошибку когда список имен колонки содержит более одного идентификатора + */ + if((isVirtualTable && ctx.mdoName != null && !ctx.columnNames.isEmpty()) || ctx.columnNames.size() > 1){ + + diagnosticStorage.addDiagnostic(ctx); } super.enterColumn(ctx); } diff --git a/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic_en.properties b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic_en.properties index a468f1b2e66..1cb773d1584 100644 --- a/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic_en.properties +++ b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic_en.properties @@ -1,2 +1,2 @@ -diagnosticMessage=Detected access to reference data nested field by dot in database query text: "%s" +diagnosticMessage=Detected access to reference data nested field by dot in database query text diagnosticName=Getting objects nested fields data by dot in database query text diff --git a/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic_ru.properties b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic_ru.properties index 2ff7a41fae7..1aabe18ee94 100644 --- a/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic_ru.properties +++ b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic_ru.properties @@ -1,2 +1,2 @@ -diagnosticMessage=Обнаружено разыменование ссылочного поля: "%s" +diagnosticMessage=Обнаружено разыменование ссылочного поля diagnosticName=Разыменование ссылочных полей запроса через точку From e8ab22defb540086cf5f31064fbcfcfe84b9a64e Mon Sep 17 00:00:00 2001 From: levon444 Date: Mon, 5 May 2025 14:06:45 +0400 Subject: [PATCH 10/12] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20markdownn=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/diagnostics/QueryNestedFieldsByDot.md | 31 ++++++++++++++----- docs/en/diagnostics/QueryNestedFieldsByDot.md | 31 +++++++++++++------ 2 files changed, 44 insertions(+), 18 deletions(-) diff --git a/docs/diagnostics/QueryNestedFieldsByDot.md b/docs/diagnostics/QueryNestedFieldsByDot.md index b7f69fe1632..00b92047998 100644 --- a/docs/diagnostics/QueryNestedFieldsByDot.md +++ b/docs/diagnostics/QueryNestedFieldsByDot.md @@ -1,16 +1,31 @@ -# (QueryNestedFieldsByDot) +# Разыменование ссылочных полей запроса через точку (QueryNestedFieldsByDot) ## Описание диагностики - + +Диагностика позволяет контролировать разыменование ссылочных полей через точку в тексте запроса 1С. +Задача данной диагностики - предотвратить излишние неявные соединения между таблицами +и как следствие - повысить производительность исполнения запроса к БД. ## Примеры +1. Базовое разыменование ссылочных полей в выборке (во временную таблицу или в результат запроса) +`ЗаказКлиентаТовары.Ссылка.Организация КАК Организация` +2. Разыменование ссылочных полей в соединениях таблиц +`ВТ_РасчетыСКлиентами КАК ВТ_РасчетыСКлиентами + ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ДанныеЗаказовКлиента КАК ВТ_ДанныеЗаказовКлиента + ПО ВТ_РасчетыСКлиентами.АналитикаУчетаПоПартнерам.Партнер = ВТ_ДанныеЗаказовКлиента.Партнер` +3. Разыменование ссылочных полей в виртуальных таблицах +`РегистрНакопления.РасчетыСКлиентами.Обороты( + &НачалоПериода, + &КонецПериода, + , + (АналитикаУчетаПоПартнерам.Партнер) В ...` +4. Конструкция "ВЫРАЗИТЬ" с разыменованием получаемого поля +`ВЫРАЗИТЬ(ВТ_ПланОтгрузок.ДокументПлан КАК Документ.ЗаказКлиента).Валюта.Наценка` +5. Разыменование ссылочных полей в секции "ГДЕ" +`ГДЕ азКлиентаТовары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода` + ## Источники - - +Источник: [Разыменование ссылочных полей составного типа в языке запросов] (https://its.1c.ru/db/v8std/content/654/hdoc) diff --git a/docs/en/diagnostics/QueryNestedFieldsByDot.md b/docs/en/diagnostics/QueryNestedFieldsByDot.md index 7d8189b9721..1c1cf3c23cc 100644 --- a/docs/en/diagnostics/QueryNestedFieldsByDot.md +++ b/docs/en/diagnostics/QueryNestedFieldsByDot.md @@ -1,16 +1,27 @@ -# (QueryNestedFieldsByDot) +# Getting objects nested fields data by dot in database query text (QueryNestedFieldsByDot) ## Description - +Diagnostics allows you to control the dereference of reference fields through a dot in the 1C query language. +The purpose of this diagnostic is to prevent unnecessary implicit joins between tables. +and as a result, improve the performance of executing a database query. ## Examples - - +1. Base dereference through a dot (in temp. db or in select query) + `ЗаказКлиентаТовары.Ссылка.Организация КАК Организация` +2. Dereference of fields in table join section + `ВТ_РасчетыСКлиентами КАК ВТ_РасчетыСКлиентами + ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ДанныеЗаказовКлиента КАК ВТ_ДанныеЗаказовКлиента + ПО ВТ_РасчетыСКлиентами.АналитикаУчетаПоПартнерам.Партнер = ВТ_ДанныеЗаказовКлиента.Партнер` +3. Dereference of fields in virtual tables + `РегистрНакопления.РасчетыСКлиентами.Обороты( + &НачалоПериода, + &КонецПериода, + , + (АналитикаУчетаПоПартнерам.Партнер) В ...` +4. Dereference in cast function result fields + `ВЫРАЗИТЬ(ВТ_ПланОтгрузок.ДокументПлан КАК Документ.ЗаказКлиента).Валюта.Наценка` +5. Dereference of fields in WHERE section + `ГДЕ азКлиентаТовары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода` ## Sources - - +Source: [Dereference of composite type reference fields in the query language (RU)] (https://its.1c.ru/db/v8std/content/654/hdoc) From 7e00c7b1f8898eb71321e255f1cfeff2eef9d752 Mon Sep 17 00:00:00 2001 From: levon444 Date: Mon, 5 May 2025 14:09:19 +0400 Subject: [PATCH 11/12] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=B0=D1=80=D0=B8=D0=B8=20=D0=B2=20bsl=20=D1=84=D0=B0=D0=B9?= =?UTF-8?q?=D0=BB=20=D1=82=D0=B5=D1=81=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../QueryNestedFieldsByDotDiagnostic.bsl | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/test/resources/diagnostics/QueryNestedFieldsByDotDiagnostic.bsl b/src/test/resources/diagnostics/QueryNestedFieldsByDotDiagnostic.bsl index 528308d05fa..5f63392eb1c 100644 --- a/src/test/resources/diagnostics/QueryNestedFieldsByDotDiagnostic.bsl +++ b/src/test/resources/diagnostics/QueryNestedFieldsByDotDiagnostic.bsl @@ -4,8 +4,8 @@ //2.Разыменование ссылочных полей в соединениях таблиц (Должна зафиксироваться ошибка) //3.Разыменование ссылочных полей в виртуальных таблиц (Должна зафиксироваться ошибка) //4.Агрегатные и иные функции над полем (Не должна фиксироваться ошибка) -//5.Конструкция "ВЫРАЗИТЬ" без разыменования итогового поля (Не должна фиксироваться ошибка) -//6.Конструкция "ВЫРАЗИТЬ" с разыменованием итогового поля (Должна фиксироваться ошибка) +//5.Конструкция "ВЫРАЗИТЬ" без разыменования получаемого поля (Не должна фиксироваться ошибка) +//6.Конструкция "ВЫРАЗИТЬ" с разыменованием получаемого поля (Должна фиксироваться ошибка) //7.Разыменование ссылочных полей в секции "ГДЕ" (Должна фиксироваться ошибка) Процедура ПолучениеДанныхЗаказовКлиентов() @@ -19,15 +19,15 @@ | ЗаказКлиентаТовары.Упаковка КАК Упаковка, | ЗаказКлиентаТовары.Серия КАК Серия, | ЗаказКлиентаТовары.СуммаНДС + ЗаказКлиентаТовары.Сумма КАК СуммаСНДС, - | ЗаказКлиентаТовары.Ссылка.Организация КАК Организация, - | ЗаказКлиентаТовары.Ссылка.Контрагент КАК Контрагент, - | ЗаказКлиентаТовары.Ссылка.Партнер КАК Партнер, - | ЗаказКлиентаТовары.Ссылка.ОбъектРасчетов КАК ОбъектРасчетов + | ЗаказКлиентаТовары.Ссылка.Организация КАК Организация, //Ошибка №1 + | ЗаказКлиентаТовары.Ссылка.Контрагент КАК Контрагент, //Ошибка №1 + | ЗаказКлиентаТовары.Ссылка.Партнер КАК Партнер, //Ошибка №1 + | ЗаказКлиентаТовары.Ссылка.ОбъектРасчетов КАК ОбъектРасчетов //Ошибка №1 |ПОМЕСТИТЬ ВТ_ДанныеЗаказовКлиента |ИЗ | Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары |ГДЕ - | ЗаказКлиентаТовары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода + | ЗаказКлиентаТовары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода //Ошибка №7 | |ИНДЕКСИРОВАТЬ ПО | Контрагент, @@ -51,7 +51,7 @@ | &НачалоПериода, | &КонецПериода, | , - | (АналитикаУчетаПоПартнерам.Партнер, АналитикаУчетаПоПартнерам.Контрагент, АналитикаУчетаПоПартнерам.Организация, ОбъектРасчетов) В + | (АналитикаУчетаПоПартнерам.Партнер, АналитикаУчетаПоПартнерам.Контрагент, АналитикаУчетаПоПартнерам.Организация, ОбъектРасчетов) В //Ошибка №3 | (ВЫБРАТЬ | ВТ_ДанныеЗаказовКлиента.Партнер КАК Партнер, | ВТ_ДанныеЗаказовКлиента.Контрагент КАК Контрагент, @@ -99,9 +99,9 @@ |ИЗ | ВТ_РасчетыСКлиентами КАК ВТ_РасчетыСКлиентами | ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ДанныеЗаказовКлиента КАК ВТ_ДанныеЗаказовКлиента - | ПО ВТ_РасчетыСКлиентами.АналитикаУчетаПоПартнерам.Партнер = ВТ_ДанныеЗаказовКлиента.Партнер - | И ВТ_РасчетыСКлиентами.АналитикаУчетаПоПартнерам.Контрагент = ВТ_ДанныеЗаказовКлиента.Контрагент - | И ВТ_РасчетыСКлиентами.АналитикаУчетаПоПартнерам.Организация = ВТ_ДанныеЗаказовКлиента.Организация + | ПО ВТ_РасчетыСКлиентами.АналитикаУчетаПоПартнерам.Партнер = ВТ_ДанныеЗаказовКлиента.Партнер //Ошибка №2 + | И ВТ_РасчетыСКлиентами.АналитикаУчетаПоПартнерам.Контрагент = ВТ_ДанныеЗаказовКлиента.Контрагент //Ошибка №2 + | И ВТ_РасчетыСКлиентами.АналитикаУчетаПоПартнерам.Организация = ВТ_ДанныеЗаказовКлиента.Организация //Ошибка №2 |; | |//////////////////////////////////////////////////////////////////////////////// @@ -113,7 +113,7 @@ | ВТ_РасчетыСКлиентамиРасш.Характеристика КАК Характеристика, | ВТ_РасчетыСКлиентамиРасш.Упаковка КАК Упаковка, | ВЫРАЗИТЬ(ВТ_ПланОтгрузок.ДокументПлан КАК Документ.ЗаказКлиента).Валюта КАК ВалютаДокумента, - | ВЫРАЗИТЬ(ВТ_ПланОтгрузок.ДокументПлан КАК Документ.ЗаказКлиента).Валюта.Наценка КАК НаценкаВалюыДокумента + | ВЫРАЗИТЬ(ВТ_ПланОтгрузок.ДокументПлан КАК Документ.ЗаказКлиента).Валюта.Наценка КАК НаценкаВалюыДокумента //Ошибка №6 |ИЗ | ВТ_РасчетыСКлиентамиРасш КАК ВТ_РасчетыСКлиентамиРасш | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ПланОтгрузок КАК ВТ_ПланОтгрузок From 715c815314a8ec416196e7f863b7bc49f92ae024 Mon Sep 17 00:00:00 2001 From: levon444 Date: Mon, 5 May 2025 14:10:45 +0400 Subject: [PATCH 12/12] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BB=D0=B8=D1=86=D0=B5=D0=BD=D0=B7?= =?UTF-8?q?=D0=B8=D0=B8,=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B0=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../QueryNestedFieldsByDotDiagnostic.java | 21 +++++++++++++++++++ .../configuration/parameters-schema.json | 10 +++++++++ .../languageserver/configuration/schema.json | 3 +++ .../QueryNestedFieldsByDotDiagnosticTest.java | 21 +++++++++++++++++++ 4 files changed, 55 insertions(+) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic.java index 5d783861c94..a1c952fbcb9 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic.java @@ -1,3 +1,24 @@ +/* + * This file is a part of BSL Language Server. + * + * Copyright (c) 2018-2025 + * Alexey Sosnoviy , Nikita Fedkin and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + * + * BSL Language Server is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * BSL Language Server is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with BSL Language Server. + */ package com.github._1c_syntax.bsl.languageserver.diagnostics; import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticMetadata; 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 3a20edf4672..0dedfe34e9e 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 @@ -1620,6 +1620,16 @@ }, "$id": "#/definitions/PublicMethodsDescription" }, + "QueryNestedFieldsByDot": { + "description": "Getting objects nested fields data by dot in database query text", + "default": true, + "type": [ + "boolean", + "object" + ], + "title": "Getting objects nested fields data by dot in database query text", + "$id": "#/definitions/QueryNestedFieldsByDot" + }, "QueryParseError": { "description": "Query text parsing error", "default": true, diff --git a/src/main/resources/com/github/_1c_syntax/bsl/languageserver/configuration/schema.json b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/configuration/schema.json index 8bcf9df256f..71278619680 100644 --- a/src/main/resources/com/github/_1c_syntax/bsl/languageserver/configuration/schema.json +++ b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/configuration/schema.json @@ -377,6 +377,9 @@ "PublicMethodsDescription": { "$ref": "parameters-schema.json#/definitions/PublicMethodsDescription" }, + "QueryNestedFieldsByDot": { + "$ref": "parameters-schema.json#/definitions/QueryNestedFieldsByDot" + }, "QueryParseError": { "$ref": "parameters-schema.json#/definitions/QueryParseError" }, diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnosticTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnosticTest.java index 9fb41084c8f..fc0d2a5455e 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnosticTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnosticTest.java @@ -1,3 +1,24 @@ +/* + * This file is a part of BSL Language Server. + * + * Copyright (c) 2018-2025 + * Alexey Sosnoviy , Nikita Fedkin and contributors + * + * SPDX-License-Identifier: LGPL-3.0-or-later + * + * BSL Language Server is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * BSL Language Server is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with BSL Language Server. + */ package com.github._1c_syntax.bsl.languageserver.diagnostics; import org.eclipse.lsp4j.Diagnostic;