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

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

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

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

Ошибка PostgreSQL 23514 check_violation: причины, исправление и специфика 1С

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

При выполнении операций INSERT или UPDATE транзакция аварийно прерывается со следующим сообщением:

ERROR: new row for relation "table_name" violates check constraint "constraint_name"
DETAIL: Failing row contains (id, val1, val2, ...).
SQLSTATE: 23514

В технологическом журнале 1С:Предприятие фиксируется событие DBPOSTGRS со статусом ошибки выполнения запроса к таблицам итогов, регистрам сведений или системным полям дат.

1. Локализация проблемного ограничения (CHECK Constraint)

Для выявления логики нарушенного ограничения выполните запрос к системному каталогу PostgreSQL:

SELECT conname, pg_get_constraintdef(c.oid) AS constraint_def, conrelid::regclass AS table_name
FROM pg_constraint c
JOIN pg_class t ON c.conrelid = t.oid
JOIN pg_namespace n ON t.relnamespace = n.oid
WHERE c.conname = 'имя_ограничения'
  AND c.contype = 'c';

2. Анализ сбойных данных в контексте 1С:Предприятие

В среде 1С:Предприятие ошибка 23514 чаще всего возникает при попытке записи пустых дат (0001-01-01) в поля с ограничением на минимальную дату PostgreSQL (смещение дат на 2000 лет при инициализации базы) либо при нарушении целостности периодических регистров.

-- Поиск строк, нарушающих условие предиката (на примере проверки даты)
SELECT * FROM "_Document123"
WHERE NOT ("_Date_Time" >= '2000-01-01 00:00:00'::timestamp without time zone);

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

Если ограничение является пользовательским или создано сторонним расширением:

-- Временное отключение проверки для импорта данных (не рекомендуется в production без крайней необходимости)
ALTER TABLE "table_name" ALTER CONSTRAINT "constraint_name" DEFERRABLE INITIALLY DEFERRED;

-- Исправление невалидных строк
UPDATE "table_name"
SET "column_name" = 'valid_value'
WHERE NOT ("column_name" > 0);

4. Восстановление целостности в 1С

Если сбой происходит в типовых таблицах платформы, запустите процедуру Тестирование и исправление информационной базы в Конфигураторе с обязательным включением опций «Проверка логической целостности» и «Реструктуризация таблиц информационной базы».

💡 Практика специалистов: Никогда не удаляйте вручную CHECK-констрейнты, начинающиеся на 'check_' или '_check', созданные платформой 1С на пропатченном Postgres (Postgres Pro 1C / PostgreSQL-1C). Это разрушит механизм реструктуризации метаданных и приведет к полной блокировке обновлений конфигурации.

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

Почему ошибка 23514 возникает при записи пустой даты в 1С:Предприятие?

Если при создании базы 1С в PostgreSQL не был включен параметр 'Смещение дат 2000', стандартная пустая дата 1С ('0001-01-01') может нарушать ограничения встроенных проверок или сторонних триггеров на неотрицательные временные интервалы.

Можно ли принудительно проигнорировать CHECK constraint при вставке?

Нет, в PostgreSQL ограничения CHECK имеют безусловный приоритет валидации и не могут быть проигнорированы без их удаления (ALTER TABLE ... DROP CONSTRAINT) или перевода в режим NOT VALID с последующей валидацией.

Как добавить ограничение CHECK без блокировки всей таблицы на чтение/запись?

Используйте двухэтапное добавление: сначала выполните команду ALTER TABLE tbl ADD CONSTRAINT check_name CHECK (expr) NOT VALID; (не блокирует таблицу полной проверкой), а затем валидируйте существующие строки командой ALTER TABLE tbl VALIDATE CONSTRAINT check_name;.

В чем разница между констрейнтом NOT NULL и констрейнтом CHECK (col IS NOT NULL)?

Ограничение NOT NULL семантически оптимизировано на уровне ядра PostgreSQL и планировщика запросов. CHECK (col IS NOT NULL) выполняет аналогичную логическую функцию, но требует больше накладных расходов при проверке строк и не всегда корректно учитывается оптимизатором при генерации планов сканирования индексов.

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