В платформе присутствует класс «ПостроительЗапроса», и он слабо документирован. «ПостроительЗапроса» позволяет указать в качестве источника данных текст запроса, набор записей, таблицу значений, область ячеек табличного документа.
Разберём, как его можно использовать для динамического формирования текста запроса.
Предпосылкой данной заметки являлась необходимость устойчиво добавлять дополнительные условия фильтрации на выборку. Обычно это делается компоновкой текста запроса с помощью объединения строк, но это некрасиво и плохо работает после обновления конфигурации.
К сожалению, мне не удалось применить «Построитель запроса» для добавления полей выборки.
Для того, чтобы добавить новую секцию «ГДЕ» или дополнительные условия фильтрации, можно использовать следующий пример кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
// пусть есть исходный текст запроса. // Требуется добавить условия фильтрации на поле Дата и Проведен. ТекстЗапроса = "ВЫБРАТЬ |ОжиданиеНаБлокировке.Ссылка, |ОжиданиеНаБлокировке.Дата, |ОжиданиеНаБлокировке.Проведен |ИЗ |Документ.ОжиданиеНаБлокировке КАК ОжиданиеНаБлокировке"; Построитель = Новый ПостроительЗапроса(ТекстЗапроса); Построитель.ЗаполнитьНастройки(); Отбор = Построитель.Отбор; ИмяОтбора = "Проведен"; Отбор.Добавить(ИмяОтбора); Отбор[ИмяОтбора].Использование = Истина; Отбор[ИмяОтбора].Значение = Истина; Отбор[ИмяОтбора].ВидСравнения = ВидСравнения.Равно; ИмяОтбора = "Дата"; Отбор.Добавить(ИмяОтбора); Отбор[ИмяОтбора].Использование = Истина; Отбор[ИмяОтбора].Значение = Дата(2016,06,27); Отбор[ИмяОтбора].ВидСравнения = ВидСравнения.МеньшеИлиРавно; НовыйЗапрос = Построитель.ПолучитьЗапрос(); |
В итоге, текст нового запроса приобрёл следующий вид:
1 2 3 4 5 6 7 8 9 |
ВЫБРАТЬ ОжиданиеНаБлокировке.Ссылка КАК Ссылка, ОжиданиеНаБлокировке.Дата КАК Дата, ОжиданиеНаБлокировке.Проведен КАК Проведен ИЗ Документ.ОжиданиеНаБлокировке КАК ОжиданиеНаБлокировке ГДЕ ОжиданиеНаБлокировке.Проведен = &Параметр1 И ОжиданиеНаБлокировке.Дата = &Параметр2 |