С подобной ошибкой любой разработчик встречался хотя бы один раз. Ее непосредственная причина – попытка запроса использовать параметр, который в запрос не был помещен.
Почему так происходит? Код постоянно меняется, текст запросов, параметры могут переименовываться, добавляться, удаляться, но в ходе работы формируются различные приемы и методики, позволяющие данную проблему нивелировать.
При инициализации запроса, параметры необходимо указывать до текста запроса. Таким образом, еще до чтения текста, вы объявляете параметры, с которым необходимо работать. Также это позволяет улучшить самоконтроль – сначала определяем параметр, а потом его используем.
Бывают ситуации, когда параметры в зависимости от различных условий не нужны.
Самое простое решение – это использовать дополнительный параметр с типом Булево, определяющий необходимость использования основного параметра.
Функция ЗапросОстатковПоСкладу(Дата, Организация = Неопределено)
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ДатаОстатков", Дата);
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("ОтборПоОрганизации", Организация Неопределено);
Запрос.Текст =
"ВЫБРАТЬ
| Остатки.Организация,
| Остатки.Номенклатура,
| Остатки.КоличествоОстаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладе.Остатки(
| &ДатаОстатков,
| НЕ &ОтборПоОрганизации
| ИЛИ Организация = &Организация) КАК
Остатки"
;
РезультатЗапроса = Запрос.Выполнить();
Возврат РезультатЗапроса;
КонецФункции
Такой запрос не вполне оптимален с точки зрения быстродействия (из-за конструкции ИЛИ в условии отбора), но если потери быстродействия терпимы, то ими можно пренебречь.
самые свежие новости 1 раз в месяц
Более технологичным решением может быть использование возможностей компоновщика. Для простых случаев подойдет построитель запроса. Вы можете инициализировать запрос построителем, а параметры добавлять динамически.
Функция ЗапросОстатковПоСкладу(Дата, Организация = Неопределено)
ТекстЗапроса =
"ВЫБРАТЬ"
| Остатки.Организация,
| Остатки.Номенклатура,
| Остатки.КоличествоОстаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладе.Остатки(&ДатаОстатков, ) КАК
Остатки"
Построитель = Новый ПостроительЗапроса(пТекстЗапроса);
Построитель.ЗаполнитьНастройки();
Если Организация <> Неопределено Тогда
ЭлементОтбора = Построитель.Отбор.Добавить("Организация", "Организация");
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.Значение = Организация;
ЭлементОтбора.ВидСравнения = ВидСравнения.Равно;
Запрос = Построитель.ПолучитьЗапрос();
Иначе
Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;
КонецЕсли;
Запрос.УстановитьПараметр("ДатаОстатков", Дата);
РезультатЗапроса = Запрос.Выполнить();
Возврат РезультатЗапроса;
КонецФункции
Данный код приведен в качестве примера и скомпонован с целью повышения наглядности. Рекомендуется не использовать его в чистом виде, а реализовать в виде полноценного инструмента по динамической работе с отборами в запросе.
консультация эксперта
самые свежие новости 1 раз в месяц