Почему падает клиент 1С с фатальной ошибкой разбора XML: Extra content at the end of the document?

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

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


Ошибка разбора XML:  - [1,1]
Фатальная ошибка: 
Extra content at the end of the document

Интересной особенностью этой проблемы является то, что после перезапуска клиента в тот же самый документ система заходит без каких-либо проблем. Проанализируем эту ситуацию подробнее, разберем причины ее возникновения и выясним, как навсегда избавиться от подобных вылетов.

Суть ошибки и механизм ее возникновения

Для начала разберем, что означает текст самой ошибки. Сообщение «Extra content at the end of the document» генерируется системной библиотекой libxml2, которую платформа 1С использует «под капотом» для разбора (парсинга) XML-данных. Данная ошибка возникает, когда парсер успешно прочитал документ, дошел до закрывающего корневого тега, но после него обнаружил какие-то лишние данные. Это могут быть мусорные символы, нечитаемые байты, куски старого текста или даже начало совершенно другого пакета данных.

Возникает закономерный вопрос: откуда берется этот "мусор" в стандартных механизмах платформы? Практика показывает, что практически всегда эта проблема связана с использованием элемента формы Поле HTML документа.

Рассмотрим, как платформа работает с HTML-полями в современных релизах. Начиная с версий 8.3.14, 1С использует для отображения HTML-контента современный браузерный движок WebKit. В отличие от старых механизмов (на базе IE), WebKit работает асинхронно по отношению к основному потоку выполнения кода 1С.

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

В релизах платформы до 8.3.18 существовала проблема с синхронизацией: асинхронный процесс WebKit мог не успевать отдать данные вовремя, либо платформа некорректно очищала буфер обмена при чтении внутреннего состояния интерфейса. В результате во временный XML-файл или буфер памяти записывались лишние байты от предыдущих операций. При попытке прочитать этот поврежденный буфер парсером libxml2 происходила фатальная ошибка и падение клиента.

Почему перезапуск клиента решает проблему?

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

Способы решения проблемы

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

1. Обновление платформы 1С (Рекомендуемое решение)

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

2. Оптимизация вывода данных в Поле HTML документа

Если обновить платформу прямо сейчас нет возможности, необходимо оптимизировать работу с проблемной формой. Наша задача — снизить нагрузку на асинхронный движок WebKit и уменьшить объем передаваемого пакета данных.

  1. Отказ от Base64 картинок. Встраивание тяжелых картинок напрямую в HTML-код в виде строк Base64 многократно раздувает размер текста. Вместо этого сохраняйте картинки во временное хранилище или на веб-сервер, а в HTML передавайте только URL-ссылки на эти изображения (тег <img src="URL">). Браузер скачает их отдельными потоками, не перегружая XML-обмен платформы.
  2. Порционная загрузка данных. Если в поле выводится длинная переписка, не загружайте ее всю целиком при открытии формы ПриСозданииНаСервере. Реализуйте постраничный вывод или подгрузку старых сообщений по кнопке "Показать еще". Это значительно облегчит инициализацию формы.

3. Очистка кэша

В качестве временной меры, если ошибка стала появляться часто у конкретного пользователя и даже перезапуск помогает ненадолго, следует выполнить полную очистку кэша платформы (удаление папок в каталогах AppData\Local\1C и AppData\Roaming\1C). Это удалит зависшие временные файлы, в которых мог застрять сбойный XML.

Подводя итог, можно сказать, что фатальная ошибка "Extra content at the end of the document" при открытии форм — это следствие рассинхронизации при работе с тяжелым HTML-контентом в версиях платформы до 8.3.18. Оптимизация объемов передаваемого HTML и переход на более свежие релизы 1С полностью снимают этот вопрос.

← На главную