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