Skip to content

Commit

Permalink
added descriptions about query schema
Browse files Browse the repository at this point in the history
  • Loading branch information
denisushakov committed Dec 26, 2024
1 parent 74eee97 commit 6249585
Show file tree
Hide file tree
Showing 2 changed files with 115 additions and 0 deletions.
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 КАК пбп_ПредопределенныеЗначения
|ГДЕ
| пбп_ПредопределенныеЗначения.Ссылка В(&СписокПредопределенных)";
Поля = Новый СписокЗначений;
Поля.Добавить("пбп_ПредопределенныеЗначения.СписокЗначений", Список значений);
Поля.Добавить("пбп_ПредопределенныеЗначения.Пароль", Пароль");
Запрос = пбп_СхемыЗапросов.ДобавитьПоляВыборкиВЗапрос(Запрос, Поля);
```

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

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

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

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

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

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

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

0 comments on commit 6249585

Please sign in to comment.