Как исправить ошибку «Не задано значение параметра» при выполнении запроса в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Рассмотрим подробнее причины возникновения этой ошибки, разберем типичные заблуждения при работе с параметрами запросов и научимся правильно передавать ссылку на текущий документ.

Основные причины возникновения ошибки

Проанализируем основные технические причины, из-за которых платформа выдает исключение:

  1. Рассинхрон имен параметров: имя параметра, указанное в тексте запроса (например, &Ссылка), не совпадает с именем, переданным в метод Запрос.УстановитьПараметр() (например, "Регистратор"). Имена должны совпадать с точностью до символа.
  2. Опечатки и синтаксические ошибки: использование символов латиницы вместо кириллицы или лишние пробелы в названии параметра.
  3. Непереданные параметры во вложенных запросах: если параметр указан в секциях временных таблиц, вложенных запросов или в одном из запросов пакета, платформа требует обязательно задать для него значение до вызова Выполнить().
  4. Попытка передачи объекта вместо ссылки: использование метода ПолучитьОбъект() вместо передачи ссылки Ссылка на объект базы данных.

Шаг 1. Сопоставление имен параметров в коде и запросе

Выясним главную проблему: если в тексте запроса написано условие отбора по параметру &Ссылка, а в коде вызывается метод установки с именем "Регистратор", платформа не сможет сопоставить эти данные и выдаст исключение.

Посмотрим на ошибочный вариант написания:


// В запросе:
| ГДЕ Регистратор = &Ссылка

// В коде:
Запрос.УстановитьПараметр("Регистратор", Ссылка); // ОШИБКА: Имя параметра "Ссылка" не задано!

Разберем, как правильно исправить эту ошибку. Нам необходимо привести имена параметров к единому виду:


// Корректный вариант 1: синхронизируем имя "Ссылка"
Запрос.УстановитьПараметр("Ссылка", Ссылка);

// Корректный вариант 2: синхронизируем имя "Регистратор"
// Если в тексте запроса указано: ГДЕ Регистратор = &Регистратор
Запрос.УстановитьПараметр("Регистратор", Ссылка);

Шаг 2. Правильная передача ссылки на текущий документ

Разберем частую ошибку, когда при установке параметра пытаются вызвать Ссылка.ПолучитьОбъект(). Запросы в 1С работают исключительно с таблицами базы данных и с сылочной адресацией. Объект типа ДокументОбъект существует в оперативной памяти и не может выступать значением для сравнения с полями типа ДокументСсылка (такими как Регистратор).

Правильные подходы к получению ссылки в зависимости от контекста выполнения кода:

  1. Модуль объекта документа: используем контекстную переменную Ссылка или ЭтотОбъект.Ссылка. Вызывать ПолучитьОбъект() категорически не требуется.
  2. Модуль формы документа: обращаемся к свойству реквизита формы Объект.Ссылка.
  3. Модуль менеджера: ссылка передается в качестве входящего параметра процедуры или функции.

Пример правильного построения запроса

Рассмотрим готовый пример запроса к виртуальной таблице регистра бухгалтерии с получением оборотов по текущему документу-регистратору:


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

// Передаем ссылку на текущий документ в параметр Регистратор
Запрос.УстановитьПараметр("Регистратор", Ссылка);

РезультатЗапроса = Запрос.Выполнить();

Способ автоматической проверки параметров при отладке

Чтобы быстро найти, какой именно параметр забыли установить в сложном пакетном запросе, можно использовать встроенный метод НайтиПараметры(). Он возвращает массив всех параметров, найденных платформой в тексте запроса:


МассивПараметров = Запрос.НайтиПараметры();
Для Каждого Параметр Из МассивПараметров Цикл
    Сообщить("В запросе найден параметр: " + Параметр.Имя);
КонецЦикла;

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

← На главную