Как найти данные информационной базы 1С на сервере PostgreSQL

· 9 мин

Содержание

База 1С в PostgreSQL не лежит одним файлом, как файловая 1Cv8.1CD. Она хранится внутри каталога данных кластера PostgreSQL: в Ubuntu и Debian это обычно /var/lib/postgresql/<версия>/main, в CentOS и RHEL — /var/lib/pgsql/<версия>/data, в Windows — подкаталог data в папке установки PostgreSQL. Точный путь на вашем сервере покажет команда SHOW data_directory;.

Типичная ситуация: администратор ставит новый диск под базы, хочет понять, сколько места занимает бухгалтерия и где физически лежат её файлы. Ниже — как найти каталог, опознать в нём нужную базу и не сломать права доступа .

Где PostgreSQL хранит данные в разных ОС

Каталог данных (его ещё называют PGDATA) задаётся при инициализации кластера. Если при установке путь не меняли, он будет одним из стандартных.

Система и сборкаКаталог данных по умолчаниюГде лежат конфиги
Ubuntu, Debian (пакеты PostgreSQL)/var/lib/postgresql/<версия>/main/etc/postgresql/<версия>/main/
CentOS, RHEL, Rocky (пакеты PGDG)/var/lib/pgsql/<версия>/dataв самом каталоге данных
Postgres Pro для 1С (Linux)/var/lib/pgpro/1c-<версия>/dataв самом каталоге данных
Windows, сборка PostgreSQL для 1СC:\Program Files\PostgreSQL\<версия>\dataв самом каталоге данных

В Windows имя папки версии у сборки для 1С обычно содержит суффикс 1C, например 15.x-x.1C. Если путь при установке меняли на другой диск, таблица не поможет — смотрите раздел про поиск через SQL.

Быстрее всего узнать путь у самого сервера: SHOW data_directory; в psql или pgAdmin. Ответ всегда точный, даже если инсталлятор ставили «как получилось».

Что внутри каталога данных

  • 📁 base/ — данные всех баз кластера, по подкаталогу на каждую базу.
  • 📁 global/ — общие для кластера таблицы: список баз, роли, пароли.
  • 📁 pg_wal/ — журнал предзаписи (WAL). Растёт при активной записи и при сбоях архивации.
  • 📁 pg_tblspc/ — ссылки на табличные пространства, если базу вынесли на другой диск.
  • 📄 postgresql.conf, pg_hba.conf — конфигурация (кроме Debian/Ubuntu, где они в /etc).

Ничего в этих каталогах не удаляйте и не переносите руками при запущенном сервере. Особенно pg_wal: его ручная чистка делает кластер неработоспособным.

Как найти файлы конкретной базы 1С через SQL и консоль

Подкаталоги в base/ называются не именами баз, а числами — OID. Чтобы найти папку нужной базы, сначала узнайте её имя в PostgreSQL, потом OID.

Шаг 1. Узнать имя базы данных

Имя информационной базы в списке 1С и имя базы в PostgreSQL могут не совпадать. Проверить связь можно так:

  1. Откройте консоль администрирования серверов 1С.
  2. Разверните кластер → Информационные базы → свойства нужной базы.
  3. Поля «Сервер баз данных» и «База данных» показывают сервер PostgreSQL и имя базы в нём.

Без консоли то же даёт утилита rac: команда rac infobase summary list --cluster=<uuid> выведет список баз с идентификаторами, а подробности по одной базе смотрите через rac infobase info (параметры — в rac help infobase).

Шаг 2. Получить путь и OID

Подключитесь к серверу. В Linux:

sudo -u postgres psql

В Windows запустите psql из папки bin установки PostgreSQL или откройте Query Tool в pgAdmin. Дальше:

-- каталог данных
SHOW data_directory;

-- OID и размер каждой базы
SELECT oid, datname, pg_size_pretty(pg_database_size(datname)) AS size
FROM pg_database
ORDER BY pg_database_size(datname) DESC;

Допустим, база buh_2024 получила OID 16384. Значит, её файлы лежат в <каталог данных>/base/16384/.

Шаг 3. Найти файл конкретной таблицы

Подключитесь к нужной базе (\c buh_2024) и спросите путь таблицы:

SELECT pg_relation_filepath('_reference45');
-- base/16384/24601

Путь указан относительно каталога данных. Большие таблицы режутся на сегменты по 1 ГБ: 24601, 24601.1, 24601.2 и так далее.

