Что делать, если при переносе данных из БП 3.0 в КА 2.0 XML-файл выгрузки раздувается до нескольких гигабайт?

Программист 1С v8.3 (Управляемые формы) 1С:Комплексная автоматизация IT и автоматизация бизнеса
← На главную

Перенос данных между конфигурациями 1С с помощью штатных обработок обмена — стандартная задача для программиста. Однако на практике мы часто сталкиваемся с техническими аномалиями. Представим ситуацию: выгрузка за весь прошлый год проходит стабильно и формирует компактный файл размером до 50 МБ, но при попытке перенести данные за один конкретный месяц (например, февраль) процесс зависает, а итоговый XML-файл раздувается до внушительных 5.5 ГБ. Тестирование и исправление (ТИИ) базы данных при этом не приносит никаких результатов.

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

Главная причина проблемы: избыточная выгрузка и зацикливание связанных объектов

Когда размер XML-файла обмена увеличивается в сотни раз без видимых причин (объем документов в базе за этот период стандартный), первоочередной подозреваемый — неоптимальная настройка правил конвертации объектов (ПКО) в конфигурации «Конвертация данных 2.1». Рассмотрим механизм, который приводит к этой проблеме:

  1. Полная сериализация объектов вместо выгрузки по ссылке. Если в правилах обмена для табличной части документа (например, УстановкаЦенНоменклатуры) для реквизита Номенклатура не настроено ограничение выгрузки, XML-движок при обработке каждой строки документа выгружает не уникальный идентификатор (GUID) позиции, а весь объект целиком. Это означает, что для каждой строки со всеми реквизитами, свойствами, штрихкодами и единицами измерения генерируется огромный массив XML-кода. Если документ содержит 10 000 – 15 000 строк, данные одних и тех же позиций номенклатуры будут продублированы в файле тысячи раз.
  2. Рекурсивное зацикливание метаданных. Нередки случаи, когда в правилах возникает циклическая ссылка. Например: Номенклатура ссылается на справочник ЕдиницыИзмерения, у которого владельцем является та же Номенклатура, которая в свою очередь выгружает свои свойства, опять инициирующие выгрузку единиц измерения. Если глубина выгрузки не ограничена на уровне правил, XML-парсер уходит в бесконечную генерацию вложенных тегов, пока не закончится память или выгрузка не завершится принудительно с гигантским файлом на выходе.
  3. Скрытые «тяжелые» данные в формате Base64. Даже если вы уверены, что файлы электронного документооборота (ЭДО) или сканы договоров не переносятся, в системе могут присутствовать присоединенные файлы картинок товаров, сертификатов номенклатуры или спецификаций. При выгрузке этих объектов в XML бинарные файлы кодируются в текстовую строку Base64. Стоит нескольким «тяжелым» изображениям попасть в выгрузку через переносимые документы установки цен, как итоговый файл моментально вырастает до гигабайтных размеров.

Как проанализировать файл размером более 5 ГБ?

Попытка открыть текстовый или XML-файл размером 5 ГБ в обычном Блокноте или Notepad++ гарантированно приведет к зависанию операционной системы из-за переполнения выделенной оперативной памяти. Нам потребуются специализированные инструменты, способные читать файлы частями (без полной загрузки в ОЗУ):

Пошаговая стратегия локализации проблемы

Если мы не знаем, какой именно объект вызывает раздувание файла, выполним следующие шаги:

Шаг 1. Разбиение периода выгрузки.

Вместо того чтобы выгружать целиком проблемный месяц (февраль), попробуем разбить выгрузку на более мелкие интервалы — например, по декадам или по дням. Это позволит быстро локализовать конкретную дату, в которой находится «проблемный» документ.

Шаг 2. Исключение тяжелых документов из выгрузки.

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

Попробуем поочередно отключать эти типы документов в настройках состава выгрузки типовой обработки. Если после отключения документа УстановкаЦенНоменклатуры размер файла моментально пришел в норму (стал весить стандартные несколько мегабайт) — источник проблемы успешно найден.

Технические решения проблемы

Когда проблемный объект найден, у нас есть два пути: исправить правила обмена в «Конвертации данных» или воспользоваться альтернативными, более быстрыми методами переноса данных.

Вариант 1. Оптимизация правил обмена в «Конвертации данных 2.1»

Если нам критически важно переносить именно документы установки цен через XML-файл, необходимо доработать правила обмена:

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

// Отключаем полную выгрузку объекта номенклатуры, передаем только ссылку
ВыгрузитьОбъект = Ложь;
  1. Также рекомендуется проверить и отключить выгрузку подчиненных справочников присоединенных файлов для номенклатуры в правилах конвертации объектов, чтобы избежать трансляции тяжелых бинарных данных в формате Base64.

Вариант 2. Альтернативный перенос цен без использования XML-обмена

Зачастую перенос исторических документов установки цен за прошлые периоды (например, за 2017 год) не имеет практического смысла для ведения текущего оперативного учета в новой базе КомплекснаяАвтоматизация 2. Гораздо эффективнее и быстрее использовать альтернативные методы:

  1. Перенос только актуального «среза последних». Вместо переноса документов за весь период выгрузим из Бухгалтерии Предприятия только действующие на дату начала учета цены с помощью отчета или простой обработки.
  2. Использование загрузки из Excel. Это самый надежный и быстрый способ, полностью исключающий зависание XML-парсера:
    • В исходной базе БП 3.0 сформируем прайс-лист или ведомость действующих цен и сохраним файл в формате Excel (XLSX).
    • В целевой базе КА 2.0 перейдем в раздел CRM и маркетинг, откроем рабочее место ЦеныНоменклатуры (Прайс-лист).
    • Воспользуемся штатным механизмом «Загрузка цен номенклатуры из табличного документа». Скопируем данные из Excel-файла в форму загрузки, сопоставим колонки (Номенклатура, Вид цены, Цена) и запустим создание документов. Этот процесс займет всего несколько минут и гарантирует корректность загруженных данных без раздувания базы.

Используя предложенные методики анализа структуры файлов и оптимизации правил обмена, мы сможем успешно преодолеть технические ограничения механизмов XML-выгрузки и обеспечить стабильный переход на новую информационную систему.

← На главную