При переходе с платформы 1С:Предприятие 8.2 на 8.3 часто возникает ситуация, когда часть данных (например, обороты за текущий период) остается в старой базе, а новые данные уже формируются в новой. Бухгалтеру или техническому специалисту требуется объединить эти данные в один XML-файл для последующей отправки в контролирующие органы или сторонние системы. В этой статье мы разберем несколько профессиональных способов решения этой задачи: от простых манипуляций с объектами 1С до использования высокопроизводительных технологий трансформации данных.
Этот метод считается наиболее интуитивно понятным для разработчика 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 для формирования итоговой структуры.
Если структура файлов сложная и мы не хотим вручную описывать каждое поле в таблице значений, целесообразно использовать ДокументDOM. Этот метод позволяет манипулировать узлами XML как объектами дерева.
Выясним алгоритм действий:
ДокументDOM.ДокументDOM.Row) из второго документа.Рассмотрим пример кода для реализации этого подхода:
Чтение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 загружает весь файл в оперативную память. Если ваши файлы весят сотни мегабайт, этот способ может привести к ошибке нехватки памяти.
Когда речь идет о действительно больших объемах данных, проанализируем потоковый метод. В этом случае мы не читаем файл целиком, а обрабатываем его поузлово, сразу записывая результат в новый файл. Это самый экономный способ с точки зрения потребления ресурсов.
Рассмотрим по шагам, как реализовать потоковое слияние:
ЗаписьXML для итогового файла.ЧтениеXML, читаем его и переписываем в итог все узлы до закрывающего корневого тега.ЗаписьXML.Такой подход требует аккуратности с пространствами имен (Namespaces), так как они должны совпадать в обоих исходных файлах, иначе итоговый XML не пройдет валидацию.
Для системных интеграторов и сложных задач 1С предоставляет объект ПреобразованиеXSL. Это стандарт трансформации XML-документов. Вы можете создать небольшой файл-шаблон (XSL), который будет описывать правила слияния двух документов.
Преимущество этого метода в скорости. Преобразование выполняется на уровне оптимизированных библиотек C++, что значительно быстрее циклов в коде 1С. Это "промышленный" стандарт, который минимизирует вероятность ошибок при работе со сложными структурами метаданных.
При объединении файлов из разных версий платформы (8.2 и 8.3) обратите внимание на следующие моменты:
ЧтениеXML в 1С автоматически нивелируют эту проблему.ТаблицаЗначений или Массив объектов XDTO, чтобы программно исключить повторение одних и тех же хозяйственных операций в итоговом файле.Подводя итог, выбор метода зависит от объема данных. Если файлы небольшие (до 10-20 Мб), используйте XDTO или DOM. Если файлы огромные — выбирайте потоковое чтение или XSLT. Это гарантирует стабильную работу системы и корректность данных для бухгалтерии.