При выполнении обмена данными между конфигурациями 1С (например, при загрузке данных из «Управление торговлей» в «Бухгалтерию предприятия») с помощью обработки Универсальный обмен данными в формате XML пользователи часто сталкиваются с аварийным завершением работы программы и ошибкой «Недостаточно памяти». Примечательно, что эта ошибка может возникать даже на мощных компьютерах с большим объемом оперативной памяти и при небольшом размере файла выгрузки (всего 2–3 МБ).
В этой статье мы подробно проанализируем причины возникновения данной проблемы, рассмотрим эффективные методы диагностики с помощью отладчика и разберем системные настройки, которые помогут раз и навсегда решить эту проблему.
Самая распространенная прикладная причина возникновения ошибки «Недостаточно памяти» — это бесконечные циклы в алгоритмах сопоставления объектов. Если в правилах обмена (созданных в «Конвертации данных») настроен поиск элементов по наименованию или по коду, а в базе-приемнике существуют дублирующиеся элементы, то платформа может войти в бесконечную рекурсию.
Рассмотрим классическую ситуацию: в справочнике номенклатуры или контрагентов базы-приемника создано несколько групп с абсолютно одинаковым наименованием (например, три группы «Строительные материалы»). При попытке сопоставить загружаемый объект система начинает искать родительскую группу. Из-за совпадения имен алгоритм поиска путается, многократно обращается к одним и тем же записям и пытается сопоставить группу саму себе (когда родителем группы становится эта же группа). Возникает бесконечный цикл обхода дерева, оперативная память моментально переполняется, и программа вылетает.
Для того чтобы локализовать и исправить зацикливание, выполним следующие шаги:
Выборка = Справочники.Номенклатура.ВыбратьИерархически();
Пока Выборка.Следующий() Цикл
Если Выборка.Родитель = Выборка.Ссылка Тогда
Сообщить("Найден битый элемент с круговой ссылкой: " + Выборка.Ссылка);
КонецЕсли;
КонецЦикла;
Решение: Найдем в базе-приемнике дублирующиеся группы или элементы справочника, которые вызывают сбой, переименуем их или объединим с помощью стандартной обработки «Поиск и удаление дублей».
Если на вашем компьютере установлено 8, 16 или даже 32 ГБ оперативной памяти, стандартный 32-битный клиент 1С (процесс 1cv8.exe) физически не способен адресовать более 2 ГБ (в редких случаях — до 3 ГБ) оперативной памяти. При разборе XML-файла методом DOM (Document Object Model) платформа строит в оперативной памяти полную структуру документа, что требует ресурсов, в 5–10 раз превышающих физический размер самого файла.
Выясним, как обойти это ограничение:
bcdedit /set increaseuserva 3072
После выполнения этой команды необходимо обязательно перезагрузить компьютер, чтобы изменения вступили в силу.
Иногда операционной системе не хватает виртуальной памяти из-за того, что файл подкачки (pagefile.sys) жестко ограничен фиксированным размером (например, задан вручную в размере 1 ГБ) или отключен вовсе.
Проанализируем настройки системы и исправим их:
По умолчанию правила обмена, созданные в конфигурации «Конвертация данных», кэшируют в памяти информацию обо всех сопоставленных и созданных объектах, чтобы не производить повторный поиск при обращении к ним по ссылкам. При переносе больших объемов информации это приводит к прогрессирующему потреблению ОЗУ.
Рассмотрим, как оптимизировать параметры самого обмена:
Универсальный обмен данными в формате XML.При чтении XML платформа 1С активно использует системный каталог временных файлов операционной системы для распаковки и промежуточного хранения данных. Если на системном диске (обычно диск C:\) осталось мало свободного места (менее 1–2 ГБ), то парсер XML выдаст ошибку нехватки ресурсов памяти, даже если оперативная память свободна.
Для решения этой проблемы выполним очистку:
%temp% и нажмем Enter.TEMP.