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

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

Выгрузка документов и справочников в формат XML — стандартная задача при организации интеграции 1С 7.7 с другими информационными системами, сайтами, базами данных 1С 8 или сервисами электронного документооборота. В платформе 1С 7.7 отсутствуют встроенные методы для прямой сериализации XML (такие как ЗаписьXML в версии 8), поэтому разработчики применяют несколько альтернативных подходов.

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

Способ 1. Использование внешней компоненты v7plus.dll (AddIn.XMLParser)

Классический способ формирования 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).

Ограничения метода:

  1. Объект строит полную DOM-модель в оперативной памяти, что при больших объемах данных может привести к ее переполнению.
  2. На 64-битных версиях Windows внешняя 32-битная библиотека v7plus.dll нередко вызывает трудности при регистрации в системе и проблемы с правами доступа.

Способ 2. Использование системного COM-объекта MSXML

Чтобы избежать необходимости регистрировать 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");

Способ 3. Прямая генерация через объект «Текст» или ADODB.Stream

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

Разберем реализацию через штатный объект Текст:


Т = СоздатьОбъект("Текст");
Т.ДобавитьСтроку("<?xml version=""1.0"" encoding=""windows-1251""?>");
Т.ДобавитьСтроку("<Файл ИдФайл=""1122"">");

Пока Запрос.Группировка(1) = 1 Цикл
    Док = Запрос.Реализация;
    ТекстДокумента = Симв(9) + "<Документ Номер=""" + СокрЛП(Док.НомерДок) + """ Дата=""" + Формат(Док.ДатаДок, "ДГГГГММДД") + """/>";
    Т.ДобавитьСтроку(ТекстДокумента);
КонецЦикла;

Т.ДобавитьСтроку("</Файл>");
Т.Записать("C:\Export\FastRealization.xml");

Важные правила при ручной сборке XML:

  1. Экранирование специальных символов: все строковые данные (наименования контрагентов, товаров, комментарии) обязательно должны проходить фильтрацию. Символ & заменяется на &amp;, < на &lt;, > на &gt;, кавычка " на &quot;, апостроф ' на &apos;.
  2. Кодировка UTF-8: стандартный объект Текст сохраняет файлы только в ANSI (CP1251) или OEM (CP866). Если принимающая сторона требует кодировку UTF-8, для сохранения текста следует использовать объект ADODB.Stream со свойством Charset = "utf-8".
  3. Формат чисел и дат: даты рекомендуется передавать в формате ISO (ГГГГ-ММ-ДД), а в числах разделителем дробной части должна выступать точка без пробелов-разделителей триад (Формат(Сумма, "Ч-пробел")).

Способ 4. Типовая обработка универсального обмена данными (V77Exp.ert)

Если целью выгрузки накладных реализации является их последующая загрузка в современную конфигурацию 1С (например, «1С:Управление торговлей 11» или «1С:Бухгалтерия предприятия 3.0»), писать собственный парсер не требуется. Для этих задач применяется стандартная обработка V77Exp.ert и правила переноса, созданные в конфигурации «Конвертация данных 2.1».

← На главную