Почему при выгрузке в XML нарушается порядок следования элементов и атрибутов в 1С?

Программист 1С v8.3 (Обычные формы) Налоговый учет Промышленность, строительство и АПК
← На главную

Часто при разработке механизмов обмена данными, особенно для регламентированной отчетности, программисты сталкиваются с тем, что сформированный XML-файл выглядит «не так», как ожидалось. Элементы или атрибуты меняются местами, что вызывает подозрения в некорректной работе платформы 1С. Давайте разберем, почему это происходит и как гарантированно получить нужную структуру файла.

Порядок атрибутов в XML: важный нюанс

Первое, что необходимо усвоить: порядок следования атрибутов внутри одного тега не регламентирован стандартом XML. Согласно спецификации W3C, парсеры должны игнорировать последовательность записи атрибутов. Если вы используете объект ЗаписьXML, платформа 1С может записывать их в том порядке, который считает наиболее оптимальным для внутренних алгоритмов.

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

Как обеспечить строгий порядок следования элементов

В отличие от атрибутов, порядок вложенных элементов (тегов) в XML-структуре часто имеет критическое значение, особенно если схема XSD требует жесткой последовательности. Чтобы управлять этим процессом, воспользуемся следующими стратегиями:

1. Использование последовательных циклов для записи

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

Рассмотрим пример кода:


// Сначала записываем все элементы одного типа
Для Каждого Строка Из КоллекцияДанных Цикл
    Если Строка.Тип = \"Приход\" Тогда
        ХМЛФайлДанных.ЗаписатьНачалоЭлемента(\"Поставка\");
        // Запись атрибутов...
        ХМЛФайлДанных.ЗаписатьКонецЭлемента();
    КонецЕсли;
КонецЦикла;

// Затем записываем все элементы другого типа
Для Каждого Строка Из КоллекцияДанных Цикл
    Если Строка.Тип = \"Возврат\" Тогда
        ХМЛФайлДанных.ЗаписатьНачалоЭлемента(\"Возврат\");
        // Запись атрибутов...
        ХМЛФайлДанных.ЗаписатьКонецЭлемента();
    КонецЕсли;
КонецЦикла;

Этот метод исключает ситуацию, когда «Возврат» случайно окажется раньше «Поставки» из-за особенностей сортировки исходной таблицы данных.

2. Предварительная сортировка коллекции

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


// Сортируем таблицу по колонке, определяющей порядок
ТЗДанных.Сортировать(\"ТипЗаписи Возр, ДатаДокумента Возр\");

// Теперь обходим отсортированную таблицу
Для Каждого Строка Из ТЗДанных Цикл
    // Вывод элементов в нужном порядке
КонецЦикла;

Как правильно проверять структуру XML

Важно помнить, что визуальное отображение файла в браузере (например, Internet Explorer) или даже в некоторых редакторах может вводить в заблуждение. Часто просмотрщики автоматически сортируют атрибуты по алфавиту для удобства чтения. Чтобы увидеть реальный порядок байтов в файле:

  1. Откройте файл в специализированном текстовом редакторе (например, Notepad++ или Sublime Text).
  2. Используйте онлайн-валидаторы или специализированные XML-редакторы, которые показывают структуру дерева без применения сторонних стилей отображения.
  3. Если файл все равно не проходит проверку, попробуйте сформировать его через объект ТекстовыйДокумент как обычную строку. Это «тяжелый» способ, который лишает вас автоматического экранирования спецсимволов и соблюдения кодировок, но дает 100% контроль над содержанием файла.

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

← На главную