Выгрузка документов и справочников в формат XML — стандартная задача при организации интеграции 1С 7.7 с другими информационными системами, сайтами, базами данных 1С 8 или сервисами электронного документооборота. В платформе 1С 7.7 отсутствуют встроенные методы для прямой сериализации XML (такие как ЗаписьXML в версии 8), поэтому разработчики применяют несколько альтернативных подходов.
Разберем по шагам, как выгрузить накладные реализации с помощью различных инструментов платформы 1С 7.7, выясним причины записи файла в одну строку и рассмотрим способы правильного форматирования результирующих данных.
Классический способ формирования XML-файлов в 1С 7.7 заключается в использовании штатной компоненты v7plus.dll. Она предоставляет DOM-парсер, позволяющий создавать дерево элементов и сохранять его в файл.
Посмотрим на пример выгрузки документов «Реализация» через объект AddIn.XMLParser:
XMLАнализатор = СоздатьОбъект("AddIn.XMLParser");
XMLКорневойРаздел = XMLАнализатор.СоздатьДокумент();
// Создаем корневой элемент
Файл = XMLКорневойРаздел.СоздатьПодчиненныйЭлемент("Файл");
Файл.УстановитьАтрибут("ИдФайл", "1122");
// Обходим выборку документов реализации
Пока Запрос.Группировка(1) = 1 Цикл
Док = Запрос.Реализация;
Документ = Файл.СоздатьПодчиненныйЭлемент("Документ");
Документ.УстановитьАтрибут("КНД", Док.НомерДок);
Документ.УстановитьАтрибут("ДатаДок", Формат(Док.ДатаДок, "ДДДММГГГГ"));
Документ.УстановитьАтрибут("ВремяДок", Док.ПолучитьВремя());
СвТНО = Документ.СоздатьПодчиненныйЭлемент("СвТНО");
СвТНО.УстановитьАтрибут("НаимПервДок", "Товарная накладная");
СвТНО.УстановитьАтрибут("ОКУДПервДок", "0330212");
СвТНО.УстановитьАтрибут("НомФорм", "ТОРГ-12");
КонецЦикла;
// Сохраняем результат на диск
XMLКорневойРаздел.Записать("C:\Export\Realization.xml");
Часто при открытии сформированного таким образом файла в простом текстовом редакторе (например, в «Блокноте») весь текст отображается в одну длинную строку без переносов и отступов. При этом браузеры и специализированные XML-парсеры открывают файл корректно.
Проанализируем причину такого поведения: спецификация XML не требует обязательного наличия символов перевода строки и отступов между тегами. С точки зрения синтаксиса XML файл, записанный в одну строку, является полностью валидным и корректно считывается любыми парсерами. Переносы строк и табуляция нужны исключительно для удобства чтения человеком (так называемый Pretty Print).
Ограничения метода:
v7plus.dll нередко вызывает трудности при регистрации в системе и проблемы с правами доступа.Чтобы избежать необходимости регистрировать v7plus.dll, можно использовать системную библиотеку Windows MSXML2.DOMDocument. Для создания форматированного XML с отступами и переносами строк применяется связка с MSXML2.MXXMLWriter.
Рассмотрим пример формирования XML с помощью системного парсера:
DOM = СоздатьОбъект("MSXML2.DOMDocument");
Писатель = СоздатьОбъект("MSXML2.MXXMLWriter");
Писатель.indent = 1; // Включаем отступы
Писатель.encoding = "windows-1251";
Корневой = DOM.createElement("Файл");
Корневой.setAttribute("ИдФайл", "1122");
DOM.appendChild(Корневой);
Пока Запрос.Группировка(1) = 1 Цикл
Док = Запрос.Реализация;
ЭлмДок = DOM.createElement("Документ");
ЭлмДок.setAttribute("Номер", СокрЛП(Док.НомерДок));
ЭлмДок.setAttribute("Дата", Формат(Док.ДатаДок, "ДГГГГММДД"));
Корневой.appendChild(ЭлмДок);
КонецЦикла;
DOM.save("C:\Export\Realization_Formatted.xml");
Если требуется максимальная скорость выгрузки без нагрузки на оперативную память, самым простым и производительным решением является ручная сборка текстового потока.
Разберем реализацию через штатный объект Текст:
Т = СоздатьОбъект("Текст");
Т.ДобавитьСтроку("<?xml version=""1.0"" encoding=""windows-1251""?>");
Т.ДобавитьСтроку("<Файл ИдФайл=""1122"">");
Пока Запрос.Группировка(1) = 1 Цикл
Док = Запрос.Реализация;
ТекстДокумента = Симв(9) + "<Документ Номер=""" + СокрЛП(Док.НомерДок) + """ Дата=""" + Формат(Док.ДатаДок, "ДГГГГММДД") + """/>";
Т.ДобавитьСтроку(ТекстДокумента);
КонецЦикла;
Т.ДобавитьСтроку("</Файл>");
Т.Записать("C:\Export\FastRealization.xml");
Важные правила при ручной сборке XML:
& заменяется на &, < на <, > на >, кавычка " на ", апостроф ' на '.Текст сохраняет файлы только в ANSI (CP1251) или OEM (CP866). Если принимающая сторона требует кодировку UTF-8, для сохранения текста следует использовать объект ADODB.Stream со свойством Charset = "utf-8".ГГГГ-ММ-ДД), а в числах разделителем дробной части должна выступать точка без пробелов-разделителей триад (Формат(Сумма, "Ч-пробел")).Если целью выгрузки накладных реализации является их последующая загрузка в современную конфигурацию 1С (например, «1С:Управление торговлей 11» или «1С:Бухгалтерия предприятия 3.0»), писать собственный парсер не требуется. Для этих задач применяется стандартная обработка V77Exp.ert и правила переноса, созданные в конфигурации «Конвертация данных 2.1».