Загрузка объемных прайс-листов (от 500 тысяч строк) в 1С:Предприятие часто сопровождается ошибкой Превышен максимальный расход памяти сервера за один вызов. Эта проблема возникает из-за специфики работы платформы с объектным кэшем и нерационального использования оперативной памяти при массовой обработке данных. Давайте разберем по шагам, как перестроить архитектуру такой загрузки, чтобы обеспечить стабильную работу сервера.
Основная причина «поедания» памяти — это метод ПолучитьОбъект() внутри цикла. Когда вы получаете объект номенклатуры, платформа загружает в память не только нужные реквизиты, но и всю структуру объекта, включая табличные части. Если таких вызовов тысячи, сеансовые данные растут лавинообразно. Чтобы избежать этого, следуйте правилам:
НаборЗаписей.Рассмотрим пример оптимизированного обновления реквизитов:
НоменклатураОбъект = Неопределено;
Если Выборка.Реквизит1 <> Выборка.НоменклатураРеквизит1 Тогда
Если НоменклатураОбъект = Неопределено Тогда
НоменклатураОбъект = Выборка.Номенклатура.ПолучитьОбъект();
КонецЕсли;
НоменклатураОбъект.Реквизит1 = Выборка.Реквизит1;
ЕстьИзменения = Истина;
КонецЕсли;
// ... аналогично для других реквизитов
Если ЕстьИзменения Тогда
НоменклатураОбъект.ОбменДанными.Загрузка = Истина;
НоменклатураОбъект.Записать();
КонецЕсли;
Передача больших ТаблицаЗначений в фоновое задание через сериализацию в строку крайне неэффективна. Она создает огромную нагрузку на память сервера в момент передачи параметров.
Рекомендуемый подход: используйте временные файлы. Записывайте данные во временный файл в формате JSON или XML, а в фоновое задание передавайте только путь к файлу. Это позволит считывать данные порциями, не перегружая RAM.
Вместо выполнения всей загрузки в одном «тяжелом» фоновом задании, примените принцип распараллеливания:
Для диагностики узких мест недостаточно использовать стандартный замер производительности. Технологический журнал — ваш главный инструмент. Он позволит отследить события EXCP, связанные с нехваткой памяти, и увидеть конкретный момент, когда сервер теряет управление процессом.
Также обратите внимание на следующие технические советы:
ADODB: Если вы читаете данные из mdb или excel, убедитесь, что драйверы установлены на стороне сервера, чтобы чтение происходило на сервере без пересылки данных с клиента.Применяя данные методы, вы сможете перевести процесс загрузки прайсов из «проблемной зоны» в штатный регламентный процесс, который будет работать стабильно вне зависимости от объема входящего файла.