Как выгрузить и загрузить данные в формат XML в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

В платформе 1С:Предприятие 7.7 отсутствуют встроенные высокоуровневые объекты для работы с XML, которые появились только в версии 8 (такие как ЗаписьXML, ЧтениеXML или механизмы XDTO). Однако задача обмена данными через XML часто возникает при интеграции 1С 7.7 с внешними системами или другими конфигурациями. Разберем основные способы реализации выгрузки и загрузки документов, реквизитов шапки и табличной части.

Способ 1. Использование COM-объекта MSXML2.DOMDocument

Использование системного COM-объекта Windows MSXML2.DOMDocument — один из самых удобных и надежных способов. Главный плюс этого подхода заключается в том, что на рабочем компьютере не требуется регистрировать сторонние компоненты вроде v7plus.dll. Кроме того, данный объект позволяет выполнять проверку созданного XML-файла по XSD-схеме.

Рассмотрим пример создания XML-документа и обхода выгружаемых документов за период:


// Создаем объект для работы с DOM-моделью XML
ИмяОбъекта = "MSXML2.DOMDocument.4.0";
XMLДок = СоздатьОбъект(ИмяОбъекта);

// Создаем корневой элемент
КорневойУзел = XMLДок.createElement("Root");
XMLДок.appendChild(КорневойУзел);

// Выборка документов за период
Док = СоздатьОбъект("Документ.Реализация");
Док.ВыбратьДокументы(ДатаНач, ДатаКон);

Пока Док.ПолучитьДокумент() = 1 Цикл
    // Создаем элемент для документа
    УзелДок = XMLДок.createElement("Document");
    УзелДок.setAttribute("Number", Док.НомерДок);
    УзелДок.setAttribute("Date", Док.ДатаДок);
    
    // Выгрузка реквизитов шапки
    УзелШапка = XMLДок.createElement("Header");
    УзелШапка.setAttribute("Client", Док.Контрагент.Наименование);
    УзелДок.appendChild(УзелШапка);
    
    // Выгрузка табличной части
    УзелТаблица = XMLДок.createElement("TablePart");
    Док.ВыбратьСтроки();
    Пока Док.ПолучитьСтроку() = 1 Цикл
        УзелСтрока = XMLДок.createElement("Row");
        УзелСтрока.setAttribute("ItemCode", Док.Номенклатура.Код);
        УзелСтрока.setAttribute("Quantity", Док.Количество);
        УзелСтрока.setAttribute("Amount", Док.Сумма);
        УзелТаблица.appendChild(УзелСтрока);
    КонецЦикла;
    
    УзелДок.appendChild(УзелТаблица);
    КорневойУзел.appendChild(УзелДок);
КонецЦикла;

// Сохраняем сформированный XML в файл
XMLДок.save("C:\Exchange\Export.xml");

Если планируется обработка файлов большого объема (сотни мегабайт), загрузка всего дерева в память через DOM может привести к ошибкам нехватки памяти (Out of memory). В таких случаях рекомендуем выгружать данные порциями или использовать событийный парсер MSXML2.SAXXMLReader.

Способ 2. Внешняя компонента v7plus.dll

Фирма «1С» предоставляла штатную внешнюю библиотеку v7plus.dll с объектом AddIn.XMLParser. Данный метод является классическим для платформы 7.7. Для работы с ним библиотеку предварительно необходимо подключить через функцию ЗагрузитьВнешнююКомпоненту().

Проанализируем базовый пример подключения и создания элементов с помощью v7plus.dll:


Если ЗагрузитьВнешнююКомпоненту("v7plus.dll") <> 1 Тогда
    Предупреждение("Не удалось загрузить v7plus.dll!");
    Возврат;
КонецЕсли;

Анализатор = СоздатьОбъект("AddIn.XMLParser");
XMLДок = Анализатор.СоздатьДокумент();
КорневойУзел = XMLДок.СоздатьПодчиненныйЭлемент("Data");

// Добавление узла
УзелНоменклатура = КорневойУзел.СоздатьПодчиненныйЭлемент("Item");
УзелНоменклатура.УстановитьАтрибут("Code", "00001");
УзелНоменклатура.Значение = "Товар 1";

XMLДок.Записать("C:\Exchange\Data.xml");

Способ 3. Формирование XML текстовым объектом

Если требования к структуре XML простые, выгрузку можно реализовать без использования внешних библиотек и COM-объектов. Для этого применяется встроенный объект СоздатьОбъект("Текст").

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

Решение проблемы сопоставления ссылочных реквизитов

Выясним главную проблему выгрузки справочников: в 1С 7.7 нет встроенного метода УникальныйИдентификатор(), как в версии 1С 8. Если в документе выгружается ссылка на номенклатуру или контрагента, система-приемник должна однозначно понять, какой именно элемент соответствует этим данным.

Для сопоставления объектов применяются следующие подходы:

  1. Бизнес-ключи (поиск по уникальным реквизитам): Выгружайте ИНН/КПП для контрагентов, а также Код, Артикул или Штрихкод для номенклатуры. При загрузке выполняйте поиск элемента по этим ключам: если элемент найден — подставляйте его, если нет — создавайте новый.
  2. Внутренний ID объекта: Если обмен происходит между идентичными узлами баз 1С 7.7, можно использовать функцию ЗначениеВСтрокуВнутр(). Она позволяет получить уникальную внутреннюю строку объекта и сопоставлять данные напрямую.
  3. Внешняя таблица соответствий: Как вариант, можно вести отдельный справочник или таблицу регистров, где хранится соответствие кодов приемника и источника.

Альтернативные инструменты обмена

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

  1. 1С:Конвертация данных: С помощью обработки MD77Exp.ert выгружается структура метаданных 7.7, после чего в конфигурации «Конвертация данных» настраиваются правила обмена любой сложности. Выгрузка и загрузка данных затем выполняется стандартными универсальными обработками по готовым правилам.
  2. Обмен через DBF или текст с разделителями: Если жесткого требования использовать XML нет, для внутреннего обмена между базами 1С 7.7 отлично подходит встроенный объект XBase. Работа с DBF-файлами в версии 7.7 происходит значительно быстрее и не требует дополнительных библиотек.
← На главную