Ошибка PostgreSQL 42601 syntax_error: синтаксическая ошибка SQL
СУБД отклоняет запрос на этапе парсинга из-за нарушения грамматики языка SQL или использования зарезервированных ключевых слов:
ERROR: syntax error at or near "WHERE"
LINE 1: SELECT id, name, WHERE status = 1;
^
SQLSTATE: 42601В платформе 1С ошибка возникает при некорректной программной конкатенации строк динамических запросов или при использовании прямых SQL-запросов к СУБД.
1. Анализ маркера позиции ошибки (Cursor Position)
В тексте ошибки PostgreSQL всегда указывает точную строку (LINE) и символ (^), на котором синтаксический анализатор прервал разбор. Обратите внимание на токен, расположенный непосредственно перед указателем (часто пропущена запятая, скобка или экранирование).
2. Использование зарезервированных ключевых слов в качестве имен полей
Если колонка таблицы называется зарезервированным словом (user, order, group, check, limit), ее необходимо экранировать двойными кавычками:
-- ОШИБКА 42601:
SELECT id, user, order FROM orders;
-- ИСПРАВЛЕНИЕ:
SELECT id, "user", "order" FROM "orders";3. Проверка непарных кавычек и спецсимволов
-- Ошибка из-за одинарной кавычки внутри литерала:
SELECT 'O'Reilly' AS author;
-- Исправление экранированием через дублирование кавычки:
SELECT 'O''Reilly' AS author;
-- Исправление через Dollar-Quoting (рекомендуется для скриптов):
SELECT $$O'Reilly$$ AS author;4. Траблшутинг динамических запросов в 1С:Предприятие
При сборке запросов в коде 1С выводите сформированный текст в консоль перед выполнением:
ТекстЗапроса = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ " + Условие; // Ошибка, если Условие пустое
// Защита:
Если ПустаяСтрока(Условие) Тогда
Условие = "ИСТИНА";
КонецЕсли; Частые вопросы (FAQ)
Где найти полный список зарезервированных слов PostgreSQL?
В системном представлении pg_get_keywords(): SELECT * FROM pg_get_keywords() WHERE catcode = 'R'; (буква R означает строго зарезервированное слово).
Что такое Dollar-Quoting ($$) в PostgreSQL?
Это синтаксический механизм экранирования строковых констант без использования обратных слэшей или дублирования кавычек. Все, что находится внутри тегов $$...$$ или $tag$...$tag$, воспринимается ядром как сплошной текст.
Почему 42601 возникает при выполнении нескольких команд через точку с запятой?
Некоторые интерфейсы драйверов (например, подготовленные выражения Prepared Statements или функции pqexecparams) не поддерживают мультизапросные выражения в одном вызове.
Как подсветить синтаксическую ошибку в многостраничном SQL скрипте?
Используйте встроенные линтеры (например, sqlfluff или pgformatter) либо запустите скрипт через утилиту psql, которая вернет номер строки сбоя.