При работе регламентных и фоновых заданий в «1С:Предприятие» разработчики и администраторы часто сталкиваются с ситуацией, когда автоматическая выгрузка данных (например, XML или XLS) завершается ошибкой «На сервере недостаточно памяти для выполнения задания». При этом на самом сервере может быть свободно 17 ГБ и более оперативной памяти. Проанализируем причины этой проблемы и разберем практические способы ее решения.
Выясним, почему возникает данная ошибка, даже если физическая оперативная память (ОЗУ) на сервере свободна:
rphost ограничен виртуальным адресным пространством в 2–3 ГБ. Сколько бы свободной памяти ни оставалось у операционной системы, отдельный процесс не может занять больше этого лимита.rphost расщепляется на мелкие фрагменты. При попытке выделить единый непрерывный блок памяти для новой операции система выдает ошибку нехватки памяти.DOMДокумент) загружает весь массив данных в оперативную память и часто приводит к утечкам ресурсов.Рассмотрим наименее трудоемкий и проверенный на практике способ. Если одно регламентное задание делает сразу несколько операций (например, выполняет запрос и выгружает данные в несколько разных форматов файлов), его лучше разделить на самостоятельные фоновые операции.
Разберем, почему это помогает: при завершении каждого отдельного регламентного задания сеанс фонового процесса завершается и освобождает занятые ресурсы. В результате адресное пространство rphost не успевает чрезмерно фрагментироваться и переполняться.
Вместо выполнения одного задания, формирующего сразу 2 XML и 2 XLS файла, создаем два отдельных регламентных задания, каждое из которых отвечает за свою часть выгрузки.
Проанализируем используемые алгоритмы формирования файлов и заменим ресурсоемкие операции на потоковые:
COMОбъект("Excel.Application") используем штатный объект 1С ТабличныйДокумент и его метод Записать(). Это избавляет от накладных расходов COM-интерфейсов и незавершённых процессов в системе.ЗаписьXML. Данные записываются прямым потоком на диск с минимальным расходом ОЗУ.Посмотрим на пример правильного формирования XML-файла потоковым методом:
ЗаписьФайла = Новый ЗаписьXML;
ЗаписьФайла.ОткрытьФайл("C:\Exports\Data.xml", "UTF-8");
ЗаписьФайла.ЗаписатьОбъявлениеXML();
ЗаписьФайла.ЗаписатьНачалоЭлемента("Корневой");
Пока Выборка.Следующий() Цикл
ЗаписьФайла.ЗаписатьНачалоЭлемента("Элемент");
ЗаписьФайла.ЗаписатьАтрибут("Код", Строка(Выборка.Код));
ЗаписьФайла.ЗаписатьКонецЭлемента();
КонецЦикла;
ЗаписьФайла.ЗаписатьКонецЭлемента();
ЗаписьФайла.Закрыть();
Рассмотрим правила работы с памятью в исходном коде 1С:
УНИЧТОЖИТЬ ВременнаяТаблица, чтобы они не удерживали память СУБД и сервера приложений.Неопределено:
ТЗ_Данные = Запрос.Выполнить().Выгрузить();
// ... Обработка и запись данных в файл ...
ТЗ_Данные = Неопределено; // Явно освобождаем оперативную память
Если нет возможности оперативно изменить код или перейти на 64-битную платформу, настроим автоматический контроль ресурсов в консоли администройства кластера серверов 1С:
rphost. При превышении предела процесс будет автоматически перезапускаться и освобождать память без остановки работы пользователей.Кардинальным решением проблемы с ограничением памяти является использование 64-битной версии сервера «1С:Предприятие». В 64-разрядной архитектуре снимается ограничение на размер виртуального адресного пространства одного процесса rphost в 2–3 ГБ, что полностью исключает подобную ошибку при наличии достаточного количества физической ОЗУ на сервере.