Как исправить ошибку разбора XML «Comment must not contain '--'» в правилах обмена 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При настройке и отладке обменов данными в среде 1С разработчики часто сталкиваются с необходимостью вручную корректировать файлы правил обмена XML. В процессе такой работы может возникнуть фатальная ошибка разбора XML, которая полностью блокирует чтение файла платформой 1С. Давайте подробно разберем, почему возникает эта ошибка, как она связана со спецификацией XML и как правильно её исправить.

Суть проблемы и текст ошибки

Обычно проблема заявляет о себе при попытке загрузить измененные правила обмена в информационную базу или непосредственно в процессе выполнения выгрузки/загрузки данных. Платформа выдает следующее диагностическое сообщение:


Ошибка разбора XML:  - [НомерСтроки, НомерСимвола]
Фатальная ошибка: 
Comment must not contain '--' (double-hyphen)

Из текста ошибки становится понятно, что XML-парсер споткнулся на комментарии, внутри которого содержится последовательность из двух дефисов --. Выясним, почему это ограничение столь критично для разметки.

Почему стандарт XML категорически запрещает «--» в комментариях?

Для того чтобы понять природу этой ошибки, нам необходимо обратиться к официальной спецификации W3C XML 1.0. Ограничение на использование двойного дефиса внутри комментариев обусловлено историческими и техническими причинами:

  1. Наследие языка SGML: XML является подмножеством более старого языка разметки SGML. В SGML двойной дефис -- использовался в качестве переключателя (триггера) режима парсера непосредственно внутри комментариев. Если бы парсер встретил лишнюю пару дефисов, он бы запутался в границах комментария.
  2. Запрет на вложенные комментарии: По стандарту XML комментарии не могут быть вложены друг в друга. Конструкция вида <!-- внешний комментарий <!-- внутренний --> --> недопустима. Если разрешить использование -- внутри комментариев, парсерам станет гораздо сложнее однозначно определять реальную закрывающую конструкцию -->. Ограничение гарантирует, что последовательность -- встретится в комментарии ровно один раз — на его закрытии.

Таким образом, любое появление двух дефисов подряд между открывающим тегом комментария <!-- и закрывающим --> делает весь XML-документ невалидным (not well-formed).

Почему эта проблема часто возникает именно в 1С при работе с правилами обмена?

Давайте проанализируем, как создаются правила обмена в популярной конфигурации «1С:Конвертация данных 2.1». При автоматической генерации Правил Конвертации Свойств (ПКС) система формирует их наименования по предопределенному шаблону:

<Наименование>Источник --> Приемник</Наименование>

Например, если у нас сопоставляются реквизиты контрагента, имя ПКС будет выглядеть так: <Наименование>Контрагент --> Контрагент</Наименование>. Обратите внимание на наличие стрелочки -->, которая содержит в себе тот самый запрещенный двойной дефис.

Проблема проявляется в тот момент, когда разработчик решает временно «отключить» какое-то Правило Конвертации Объектов (ПКО) или ПКС. Вместо того чтобы заходить в базу «Конвертации данных», разработчик открывает выгруженный XML-файл в текстовом редакторе (например, Notepad++ или VS Code) и комментирует целый блок кода с помощью стандартных тегов разметки:


<!-- 
<Правило>
    <Код>ПроизвольныйЭД</Код>
    <Свойства>
        <Свойство>
            <Код>1</Код>
            <Наименование>Дата --> Дата</Наименование>
        </Свойство>
    </Свойства>
</Правило>
-->

Как только мы оборачиваем этот блок в комментарий, тег наименования свойства оказывается внутри комментария. При этом стрелочка --> превращается в запрещенную последовательность дефисов внутри комментария. XML-парсер платформы 1С моментально прерывает чтение файла с фатальной ошибкой.

Анализируем ложные решения: почему ПараметрыЧтенияXML не помогут

Иногда на форумах можно встретить совет использовать объект 1С ПараметрыЧтенияXML и устанавливать свойство ИгнорироватьКомментарии в значение Истина. Давайте разберем, почему этот способ не сработает в нашей ситуации.

Рассмотрим пример кода чтения XML-файла в 1С:


ПараметрыЧтения = Новый ПараметрыЧтенияXML;
ПараметрыЧтения.ИгнорироватьКомментарии = Истина;

Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ПутьКФайлу, ПараметрыЧтения);

Пока Чтение.Прочитать() Цикл
    // Обработка данных
КонецЦикла;

Несмотря на установку свойства ИгнорироватьКомментарии = Истина, этот код все равно завершится аварийно. Дело в том, что перед тем как отбросить комментарии или передать данные коду 1С, встроенный низкоуровневый парсер обязан проверить документ на соответствие базовому стандарту XML (well-formedness). Так как двойной дефис в комментарии грубо нарушает спецификацию XML, парсер считает документ поврежденным и выдает фатальное исключение еще на этапе синтаксического анализа, до применения каких-либо параметров игнорирования.

Рекомендуемые способы решения проблемы

Рассмотрим несколько практических и надежных способов решения этой проблемы, расположенных по степени их правильности и безопасности.

Способ 1. Использование штатного отключения правил в «Конвертации данных»

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

  1. Найдите нужное вам правило конвертации (ПКО, ПКС или ПВД).
  2. Откройте форму элемента правила.
  3. Установите флаг «Отключить» (или снимите флаг активности).
  4. Сохраните изменения и выполните повторную выгрузку правил обмена в XML-файл.

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

Способ 2. Отказ от использования дефисов в именах ПКС

Если вам часто приходится вручную анализировать и комментировать фрагменты файлов правил, измените шаблон наименования свойств в вашей базе «Конвертации данных»:

Это позволит вам безбоязненно комментировать любые блоки XML-кода вручную, так как внутри комментариев больше не будет появляться запрещенный дубль дефиса.

Способ 3. Физическое удаление блоков кода вместо комментирования

Если вы редактируете XML-файл правил обмена «на лету» в текстовом редакторе и вам нужно временно отключить блок кода, сделайте следующее:

  1. Создайте резервную копию исходного файла правил обмена (это обязательный шаг!).
  2. В рабочем файле выделите ненужный блок правил (например, узел <Правило>...</Правило>).
  3. Просто удалите этот блок из файла (используйте клавишу Delete вместо комментирования).
  4. Сохраните файл и выполните обмен.

Такой подход полностью гарантирует валидность XML-структуры, и парсер прочитает файл без каких-либо замечаний.

Резюме

Мы выяснили, что фатальная ошибка разбора XML с упоминанием двойного дефиса — это строгое ограничение мирового стандарта XML, обойти которое программными настройками чтения в 1С невозможно. Для успешной работы обменов всегда следите за тем, чтобы внутри комментариев <!-- ... --> не содержалось символов --, и отдавайте предпочтение штатным механизмам настройки правил обмена в конфигурации «Конвертация данных».

← На главную