При работе с базами данных 1С на платформе PostgreSQL администраторы иногда сталкиваются с критической ошибкой: Ошибка СУБД: 42P01: ERROR: relation "_refsinfXXXXX" does not exist. Эта ситуация означает, что платформа пытается обратиться к таблице, описание которой есть в метаданных конфигурации, но сама таблица физически отсутствует в схеме базы данных SQL. Чаще всего проблема проявляется при попытке выгрузки базы в формат .dt, выполнении регламентных операций или при открытии конкретных справочников.
В этой статье мы подробно разберем причины возникновения данной ошибки, проанализируем взаимосвязь с обновлениями платформы и рассмотрим пошаговые алгоритмы спасения данных, от работы с pgAdmin до использования специализированных обработок выгрузки.
Проанализируем ситуацию: почему таблица может исчезнуть? Рассмотрим основные сценарии:
DROP TABLE. Это приводило к полному удалению таблиц из PostgreSQL._RefSInfXXXXX для хранения вспомогательной информации о предопределенных элементах (Predefined Information). Если такая таблица удаляется, база перестает корректно функционировать, так как нарушается логика связи программного кода с объектами базы данных.Прежде чем приступать к лечению, нам нужно понять, какой именно объект конфигурации пострадал. В тексте ошибки обычно указывается имя таблицы, например, _RefSInf48971. Чтобы быстро сопоставить это имя с объектом в 1С, удобно использовать инструмент для анализа структуры хранения базы данных.
Воспользуемся консолью запросов или средствами pgAdmin. В большинстве случаев префикс _RefSInf указывает на справочник. Вы можете выполнить поиск в интернете по номеру таблицы или, если база еще открывается в режиме "Конфигуратор", попробовать сопоставить идентификатор через таблицу Config (хотя это трудоемкий процесс).
Если у вас есть архивная копия базы (даже старая), откройте её в pgAdmin и найдите таблицу с указанным именем. По составу полей и данным в ней можно будет определить, к какому справочнику она относится (например, Справочник.КлассификаторыМедРегистра или Справочник.РешенияАттестационнойКомиссии).
Попробуем заставить платформу 1С самостоятельно пересоздать недостающую таблицу. Разберем этот алгоритм:
Тест или временно изменим длину наименования на один символ.F7 (Обновить конфигурацию базы данных).Если "фиктивное" обновление не помогло, рассмотрим способ восстановления через создание новой базы данных и использование инструментов pg_dump и pg_restore. Проанализируем рецепт, предложенный опытными администраторами:
Backup, выбрав форматы .sql или .backup).Restore из созданного дампа в новую базу (используя штатные средства или сценарий для восстановления баз данных в Linux). Обратите внимание: если в дампе отсутствует команда создания таблицы, она не появится и в новой базе, но этот процесс поможет "отсеять" другие возможные ошибки целостности.Удал)..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"
Если база данных открывается, но не выгружается в .dt из-за ошибки СУБД, рассмотрим вариант частичного переноса данных. Это наиболее надежный способ спасти информацию, если структура SQL серьезно повреждена.
ВыгрузкаЗагрузкаДанныхXML.epf (она входит в состав инструментов разработчика 1С).В современных версиях платформы (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:
.dt и загрузку в новую базу по новому пути, либо используйте команду pg_ctl register для корректного переподключения службы PostgreSQL с новым путем к DATA.Подведем итог: ошибка 42P01 — это серьезный сигнал о повреждении структуры базы, но при наличии хотя бы частичных бэкапов и использовании инструментов прямого доступа к СУБД, данные в 99% случаев удается спасти. Мы рассмотрели основные пути решения: от манипуляций в конфигураторе до прямого восстановления таблиц через SQL-дампы.