Ошибка PostgreSQL 42P01 undefined_table: отношение/таблица не существует
СУБД отклоняет запрос к таблице, представлению или материализованному представлению из-за его отсутствия в текущем пространстве имен:
ERROR: relation "my_table" does not exist
LINE 1: SELECT * FROM my_table;
SQLSTATE: 42P01В среде 1С сбой часто возникает при динамическом формировании прямых SQL-запросов к СУБД без учета префиксов схем, регистра символов или после некорректного обновления конфигурации.
1. Проверка регистра и экранирования двойными кавычками
По умолчанию PostgreSQL приводит все неэкранированные имена идентификаторов к нижнему регистру. Таблицы 1С создаются с именами в смешанном регистре (например, _Document123):
-- Ошибка 42P01 (запрос преобразуется в _document123):
SELECT * FROM _Document123;
-- Корректный запрос с экранированием:
SELECT * FROM "_Document123";2. Проверка схемы и переменной search_path
-- Просмотр текущего пути поиска схем
SHOW search_path;
-- Установка пути к целевой схеме (по умолчанию public)
SET search_path TO public, my_custom_schema;
-- Прямой вызов с указанием схемы:
SELECT * FROM public."_Reference25";3. Соответствие имен таблиц объектам метаданных 1С
Для определения реального физического имени таблицы СУБД по объекту 1С используйте функцию ПолучитьСтруктуруХраненияБазыДанных():
// Выполнить в 1С:
ИмяТаблицыХранения = ПолучитьСтруктуруХраненияБазыДанных(
Метаданные.Документы.РеализацияТоваровУслуг
)[0].ИмяТаблицыХранения;
// Результат вернет имя вида: "_Document245"4. Проверка существования таблицы в системном каталоге
SELECT schemaname, tablename
FROM pg_tables
WHERE tablename ILIKE '%document123%'; Частые вопросы (FAQ)
Почему таблица видна в pgAdmin, но скрипт падает с ошибкой 42P01?
Причина в отсутствии схемы таблицы в search_path текущего пользователя или создании таблицы в кавычках с заглавными буквами (PostgreSQL чувствителен к регистру при наличии кавычек).
Как глобально зафиксировать search_path для базы данных 1С?
Выполните команду: ALTER DATABASE db_name SET search_path TO public;
Может ли 42P01 возникать из-за временных таблиц?
Да, временные таблицы (pg_temp) изолированы в рамках конкретной сессии. Если соединение разорвалось или пул соединений переключил сессию на другой процесс-воркер, временная таблица перестает существовать.
Как проверить, к какому типу относится отношение (таблица, view, foreign table)?
Выполните запрос: SELECT relname, relkind FROM pg_class WHERE relname = 'имя_объекта'; (где relkind 'r' - таблица, 'v' - view, 'm' - материализованное представление, 'f' - внешняя таблица).