Как исправить ошибку СУБД 42601 при работе 1С:Предприятие 8.3 с PostgreSQL?

Системный администратор 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При обновлении платформы 1С:Предприятие с ветки 8.2 или ранних релизов 8.3 на современные версии (начиная с 8.3.9) системные администраторы нередко сталкиваются с критической ошибкой СУБД. Проблема проявляется как при обычном запуске конфигурации в пользовательском режиме, так и при попытке запустить тестирование и исправление информационной базы в конфигураторе.

Текст ошибки в журнале обычно выглядит следующим образом:


Ошибка СУБД:
42601:ERROR: syntax error at near "not"
LINE 1: create table if not exists _tmpRCT (TabID bytea not null pri...

Разберем детально техническую причину такого поведения и рассмотрим проверенные способы восстановления штатной работы кластера 1С.

Техническая причина возникновения ошибки 42601

Проанализируем текст ошибки и логику взаимодействия платформы с базой данных:

  1. Код ошибки 42601 (syntax_error): Данный статус в СУБД PostgreSQL сигнализирует о синтаксической ошибке в переданном SQL-запросе. Парсер базы данных прерывает выполнение инструкции на слове not.
  2. Изменение синтаксиса в PostgreSQL: Конструкция CREATE TABLE IF NOT EXISTS была официально представлена и добавлена в ядро PostgreSQL только начиная с версии 9.1. Во всех более ранних релизах (PostgreSQL 8.4, 9.0 и сборках 1C на их базе) данный синтаксис считается недопустимым.
  3. Оптимизация генератора SQL в платформе 1С: Начиная с релиза 8.3.9, внутренний механизм платформы «1С:Предприятие» был переработан. Для работы со служебными и временными таблицами (в частности, таблицей _tmpRCT, используемой для контроля транзакций, блокировок и наборов записей) платформа перестала делать предварительные запросы к системным каталогам и перешла на прямую инструкцию CREATE TABLE IF NOT EXISTS.
  4. Различие формата хранения дат: В старых версиях платформы 8.2 использовался параметр СУБД integer_datetimes = off (хранение даты/времени с плавающей точкой). Начиная с версии 8.3.3, платформа 1С штатно требует целочисленный формат integer_datetimes = on, который по умолчанию активирован во всех современных дистрибутивах PostgreSQL.

Таким образом, платформа 8.3.9 и новее архитектурно и синтаксически несовместима с PostgreSQL 9.0 и более старыми сборками.

Способ 1. Обновление СУБД PostgreSQL и корректная миграция данных (Основное решение)

Для долговременной и стабильной работы системы требуется установить актуальную версию СУБД PostgreSQL, оптимизированную для работы с «1С:Предприятие» (версии 9.4, 9.6, 10 или более современные сборки от Postgres Professional или фирмы 1С).

Важно: Из-за смены формата integer_datetimes прямое обновление каталога данных СУБД через утилиту pg_upgrade со старых версий (9.0) на новые (9.4+) невозможно. Перенос базы данных необходимо выполнять логически.

Разберем пошаговый порядок корректной миграции:

  1. Создание резервной копии базы данных: На исходном сервере со старой версией платформы (или через конфигуратор) выполним выгрузку информационной базы в файл выгрузки: Администрирование → Выгрузить информационную базу... (файл с расширением .dt). Альтернативно можно сделать текстовый дамп средствами утилиты pg_dump.
  2. Установка новой версии PostgreSQL: Установим специализированную сборку PostgreSQL (например, 9.4.10, 9.6 или новее с патчами для 1С) на сервер. Если миграция происходит на одном физическом сервере, настроим новый экземпляр PostgreSQL на альтернативный порт (например, 5433).
  3. Создание пустой базы данных: Через консоль pgAdmin или утилиту createdb создадим новую чистую базу данных в обновленном кластере СУБД с параметрами кодировки UTF8 и локали ru_RU.UTF-8 (или Russian_Russia.1251 для Windows).
  4. Создание базы в кластере 1С: В консоли администрирования серверов 1С:Предприятия 8.3 создадим новую информационную базу, указав параметры подключения к новому серверу PostgreSQL.
  5. Загрузка данных: Откроем конфигуратор созданной пустой информационной базы и выполним операцию: Администрирование → Загрузить информационную базу..., указав ранее сохраненный .dt файл.
  6. Проверка целостности: Запустим процедуру Тестирование и исправление информационной базы, чтобы убедиться в отсутствии синтаксических ошибок СУБД.

Способ 2. Временное понижение версии платформы (Workaround)

Если обновление СУБД в текущий момент невозможно из-за регламента или инфраструктурных ограничений, можно временно вернуться на более ранний релиз платформы 1С.

Рассмотрим порядок действий для временного решения:

  1. Подбор релиза платформы: Установим версию платформы 1С из веток 8.3.6, 8.3.7 или 8.3.8 (например, релиз 8.3.8.1747). В этих версиях внутренний генератор запросов платформы еще не использовал конструкцию IF NOT EXISTS и успешно работает с СУБД PostgreSQL 9.0.
  2. Проверка совместимости конфигурации: Убедимся, что используемая конфигурация (например, «Бухгалтерия предприятия» ред. 2.0 или 3.0) не требует в обязательном порядке режим совместимости 8.3.9.
  3. Перезапуск службы: Переведем рабочие процессы кластера 1С на установленный релиз платформы 8.3.8.

Отметим, что данный вариант является временной мерой, так как дальнейшее обновление типовых конфигураций 1С неизбежно потребует актуализации версии платформы и соответствующего обновления версии СУБД.

← На главную