Как найти данные информационной базы 1С на сервере PostgreSQL
Содержание
База 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С.
- Разверните кластер →
Информационные базы→ свойства нужной базы. - Поля «Сервер баз данных» и «База данных» показывают сервер 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 выглядит так:
- Предупредите пользователей: остановка PostgreSQL обрывает все сеансы 1С. Делайте это вне рабочего времени.
- Остановите службу:
sudo systemctl stop postgresql. - Скопируйте каталог с сохранением прав:
sudo rsync -a /var/lib/postgresql/15/main/ /data/pg15/main/. - Поменяйте
data_directoryвpostgresql.conf(или путь PGDATA в юните systemd для RHEL-сборок). - Запустите службу, проверьте
SHOW data_directory;и вход в 1С. - Старый каталог удаляйте только через несколько дней спокойной работы.
Вынести одну базу на другой диск без переноса всего кластера помогает табличное пространство: 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 занимает десятки гигабайт?
pg_replication_slots.Можно ли держать в одном кластере PostgreSQL несколько баз 1С?
base/.