При активной работе в связке 1С:Предприятие, PostgreSQL и модуля обмена с 1С-Битрикс системные администраторы часто сталкиваются с ошибкой out of memory for query result. Ситуация выглядит парадоксально: на сервере может быть установлено 16, 32 или даже 64 ГБ оперативной памяти, а ошибка возникает при выгрузке всего нескольких десятков позиций номенклатуры. Разберем детально причины этого поведения и способы его устранения.
Рассмотрим природу сообщения out of memory for query result. Важно понимать, что эту ошибку генерирует не само ядро СУБД PostgreSQL в момент выполнения расчета, а клиентская библиотека libpq, которую использует 1С для взаимодействия с базой данных. Ошибка означает, что сервер PostgreSQL успешно выполнил запрос и готов отдать данные, но на стороне клиента (в нашем случае — рабочего процесса 1С rphost) не удалось выделить непрерывный блок оперативной памяти для приема этого результата.
Проанализируем основные факторы, приводящие к этому состоянию:
rphost.exe ограничен адресным пространством в 2 ГБ (в Windows). Даже если физической памяти много, процесс просто "не видит" больше своего лимита.rphost фрагментируется. Когда от СУБД приходит массив данных (например, на 300 МБ), системе может не хватить именно непрерывного участка памяти, что и вызывает фатальный сбой.Как показывает практика и опыт участников обсуждения, самым надежным и стратегически правильным решением является использование 64-битного сервера 1С. Разберем, почему это критично. В 64-битной среде лимит адресного пространства процесса rphost практически неограничен (измеряется терабайтами). Это позволяет 1С спокойно принимать тяжелые выборки из PostgreSQL, не опасаясь фрагментации или нехватки места под результат запроса.
Если у вас используется 32-битный лицензионный ключ, для стабильной работы современных конфигураций вроде Управление торговлей 11 настоятельно рекомендуется произвести апгрейд лицензии до x64. Это снимет архитектурный барьер, который невозможно обойти программными настройками.
Посмотрим на настройки postgresql.conf, которые часто остаются в состоянии "по умолчанию", что недопустимо для высоконагруженных систем 1С. Проанализируем ключевые параметры и выясним, как их изменить:
Параметр shared_buffers. В стандартном конфиге он часто равен 128MB. Для сервера с 16 ГБ оперативной памяти это крайне мало. Рассмотрим рекомендации: установите значение равным 25% от общего объема ОЗУ (в данном случае около 4GB). Это позволит СУБД кэшировать больше данных в памяти и снизить нагрузку на диск.
Параметр work_mem. Этот параметр определяет объем памяти для операций сортировки и группировки внутри одного запроса. Если выгрузка на сайт содержит сложные условия отбора или группировки, стандартных 4MB будет недостаточно. Попробуем увеличить это значение до 64MB или 128MB. Однако будьте осторожны: эта память выделяется на каждое соединение, поэтому при 100 активных пользователях расход памяти может быть значительным.
Пример настройки в файле postgresql.conf:
# Основные настройки памяти для 16ГБ сервера
shared_buffers = 4GB
work_mem = 64MB
maintenance_work_mem = 512MB
effective_cache_size = 12GB
temp_buffers = 32MB
Если переход на x64 временно невозможен, попробуем минимизировать потребление памяти на стороне 1С. Рассмотрим стандартный механизм обмена с сайтом (Bitrix). В типовых конфигурациях 1С (УТ 11, КА, ERP) в узле обмена с сайтом существуют настройки порционности.
Выясним, как это работает: 1С может формировать не один гигантский файл import.xml или offers.xml, а разбивать его на пакеты. Уменьшите параметр "Количество товаров в одном пакете". Например, если при 50 позициях возникает ошибка, попробуйте установить значение 10 или 20. Это заставит систему выполнять запросы к БД меньшими порциями, что снизит пиковое потребление памяти процессом rphost.
1С активно использует временные таблицы в PostgreSQL. Иногда ошибка out of memory может быть косвенно связана с тем, что планировщик БД выбирает неоптимальный план из-за неактуальной статистики. Проанализируем настройки автовакуума в предоставленном конфиге. Убедимся, что параметры autovacuum включены, а также обратим внимание на расширения, специфичные для 1С (например, online_analyze).
В тексте конфигурации мы видим использование расширений:
shared_preload_libraries = 'online_analyze, plantuner'
online_analyze.threshold = 50
online_analyze.scale_factor = 0.1
online_analyze.enable = on # Убедитесь, что здесь стоит on
Эти параметры заставляют PostgreSQL собирать статистику по временным таблицам сразу после их заполнения, что крайне важно для корректной работы запросов 1С.
Часто причиной раздувания памяти являются картинки. Проанализируем, как хранятся присоединенные файлы. Если они хранятся непосредственно в томах на диске, 1С все равно считывает их в память перед отправкой на сайт. Рассмотрим возможность оптимизации самих изображений перед загрузкой в 1С. Фотографии размером более 1-2 МБ каждая при массовой выгрузке гарантированно приведут к переполнению памяти в 32-битной среде. Рекомендуется использовать сжатые форматы и разрешение, подходящее для веб-витрины (например, не более 1200px по большой стороне).
Для эффективного решения проблемы мы рекомендуем следующий алгоритм действий:
postgresql.conf, увеличив shared_buffers и work_mem в соответствии с ресурсами вашего сервера.Соблюдение этих шагов позволит стабилизировать обмен данными и избавиться от невосстановимых ошибок СУБД при выгрузке номенклатуры.