Ошибка PostgreSQL 0A000: feature_not_supported — причины и решения
- Запрос аварийно завершается с ошибкой
ERROR: feature is not supported: ... (SQLSTATE 0A000). - В 1С:Предприятие возникает ошибка при попытке выполнения сложных прямых SQL-запросов, внешних источников данных или использования специфических конструкций MSSQL.
- Попытка изменения структуры партиционированных таблиц, генерации уникальных ключей поверх внешних таблиц (FDW) или выполнения неподдерживаемых операций в логической репликации.
1. Анализ текста неподдерживаемой функции
Проверьте детальное сообщение в логе PostgreSQL /var/log/postgresql/postgresql-*.log:
tail -n 50 /var/log/postgresql/postgresql-16-main.log | grep -A 5 "0A000"2. Типичный сценарий 1: Кросс-базовые запросы (замена MSSQL синтаксиса)
В отличие от MS SQL Server, PostgreSQL не поддерживает трехточечный синтаксис SELECT * FROM OtherDb.dbo.Table. Используйте расширение postgres_fdw:
CREATE EXTENSION postgres_fdw;
CREATE SERVER remote_pg FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (host '192.168.1.100', dbname 'secondary_db', port '5432');
CREATE USER MAPPING FOR current_user SERVER remote_pg
OPTIONS (user 'remote_user', password 'secure_password');
IMPORT FOREIGN SCHEMA public FROM SERVER remote_pg INTO public;3. Типичный сценарий 2: Попытка изменения схемы секционированной таблицы
Некоторые DDL операции над секциями (например, добавление уникального индекса, не включающего ключ партиционирования) запрещены ядром. Перестройте структуру индексов:
-- Уникальный индекс обязан содержать ключ секционирования (например, period)
CREATE UNIQUE INDEX idx_doc_uniq ON documents (id, period);4. Адаптация запросов 1С при переходе с MS SQL на PostgreSQL
Замените T-SQL специфичные функции (ISNULL -> COALESCE, TOP n -> LIMIT n, неявные приведения типов -> ::datatype).
Частые вопросы (FAQ)
Почему 1С выдает ошибку 0A000 при работе с расширениями конфигурации?
Это происходит, если расширение пытается добавить реквизит или таблицу с типом данных или параметром, который не поддерживается текущей версией ядра PostgreSQL (или патчами 1С от Postgres Professional).
Поддерживает ли PostgreSQL автономные транзакции внутри функций?
В функциях (FUNCTION) автономные транзакции не поддерживаются и вызывают ошибку 0A000. Начиная с PostgreSQL 11, для управления транзакциями (COMMIT/ROLLBACK) необходимо использовать хранимые процедуры (PROCEDURE).
Можно ли создать глобальную временную таблицу (GLOBAL TEMPORARY) как в Oracle/MSSQL?
Нет, в PostgreSQL поддерживаются только локальные временные таблицы (CREATE TEMP TABLE), существующие в рамках текущей сессии/транзакции.
Как обойти ошибку 0A000 при использовании логической репликации для таблиц без первичного ключа?
Установите для таблицы REPLICA IDENTITY FULL: ALTER TABLE my_table REPLICA IDENTITY FULL; однако это увеличит нагрузку на WAL.