новое событие
Информационный поток
Задания вакансии материалы разработки сообщения форума

Запрос с произвольно заполненным параметром

  • Добавить свою публикацию
  • для этого требуется регистрация

Многие программисты при написании запросов пользуются очень неудобным методом дополнения текста запроса исходя из выбранных пользователем или переданными в процедуру параметрами. Зачастую это выглядит следующим образом:


Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| Номенклатура.Ссылка,
| Номенклатура.Код,
| Номенклатура.Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура»;
...
 

Возьмем, как пример, вышеуказанный запрос. Ничего сложного в нем нет, выбирается справочник Номенклатура и поля Ссылка,Код и Наименование. При использовании каких либо параметров отбора по данному запросу (если не использовать СКД, т. к. в ней отбор произвести не сложно) многие начинают «оптимизировать» запрос следующим образом
(В нашем примере мы хотим совершить отбор справочника по определенной номенклатуре):

...
Если ЗначениеЗаполнено(НоменклатураДляОтбора) Тогда
Запрос.Текст = Запрос.Текст + «
|ГДЕ Номенклатура.Ссылка = &НоменклатураДляОтбора»;
Запрос.УстановитьПараметр(«НоменклатураДляОтбора»,НоменклатураДляОтбора);
КонецЕсли;
...

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


Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| Номенклатура.Ссылка,
| Номенклатура.Код,
| Номенклатура.Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| ВЫБОР
|         КОГДА &ОтборПоНоменклатуре = ИСТИНА
|         ТОГДА Номенклатура.Ссылка = &НоменклатураДляОтбора
|         ИНАЧЕ ИСТИНА
| КОНЕЦ»;
Запрос.УстановитьПараметр(«ОтборПоНоменклатуре»,ЗначениеЗаполнено(НоменклатураДляОтбора));
Запрос.УстановитьПараметр(«НоменклатураДляОтбора»,НоменклатураДляОтбора);

Как видим в конструкции запроса «ГДЕ» у нас появилась конструкция «ВЫБОР» которая срабатывает на значение параметра «ОтборПоНоменклатуре». Таким образом имеяя один общий текст запроса, который легко изменяется в конструкторе запросов, мы имеем различные результаты выполнения этого запроса в зависимости от заполнения «НоменклатурыДляОтбора» т. е. В данном случае мы получаем достаточно универсальный запрос. Данный пример можно развить уже в необходимом вам направлении и применять в других различных запросах.

 
0
≡ к списку статей