При настройке и отладке обменов данными в среде 1С разработчики часто сталкиваются с необходимостью вручную корректировать файлы правил обмена XML. В процессе такой работы может возникнуть фатальная ошибка разбора XML, которая полностью блокирует чтение файла платформой 1С. Давайте подробно разберем, почему возникает эта ошибка, как она связана со спецификацией XML и как правильно её исправить.
Обычно проблема заявляет о себе при попытке загрузить измененные правила обмена в информационную базу или непосредственно в процессе выполнения выгрузки/загрузки данных. Платформа выдает следующее диагностическое сообщение:
Ошибка разбора XML: - [НомерСтроки, НомерСимвола]
Фатальная ошибка:
Comment must not contain '--' (double-hyphen)
Из текста ошибки становится понятно, что XML-парсер споткнулся на комментарии, внутри которого содержится последовательность из двух дефисов --. Выясним, почему это ограничение столь критично для разметки.
Для того чтобы понять природу этой ошибки, нам необходимо обратиться к официальной спецификации W3C XML 1.0. Ограничение на использование двойного дефиса внутри комментариев обусловлено историческими и техническими причинами:
-- использовался в качестве переключателя (триггера) режима парсера непосредственно внутри комментариев. Если бы парсер встретил лишнюю пару дефисов, он бы запутался в границах комментария.<!-- внешний комментарий <!-- внутренний --> --> недопустима. Если разрешить использование -- внутри комментариев, парсерам станет гораздо сложнее однозначно определять реальную закрывающую конструкцию -->. Ограничение гарантирует, что последовательность -- встретится в комментарии ровно один раз — на его закрытии.Таким образом, любое появление двух дефисов подряд между открывающим тегом комментария <!-- и закрывающим --> делает весь XML-документ невалидным (not well-formed).
Давайте проанализируем, как создаются правила обмена в популярной конфигурации «1С:Конвертация данных 2.1». При автоматической генерации Правил Конвертации Свойств (ПКС) система формирует их наименования по предопределенному шаблону:
<Наименование>Источник --> Приемник</Наименование>
Например, если у нас сопоставляются реквизиты контрагента, имя ПКС будет выглядеть так: <Наименование>Контрагент --> Контрагент</Наименование>. Обратите внимание на наличие стрелочки -->, которая содержит в себе тот самый запрещенный двойной дефис.
Проблема проявляется в тот момент, когда разработчик решает временно «отключить» какое-то Правило Конвертации Объектов (ПКО) или ПКС. Вместо того чтобы заходить в базу «Конвертации данных», разработчик открывает выгруженный XML-файл в текстовом редакторе (например, Notepad++ или VS Code) и комментирует целый блок кода с помощью стандартных тегов разметки:
<!--
<Правило>
<Код>ПроизвольныйЭД</Код>
<Свойства>
<Свойство>
<Код>1</Код>
<Наименование>Дата --> Дата</Наименование>
</Свойство>
</Свойства>
</Правило>
-->
Как только мы оборачиваем этот блок в комментарий, тег наименования свойства оказывается внутри комментария. При этом стрелочка --> превращается в запрещенную последовательность дефисов внутри комментария. XML-парсер платформы 1С моментально прерывает чтение файла с фатальной ошибкой.
Иногда на форумах можно встретить совет использовать объект 1С ПараметрыЧтенияXML и устанавливать свойство ИгнорироватьКомментарии в значение Истина. Давайте разберем, почему этот способ не сработает в нашей ситуации.
Рассмотрим пример кода чтения XML-файла в 1С:
ПараметрыЧтения = Новый ПараметрыЧтенияXML;
ПараметрыЧтения.ИгнорироватьКомментарии = Истина;
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ПутьКФайлу, ПараметрыЧтения);
Пока Чтение.Прочитать() Цикл
// Обработка данных
КонецЦикла;
Несмотря на установку свойства ИгнорироватьКомментарии = Истина, этот код все равно завершится аварийно. Дело в том, что перед тем как отбросить комментарии или передать данные коду 1С, встроенный низкоуровневый парсер обязан проверить документ на соответствие базовому стандарту XML (well-formedness). Так как двойной дефис в комментарии грубо нарушает спецификацию XML, парсер считает документ поврежденным и выдает фатальное исключение еще на этапе синтаксического анализа, до применения каких-либо параметров игнорирования.
Рассмотрим несколько практических и надежных способов решения этой проблемы, расположенных по степени их правильности и безопасности.
Самый надежный метод — отказаться от ручного комментирования блоков в итоговом XML-файле. Вместо этого выполните следующие шаги в информационной базе «Конвертация данных»:
В этом случае отключенные правила либо вообще не попадут в результирующий XML-файл, либо будут помечены специальным атрибутом, который корректно обработается платформой 1С без вызова синтаксических ошибок.
Если вам часто приходится вручную анализировать и комментировать фрагменты файлов правил, измените шаблон наименования свойств в вашей базе «Конвертации данных»:
--> на одинарную стрелку ->.=>.Дата - Дата или Дата к Дата.Это позволит вам безбоязненно комментировать любые блоки XML-кода вручную, так как внутри комментариев больше не будет появляться запрещенный дубль дефиса.
Если вы редактируете XML-файл правил обмена «на лету» в текстовом редакторе и вам нужно временно отключить блок кода, сделайте следующее:
<Правило>...</Правило>).Delete вместо комментирования).Такой подход полностью гарантирует валидность XML-структуры, и парсер прочитает файл без каких-либо замечаний.
Мы выяснили, что фатальная ошибка разбора XML с упоминанием двойного дефиса — это строгое ограничение мирового стандарта XML, обойти которое программными настройками чтения в 1С невозможно. Для успешной работы обменов всегда следите за тем, чтобы внутри комментариев <!-- ... --> не содержалось символов --, и отдавайте предпочтение штатным механизмам настройки правил обмена в конфигурации «Конвертация данных».