При разработке запросов в платформе 1С:Предприятие начинающие разработчики часто сталкиваются с ошибкой «Не задано значение параметра...». Данная ситуация возникает в процессе вызова метода Выполнить(), если система не обнаружила переданного значения для одного или нескольких параметров, объявленных в тексте запроса с помощью символа амперсанда &.
Рассмотрим подробнее причины возникновения этой ошибки, разберем типичные заблуждения при работе с параметрами запросов и научимся правильно передавать ссылку на текущий документ.
Проанализируем основные технические причины, из-за которых платформа выдает исключение:
&Ссылка), не совпадает с именем, переданным в метод Запрос.УстановитьПараметр() (например, "Регистратор"). Имена должны совпадать с точностью до символа.Выполнить().ПолучитьОбъект() вместо передачи ссылки Ссылка на объект базы данных.Выясним главную проблему: если в тексте запроса написано условие отбора по параметру &Ссылка, а в коде вызывается метод установки с именем "Регистратор", платформа не сможет сопоставить эти данные и выдаст исключение.
Посмотрим на ошибочный вариант написания:
// В запросе:
| ГДЕ Регистратор = &Ссылка
// В коде:
Запрос.УстановитьПараметр("Регистратор", Ссылка); // ОШИБКА: Имя параметра "Ссылка" не задано!
Разберем, как правильно исправить эту ошибку. Нам необходимо привести имена параметров к единому виду:
// Корректный вариант 1: синхронизируем имя "Ссылка"
Запрос.УстановитьПараметр("Ссылка", Ссылка);
// Корректный вариант 2: синхронизируем имя "Регистратор"
// Если в тексте запроса указано: ГДЕ Регистратор = &Регистратор
Запрос.УстановитьПараметр("Регистратор", Ссылка);
Разберем частую ошибку, когда при установке параметра пытаются вызвать Ссылка.ПолучитьОбъект(). Запросы в 1С работают исключительно с таблицами базы данных и с сылочной адресацией. Объект типа ДокументОбъект существует в оперативной памяти и не может выступать значением для сравнения с полями типа ДокументСсылка (такими как Регистратор).
Правильные подходы к получению ссылки в зависимости от контекста выполнения кода:
Ссылка или ЭтотОбъект.Ссылка. Вызывать ПолучитьОбъект() категорически не требуется.Объект.Ссылка.Рассмотрим готовый пример запроса к виртуальной таблице регистра бухгалтерии с получением оборотов по текущему документу-регистратору:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ХозрасчетныйДвиженияССубконто.Регистратор КАК Регистратор,
| ХозрасчетныйДвиженияССубконто.СубконтоКт1 КАК СубконтоКт1,
| ХозрасчетныйДвиженияССубконто.СубконтоКт2 КАК СубконтоКт2,
| СУММА(ХозрасчетныйДвиженияССубконто.Сумма) КАК Сумма,
| СУММА(ХозрасчетныйДвиженияССубконто.КоличествоКт) КАК КоличествоКт
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(
| ,
| ,
| Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.МатериалыПереданныеВПереработку)
| И Регистратор = &Регистратор
| ) КАК ХозрасчетныйДвиженияССубконто
|СГРУППИРОВАТЬ ПО
| ХозрасчетныйДвиженияССубконто.Регистратор,
| ХозрасчетныйДвиженияССубконто.СубконтоКт2,
| ХозрасчетныйДвиженияССубконто.СубконтоКт1";
// Передаем ссылку на текущий документ в параметр Регистратор
Запрос.УстановитьПараметр("Регистратор", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Чтобы быстро найти, какой именно параметр забыли установить в сложном пакетном запросе, можно использовать встроенный метод НайтиПараметры(). Он возвращает массив всех параметров, найденных платформой в тексте запроса:
МассивПараметров = Запрос.НайтиПараметры();
Для Каждого Параметр Из МассивПараметров Цикл
Сообщить("В запросе найден параметр: " + Параметр.Имя);
КонецЦикла;
Важно помнить: если новый документ еще ни разу не был записан в базу данных, реквизит Ссылка содержит пустую ссылку. В таком случае запрос к физическим или виртуальным таблицам регистра не вернет никаких движений, так как они еще не сохранены в базе данных.