Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

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

42804 1С:Предприятие и СУБД

Ошибка PostgreSQL 42804 datatype_mismatch: несоответствие типов данных

Обновлено: 26.08.2026 · Официальная документация ↗

СУБД отклоняет запрос, когда тип возвращаемого выражения не совпадает с ожидаемым контекстом или типами других веток оператора:

ERROR: structure of query does not match function result type
-- либо:
ERROR: UNION types text and integer cannot be matched
LINE 2: SELECT 1 UNION ALL SELECT 'text';
SQLSTATE: 42804

В платформе 1С ошибка возникает при объединении несовместимых типов в запросах ОБЪЕДИНИТЬ ВСЕ или несовпадении типов веток ВЫБОР КОГДА ... ТОГДА.

1. Исправление конфликтов типов в UNION / UNION ALL

Все объединяемые запросы должны иметь идентичные типы данных в соответствующих позициях колонок:

-- ОШИБКА 42804:
SELECT id, total_amount FROM orders
UNION ALL
SELECT id, 'Нет данных' FROM archived_orders;

-- ИСПРАВЛЕНИЕ с приведением к общему типу (например, text):
SELECT id::text, total_amount::text FROM orders
UNION ALL
SELECT id::text, 'Нет данных' FROM archived_orders;

2. Согласование типов в операторах CASE WHEN / COALESCE

Все ветки THEN и ELSE обязаны возвращать один и тот же тип данных:

-- ОШИБКА:
SELECT CASE WHEN is_active THEN 1 ELSE 'Не активен' END FROM users;

-- ИСПРАВЛЕНИЕ:
SELECT CASE WHEN is_active THEN '1' ELSE 'Не активен' END FROM users;

3. Исправление запросов 1С:Предприятие

В текстах запросов 1С используйте явное приведение типов через функцию ВЫРАЗИТЬ():

// Запрос 1С с согласованием типов колонок
ВЫБРАТЬ
    Заказ.Номер КАК ДокументНомер,
    Заказ.Сумма КАК СуммаДокумента
ИЗ
    Документ.ЗаказКлиента КАК Заказ

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Списание.Номер,
    ВЫРАЗИТЬ(0 КАК ЧИСЛО(15, 2)) // Явное задание типа Число вместо пустой ссылки
ИЗ
    Документ.СписаниеБезналичныхДенежныхСредств КАК Списание
💡 Практика специалистов: В запросах 1С:Предприятие при работе с составными типами данных (например, поле 'ДокументОснование') всегда проверяйте тип ссылки через оператор ССЫЛКА перед объединением, чтобы исключить конфликты типизации на уровне PostgreSQL.

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

Почему PostgreSQL не приводит int к text автоматически в UNION?

В целях предотвращения скрытых ошибок оптимизации и потери производительности PostgreSQL запрещает неявное приведение фундаментально различных категорий типов (числа, строки, бинарные данные, даты) без явного оператора CAST (::).

Как функция COALESCE обрабатывает разные типы аргументов?

Функция COALESCE пытается привести все переданные аргументы к типу первого аргумента. Если неявное приведение невозможно, ядро возвращает ошибку 42804.

Почему 42804 возникает при создании триггерной функции?

Триггерная функция обязана возвращать тип trigger (или event_trigger для DDL событий). Если функция объявлена как возвращающая void, integer или text, CREATE TRIGGER завершится ошибкой 42804.

Как узнать категорию типа данных в PostgreSQL?

Выполните запрос к системному каталогу pg_type: SELECT typname, typcategory FROM pg_type WHERE typname = 'my_type'; (например, 'S' - String, 'N' - Numeric, 'D' - DateTime).

Полезные материалы
Рекомендуем