При выгрузке документов из 1С:Предприятие 7.7 в формат XML программисты часто сталкиваются с двумя типичными проблемами. Первая — это форматирование: файл, созданный стандартными средствами вроде v7plus.dll, представляет собой одну длинную строку, которую невозможно анализировать в текстовом редакторе. Вторая — ошибки при загрузке такого файла в сторонние системы (например, оператору ЭДО "Диадок"), когда часть данных, например, номера строк в таблице, не считывается, хотя структура файла кажется верной. Разберем, как решить обе эти задачи.
Выясним причину, почему XML-файл отображается в одну строку. Это не является ошибкой или "глюком" компоненты v7plus.dll. Такое поведение называется минификацией. Формат XML предназначен в первую очередь для обмена данными между программами, которым совершенно не важны отступы и переносы строк. Отсутствие этих "лишних" символов экономит место и немного ускоряет парсинг. Однако для отладки и ручного анализа читаемый вид файла критически важен. Рассмотрим несколько способов добиться "красивого" вывода.
Самый надежный и контролируемый метод — это отказаться от XML-парсеров, которые не поддерживают форматирование, и формировать файл построчно, как обычный текстовый документ. В этом случае вы полностью управляете структурой, отступами и переносами строк. Отличный пример такого подхода можно найти прямо в типовых конфигурациях 1С 7.7.
Посмотрим на пример из регламентированной отчетности:
6NDFL1501.ERT (форма 6-НДФЛ).СформироватьФайлВыгрузки.ЗаписатьУзелВФайл, передавая в нее данные узла и его уровень вложенности.Логика работы примерно следующая: функция ЗаписатьУзелВФайл получает на вход уровень вложенности и генерирует соответствующий отступ (например, несколько символов табуляции). Затем она записывает в текстовый файл открывающий тег, вызывает сама себя для всех дочерних узлов (увеличив уровень вложенности на 1), а после их обработки записывает закрывающий тег с тем же отступом. Это позволяет сформировать идеально структурированный XML-документ.
Если вам нужно лишь быстро сделать файл читаемым для анализа, а не переписывать код выгрузки, можно воспользоваться функцией поиска и замены в любом продвинутом текстовом редакторе (например, Notepad++ с подсветкой синтаксиса 1С).
Разберем по шагам:
>.> и символ переноса строки (в Notepad++ это \r\n в расширенном режиме поиска).Это разобьет файл на строки после каждого закрывающего тега. Для лучшего результата можно использовать замену >< на >\r\n<. Этот способ не создаст правильных отступов-"лесенки", но уже сделает структуру файла наглядной и позволит легко найти нужные теги.
Microsoft.XMLDOMБолее современный и гибкий подход для 1С 7.7 — использовать COM-объект для работы с XML. Встроенные средства Windows позволяют создавать XML-документ в памяти как иерархию объектов, а затем сохранять его в файл с автоматическим форматированием.
Ключевой момент при работе с любым из этих методов — кодировка. 1С 7.7 по умолчанию работает в кодировке Windows-1251. Однако практически все современные системы обмена данными, включая операторов ЭДО, требуют XML в кодировке UTF-8. Поэтому при сохранении файла убедитесь, что в его заголовке указано <?xml version="1.0" encoding="UTF-8"?>, и сам файл сохранен именно в этой кодировке. Для перекодировки строк из ANSI в UTF-8 в 1С 7.7 может потребоваться использование внешних компонент.
Проанализируем ситуацию: выгруженный из 1С 7.7 файл УПД загружается в Диадок, но номера строк в табличной части не появляются. При этом аналогичный файл из 1С 8.x загружается корректно. Как показывает практика, в 99% случаев проблема кроется в самом XML-файле.
Основная причина — ошибка в имени тега или его атрибута. Формат электронных документов строго регламентирован ФНС. Любое отклонение, даже в регистре символов (XML чувствителен к регистру), приводит к тому, что система-получатель не может найти ожидаемый тег и пропускает данные.
Автор исходного вопроса нашел ошибку самостоятельно в тот момент, когда начал готовить фрагменты кода и XML-файлов для публикации на форуме. Это иллюстрирует самый эффективный метод отладки.
Если ваш файл не загружается или загружается частично, выполните следующие действия:
НомСтр) в вашем файле называется точно так же, как в эталонном. Проверьте каждую букву и регистр.НомерСтроки="1").<СведТов>).Этот метод почти всегда позволяет быстро выявить расхождение и исправить ошибку в коде формирования XML в 1С 7.7.
При работе с выгрузкой электронных документов из 1С 7.7 важно помнить о нескольких вещах:
<НомСредИдентТов>). Работа с ними в 1С 7.7 имеет свои сложности из-за наличия непечатаемых спецсимволов (GS), которые могут обрезаться стандартными строковыми функциями.