diff --git a/README.md b/README.md index 26666df1..8867a973 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,7 @@ 7. [Настройки отбора объектов](docs/ПолучениеДанныхПоНастройкеОтбора.md) 8. [Загрузка файла через табличный документ](docs/ЗагрузкаФайлаЧерезТабличныйДокумент.md) 9. [Переопределения методов БСП](docs/ПереопределениеМетодовБСП.md) +10. [Схемы Запросов](docs/СхемыЗапросов.md) ## Заимствованные разработки diff --git "a/docs/\320\241\321\205\320\265\320\274\321\213\320\227\320\260\320\277\321\200\320\276\321\201\320\276\320\262.md" "b/docs/\320\241\321\205\320\265\320\274\321\213\320\227\320\260\320\277\321\200\320\276\321\201\320\276\320\262.md" new file mode 100644 index 00000000..b3b92dc0 --- /dev/null +++ "b/docs/\320\241\321\205\320\265\320\274\321\213\320\227\320\260\320\277\321\200\320\276\321\201\320\276\320\262.md" @@ -0,0 +1,114 @@ +# Подсистема "схемы запросов" + +## Описание подсистемы + +Встроенный язык 1С позволяет использовать текстовые запросы для извлечения данных из базы. Однако зачастую требуется динамически изменять текст запросов в зависимости от условий алгоритма. Это может включать добавление новых условий, полей выборки или модификацию существующих параметров. + +Подсистема ``Схемы запросов`` предоставляет удобный интерфейс для работы с текстами запросов через объектную модель, позволяя: + +- Избежать прямого редактирования текста запроса. +- Улучшить читаемость и поддержку кода. +- Минимизировать вероятность ошибок, связанных с изменением текстов запросов. + +## Требования для работы со схемой запросов + +- Сохранение родительских объектов +Для корректного использования объектов схемы запроса их родительские объекты должны оставаться существующими. Например, нельзя получить объект **``ПоляСхемыЗапроса``** из **``ОператорВыбратьСхемыЗапроса``**, затем удалить этот оператор из **``ЗапросВыбораСхемыЗапроса``** и после этого пытаться добавить новые выражения в **``ПоляСхемыЗапроса``**. + +- Уникальность объектов схемы запроса +Объекты, полученные из одной схемы запроса, не могут быть использованы в другой схеме. + +## Примеры использования + +**Пример 1: Добавление условия отбора** +Неправильно: +Вставка условия с использованием СтрЗаменить увеличивает объем кода и снижает читаемость. Возможна ситуация когда фрагмент кода ``НЕ пбп_ПредопределенныеЗначения.ПометкаУдаления`` используется не только в секции ``ГДЕ`` + +```BSL +Если пбп_ОбщегоНазначенияПовтИсп.ПолучитьЗначениеКонстанты("пбп_ИспользоватьПользовательскиеФункции") Тогда + Запрос.Текст = СтрЗаменить(Запрос.Текст, "НЕ пбп_ПредопределенныеЗначения.ПометкаУдаления", + "НЕ пбп_ПредопределенныеЗначения.ПометкаУдаления + |пбп_ПредопределенныеЗначения.ИдентификаторНастройки <> """""); +КонецЕсли; +``` + +Правильно: +Используйте функцию ``ДобавитьОтборВЗапрос``, чтобы вставить условие в секцию ``ГДЕ``: +```BSL +Если пбп_ОбщегоНазначенияПовтИсп.ПолучитьЗначениеКонстанты("пбп_ИспользоватьПользовательскиеФункции") Тогда + Запрос.Текст = пбп_СхемыЗапросов.ДобавитьОтборВЗапрос(Запрос.Текст, + "пбп_ПредопределенныеЗначения.ИдентификаторНастройки <> """""); +КонецЕсли; +``` + +**Пример 2: Множественное добавление полей выборки** + +Для динамического формирования списка полей можно использовать функцию ``ДобавитьПоляВыборкиВЗапрос``. +```BSL +Запрос.Текст = + "ВЫБРАТЬ + | пбп_ПредопределенныеЗначения.Ссылка КАК Ссылка + |ИЗ + | %1 КАК пбп_ПредопределенныеЗначения + |ГДЕ + | пбп_ПредопределенныеЗначения.Ссылка В(&СписокПредопределенных)"; + +Поля = Новый СписокЗначений; +Поля.Добавить("пбп_ПредопределенныеЗначения.СписокЗначений", Список значений); +Поля.Добавить("пбп_ПредопределенныеЗначения.Пароль", Пароль"); + +Запрос = пбп_СхемыЗапросов.ДобавитьПоляВыборкиВЗапрос(Запрос, Поля); +``` + +**Пример 3: Установить количество получаемых записей** + +Пример: +```BSL +Запрос.Текст = + "ВЫБРАТЬ + | пбп_ИсторияИнтеграции.Ссылка КАК Ссылка + |ИЗ + | Справочник.пбп_ИсторияИнтеграции КАК пбп_ИсторияИнтеграции + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | пбп_СоответствияОбъектовИБ.Объект1 КАК Объект1 + |ИЗ + | РегистрСведений.пбп_СоответствияОбъектовИБ КАК пбп_СоответствияОбъектовИБ"; +``` + +Необходимо наложить ограничение по количеству записей на первый пакет запроса. +Неправильно: +```BSL +Запрос.Текст = СтрЗаменить(Запрос.Текст, "ВЫБРАТЬ + | пбп_ИсторияИнтеграции.Ссылка", + "ВЫБРАТЬ ПЕРВЫЕ 1 + | пбп_ИсторияИнтеграции.Ссылка"); +``` + +Правильно: +Используйте функцию ``УстановитьКоличествоПолучаемыхЗаписей``, чтобы установить количество получаемых записей: +```BSL +Запрос = пбп_СхемыЗапросов.УстановитьКоличествоПолучаемыхЗаписей(Запрос, 1, 0); +``` + +**Пример 4. Добавление условий в виртуальную таблицу +```BSL +Запрос.Текст = "ВЫБРАТЬ +| ТестОстатки.Склад КАК Склад, +| ТестОстатки.КоличествоОстаток КАК КоличествоОстаток +|ИЗ +| РегистрНакопления.Тест.Остатки(&Дата, ) КАК ТестОстатки +``` + +Неправильно: +```BSL +Запрос.Текст = СтрЗаменить(Запрос.Текст, "(&Дата, )", "(&Дата, Склад = &Склад)"); +``` + +Правильно: +Используйте функцию ``ДобавитьУсловиеВЗапрос``: +```BSL +Запрос = пбп_СхемыЗапросов.ДобавитьУсловиеВЗапрос(Запрос, "Склад = &Склад"); +``` \ No newline at end of file