Короткая команда \l+ в psql выводит список баз сразу с размерами. Удобно, когда нужно понять, кто съел диск.

Если подключиться к серверу не получается

Бывает, что PostgreSQL не стартует, и SHOW data_directory; выполнить негде. Тогда путь ищут по следам службы.

В Linux:

# путь виден в параметре -D запущенного процесса
ps aux | grep -E "postgres.*-D"

# у Debian/Ubuntu — список кластеров с каталогами
pg_lsclusters

# у RHEL-сборок — переменная PGDATA в юните службы
systemctl cat postgresql-15 | grep PGDATA

В Windows откройте services.msc, найдите службу PostgreSQL и посмотрите поле «Исполняемый файл» в её свойствах. В строке запуска после ключа -D указан каталог данных.

Какая база сейчас нужна серверу 1С

Если на сервере десяток баз с похожими именами, проще посмотреть, к каким базам прямо сейчас подключены рабочие процессы 1С:

SELECT datname, client_addr, count(*) AS connections
FROM pg_stat_activity
WHERE datname IS NOT NULL
GROUP BY datname, client_addr
ORDER BY connections DESC;

Адрес клиента здесь — сервер 1С. База без подключений в рабочее время — кандидат в «забытые копии», которые тихо занимают диск.

Как устроена база 1С внутри PostgreSQL

Платформа создаёт в базе PostgreSQL свои таблицы. Имена служебные, без русских названий объектов:

Префикс таблицыЧто хранит
_Reference<N>справочники
_Document<N>шапки документов
_Document<N>_VT<M>табличные части документов
_AccumRg<N>движения регистров накопления
_AccumRgT<N>итоги регистров накопления
_InfoRg<N>регистры сведений
_AccRg<N>движения регистров бухгалтерии
_Enum<N>перечисления

Поля тоже обезличены: _IDRRef — ссылка (16 байт, тип bytea), _Marked — пометка удаления, _Fld<N> — реквизиты. Отдельно есть служебные таблицы: config и configsave (конфигурация базы и её несохранённые изменения), params, files, dbschema, v8users (список пользователей).

Сборка PostgreSQL для 1С добавляет свои типы данных mchar и mvarchar — для строк с регистронезависимым сравнением, как ждёт платформа. Поэтому базу 1С нельзя просто восстановить на «чистом» PostgreSQL без патчей: нужна сборка с поддержкой 1С.

Как сопоставить таблицу и объект конфигурации

Номера в именах таблиц для каждой базы свои. Соответствие «объект → таблица → поле» возвращает метод платформы ПолучитьСтруктуруХраненияБазыДанных(). Вызовите его во внешней обработке или в режиме отладки — результат покажет, что _Document312 у вас — это, например, «Реализация товаров и услуг».

Читать таблицы 1С напрямую SQL-запросом можно для анализа. Менять данные в них в обход платформы нельзя: нарушится целостность ссылок, итогов и версий объектов, а платформа о ваших правках не узнает.

Где лежат BLOB: файлы, картинки, хранилища значений

Двоичные данные 1С — реквизиты типа «Хранилище значения», картинки, присоединённые файлы, сама конфигурация — хранятся в обычных столбцах типа bytea. Механизм больших объектов PostgreSQL (pg_largeobject) для этого не используется.

Значения длиннее примерно 2 КБ PostgreSQL сжимает и выносит в отдельную TOAST-таблицу. Поэтому таблица справочника с файлами может весить 200 МБ, а её TOAST-спутник — 40 ГБ. Посмотреть разбивку:

SELECT relname,
       pg_size_pretty(pg_relation_size(oid))       AS main_data,
       pg_size_pretty(pg_total_relation_size(oid)) AS total_with_toast_and_idx
FROM pg_class
WHERE relkind = 'r'
ORDER BY pg_total_relation_size(oid) DESC
LIMIT 10;

Если в топе таблица с огромным total и скромным main_data — это и есть BLOB. Чаще всего так выглядят присоединённые файлы и версии файлов.

Удалили из базы старые файлы, а место на диске не освободилось? Так и должно быть: обычный VACUUM помечает место как свободное для новых записей, но файлы не уменьшает. Вернуть место операционной системе может VACUUM FULL, однако он переписывает таблицу целиком и блокирует её на всё время работы. Для 1С это значит недоступную базу, поэтому запускайте его только в технологическое окно, когда пользователи не работают, и при свободном месте на диске не меньше размера таблицы.

Файлы могут лежать вообще не в PostgreSQL

В типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) присоединённые файлы можно хранить в томах на диске. Тогда в базе остаётся только карточка файла, а сам документ лежит в сетевой папке, указанной в настройках тома. Настройки хранения файлов находятся в разделе Администрирование. Если база весит неожиданно мало, а файлы в ней открываются, проверьте именно это.

Настройка путей в postgresql.conf и доступа в pg_hba.conf

Где лежат сами конфиги, сервер тоже подскажет:

SHOW config_file;
SHOW hba_file;

Параметры путей в postgresql.conf

  • 📌 data_directory — каталог данных. Задаётся в конфиге, если конфиги лежат отдельно (схема Debian/Ubuntu).
  • 📌 hba_file, ident_file — пути к файлам аутентификации, если их вынесли.
  • 📌 listen_addresses — на каких адресах сервер принимает подключения. Для сервера 1С на другой машине нужен не localhost, а '*' или конкретный IP.
  • 📌 port — по умолчанию 5432.

Перенос каталога данных на другой диск в Linux выглядит так:

  1. Предупредите пользователей: остановка PostgreSQL обрывает все сеансы 1С. Делайте это вне рабочего времени.
  2. Остановите службу: sudo systemctl stop postgresql.
  3. Скопируйте каталог с сохранением прав: sudo rsync -a /var/lib/postgresql/15/main/ /data/pg15/main/.
  4. Поменяйте data_directory в postgresql.conf (или путь PGDATA в юните systemd для RHEL-сборок).
  5. Запустите службу, проверьте SHOW data_directory; и вход в 1С.
  6. Старый каталог удаляйте только через несколько дней спокойной работы.

Вынести одну базу на другой диск без переноса всего кластера помогает табличное пространство: CREATE TABLESPACE fast LOCATION '/data/fast';, затем ALTER DATABASE buh_2024 SET TABLESPACE fast;. Команда требует, чтобы к базе никто не был подключён — включите блокировку сеансов в консоли кластера 1С.

Доступ в pg_hba.conf

Каждая строка — правило: тип подключения, база, пользователь, адрес, метод проверки. Пример для сервера 1С с адресом 192.168.10.5:

# TYPE  DATABASE  USER      ADDRESS            METHOD
host    all       postgres  192.168.10.5/32    scram-sha-256

Правила читаются сверху вниз, срабатывает первое подходящее. После правки перечитайте конфигурацию без перезапуска:

SELECT pg_reload_conf();

Метод trust (вход без пароля) на рабочем сервере не используйте: любой, кто достучится до порта, получит все базы.

Права файловой системы и ошибки доступа

Каталог данных должен принадлежать пользователю, от которого работает PostgreSQL (в Linux — postgres), с правами 0700. Начиная с PostgreSQL 11 допустимы и 0750, если кластер инициализирован с групповым доступом. Любые другие права сервер считает опасными и не стартует.

Проверка и исправление в Linux:

ls -ld /var/lib/postgresql/15/main
sudo chown -R postgres:postgres /var/lib/postgresql/15/main
sudo chmod 700 /var/lib/postgresql/15/main

В RHEL-подобных системах после переноса каталога ещё мешает SELinux: у нового пути должен быть контекст postgresql_db_t. В Windows учётной записи службы PostgreSQL нужны полные права на папку data, а антивирус стоит настроить так, чтобы он не сканировал её на лету.

Диагностика: выберите симптом

Частые вопросы

Можно ли перенести базу 1С, скопировав папку из base/?
Нет. Файлы одной базы без общих данных кластера бесполезны. Переносите через pg_dump/pg_restore или выгрузку .dt в конфигураторе.
Как узнать, сколько места занимает база 1С в PostgreSQL?
Запрос SELECT pg_size_pretty(pg_database_size('имя_базы')); или команда \l+ в psql. Это быстрее, чем считать размер папки.
Почему база в PostgreSQL весит больше, чем выгрузка .dt?
Выгрузка сжата и не содержит индексов, итогов и «мёртвых» версий строк. Рабочая база обычно в несколько раз больше файла .dt.
Почему папка pg_wal занимает десятки гигабайт?
Чаще всего не работает архивация WAL или висит неактивный слот репликации. Чистить папку руками нельзя — ищите причину в настройках архивации и в pg_replication_slots.
Можно ли держать в одном кластере PostgreSQL несколько баз 1С?
Да, это обычная схема. Каждая информационная база — отдельная база PostgreSQL со своим подкаталогом в base/.