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

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия Бухгалтерский учет
← На главную

При разработке отчетов или обработок на платформе 1С программисты часто сталкиваются с ситуацией, когда синтаксически верный запрос отказывается работать, выдавая системную ошибку «Недопустимое значение параметра (Параметр номер 1)». Эта ошибка обычно возникает в момент вызова метода Выполнить() или УстановитьПараметр(). Рассмотрим подробнее причины возникновения этой проблемы и разберем по шагам методы ее решения на примере запроса к документу «Счет на оплату покупателю».

Анализ исходного кода и выявление явных ошибок

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

Во-первых, обратим внимание на текст запроса и блок установки параметров:


Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|   СчетНаОплатуПокупателю.Номер,
|   СчетНаОплатуПокупателю.Ссылка В (&МассивОбъектов)";

// Ошибка здесь:
Запрос.Параметры.Вставить("Ссылка", МассивОбъектов);

Выясним причину: в тексте запроса указан параметр с именем &МассивОбъектов, а в коде делается попытка вставить параметр с именем "Ссылка". Платформа 1С не находит соответствия между этими именами. Более того, использование прямой записи в коллекцию через Параметры.Вставить не является рекомендуемым стандартом. Правильно использовать метод УстановитьПараметр(), который проверяет наличие параметра в тексте запроса.

Рассмотрим исправленный вариант установки параметров:

Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);

Проблема несоответствия типов данных

Если после исправления имен параметров ошибка сохраняется, нам необходимо проанализировать содержимое переменной МассивОбъектов. Ошибка «Недопустимое значение параметра» часто сигнализирует о том, что тип данных, передаваемый в запрос, не может быть корректно обработан оператором В.

Проанализируем ситуацию по шагам:

  1. Проверка типа коллекции: Убедимся, что переменная МассивОбъектов действительно является Массивом или СпискомЗначений. Если передать туда ТаблицуЗначений или Структуру, запрос выдаст ошибку.
  2. Анализ элементов коллекции: Если в массиве, предназначенном для сравнения с полем Ссылка, окажется хотя бы одна строка, число или Неопределено, движок запросов может выдать ошибку типизации.
  3. Пустые ссылки: Иногда наличие в массиве «битых» ссылок (объектов, которые были удалены, но ссылка на них осталась в памяти) приводит к сбоям на уровне СУБД.

Для диагностики воспользуемся советом из обсуждения: установим точку останова на строке выполнения запроса и нажмем Shift+F9. В окне вычисления выражений введем ТипЗнч(МассивОбъектов[0]). Это позволит увидеть тип первого элемента. Если он отличается от ДокументСсылка.СчетНаОплатуПокупателю, значит, массив сформирован некорректно.

Специфика вложенных таблиц в запросе

В представленном коде используется выборка табличной части документа через точку: СчетНаОплатуПокупателю.Товары.(...). Рассмотрим этот подход подробнее. Хотя 1С поддерживает такой синтаксис для получения иерархических результатов, он имеет свои особенности:

Рекомендуем переписать запрос с использованием классического соединения, если вложенная выборка не является обязательным требованием архитектуры:


ВЫБРАТЬ
    Счет.Номер КАК Номер,
    Счет.Дата КАК Дата,
    СчетТовары.Номенклатура КАК Номенклатура,
    СчетТовары.Количество КАК Количество
ИЗ
    Документ.СчетНаОплатуПокупателю КАК Счет
ЛЕВОЕ СОЕДИНЕНИЕ 
    Документ.СчетНаОплатуПокупателю.Товары КАК СчетТовары
ПО 
    СчетТовары.Ссылка = Счет.Ссылка
ГДЕ
    Счет.Ссылка В (&МассивОбъектов)

Итоговый алгоритм решения проблемы

Подводя итог, если вы столкнулись с ошибкой «Недопустимое значение параметра (Параметр номер 1)», выполните следующие действия:

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

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

← На главную