При работе с крупными базами данных в 1С:Управление торговлей 11 часто возникает ситуация, когда стандартная выгрузка номенклатуры на сайт (например, на CMS Битрикс или другие системы) обрывается с ошибкой «Недостаточно памяти» или «Превышен максимальный расход памяти сервера за один вызов». Это происходит даже в тех случаях, когда сервер обладает внушительными характеристиками (например, 160 ГБ ОЗУ), а в настройках обмена установлена порционная выгрузка. Рассмотрим подробно, почему так происходит, и разберем по шагам способы решения этой проблемы.
Первое, что нам необходимо понять: наличие большого объема оперативной памяти на физическом сервере не означает, что платформа 1С может использовать её всю для выполнения одной операции. Проанализируем ситуацию. Ошибка «Превышен максимальный расход памяти сервера за один вызов» генерируется не операционной системой, а самим менеджером кластера 1С. Это защитный механизм, который предотвращает «падение» всего рабочего процесса rphost из-за одного некорректного или слишком тяжелого запроса.
Существует несколько «подводных камней» в типовом механизме обмена УТ 11:
Разберем, как снять программные ограничения платформы. Если мы уверены, что сервер физически потянет нагрузку, нам нужно изменить параметры безопасности в консоли администрирования 1С.
Проанализируем параметры рабочего сервера:
Важно: После изменения этих настроек может потребоваться перезапуск службы 1C:Enterprise 8.3 Server Agent, чтобы новые лимиты вступили в силу.
Если настройка кластера помогла избежать ошибки, но выгрузка все равно длится часами, нужно заглянуть «под капот» программного кода. Выясним причину медленной работы. В УТ 11 за формирование данных отвечает СКД (Схема компоновки данных). Рассмотрим подробнее макет СхемаВыгрузкиКаталогПакетПредложений.
Часто в типовых запросах обмена можно встретить неоптимальные соединения. Например, платформа может пытаться получить остатки и цены для всех характеристик товара, даже если они не используются. Рассмотрим пример «бага» в платформе, который иногда встречается в коде формирования пакетов (модуль Б_ОбменССайтомСерверВыгрузкаДанных):
// Пример оптимизации текста запроса, если условие с NULL работает некорректно
ТекстЗапроса = Запрос.Текст;
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "NULL = &П ", "ИСТИНА = ИСТИНА ");
Запрос.Текст = ТекстЗапроса;
Посмотрим на ситуацию со стороны регистрации изменений. Если выгрузка 100 000 позиций целиком не проходит, лучшим решением будет выгружать данные частями, используя отборы. Вместо того чтобы пытаться выгрузить всё сразу, настройте расписание обмена так, чтобы сначала ушли только изменения, а не полная база.
Проанализируем структуру нашего XML-файла. Если вы выгружаете изображения вместе с каталогом, 1С преобразует каждую картинку в строку формата Base64. Это колоссально нагружает память. Рассмотрим рекомендации по оптимизации:
Выясним, какая разрядность у вашего сервера 1С. Если вы используете 32-битную версию сервера 1С (даже на 64-битной Windows), то каждый рабочий процесс rphost физически не может адресовать более 4 ГБ памяти. В этом случае никакие настройки кластера и 160 ГБ ОЗУ на сервере не помогут — процесс просто «схлопнется» при достижении лимита. Убедитесь, что у вас установлена 64-битная версия сервера 1С:Предприятия.
Рассмотрим ситуацию, когда 1С уже передала данные, но на сайте они появляются «по чайной ложке» (например, по 20 позиций за раз). Это сигнализирует о том, что проблема сместилась на сторону принимающей стороны (CMS).
Процесс выглядит так:
import.xml или offers.xml.Если на сайте установлены жесткие лимиты в php.ini (например, memory_limit или max_execution_time), сайт будет обрабатывать файл пошагово. Для ускорения необходимо оптимизировать индексы в базе данных сайта и увеличить лимиты ресурсов для PHP-скриптов импорта.
Подведем итог нашего исследования. Если вы столкнулись с нехваткой памяти при обмене с сайтом в УТ 11, действуйте по следующему плану:
rphost в реальном времени во время выгрузки. Если память растет скачкообразно перед самой ошибкой — ищите проблему в сериализации XDTO и картинках.Выполняя эти шаги, мы сможем добиться стабильной работы обмена даже на очень больших объемах номенклатуры.