Многие администраторы 1С, переходящие с Microsoft SQL Server на PostgreSQL, сталкиваются с архитектурными различиями этих СУБД. В MS SQL Server создание нового "именованного экземпляра" (Named Instance) — это тривиальная задача, решаемая галочкой в инсталляторе. В PostgreSQL, особенно на ОС Windows, этот процесс требует более глубокого понимания работы службы и инициализации кластера данных.
В этой статье мы подробно разберем, как развернуть второй независимый экземпляр PostgreSQL на одном сервере Windows, зарегистрировать его как службу, настроить порты и права доступа, а также избежать распространенных ошибок при подключении платформы 1С:Предприятие.
Прежде чем приступать к практическим действиям, давайте проясним терминологию. То, что мы привыкли называть "экземпляром" (Instance) в MS SQL, в мире PostgreSQL называется "кластером базы данных" (Database Cluster). Это совокупность баз данных, управляемых одним работающим экземпляром сервера, что является частью концепции защищенной IT инфраструктуры.
Если вы запустите стандартный инсталлятор PostgreSQL повторно, он может предложить обновить или изменить существующую установку, но не создать новую службу параллельно. Поэтому мы пойдем путем ручной инициализации. Это дает нам полный контроль над каталогами данных, портами и пользователями.
Для создания нового экземпляра нам потребуется утилита initdb, которая входит в состав бинарных файлов PostgreSQL. Предположим, что бинарные файлы у вас уже установлены (например, в C:\Program Files\PostgreSQL\16\bin), и нам нужно создать новый кластер в папке C:\Data\PostgresInstance2.
Откроем командную строку (CMD или PowerShell) от имени администратора и перейдем к шагу инициализации.
Типичная команда, которую мы рассмотрим, выглядит так:
"C:\Program Files\PostgreSQL\16\bin\initdb.exe" -D "C:\Data\PostgresInstance2" -U postgres -W -A md5 --locale=ru_RU
Давайте подробно разберем каждый параметр, так как ошибки здесь приводят к проблемам с доступом в дальнейшем:
FATAL: password authentication failed for user "postgres", так как такого пользователя просто не существует в этом кластере. Мы явно указываем имя суперпользователя.lc_collate.После успешной инициализации (вы увидите сообщение "Success"), новый кластер создан, но еще не запущен. Нам нужно изменить порт, так как стандартный порт 5432, скорее всего, занят первым экземпляром. Для дальнейшей оптимизации структуры может пригодиться генератор скрипта для индексации таблиц.
Перейдем в папку данных C:\Data\PostgresInstance2 и откроем файл postgresql.conf любым текстовым редактором.
Найдем и изменим параметр port:
port = 5433 # Используем любой свободный порт
listen_addresses = '*' # Разрешаем подключения с любых адресов, если сервер не только локальный
Здесь же можно настроить параметры производительности (shared_buffers, effective_cache_size и т.д.) индивидуально для этого экземпляра. Чтобы понять, какие значения выставить, полезно анализировать SQL сервер глазами 1С-ника.
Чтобы наш новый PostgreSQL запускался автоматически вместе с Windows и работал в фоне, нам нужно зарегистрировать его как службу. Для этого используем утилиту pg_ctl.
В командной строке выполним:
"C:\Program Files\PostgreSQL\16\bin\pg_ctl.exe" register -N "postgresql-5433" -D "C:\Data\PostgresInstance2" -S auto
Разберем параметры:
register: Команда регистрации службы.-N "ИмяСлужбы": Уникальное имя службы, которое будет отображаться в оснастке services.msc. Назовите её так, чтобы отличать от основной (например, postgresql-5433 или pgsql-dev).-D "Путь": Путь к нашей новой папке данных.-S auto: Режим запуска службы "Автоматически".После этого можно запустить службу через оснастку "Службы" или командой net start postgresql-5433.
При попытке создать информационную базу через консоль серверов 1С на новом экземпляре PostgreSQL (особенно версий 15 и 16) вы можете столкнуться с ошибкой:
ERROR: unrecognized configuration parameter "lc_collate"
Давайте проанализируем причины. Начиная с 15-й версии, PostgreSQL ужесточил политику работы с локалями. Параметры lc_collate и lc_ctype стали глобальными атрибутами базы данных, доступными только для чтения после создания. Старые версии платформы 1С пытаются установить эти параметры в сессии, что вызывает ошибку.
Решение:
--locale=ru_RU. Если локаль системы отличается от русской, 1С не сможет корректно работать со строковыми данными без этой настройки.В MS SQL Server принята модель, где логины (Login) создаются на уровне сервера, а пользователи (User) — на уровне базы, и их нужно явно связывать. В PostgreSQL модель немного иная: роль (Role) может быть и пользователем, и группой, и она глобальна для всего кластера.
Часто возникает вопрос: "Как запретить пользователю видеть и подключаться к чужим базам?". По умолчанию, если у пользователя есть право CONNECT, он может попытаться подключиться к любой базе (хотя читать таблицы внутри без грантов не сможет).
Для жесткого разграничения доступа ("Фейс-контроль") в PostgreSQL используется файл pg_hba.conf, находящийся в папке данных кластера. Это мощнейший инструмент сетевой безопасности.
Рассмотрим пример настройки, когда пользователю user_upp разрешено подключаться только к базе upp, а пользователю user_zup — только к zup.
Откроем pg_hba.conf и добавим записи в начало списка (правила применяются сверху вниз до первого совпадения!):
# TYPE DATABASE USER ADDRESS METHOD
host upp user_upp 0.0.0.0/0 md5
host zup user_zup 0.0.0.0/0 md5
Если после этих строк не будет разрешающих правил типа host all all ..., то user_upp физически не сможет пройти аутентификацию при попытке входа в базу zup. Это надежный способ изоляции.
Кроме того, внутри базы можно управлять правами через SQL-команды. По умолчанию роль PUBLIC имеет право на подключение. Чтобы сделать систему закрытой, выполните:
REVOKE CONNECT ON DATABASE zup FROM PUBLIC;
GRANT CONNECT ON DATABASE zup TO user_zup;
Важно помнить, что обычный бэкап базы данных (через pg_dump или выгрузку dt в 1С) не содержит информации о пользователях (ролях), так как они являются глобальными объектами кластера.
Если вы переносите базы на другой сервер, вам нужно отдельно перенести пользователей. Для этого используем утилиту pg_dumpall с ключом --globals-only (или -g).
"C:\Program Files\PostgreSQL\16\bin\pg_dumpall.exe" -g -U postgres > C:\Backup\users_globals.sql
Этот файл позволит восстановить всех пользователей и их пароли на чистом экземпляре PostgreSQL перед загрузкой самих баз данных.
Мы рассмотрели процесс создания второго экземпляра PostgreSQL на Windows. Основные шаги успеха — это корректная инициализация через initdb с указанием суперпользователя и локали, регистрация отдельной службы с уникальным портом и правильная настройка pg_hba.conf. Такой подход позволяет гибко управлять ресурсами сервера, разделяя базы данных разработки и продуктива, или разные версии платформы 1С.