Как объединить два XML-файла в 1С при переходе с версии 8.2 на 8.3?

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

При переходе с платформы 1С:Предприятие 8.2 на 8.3 часто возникает ситуация, когда часть данных (например, обороты за текущий период) остается в старой базе, а новые данные уже формируются в новой. Бухгалтеру или техническому специалисту требуется объединить эти данные в один XML-файл для последующей отправки в контролирующие органы или сторонние системы. В этой статье мы разберем несколько профессиональных способов решения этой задачи: от простых манипуляций с объектами 1С до использования высокопроизводительных технологий трансформации данных.

Метод 1. Использование объектной модели XDTO и Таблицы Значений

Этот метод считается наиболее интуитивно понятным для разработчика 1С. Мы прочитаем оба файла, преобразуем их в объекты 1С, объединим данные в таблице и запишем результат в новый файл. Разберем ситуацию на примере работы с узлом оборотов.

Для начала проанализируем, как прочитать данные из файла с помощью фабрики XDTO. Рассмотрим программный код:


// Создаем объекты для чтения
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл("C:\Обмен\Файл_82.xml");

// Используем фабрику XDTO для получения объекта
ОбъектXDTO_82 = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);

// Создаем таблицу значений для объединения данных
ТаблицаОборотов = Новый ТаблицаЗначений;
ТаблицаОборотов.Колонки.Добавить("Имя");
ТаблицаОборотов.Колонки.Добавить("Сумма");

// Обходим данные первого файла
Для Каждого ЗаписьИз82 Из ОбъектXDTO_82.Oborot Цикл
    НоваяСтрока = ТаблицаОборотов.Добавить();
    ЗаполнитьЗначенияСвойств(НоваяСтрока, ЗаписьИз82);
КонецЦикла;

ЧтениеXML.Закрыть();

После того как мы загрузили данные из первого файла, нам нужно аналогичным образом прочитать второй файл из версии 8.3 и добавить строки в ту же ТаблицаОборотов. Основное преимущество использования таблицы значений заключается в том, что мы можем легко выполнить проверку на дубли. Например, если обороты за определенную дату выгрузились в оба файла, мы можем сгруппировать таблицу по ключевым полям перед итоговой записью.

Завершающим этапом будет создание нового XML-файла на основе накопленных данных. Мы будем использовать ЗаписьXML для формирования итоговой структуры.

Метод 2. Объединение через объектную модель DOM (Document Object Model)

Если структура файлов сложная и мы не хотим вручную описывать каждое поле в таблице значений, целесообразно использовать ДокументDOM. Этот метод позволяет манипулировать узлами XML как объектами дерева.

Выясним алгоритм действий:

  1. Загружаем первый файл (базовый) в объект ДокументDOM.
  2. Загружаем второй файл в другой объект ДокументDOM.
  3. Находим корневой узел первого документа, куда будем добавлять данные.
  4. Получаем список узлов (например, все теги Row) из второго документа.
  5. Импортируем и добавляем их в первый документ.

Рассмотрим пример кода для реализации этого подхода:


Чтение1 = Новый ЧтениеXML;
Чтение1.ОткрытьФайл("C:\Data\BaseFile.xml");
ПостроительDOM = Новый ПостроительDOM;
ДокументDOM1 = ПостроительDOM.Прочитать(Чтение1);

Чтение2 = Новый ЧтениеXML;
Чтение2.ОткрытьФайл("C:\Data\AdditionalData.xml");
ДокументDOM2 = ПостроительDOM.Прочитать(Чтение2);

// Получаем корневые элементы
Корень1 = ДокументDOM1.ДокументОбъект;
ДанныеДляПереноса = ДокументDOM2.ПолучитьЭлементыПоИмени("Oborot");

Для Каждого УзелИзВторого Из ДанныеДляПереноса Цикл
    // Важно: узел сначала нужно импортировать в контекст первого документа
    НовыйУзел = ДокументDOM1.ИмпортироватьУзел(УзелИзВторого, Истина);
    Корень1.ДочерниеУзлы.Добавить(НовыйУзел);
КонецЦикла;

// Записываем результат
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл("C:\Data\Result.xml");
ЗаписьDOM = Новый ЗаписьDOM;
ЗаписьDOM.Записать(ДокументDOM1, Запись);
Запись.Закрыть();

Важный нюанс: Метод DOM загружает весь файл в оперативную память. Если ваши файлы весят сотни мегабайт, этот способ может привести к ошибке нехватки памяти.

Метод 3. Потоковое объединение для больших файлов

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

Рассмотрим по шагам, как реализовать потоковое слияние:

  1. Создаем ЗаписьXML для итогового файла.
  2. Открываем первый файл через ЧтениеXML, читаем его и переписываем в итог все узлы до закрывающего корневого тега.
  3. Закрываем чтение первого файла.
  4. Открываем второй файл, пропускаем его заголовок и открывающий корневой тег.
  5. Читаем все внутренние узлы второго файла и дописываем их в ЗаписьXML.
  6. В конце программно закрываем корневой тег и завершаем запись.

Такой подход требует аккуратности с пространствами имен (Namespaces), так как они должны совпадать в обоих исходных файлах, иначе итоговый XML не пройдет валидацию.

Метод 4. XSLT-преобразование

Для системных интеграторов и сложных задач 1С предоставляет объект ПреобразованиеXSL. Это стандарт трансформации XML-документов. Вы можете создать небольшой файл-шаблон (XSL), который будет описывать правила слияния двух документов.

Преимущество этого метода в скорости. Преобразование выполняется на уровне оптимизированных библиотек C++, что значительно быстрее циклов в коде 1С. Это "промышленный" стандарт, который минимизирует вероятность ошибок при работе со сложными структурами метаданных.

Технические рекомендации и риски

При объединении файлов из разных версий платформы (8.2 и 8.3) обратите внимание на следующие моменты:

Подводя итог, выбор метода зависит от объема данных. Если файлы небольшие (до 10-20 Мб), используйте XDTO или DOM. Если файлы огромные — выбирайте потоковое чтение или XSLT. Это гарантирует стабильную работу системы и корректность данных для бухгалтерии.

← На главную