Как исправить ошибку «Недостаточно памяти» при обмене данными XML в 1С

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При выполнении обмена данными между конфигурациями 1С (например, при загрузке данных из «Управление торговлей» в «Бухгалтерию предприятия») с помощью обработки Универсальный обмен данными в формате XML пользователи часто сталкиваются с аварийным завершением работы программы и ошибкой «Недостаточно памяти». Примечательно, что эта ошибка может возникать даже на мощных компьютерах с большим объемом оперативной памяти и при небольшом размере файла выгрузки (всего 2–3 МБ).

В этой статье мы подробно проанализируем причины возникновения данной проблемы, рассмотрим эффективные методы диагностики с помощью отладчика и разберем системные настройки, которые помогут раз и навсегда решить эту проблему.

Причина 1. Зацикливание при поиске дублирующихся элементов

Самая распространенная прикладная причина возникновения ошибки «Недостаточно памяти» — это бесконечные циклы в алгоритмах сопоставления объектов. Если в правилах обмена (созданных в «Конвертации данных») настроен поиск элементов по наименованию или по коду, а в базе-приемнике существуют дублирующиеся элементы, то платформа может войти в бесконечную рекурсию.

Рассмотрим классическую ситуацию: в справочнике номенклатуры или контрагентов базы-приемника создано несколько групп с абсолютно одинаковым наименованием (например, три группы «Строительные материалы»). При попытке сопоставить загружаемый объект система начинает искать родительскую группу. Из-за совпадения имен алгоритм поиска путается, многократно обращается к одним и тем же записям и пытается сопоставить группу саму себе (когда родителем группы становится эта же группа). Возникает бесконечный цикл обхода дерева, оперативная память моментально переполняется, и программа вылетает.

Для того чтобы локализовать и исправить зацикливание, выполним следующие шаги:

  1. Запустим базу-приемник в режиме Конфигуратор и откроем отладчик.
  2. Включим остановку по ошибке или установим точку останова в модуле обработки обмена на этапе чтения очередного объекта XML.
  3. Проанализируем, на каком именно элементе происходит зависание. Пошагово пройдем процедуру сопоставления ссылок.
  4. Если зацикливание обнаружено в иерархическом справочнике, проверим корректность связей. Нам может помочь простой программный код для поиска «петель» в иерархии (когда элемент ссылается сам на себя через родительские связи):

Выборка = Справочники.Номенклатура.ВыбратьИерархически();
Пока Выборка.Следующий() Цикл
    Если Выборка.Родитель = Выборка.Ссылка Тогда
        Сообщить("Найден битый элемент с круговой ссылкой: " + Выборка.Ссылка);
    КонецЕсли;
КонецЦикла;

Решение: Найдем в базе-приемнике дублирующиеся группы или элементы справочника, которые вызывают сбой, переименуем их или объединим с помощью стандартной обработки «Поиск и удаление дублей».

Причина 2. Ограничение адресного пространства 32-разрядного клиента

Если на вашем компьютере установлено 8, 16 или даже 32 ГБ оперативной памяти, стандартный 32-битный клиент 1С (процесс 1cv8.exe) физически не способен адресовать более 2 ГБ (в редких случаях — до 3 ГБ) оперативной памяти. При разборе XML-файла методом DOM (Document Object Model) платформа строит в оперативной памяти полную структуру документа, что требует ресурсов, в 5–10 раз превышающих физический размер самого файла.

Выясним, как обойти это ограничение:

  1. Переход на 64-битный клиент. Самым правильным решением в современных реалиях является установка и запуск 64-разрядной версии платформы 1С:Предприятие. Для процесса x64 лимитов памяти практически не существует.
  2. Расширение лимита виртуальной памяти для x86. Если вы вынуждены использовать 32-битный клиент, можно принудительно заставить операционную систему Windows выделить процессу до 3 ГБ адресного пространства. Для этого запустим командную строку от имени администратора и выполним команду:

bcdedit /set increaseuserva 3072

После выполнения этой команды необходимо обязательно перезагрузить компьютер, чтобы изменения вступили в силу.

Причина 3. Неправильные настройки файла подкачки Windows

Иногда операционной системе не хватает виртуальной памяти из-за того, что файл подкачки (pagefile.sys) жестко ограничен фиксированным размером (например, задан вручную в размере 1 ГБ) или отключен вовсе.

Проанализируем настройки системы и исправим их:

  1. Откроем «Свойства системы» (нажав комбинацию клавиш Win + Break) и перейдем в раздел «Дополнительные параметры системы».
  2. На вкладке «Дополнительно» в разделе «Быстродействие» нажмем кнопку «Параметры».
  3. Перейдем на вкладку «Дополнительно» и в разделе «Виртуальная память» нажмем «Изменить».
  4. Установим флаг «Автоматически выбирать объем файла подкачки» или выберем опцию «Размер по выбору системы» для системного диска. Это позволит Windows динамически расширять виртуальную память при обработке тяжелых XML-файлов.

Причина 4. Избыточное кэширование и транзакции при обмене

По умолчанию правила обмена, созданные в конфигурации «Конвертация данных», кэшируют в памяти информацию обо всех сопоставленных и созданных объектах, чтобы не производить повторный поиск при обращении к ним по ссылкам. При переносе больших объемов информации это приводит к прогрессирующему потреблению ОЗУ.

Рассмотрим, как оптимизировать параметры самого обмена:

  1. Откроем обработку Универсальный обмен данными в формате XML.
  2. Перейдем на вкладку «Параметры загрузки».
  3. Установим флаг «Использовать транзакции» и зададим количество объектов в одной транзакции (оптимально выбрать значение от 1000 до 5000). Запись данных порциями позволяет системе периодически очищать память и сбрасывать кэш XML-парсера на диск.
  4. Если вы сами разрабатываете правила в «Конвертации данных», для тяжелых правил конвертации объектов (ПКО) установите свойство «Не запоминать выгруженные объекты».
  5. Перед запуском обмена всегда отключайте «Режим отладки обработчиков обмена» и снимайте флаги подробного протоколирования, так как запись логов в память при больших объемах данных гарантированно вызывает критический рост потребления ресурсов.

Причина 5. Нехватка места в каталоге временных файлов (TEMP)

При чтении XML платформа 1С активно использует системный каталог временных файлов операционной системы для распаковки и промежуточного хранения данных. Если на системном диске (обычно диск C:\) осталось мало свободного места (менее 1–2 ГБ), то парсер XML выдаст ошибку нехватки ресурсов памяти, даже если оперативная память свободна.

Для решения этой проблемы выполним очистку:

  1. Закроем все сеансы 1С:Предприятия.
  2. Нажмем комбинацию клавиш Win + R, введем в строке команду %temp% и нажмем Enter.
  3. Удалим все содержимое открывшейся папки TEMP.
  4. Очистим корзину и проверим, чтобы на диске C:\ оставалось как минимум 5–10 ГБ свободного пространства для беспрепятственной работы кэша операционной системы.
← На главную