Ошибка «lost synchronization with server» в связке 1С:Предприятие и PostgreSQL является одной из самых коварных, так как она указывает на внезапный разрыв коммуникации между рабочим процессом 1С (rphost) и процессом обслуживания базы данных в PostgreSQL. Чаще всего это происходит при выполнении тяжелых операций: выгрузке информационной базы в формат .dt, формировании сложных отчетов или проведении объемных документов.
Рассмотрим детально причины возникновения этой проблемы и разберем по шагам методы ее решения, основываясь на практике администрирования и настройках СУБД.
Прежде чем приступать к изменению настроек, проанализируем ситуацию. Если ошибка возникает только на одной конкретной базе из нескольких, проблема, скорее всего, кроется либо в специфических данных этой базы, либо в достижении определенных лимитов СУБД при обработке ее объектов.
Выясним причину, обратившись к логам. Нам необходимо изучить три источника данных:
unexpected EOF on client connection или terminating connection due to administrator command. Особое внимание обратим на записи, идущие непосредственно перед разрывом. Если там фигурирует out of memory или stack depth limit exceeded, это прямой сигнал к изменению конфига.EXCP и DBPOSTGRS. Это позволит увидеть, какой именно запрос привел к падению сессии.rphost или postgres аварийно из-за нехватки системных ресурсов.Одной из наиболее частых причин «потери синхронизации» является некорректное распределение оперативной памяти, из-за чего процесс Postgres либо аварийно завершается, либо не успевает обработать пакет данных. Разберем основные параметры, которые необходимо оптимизировать под нужды 1С.
Посмотрим на пример настройки для сервера с 64 ГБ оперативной памяти. Если у вас другой объем памяти, пропорционально измените значения:
shared_buffers = 16GB (примерно 25% от общего объема RAM)
work_mem = 128MB (увеличиваем, если много сложных запросов)
maintenance_work_mem = 2GB (помогает при создании индексов и VACUUM)
temp_buffers = 256MB
effective_cache_size = 48GB (примерно 75% от всей RAM)
Важно помнить, что параметр work_mem выделяется на каждое соединение. Если у вас одновременно работают сотни пользователей, слишком высокое значение может привести к полному исчерпанию памяти. Однако для успешной выгрузки .dt иногда требуется временно увеличить этот параметр.
Иногда синхронизация теряется из-за того, что активное соединение простаивает с точки зрения сетевого оборудования (например, пока 1С формирует тяжелый временный файл), и операционная система или брандмауэр разрывает «неактивную» сессию. Чтобы предотвратить это, настроим параметры Keepalives в файле postgresql.conf.
Рассмотрим следующие настройки:
tcp_keepalives_idle = 60 — начинать проверку связи через 60 секунд бездействия.tcp_keepalives_interval = 10 — отправлять проверочные пакеты каждые 10 секунд.tcp_keepalives_count = 10 — считать соединение разорванным только после 10 неудачных попыток.Эти параметры заставляют сервер «простукивать» соединение, поддерживая сессию живой даже при длительных операциях.
Для запросов 1С характерна высокая вложенность и обращение к огромному количеству таблиц (особенно в сложных конфигурациях типа ERP или ЗУП). Это может приводить к превышению лимитов стека.
Проанализируем параметр max_stack_depth. По умолчанию он часто установлен в 2MB. Попробуем увеличить его до 4MB. Внимание: это значение не должно превышать лимит, установленный в самой операционной системе (команда ulimit -s в Linux).
Также увеличим лимит блокировок, так как выгрузка базы требует фиксации множества объектов:
max_locks_per_transaction = 256
max_pred_locks_per_transaction = 256
Если проблема локализована только в одной базе, нельзя исключать логическое повреждение таблиц или индексов. Посмотрим, как можно «оздоровить» базу средствами самой СУБД. Выполним последовательно следующие команды через pgAdmin или psql:
1. Пересборка всех индексов базы данных (помогает, если ошибка возникает при чтении конкретной таблицы):
REINDEX DATABASE "имя_вашей_базы";
2. Полная очистка и обновление статистики (требует монопольного доступа к базе):
VACUUM FULL ANALYZE;
Если во время выполнения этих команд Postgres выдаст ошибку, значит, мы нашли поврежденный участок данных. В таком случае может потребоваться восстановление из бэкапа или использование специализированных средств ремонта таблиц.
Проанализируем окружение сервера. Ошибка «lost synchronization with server» часто вызывается сторонним ПО:
postgres.exe и rphost.exe в исключения.127.0.0.1) вместо имени хоста.Таким образом, системный подход к настройке параметров postgresql.conf, контроль сетевых задержек и регулярное обслуживание индексов позволяют полностью избавиться от ошибок синхронизации в связке 1С и PostgreSQL.