-
Notifications
You must be signed in to change notification settings - Fork 7
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
base: develop
Are you sure you want to change the base?
Changes from 1 commit
6249585
4fb684b
b267b34
bfb1cde
ea9a45a
5785ac3
66dbc4e
c88c718
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,114 @@ | ||
# Подсистема "схемы запросов" | ||
|
||
## Описание подсистемы | ||
|
||
Встроенный язык 1С позволяет использовать текстовые запросы для извлечения данных из базы. Однако зачастую требуется динамически изменять текст запросов в зависимости от условий алгоритма. Это может включать добавление новых условий, полей выборки или модификацию существующих параметров. | ||
|
||
Подсистема ``Схемы запросов`` предоставляет удобный интерфейс для работы с текстами запросов через объектную модель, позволяя: | ||
|
||
- Избежать прямого редактирования текста запроса. | ||
- Улучшить читаемость и поддержку кода. | ||
- Минимизировать вероятность ошибок, связанных с изменением текстов запросов. | ||
|
||
## Требования для работы со схемой запросов | ||
|
||
- Сохранение родительских объектов | ||
Для корректного использования объектов схемы запроса их родительские объекты должны оставаться существующими. Например, нельзя получить объект **``ПоляСхемыЗапроса``** из **``ОператорВыбратьСхемыЗапроса``**, затем удалить этот оператор из **``ЗапросВыбораСхемыЗапроса``** и после этого пытаться добавить новые выражения в **``ПоляСхемыЗапроса``**. | ||
|
||
- Уникальность объектов схемы запроса | ||
Объекты, полученные из одной схемы запроса, не могут быть использованы в другой схеме. | ||
|
||
## Примеры использования | ||
|
||
**Пример 1: Добавление условия отбора** | ||
Неправильно: | ||
Вставка условия с использованием СтрЗаменить увеличивает объем кода и снижает читаемость. Возможна ситуация когда фрагмент кода ``НЕ пбп_ПредопределенныеЗначения.ПометкаУдаления`` используется не только в секции ``ГДЕ`` | ||
|
||
```BSL | ||
Если пбп_ОбщегоНазначенияПовтИсп.ПолучитьЗначениеКонстанты("пбп_ИспользоватьПользовательскиеФункции") Тогда | ||
Запрос.Текст = СтрЗаменить(Запрос.Текст, "НЕ пбп_ПредопределенныеЗначения.ПометкаУдаления", | ||
"НЕ пбп_ПредопределенныеЗначения.ПометкаУдаления | ||
|пбп_ПредопределенныеЗначения.ИдентификаторНастройки <> """""); | ||
КонецЕсли; | ||
``` | ||
|
||
Правильно: | ||
Используйте функцию ``ДобавитьОтборВЗапрос``, чтобы вставить условие в секцию ``ГДЕ``: | ||
```BSL | ||
Если пбп_ОбщегоНазначенияПовтИсп.ПолучитьЗначениеКонстанты("пбп_ИспользоватьПользовательскиеФункции") Тогда | ||
Запрос.Текст = пбп_СхемыЗапросов.ДобавитьОтборВЗапрос(Запрос.Текст, | ||
"пбп_ПредопределенныеЗначения.ИдентификаторНастройки <> """""); | ||
КонецЕсли; | ||
``` | ||
|
||
**Пример 2: Множественное добавление полей выборки** | ||
|
||
Для динамического формирования списка полей можно использовать функцию ``ДобавитьПоляВыборкиВЗапрос``. | ||
```BSL | ||
Запрос.Текст = | ||
"ВЫБРАТЬ | ||
| пбп_ПредопределенныеЗначения.Ссылка КАК Ссылка | ||
|ИЗ | ||
| %1 КАК пбп_ПредопределенныеЗначения | ||
|ГДЕ | ||
| пбп_ПредопределенныеЗначения.Ссылка В(&СписокПредопределенных)"; | ||
|
||
Поля = Новый СписокЗначений; | ||
Поля.Добавить("пбп_ПредопределенныеЗначения.СписокЗначений", Список значений); | ||
Поля.Добавить("пбп_ПредопределенныеЗначения.Пароль", Пароль"); | ||
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 | ||
Запрос.Текст = СтрЗаменить(Запрос.Текст, "(&Дата, )", "(&Дата, Склад = &Склад)"); | ||
``` | ||
|
||
Правильно: | ||
Используйте функцию ``ДобавитьУсловиеВЗапрос``: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Т.е. условие работает именно на виртуальную таблицу, а отбор на ГДЕ? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Для секции ГДЕ функция ДобавитьОтборВЗапрос, для виртуальных таблиц ДобавитьУсловиеВЗапрос |
||
```BSL | ||
Запрос = пбп_СхемыЗапросов.ДобавитьУсловиеВЗапрос(Запрос, "Склад = &Склад"); | ||
``` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
"Список значений" наверное в кавычках должно быть
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Точно, исправлю