Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

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

Ошибка PostgreSQL 42P02: undefined_parameter — биндинг переменных

Обновлено: 26.08.2026  ·  Официальная база знаний
  • Ошибка выполнения запроса ERROR: there is no parameter $ (SQLSTATE 42P02).
  • Сбои при выполнении подготовленных выражений (Prepared Statements), когда переданных позиционных параметров меньше, чем указано в теле запроса.
  • Ошибки прямого выполнения SQL через внешние компоненты или REST-коннекторы к базе 1С.

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

Проверьте соответствие плейсхолдеров ($1, $2, ...) и фактически переданных значений в логе PostgreSQL:

-- Ошибочный запрос (указан $2, но передан только один параметр):
PREPARE get_doc(int) AS SELECT * FROM _document123 WHERE _id = $1 AND _posted = $2;

-- Исправленный запрос:
PREPARE get_doc(int, bool) AS SELECT * FROM _document123 WHERE _id = $1 AND _posted = $2;
EXECUTE get_doc(100500, true);

2. Проверка генерации запросов в коде интеграции

Если используется связка с Python/NodeJS/C#, убедитесь, что библиотека формирует строгую последовательность без пропусков индексов (нельзя использовать $1 и $3 без $2):

-- Неверно:
SELECT * FROM users WHERE id = $1 AND role = $3;

-- Корректно:
SELECT * FROM users WHERE id = $1 AND role = $2;

3. Очистка кэша подготовленных выражений

DEALLOCATE ALL;
Практический опыт инженера: При использовании пулеров соединений (PgBouncer) в режиме Transaction Pooling вызовы PREPARE / EXECUTE приводят к ошибкам 42P02 и 26000. Используйте безымянные подготовленные выражения или протокол Extended Query.

Частые вопросы (FAQ)

Почему возникает ошибка 42P02 при динамическом формировании SQL в 1С?

Ошибка возникает, если при генерации текста запроса для внешнего источника данных был сформирован строковый литерал со знаком $ (например, в значении поля), который парсер PostgreSQL ошибочно интерпретировал как позиционный параметр.

Как экранировать символ доллара в запросах PostgreSQL?

Используйте стандартные экранированные строки E'...' или доллар-квотинг с уникальным тегом: $tag$текст с $1 внутри$tag$.

Каково максимальное количество параметров в одном запросе PostgreSQL?

В протоколе PostgreSQL количество параметров в Bind-сообщении ограничено типом int16 и составляет максимум 65535 параметров.

Что делать при ошибке prepared statement "..." does not exist?

Это ошибка 26000. В отличие от 42P02, она указывает на то, что само подготовленное выражение не найдено или сессия пулера соединений сменилась.