При развертывании сервера 1С:Предприятие 8.3 на операционной системе CentOS 6 с использованием стандартной (ванильной) сборки PostgreSQL 8.4.20 администраторы часто сталкиваются с критической ошибкой: «библиотека mchar не найдена». Это происходит потому, что стандартный PostgreSQL не содержит специфических расширений, необходимых для корректной работы механизмов 1С. В данной статье мы разберем, зачем нужны эти библиотеки, почему нельзя просто скопировать их из других версий ОС и как правильно настроить среду для стабильной работы.
Рассмотрим функциональное назначение этих модулей, которые исторически разрабатывались для адаптации открытой СУБД под требования платформы 1С:
mchar и mvarchar. Они необходимы для того, чтобы PostgreSQL обрабатывал пробелы в конце строк так же, как это делает Microsoft SQL Server или сама платформа 1С. Без этого расширения сортировка и поиск в базе данных будут работать некорректно.TRUNCATE. Платформа 1С активно использует временные таблицы, и стандартный механизм очистки таблиц в старых версиях PostgreSQL мог вызывать значительные задержки и блокировки.Проанализируем ситуацию, когда администратор пытается подсунуть файлы .so, взятые из сборок для других дистрибутивов (например, CentOS 5). В этом случае PostgreSQL выдает ошибку invalid magic block. Разберемся, почему это происходит:
В PostgreSQL реализована жесткая проверка совместимости расширений через макрос PG_MODULE_MAGIC. При загрузке библиотеки сервер проверяет заголовки файла. Если библиотека была скомпилирована с другими флагами (например, поддержка SSL, ICU) или для другой версии системных библиотек glibc, сервер откажется ее загружать. В CentOS 5 используется glibc 2.5, а в CentOS 6 — 2.12. Разница в бинарном интерфейсе приложений (ABI) делает невозможным прямой перенос файлов между этими ОС.
Самый надежный способ — не пытаться «починить» ванильный PostgreSQL, а использовать готовую сборку, в которую эти патчи уже включены. Выясним, где их можно найти:
postgresql-8.4.x-1.1C.x86_64.rpm. Индекс 1C в названии версии означает, что все необходимые библиотеки уже интегрированы.1c.postgres.ru. Несмотря на то, что сейчас актуальны версии 11–16, в их архивах можно найти подготовленные скрипты и пакеты для более старых систем.Если вы обязаны использовать версию 8.4.20 из-за сторонних приложений, лучшим решением будет Side-by-side установка. Установите второй экземпляр PostgreSQL (с патчами 1С) на альтернативный порт (например, 5433). Это позволит изолировать среду 1С от других программ и избежать конфликтов версий.
Если готовый RPM-пакет найти не удается, мы можем собрать расширения самостоятельно именно под вашу текущую версию PostgreSQL. Для этого нам понадобится пакет postgresql-devel.
Рассмотрим пошагово процесс сборки на примере расширения mchar:
yum install postgresql-devel gcc make.mchar.c, mchar.h и Makefile).pgxs, которая автоматически подтянет нужные пути заголовков сервера.Пример типичного Makefile для такой сборки будет выглядеть следующим образом:
MODULES = mchar
DATA = mchar.sql
PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)
После создания файла в директории с исходниками достаточно выполнить команды:
make
make install
Это скомпилирует файл mchar.so и скопирует его в /usr/lib64/pgsql/, гарантируя полное соответствие magic block вашей текущей версии сервера.
Просто положить файлы в папку библиотек недостаточно. Выясним, как заставить PostgreSQL «увидеть» новые функции внутри конкретной базы данных 1С. После копирования файлов .so необходимо выполнить SQL-скрипты, которые обычно идут в комплекте с исходниками.
Запустите выполнение скриптов через psql для вашей базы данных:
psql -d your_database_name -f /usr/share/pgsql/contrib/mchar.sql
psql -d your_database_name -f /usr/share/pgsql/contrib/fulleq.sql
psql -d your_database_name -f /usr/share/pgsql/contrib/fasttrun.sql
Важный нюанс: Если скриптов .sql нет, функции можно объявить вручную. Например, для fasttrun регистрация функции в SQL-консоли выглядит примерно так:
CREATE OR REPLACE FUNCTION fast_truncate(text)
RETURNS void
AS '$libdir/fasttrun', 'fast_truncate'
LANGUAGE c STRICT;
Если сборка из исходников кажется слишком трудоемкой, проанализируем варианты с контейнеризацией. Как отмечалось в обсуждении, использование Docker позволяет запустить подготовленный контейнер с нужной версией PostgreSQL и всеми патчами, не засоряя основную систему CentOS 6 старыми библиотеками. Это обеспечивает:
В заключение отметим, что связка PostgreSQL 8.4 и 1С 8.3 является морально устаревшей. Платформа 8.3 оптимизирована для работы с версиями PostgreSQL 9.6, 10 и выше. Если ваша инфраструктура позволяет, рассмотрите вопрос обновления СУБД до актуальных версий от Postgres Professional, где поддержка 1С включена «из коробки» и не требует ручных манипуляций с библиотеками.