В платформе 1С:Предприятие 7.7 отсутствуют встроенные высокоуровневые объекты для работы с XML, которые появились только в версии 8 (такие как ЗаписьXML, ЧтениеXML или механизмы XDTO). Однако задача обмена данными через XML часто возникает при интеграции 1С 7.7 с внешними системами или другими конфигурациями. Разберем основные способы реализации выгрузки и загрузки документов, реквизитов шапки и табличной части.
Использование системного 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.
Фирма «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");
Если требования к структуре XML простые, выгрузку можно реализовать без использования внешних библиотек и COM-объектов. Для этого применяется встроенный объект СоздатьОбъект("Текст").
При использовании этого способа обязательно нужно учитывать спецсимволы XML (амперсанд, кавычки, знаки «больше» и «меньше») и экранировать их вручную, а также контролировать кодировку выгружаемого файла.
Выясним главную проблему выгрузки справочников: в 1С 7.7 нет встроенного метода УникальныйИдентификатор(), как в версии 1С 8. Если в документе выгружается ссылка на номенклатуру или контрагента, система-приемник должна однозначно понять, какой именно элемент соответствует этим данным.
Для сопоставления объектов применяются следующие подходы:
ЗначениеВСтрокуВнутр(). Она позволяет получить уникальную внутреннюю строку объекта и сопоставлять данные напрямую.Если перед вами стоит задача регулярного переноса данных между конфигурациями, писать логику обхода реквизитов вручную не всегда целесообразно. Обратите внимание на такие решения:
MD77Exp.ert выгружается структура метаданных 7.7, после чего в конфигурации «Конвертация данных» настраиваются правила обмена любой сложности. Выгрузка и загрузка данных затем выполняется стандартными универсальными обработками по готовым правилам.XBase. Работа с DBF-файлами в версии 7.7 происходит значительно быстрее и не требует дополнительных библиотек.