Как исправить ошибку разбора XML при переносе данных из 1С 7.7 в 1С 8

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Переход с платформы 1С 7.7 на современную 1С 8.3 (например, с конфигурации «Торговля и склад» на «Управление торговлей 11») — это сложный процесс, часто сопровождающийся техническими сбоями. Одной из самых распространенных и неприятных проблем является «Ошибка разбора XML» при вызове метода Прочитать. Эта ошибка прерывает загрузку данных, не указывая на конкретный объект, что ставит специалиста в тупик.

В этой статье мы подробно разберем, почему возникает эта ошибка, как локализовать проблемное место в огромном файле выгрузки и какими способами можно очистить данные, чтобы успешно завершить миграцию.

Выясним причину возникновения ошибки

Основная причина кроется в различиях стандартов хранения строк. В 1С 7.7 в строковых реквизитах (наименованиях, комментариях, полных наименованиях) могут годами копиться так называемые недопустимые символы (Control Characters). Это спецсимволы с кодами ASCII от 0 по 31 (за исключением разрешенных табуляции, перевода строки и возврата каретки). Сама «семерка» прекрасно с ними работает, но XML-анализатор в 1С 8, работающий по строгим стандартам консорциума W3C, считает такой файл «некорректно сформированным» (not well-formed) и прекращает чтение.

Также проанализируем ситуацию с кодировками: если в заголовке XML указано encoding="windows-1251", но внутри встречаются символы из других кодировок (например, «умные кавычки» из Word), это также приведет к фатальному сбою разбора.

Шаг 1. Первичная диагностика файла

Прежде чем приступать к программному коду, попробуем визуализировать проблему. Попробуем открыть полученный XML-файл в обычном веб-браузере (Chrome, Edge или Firefox). Рассмотрим, что это дает: браузеры имеют встроенный строгий парсер XML. Если файл содержит ошибку, браузер не отобразит дерево данных, а покажет сообщение в духе: «Ошибка в строке 12345, позиция 67: недопустимый символ».

Если файл слишком велик для браузера, воспользуемся специализированными текстовыми редакторами, такими как Notepad++ или Visual Studio Code. В Notepad++ рекомендуем установить плагин XML Tools. С его помощью можно выполнить функцию «Check XML Syntax Now», которая мгновенно укажет на проблемный участок кода.

Шаг 2. Очистка файла от недопустимых символов

Если мы обнаружили, что в файле присутствуют непечатаемые знаки, наиболее эффективным способом будет их удаление с помощью регулярных выражений. Разберем, как это сделать в Notepad++:

  1. Нажмем Ctrl + H (замена).
  2. Выберем режим поиска «Регулярные выражения».
  3. В строке поиска введем следующее выражение, которое охватывает большинство «мусорных» символов: [\x00-\x08\x0B\x0C\x0E-\x1F].
  4. Поле «Заменить на» оставим пустым.
  5. Нажмем «Заменить все».

После этой операции сохраним файл и попробуем загрузить его в 1С снова. В большинстве случаев этот простой метод решает проблему «битого» XML.

Шаг 3. Исправление данных на стороне 1С 7.7

Чтобы не править файл вручную каждый раз при повторной выгрузке, правильнее будет очистить саму базу «семерки». Проанализируем, какие объекты чаще всего содержат мусор: это справочники «Номенклатура», «Контрагенты» и текстовые части документов. Для очистки можно написать простую обработку на языке 1С 7.7, которая будет перебирать строки и заменять недопустимые символы функцией Сред или через внешнюю компоненту. Однако проще всего использовать штатную выгрузку, предварительно проверив версию библиотеки V7Plus.dll. Рекомендуется использовать наиболее стабильную версию этой компоненты (например, версию 11), так как старые релизы некорректно экранировали амперсанд & и кавычки.

Шаг 4. Работа с объектом ЧтениеXML в 1С 8

Если ошибка возникает в вашей собственной обработке загрузки на стороне 1С 8, стоит обратить внимание на то, как именно вы читаете файл. Проанализируем использование объекта ЧтениеXML. Если вы используете модель DOM (загружаете весь документ сразу), то при любой ошибке в структуре вы получите исключение на методе Прочитать.

Рекомендуем использовать последовательное чтение. Рассмотрим пример кода, который позволяет более гибко обрабатывать процесс:


Чтение = Новый ЧтениеXML;
Попытка
    Чтение.ОткрытьФайл(ПутьКФайлу);
    Пока Чтение.Прочитать() Цикл
        // Обработка узлов XML
        Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
            ИмяУзла = Чтение.Имя;
            // Логика разбора
        КонецЕсли;
    КонецЦикла;
Исключение
    Сообщить("Ошибка в строке " + Чтение.НомерСтроки + ": " + ОписаниеОшибки());
КонецПопытки;

Использование свойства НомерСтроки у объекта ЧтениеXML в блоке Исключение — это критически важный момент. Оно позволит вам точно узнать, в каком месте файла произошел сбой, и найти этот фрагмент в текстовом редакторе для анализа.

Шаг 5. Проблема некорректного экранирования

Иногда анализатор 1С 8 выдает ошибку, если в данных встречаются символы &, < или >, которые не были преобразованы в соответствующие сущности (&, <, >). Это часто случается, если в 7.7 использовались самописные выгрузки, которые просто «склеивали» строки в XML без использования объекта ДокументHTML или специализированных функций V7Plus.

Если вы столкнулись с такой ситуацией, проверьте, не содержит ли ваше наименование товара строку вида ООО "Рога & Копыта". В корректном XML это должно выглядеть так: ООО "Рога & Копыта". Если символ & стоит в чистом виде, парсер 1С 8 законно выдаст ошибку разбора.

Дополнительные рекомендации

Строгий режим платформы 8.3: Современные релизы платформы (начиная с 8.3.10 и выше) стали гораздо строже относиться к пространствам имен (namespaces). Если выгрузка из 7.7 формировалась очень старыми правилами, убедитесь, что в корневом элементе XML присутствуют все необходимые ссылки на схемы данных.

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

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

← На главную