Часто при разработке механизмов обмена данными, особенно для регламентированной отчетности, программисты сталкиваются с тем, что сформированный XML-файл выглядит «не так», как ожидалось. Элементы или атрибуты меняются местами, что вызывает подозрения в некорректной работе платформы 1С. Давайте разберем, почему это происходит и как гарантированно получить нужную структуру файла.
Первое, что необходимо усвоить: порядок следования атрибутов внутри одного тега не регламентирован стандартом XML. Согласно спецификации W3C, парсеры должны игнорировать последовательность записи атрибутов. Если вы используете объект ЗаписьXML, платформа 1С может записывать их в том порядке, который считает наиболее оптимальным для внутренних алгоритмов.
Если внешний парсер (например, программа проверки деклараций) выдает ошибку из-за перестановки атрибутов местами, это говорит о том, что такой парсер написан с нарушением стандартов XML (вероятно, он использует простое строковое сравнение или регулярные выражения вместо полноценного разбора XML-дерева). В этом случае бороться с платформой 1С не имеет смысла — проблема заключается в стороннем программном обеспечении.
В отличие от атрибутов, порядок вложенных элементов (тегов) в XML-структуре часто имеет критическое значение, особенно если схема XSD требует жесткой последовательности. Чтобы управлять этим процессом, воспользуемся следующими стратегиями:
Самый надежный способ гарантировать порядок записи элементов — это разделение процесса формирования файла на этапы. Вместо того чтобы пытаться записать разнородные данные (например, «Поставки» и «Возвраты») в рамках одного цикла, разнесем их в разные логические блоки.
Рассмотрим пример кода:
// Сначала записываем все элементы одного типа
Для Каждого Строка Из КоллекцияДанных Цикл
Если Строка.Тип = \"Приход\" Тогда
ХМЛФайлДанных.ЗаписатьНачалоЭлемента(\"Поставка\");
// Запись атрибутов...
ХМЛФайлДанных.ЗаписатьКонецЭлемента();
КонецЕсли;
КонецЦикла;
// Затем записываем все элементы другого типа
Для Каждого Строка Из КоллекцияДанных Цикл
Если Строка.Тип = \"Возврат\" Тогда
ХМЛФайлДанных.ЗаписатьНачалоЭлемента(\"Возврат\");
// Запись атрибутов...
ХМЛФайлДанных.ЗаписатьКонецЭлемента();
КонецЕсли;
КонецЦикла;
Этот метод исключает ситуацию, когда «Возврат» случайно окажется раньше «Поставки» из-за особенностей сортировки исходной таблицы данных.
Если данные необходимо выводить вперемешку, но в строго определенной последовательности, нам поможет метод Сортировать() для таблиц значений. Перед началом записи XML выполним подготовку данных:
// Сортируем таблицу по колонке, определяющей порядок
ТЗДанных.Сортировать(\"ТипЗаписи Возр, ДатаДокумента Возр\");
// Теперь обходим отсортированную таблицу
Для Каждого Строка Из ТЗДанных Цикл
// Вывод элементов в нужном порядке
КонецЦикла;
Важно помнить, что визуальное отображение файла в браузере (например, Internet Explorer) или даже в некоторых редакторах может вводить в заблуждение. Часто просмотрщики автоматически сортируют атрибуты по алфавиту для удобства чтения. Чтобы увидеть реальный порядок байтов в файле:
Notepad++ или Sublime Text).ТекстовыйДокумент как обычную строку. Это «тяжелый» способ, который лишает вас автоматического экранирования спецсимволов и соблюдения кодировок, но дает 100% контроль над содержанием файла.Подведем итог: не пытайтесь искать «ошибки» там, где их нет. Если порядок элементов важен — используйте Сортировать() для таблиц значений или разделите логику записи на несколько проходов. Если же претензии возникают к порядку атрибутов — знайте, что стандарт XML на вашей стороне, а проблема кроется в конечном парсере, который не умеет корректно обрабатывать XML-структуры.