Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

added descriptions about query schema #176

Open
wants to merge 8 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
7. [Настройки отбора объектов](docs/ПолучениеДанныхПоНастройкеОтбора.md)
8. [Загрузка файла через табличный документ](docs/ЗагрузкаФайлаЧерезТабличныйДокумент.md)
9. [Переопределения методов БСП](docs/ПереопределениеМетодовБСП.md)
10. [Схемы Запросов](docs/СхемыЗапросов.md)

## Заимствованные разработки

Expand Down
114 changes: 114 additions & 0 deletions docs/СхемыЗапросов.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
# Подсистема "схемы запросов"

## Описание подсистемы

Встроенный язык 1С позволяет использовать текстовые запросы для извлечения данных из базы. Однако зачастую требуется динамически изменять текст запросов в зависимости от условий алгоритма. Это может включать добавление новых условий, полей выборки или модификацию существующих параметров.

Подсистема ``Схемы запросов`` предоставляет удобный интерфейс для работы с текстами запросов через объектную модель, позволяя:

- Избежать прямого редактирования текста запроса.
- Улучшить читаемость и поддержку кода.
- Минимизировать вероятность ошибок, связанных с изменением текстов запросов.

## Требования для работы со схемой запросов

- Сохранение родительских объектов
Для корректного использования объектов схемы запроса их родительские объекты должны оставаться существующими. Например, нельзя получить объект **``ПоляСхемыЗапроса``** из **``ОператорВыбратьСхемыЗапроса``**, затем удалить этот оператор из **``ЗапросВыбораСхемыЗапроса``** и после этого пытаться добавить новые выражения в **``ПоляСхемыЗапроса``**.

- Уникальность объектов схемы запроса
Объекты, полученные из одной схемы запроса, не могут быть использованы в другой схеме.

## Примеры использования

**Пример 1: Добавление условия отбора**
Неправильно:
Вставка условия с использованием СтрЗаменить увеличивает объем кода и снижает читаемость. Возможна ситуация когда фрагмент кода ``НЕ пбп_ПредопределенныеЗначения.ПометкаУдаления`` используется не только в секции ``ГДЕ``

```BSL
Если пбп_ОбщегоНазначенияПовтИсп.ПолучитьЗначениеКонстанты("пбп_ИспользоватьПользовательскиеФункции") Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "НЕ пбп_ПредопределенныеЗначения.ПометкаУдаления",
"НЕ пбп_ПредопределенныеЗначения.ПометкаУдаления
|пбп_ПредопределенныеЗначения.ИдентификаторНастройки <> """"");
КонецЕсли;
```

Правильно:
Используйте функцию ``ДобавитьОтборВЗапрос``, чтобы вставить условие в секцию ``ГДЕ``:
```BSL
Если пбп_ОбщегоНазначенияПовтИсп.ПолучитьЗначениеКонстанты("пбп_ИспользоватьПользовательскиеФункции") Тогда
Запрос.Текст = пбп_СхемыЗапросов.ДобавитьОтборВЗапрос(Запрос.Текст,
"пбп_ПредопределенныеЗначения.ИдентификаторНастройки <> """"");
КонецЕсли;
```

**Пример 2: Множественное добавление полей выборки**

Для динамического формирования списка полей можно использовать функцию ``ДобавитьПоляВыборкиВЗапрос``.
```BSL
Запрос.Текст =
"ВЫБРАТЬ
| пбп_ПредопределенныеЗначения.Ссылка КАК Ссылка
|ИЗ
| %1 КАК пбп_ПредопределенныеЗначения
|ГДЕ
| пбп_ПредопределенныеЗначения.Ссылка В(&СписокПредопределенных)";

Поля = Новый СписокЗначений;
Поля.Добавить("пбп_ПредопределенныеЗначения.СписокЗначений", Список значений);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"Список значений" наверное в кавычках должно быть

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Точно, исправлю

Поля.Добавить("пбп_ПредопределенныеЗначения.Пароль", Пароль");
denisushakov marked this conversation as resolved.
Show resolved Hide resolved

Запрос = пбп_СхемыЗапросов.ДобавитьПоляВыборкиВЗапрос(Запрос, Поля);
```

**Пример 3: Установить количество получаемых записей**

Пример:
```BSL
Запрос.Текст =
"ВЫБРАТЬ
| пбп_ИсторияИнтеграции.Ссылка КАК Ссылка
|ИЗ
| Справочник.пбп_ИсторияИнтеграции КАК пбп_ИсторияИнтеграции
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| пбп_СоответствияОбъектовИБ.Объект1 КАК Объект1
|ИЗ
| РегистрСведений.пбп_СоответствияОбъектовИБ КАК пбп_СоответствияОбъектовИБ";
```

Необходимо наложить ограничение по количеству записей на первый пакет запроса.
Неправильно:
```BSL
Запрос.Текст = СтрЗаменить(Запрос.Текст, "ВЫБРАТЬ
| пбп_ИсторияИнтеграции.Ссылка",
"ВЫБРАТЬ ПЕРВЫЕ 1
| пбп_ИсторияИнтеграции.Ссылка");
```

Правильно:
Используйте функцию ``УстановитьКоличествоПолучаемыхЗаписей``, чтобы установить количество получаемых записей:
```BSL
Запрос = пбп_СхемыЗапросов.УстановитьКоличествоПолучаемыхЗаписей(Запрос, 1, 0);
```

**Пример 4. Добавление условий в виртуальную таблицу
denisushakov marked this conversation as resolved.
Show resolved Hide resolved
```BSL
Запрос.Текст = "ВЫБРАТЬ
| ТестОстатки.Склад КАК Склад,
| ТестОстатки.КоличествоОстаток КАК КоличествоОстаток
|ИЗ
| РегистрНакопления.Тест.Остатки(&Дата, ) КАК ТестОстатки
```

Неправильно:
```BSL
Запрос.Текст = СтрЗаменить(Запрос.Текст, "(&Дата, )", "(&Дата, Склад = &Склад)");
```

Правильно:
Используйте функцию ``ДобавитьУсловиеВЗапрос``:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Т.е. условие работает именно на виртуальную таблицу, а отбор на ГДЕ?
И ещё вопрос - а можно ли редактировать запрос если он состоит из нескольких пакетов? Например добавить что-то во временную таблицу и потом в итоговый запрос? Если да, пример был бы не лишним

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Для секции ГДЕ функция ДобавитьОтборВЗапрос, для виртуальных таблиц ДобавитьУсловиеВЗапрос
Можно, добавлю

```BSL
Запрос = пбп_СхемыЗапросов.ДобавитьУсловиеВЗапрос(Запрос, "Склад = &Склад");
```
Loading