Не задано значение параметра в запросе 1С 8.3
Меню

Не задано значение параметра в запросе 1С 8.3

С подобной ошибкой любой разработчик встречался хотя бы один раз. Ее непосредственная причина – попытка запроса использовать параметр, который в запрос не был помещен.

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

При инициализации запроса, параметры необходимо указывать до текста запроса. Таким образом, еще до чтения текста, вы объявляете параметры, с которым необходимо работать. Также это позволяет улучшить самоконтроль – сначала определяем параметр, а потом его используем.

Бывают ситуации, когда параметры в зависимости от различных условий не нужны.

Самое простое решение – это использовать дополнительный параметр с типом Булево, определяющий необходимость использования основного параметра.

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

Такой запрос не вполне оптимален с точки зрения быстродействия (из-за конструкции ИЛИ в условии отбора), но если потери быстродействия терпимы, то ими можно пренебречь.

Более технологичным решением может быть использование возможностей компоновщика. Для простых случаев подойдет построитель запроса. Вы можете инициализировать запрос построителем, а параметры добавлять динамически.

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

Данный код приведен в качестве примера и скомпонован с целью повышения наглядности. Рекомендуется не использовать его в чистом виде, а реализовать в виде полноценного инструмента по динамической работе с отборами в запросе.


Рассказать друзьям
Предыдущая статья статья
1С Управление торговлей 11.4
Следующая статья статья
Основные справочники 1С 8.3: создание и изменение элементов
Комментарии