Как решить проблему out of memory for query result при выгрузке из 1С на сайт с Битриксом

Системный администратор 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При активной работе в связке 1С:Предприятие, PostgreSQL и модуля обмена с 1С-Битрикс системные администраторы часто сталкиваются с ошибкой out of memory for query result. Ситуация выглядит парадоксально: на сервере может быть установлено 16, 32 или даже 64 ГБ оперативной памяти, а ошибка возникает при выгрузке всего нескольких десятков позиций номенклатуры. Разберем детально причины этого поведения и способы его устранения.

Выясним причину возникновения ошибки

Рассмотрим природу сообщения out of memory for query result. Важно понимать, что эту ошибку генерирует не само ядро СУБД PostgreSQL в момент выполнения расчета, а клиентская библиотека libpq, которую использует 1С для взаимодействия с базой данных. Ошибка означает, что сервер PostgreSQL успешно выполнил запрос и готов отдать данные, но на стороне клиента (в нашем случае — рабочего процесса 1С rphost) не удалось выделить непрерывный блок оперативной памяти для приема этого результата.

Проанализируем основные факторы, приводящие к этому состоянию:

  1. Ограничения 32-битной архитектуры 1С. Если серверная часть 1С (сервер приложений) имеет 32-битную архитектуру, то каждый процесс rphost.exe ограничен адресным пространством в 2 ГБ (в Windows). Даже если физической памяти много, процесс просто "не видит" больше своего лимита.
  2. Фрагментация памяти. В процессе долгой работы 1С память внутри rphost фрагментируется. Когда от СУБД приходит массив данных (например, на 300 МБ), системе может не хватить именно непрерывного участка памяти, что и вызывает фатальный сбой.
  3. Объемные данные (Binary Data). При выгрузке на сайт часто передаются изображения товаров и файлы. При выборке 50 товаров с фотографиями высокого разрешения объем данных в оперативной памяти может мгновенно вырасти до критических значений из-за особенностей сериализации в XML/JSON.

Шаг 1: Переход на 64-битную платформу 1С

Как показывает практика и опыт участников обсуждения, самым надежным и стратегически правильным решением является использование 64-битного сервера 1С. Разберем, почему это критично. В 64-битной среде лимит адресного пространства процесса rphost практически неограничен (измеряется терабайтами). Это позволяет 1С спокойно принимать тяжелые выборки из PostgreSQL, не опасаясь фрагментации или нехватки места под результат запроса.

Если у вас используется 32-битный лицензионный ключ, для стабильной работы современных конфигураций вроде Управление торговлей 11 настоятельно рекомендуется произвести апгрейд лицензии до x64. Это снимет архитектурный барьер, который невозможно обойти программными настройками.

Шаг 2: Оптимизация конфигурации PostgreSQL

Посмотрим на настройки 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

Шаг 3: Настройка порционности выгрузки в 1С

Если переход на x64 временно невозможен, попробуем минимизировать потребление памяти на стороне 1С. Рассмотрим стандартный механизм обмена с сайтом (Bitrix). В типовых конфигурациях 1С (УТ 11, КА, ERP) в узле обмена с сайтом существуют настройки порционности.

Выясним, как это работает: 1С может формировать не один гигантский файл import.xml или offers.xml, а разбивать его на пакеты. Уменьшите параметр "Количество товаров в одном пакете". Например, если при 50 позициях возникает ошибка, попробуйте установить значение 10 или 20. Это заставит систему выполнять запросы к БД меньшими порциями, что снизит пиковое потребление памяти процессом rphost.

Шаг 4: Анализ и очистка временных таблиц

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 по большой стороне).

Подведем итог

Для эффективного решения проблемы мы рекомендуем следующий алгоритм действий:

  1. Приоритетное решение: Установить 64-битную версию сервера 1С:Предприятие. Это полностью устраняет корень проблемы с ограничением адресного пространства.
  2. Тюнинг базы: Отредактировать postgresql.conf, увеличив shared_buffers и work_mem в соответствии с ресурсами вашего сервера.
  3. Ограничение порций: В настройках интеграции с Битрикс уменьшить размер пакета передаваемых данных до стабильно работающего значения.
  4. Контроль процессов: Настроить в консоли администрирования 1С лимит памяти на рабочие процессы и их автоматический перезапуск, чтобы избежать влияния утечек и фрагментации памяти.

Соблюдение этих шагов позволит стабилизировать обмен данными и избавиться от невосстановимых ошибок СУБД при выгрузке номенклатуры.

← На главную