Как исправить ошибку СУБД 42P01 "relation does not exist" в 1С при работе с PostgreSQL?

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

При работе с базами данных 1С на платформе PostgreSQL администраторы иногда сталкиваются с критической ошибкой: Ошибка СУБД: 42P01: ERROR: relation "_refsinfXXXXX" does not exist. Эта ситуация означает, что платформа пытается обратиться к таблице, описание которой есть в метаданных конфигурации, но сама таблица физически отсутствует в схеме базы данных SQL. Чаще всего проблема проявляется при попытке выгрузки базы в формат .dt, выполнении регламентных операций или при открытии конкретных справочников.

В этой статье мы подробно разберем причины возникновения данной ошибки, проанализируем взаимосвязь с обновлениями платформы и рассмотрим пошаговые алгоритмы спасения данных, от работы с pgAdmin до использования специализированных обработок выгрузки.

Выясним причину возникновения ошибки 42P01

Проанализируем ситуацию: почему таблица может исчезнуть? Рассмотрим основные сценарии:

  1. Баг платформы при проведении ТиИ: В версиях платформы 1С 8.3.24 и 8.3.25 был официально зафиксирован критический баг. При выполнении процедуры "Тестирование и исправление" (ТиИ) с установленными флагами "Очищать ссылки" или "Удалять объекты", система вместо очистки записей в служебных таблицах могла ошибочно генерировать команду DROP TABLE. Это приводило к полному удалению таблиц из PostgreSQL.
  2. Природа таблиц с префиксом _RefSInf: Начиная с версии 8.3.20, 1С использует таблицы вида _RefSInfXXXXX для хранения вспомогательной информации о предопределенных элементах (Predefined Information). Если такая таблица удаляется, база перестает корректно функционировать, так как нарушается логика связи программного кода с объектами базы данных.
  3. Некорректный перенос данных: Ошибки могут возникнуть, если каталог базы данных перемещался вручную на уровне файловой системы (например, с диска C на диск D) без переинициализации службы PostgreSQL. Это часто приводит к проблемам с правами доступа или повреждению структуры индексов.

Шаг 1. Идентификация поврежденного объекта

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

Воспользуемся консолью запросов или средствами pgAdmin. В большинстве случаев префикс _RefSInf указывает на справочник. Вы можете выполнить поиск в интернете по номеру таблицы или, если база еще открывается в режиме "Конфигуратор", попробовать сопоставить идентификатор через таблицу Config (хотя это трудоемкий процесс).

Если у вас есть архивная копия базы (даже старая), откройте её в pgAdmin и найдите таблицу с указанным именем. По составу полей и данным в ней можно будет определить, к какому справочнику она относится (например, Справочник.КлассификаторыМедРегистра или Справочник.РешенияАттестационнойКомиссии).

Шаг 2. Восстановление структуры через "фиктивное" обновление

Попробуем заставить платформу 1С самостоятельно пересоздать недостающую таблицу. Разберем этот алгоритм:

  1. Откроем базу в режиме Конфигуратор.
  2. Найдем проблемный справочник, который мы вычислили на предыдущем этапе.
  3. Внесем в него любое незначительное изменение: например, добавим новый реквизит Тест или временно изменим длину наименования на один символ.
  4. Нажмем F7 (Обновить конфигурацию базы данных).
  5. При обновлении 1С сравнивает структуру метаданных с физическими таблицами в SQL. Если таблица отсутствует, платформа попытается создать её заново.
  6. Если обновление прошло успешно, удалите созданный реквизит и снова обновите конфигурацию.

Шаг 3. Использование резервной копии и SQL-дампов

Если "фиктивное" обновление не помогло, рассмотрим способ восстановления через создание новой базы данных и использование инструментов pg_dump и pg_restore. Проанализируем рецепт, предложенный опытными администраторами:

  1. Сделаем полный бэкап битой базы средствами PostgreSQL в pgAdmin (правой кнопкой мыши по базе — Backup, выбрав форматы .sql или .backup).
  2. Создадим новую пустую базу данных в PostgreSQL с аналогичными параметрами кодировки.
  3. Попробуем выполнить Restore из созданного дампа в новую базу (используя штатные средства или сценарий для восстановления баз данных в Linux). Обратите внимание: если в дампе отсутствует команда создания таблицы, она не появится и в новой базе, но этот процесс поможет "отсеять" другие возможные ошибки целостности.
  4. В новой базе (если она открылась в 1С) необходимо найти проблемные объекты. Если они не используются в учете, можно попробовать удалить предопределенные элементы в этих справочниках или переименовать сами объекты (добавив префикс Удал).
  5. После этого выполните обновление конфигурации и попробуйте сделать выгрузку в .dt.

Важный нюанс при использовании команды pg_restore. Если вы используете командную строку, синтаксис может выглядеть так:


C:\Program Files\PostgreSQL\12.5-3.1C\bin\pg_restore.exe --host "localhost" --port "5432" --username "postgres" --dbname "new_db_name" --verbose "D:\Backups\dump_file.backup"

Шаг 4. Перенос данных через XML (Выгрузка-загрузка)

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

  1. Развернем из старого бэкапа (до возникновения ошибки) чистую копию базы.
  2. В битой базе воспользуемся стандартной обработкой ВыгрузкаЗагрузкаДанныхXML.epf (она входит в состав инструментов разработчика 1С).
  3. Настроим выгрузку: выберем только документы и важные справочники за период, который отсутствует в старом бэкапе (например, с даты последнего успешного бэкапа по сегодняшний день).
  4. Внимание! Отключите выгрузку для тех справочников, которые вызывают ошибку 42P01. Если эти справочники являются классификаторами, их данные можно будет восстановить позже из официальных источников или конфигурации.
  5. Загрузим полученный XML-файл в развернутую архивную копию.

Шаг 5. Применение утилиты ibcmd (для продвинутых пользователей)

В современных версиях платформы (8.3.24+) появилась возможность использовать утилиту командной строки ibcmd, которая позволяет выполнять проверку и исправление базы данных без запуска графического интерфейса. Рассмотрим пример команды для исправления структуры:


ibcmd infobase check --db-type=PostgreSQL --db-server=localhost --db-name=my_base --db-user=postgres --db-pwd=password --repair

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

Рекомендации по профилактике

Чтобы избежать повторения ситуации, проанализируем следующие правила работы с 1С на PostgreSQL:

Подведем итог: ошибка 42P01 — это серьезный сигнал о повреждении структуры базы, но при наличии хотя бы частичных бэкапов и использовании инструментов прямого доступа к СУБД, данные в 99% случаев удается спасти. Мы рассмотрели основные пути решения: от манипуляций в конфигураторе до прямого восстановления таблиц через SQL-дампы.

← На главную