При работе с типовой обработкой ВыгрузкаЗагрузкаДанныхXML многие разработчики сталкиваются с критической ошибкой нехватки оперативной памяти при попытке выгрузить крупные справочники или документы (например, сотни тысяч записей). Система просто «зависает» или завершает работу с ошибкой. Давайте разберем, почему это происходит и как решить эту проблему, используя простые механизмы платформы.
Многие ошибочно полагают, что проблема заключается в самом объеме данных. На самом деле, стандартный механизм выгрузки при считывании объектов в XML-формат отслеживает все ссылочные связи. В оперативной памяти формируется огромная коллекция ссылок на все выгруженные объекты, чтобы избежать дублирования и корректно обработать циклические связи. Чем больше записей вы пытаетесь выгрузить за один заход, тем быстрее исчерпывается доступная оперативная память.
Самый простой и эффективный способ — не пытаться «переварить» весь объем данных сразу. Мы можем разбить выгрузку на части (пакеты), например, по 10 000 записей. Для этого воспользуемся возможностями вкладки «Произвольный запрос» в универсальной обработке.
Шаг 1: Используем автонумерацию строк
Если справочник имеет сложную структуру кодов (буквы, спецсимволы), по которым невозможно выстроить понятный интервал, воспользуемся функцией АВТОНОМЕРЗАПИСИ() внутри нашего запроса. Это позволит нам пронумеровать записи в выборке прямо в памяти СУБД и ограничить количество выбираемых элементов.
Рассмотрим пример кода для ограничения выборки:
ВЫБРАТЬ
Спр.Ссылка
ИЗ
Справочник.ВашБольшойСправочник КАК Спр
УПОРЯДОЧИТЬ ПО
Спр.Ссылка
// В параметрах запроса или в консоли задаем ограничение:
ВЫБРАТЬ ПЕРВЫЕ 10000
После выгрузки первой порции, вы можете сдвинуть выборку, используя исключение уже обработанных ссылок, либо повторно запустить запрос, но уже с условием по номеру строки, который мы получили через АВТОНОМЕРЗАПИСИ().
Если структура данных позволяет, используйте интервалы. В поле «Где» запроса можно указывать границы, например, по коду или по дате создания. Это классический метод порционной обработки данных:
ГДЕ Код МЕЖДУ 1 И 10000ГДЕ Код МЕЖДУ 10001 И 20000Такой подход максимально снижает нагрузку на ОЗУ, так как после завершения выгрузки каждого файла обработка освобождает ресурсы, накопленные для контроля ссылок в рамках текущей транзакции.
Если задача носит регулярный характер, мы рекомендуем автоматизировать процесс через РегламентныеЗадания или запуск ФоновыхЗаданий. При завершении работы фонового задания платформа принудительно очищает всю занятую им память. Создавая несколько заданий, которые выгружают разные части данных в отдельные файлы, вы обеспечите стабильность обмена даже при работе с многомиллионными базами.
Чтобы работа проходила максимально быстро и без сбоев, придерживайтесь следующих правил:
УПОРЯДОЧИТЬ ПО в запросе. Это гарантирует предсказуемый порядок выгрузки данных.НачатьТранзакцию() и ЗафиксироватьТранзакцию() в цикле по 10 000 элементов. Это позволит сбрасывать буфер записи на диск.Используя представленные выше методы, вы сможете выгрузить любой объем данных, не опасаясь зависания системы. Помните: главный секрет стабильной работы с XML в 1С — это дробление больших задач на мелкие, управляемые порции.