В процессе работы с базами 1С, работающими на СУБД PostgreSQL, пользователи и администраторы иногда сталкиваются с критической ошибкой: ERROR: out of shared memory (для глубокой диагностики пригодится перенос логов технологического журнала в ClickHouse). Сопровождается она подсказкой HINT: You might need to increase max_locks_per_transaction. Давайте разберем, почему она возникает и как пошагово решить эту задачу, обеспечив стабильную работу обменов данными.
Данная ошибка означает, что сервер баз данных исчерпал выделенную оперативную память, отведенную под отслеживание блокировок объектов. В 1С это часто происходит при выполнении операций, которые затрагивают огромное количество записей в рамках одной транзакции — например, при выгрузке документов в JSON, загрузке больших файлов обмена в РИБ (распределенную информационную базу) или выполнении массовых обработок документов.
Когда 1С инициирует транзакцию, PostgreSQL должен зафиксировать блокировки на всех объектах, задействованных в этой операции. Если объектов слишком много, лимит памяти, заданный параметром max_locks_per_transaction, оказывается превышен.
Самый прямой способ решения проблемы — увеличить лимит блокировок. Рассмотрим, как это сделать правильно:
data, а внутри неё файл конфигурации postgresql.conf.max_locks_per_transaction. Если он уже задан, измените его значение. Если строки нет, добавьте её в конец файла.
max_locks_per_transaction = 250
Важное примечание: увеличение этого параметра потребляет больше оперативной памяти сервера. Это безопасная операция, которая не требует восстановления из бэкапа, однако бесконечно увеличивать лимит не стоит — ресурсы сервера ограничены.
Если после увеличения параметра ошибка продолжает возникать, это свидетельствует о том, что архитектура обмена данными в вашей конфигурации требует оптимизации. Рассмотрим, почему это происходит и как проанализировать ситуацию:
ЗафиксироватьТранзакцию()).PostgreSQL, транзакция удерживается дольше положенного, быстрее занимая память.Вы могли заметить, что при загрузке того же файла в файловую версию базы 1С ошибка не возникает. Это связано с архитектурными различиями: файловая база управляет блокировками иначе, в то время как PostgreSQL — это мощная серверная СУБД, которая строго следит за целостностью данных и жестко ограничивает потребление памяти согласно вашим настройкам. Появление ошибки в SQL-версии — это сигнал того, что система пытается защитить себя от перегрузки.
Увеличение max_locks_per_transaction — это стандартная терапевтическая мера. Если же вы столкнулись с тем, что даже значения 500 или 1000 недостаточно, не продолжайте просто увеличивать число. Вместо этого сфокусируйтесь на оптимизации кода обмена в 1С. Помните, что грамотное разбиение транзакций — это лучший способ сделать работу базы стабильной и быстрой в долгосрочной перспективе.