При ежедневной работе с программными продуктами семейства «1С:Предприятие 8» пользователи и администраторы нередко сталкиваются со сбоями, природа которых лежит на стыке взаимодействия платформы с операционной системой и внешними библиотеками. Одним из ярких примеров такой проблемы является внезапное аварийное завершение работы программы при попытке вывести на печать ценники или этикетки со штрихкодами.
В этот момент на экране появляется критическое сообщение об ошибке следующего вида: «Ошибка разбора XML: - [5,12] Фатальная ошибка: Extra content at the end of the document. SystemId: file://C:/Users/User/AppData/Roaming/1C/1cv8/ExtCompT/registry.xml». Данный сбой полностью блокирует не только печать ценников, но и нормальную работу подключенного торгового оборудования (сканеров штрихкодов, фискальных регистраторов, терминалов сбора данных).
В рамках этой статьи мы подробно разберем, почему возникает эта ошибка, какую роль выполняет каталог ExtCompT, проанализируем причины повреждения структуры XML и рассмотрим два эффективных способа устранения неисправности: от хирургического исправления кода до быстрого автоматического сброса настроек.
Прежде чем переходить к практическим шагам по устранению проблемы, давайте выясним причину ее появления и разберемся в архитектуре хранения внешних компонент 1С. Для взаимодействия с различным торговым, фискальным или узкоспециализированным оборудованием платформа «1С:Предприятие» использует внешние компоненты. Они могут быть разработаны по устаревшей технологии COM или по современному стандарту Native API.
Когда конфигурация (например, 1С:Розница) инициирует подключение внешней компоненты, хранящейся в виде макета внутри информационной базы, платформа распаковывает соответствующие динамические библиотеки (файлы с расширением .dll для Windows или .so для Linux) на локальный диск компьютера пользователя. Местом для постоянного хранения и запуска таких библиотек служит специальный каталог ExtCompT, который располагается в профиле пользователя операционной системы по следующему пути:
%APPDATA%\1C\1Cv8\ExtCompT\ (полный путь обычно выглядит как C:\Users\[ИмяПользователя]\AppData\Roaming\1C\1Cv8\ExtCompT\)
Внутри этой директории создается конфигурационный файл registry.xml. Он выполняет функции локального реестра зарегистрированных внешних компонент. В нем платформа 1С строго фиксирует, какие именно библиотеки уже установлены в системе, где они лежат и какие типы вызовов поддерживают. Типичное корректное содержимое этого реестра выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<registry xmlns="http://v8.1c.ru/8.2/addin/registry">
<component path="SMDrvFR1CLib.dll" type="com"/>
<component path="ScanOPOS.dll" type="com"/>
</registry>
Каждый раз при вызове функций печати штрихкодов или обращении к торговому оборудованию платформа считывает файл registry.xml, чтобы понять, откуда загрузить библиотеку ScanOPOS.dll или другой драйвер. Если парсер XML платформы натыкается на некорректную структуру этого файла, происходит критический сбой разбора документа, приводящий к закрытию программы.
Большинство системных администраторов и программистов 1С при возникновении любых непонятных ошибок интерфейса или разметки первым делом прибегают к стандартной процедуре очистки временных файлов. Они запускают платформу с параметром командной строки /ClearCache или вручную удаляют папки из каталогов Local\1C\1Cv8 и Roaming\1C\1Cv8.
Проанализируем ситуацию: в данном случае этот классический метод совершенно неэффективен. Дело в том, что согласно технической документации платформы «1С:Предприятие», директория ExtCompT не относится к области временного кэша метаданных или динамически компилируемых модулей. Это защищенное хранилище зарегистрированных библиотек. Платформа никогда не очищает и не перезаписывает файлы в ExtCompT при штатных процедурах сброса кэша. Поэтому решать проблему повреждения реестра компонент придется другими, специализированными методами.
Текст ошибки «Extra content at the end of the document» буквально переводится как «Лишнее содержимое в конце документа». С точки зрения спецификации XML, это означает, что разбор структуры завершился некорректно, либо парсер обнаружил символы за пределами корневого закрывающего тега </registry>, либо встретил недопустимые знаки внутри самого тела документа. Выделим основные технические причины, приводящие к такому результату:
0x20 в таблице ASCII) подменяется неразрывным пробелом (код 0xA0). Визуально в обычном текстовом редакторе они выглядят абсолютно одинаково, но парсер XML платформы считает неразрывный пробел недопустимым служебным символом и выдает ошибку разбора.<registry xmlns="http://v8.1c.ru/8.2/addin/registry">;. Символ точки с запятой «;», случайно оказавшийся за пределами угловой скобки, превращает хорошо структурированный XML в невалидный текст, ломая весь процесс разбора.registry.xml должен иметь строго кодировку UTF-8 без BOM (Byte Order Mark). Если сторонняя программа или некорректно работающий драйвер торгового оборудования перезаписали файл в кодировке Windows-1251 (ANSI), парсер платформы не сможет правильно сопоставить байты разметки и споткнется на первом же нетипичном символе кириллицы или служебном знаке.1cv8.exe через диспетчер задач или операционная система уходит в синий экран (BSOD), файл записывается частично. На диске остается «огрызок» XML-структуры, не имеющий закрывающего тега..dll-файлов подозрительной активностью. В результате файл реестра оказывается заблокирован или записывается в искаженном виде.Рассмотрим самый простой, быстрый и безопасный способ решения проблемы, который под силу даже рядовому пользователю без привлечения программистов и изучения HEX-редакторов. Вместо того чтобы тратить время на поиск невидимых символов и исправление поврежденной структуры XML, мы заставим платформу пересоздать файл реестра с нуля.
Выполним процедуру по шагам:
1cv8.exe или 1cv8c.exe.%APPDATA%\1C\1Cv8\ExtCompT\registry.xml.registry_backup.xml) или переместить на рабочий стол.Проанализируем, что происходит в этот момент под капотом платформы. При обращении к механизмам работы с оборудованием или печати штрихкодов платформа проверяет наличие папки ExtCompT и конфигурационного файла. Не обнаружив файла registry.xml на диске, 1С автоматически инициализирует процедуру создания нового, абсолютно чистого и синтаксически корректного файла реестра.
После этого платформа извлечет необходимые внешние компоненты из макетов конфигурации и заново пропишет их в созданный реестр. Ошибка разбора XML исчезнет раз и навсегда.
Если по каким-то причинам вы не хотите удалять файл (например, в нем зарегистрированы уникальные сторонние компоненты, исходных дистрибутивов которых у вас не сохранилось) или вам важно детально разобраться в причинах сбоя, можно прибегнуть к ручному редактированию.
Разберем по шагам, как выявить и устранить невидимые дефекты разметки:
registry.xml в выбранном редакторе.<component path="ScanOPOS.dll" type="com"/> path и type. Если вместо обычного пробела там стоит символ неразрывного пробела, в HEX-редакторе вы увидите байты C2 A0 (в кодировке UTF-8) вместо стандартного одиночного байта пробела 20.</registry> нет никаких скрытых символов, случайных точек с запятой, кавычек или переносов строк. Документ должен оканчиваться строго на закрывающей угловой скобке корневого тега.Для того чтобы минимизировать риски повторного возникновения подобных фатальных ошибок, рекомендуем выполнить ряд превентивных системных настроек.
Во-первых, проанализируем права доступа к папке профиля пользователя. Иногда сбой записи в registry.xml происходит из-за того, что у текущей учетной записи Windows ограничены права на изменение файлов в каталоге AppData\Roaming\. Это частая проблема в корпоративных сетях с жесткими групповыми политиками безопасности. Убедитесь, что пользователь имеет полные права «Запись» и «Модификация» на папку 1C и все ее подкаталоги.
Во-вторых, добавьте папку %APPDATA%\1C\ в список исключений вашего антивирусного программного обеспечения. Это избавит платформу от внезапных блокировок файлов в момент сохранения конфигурационных данных и регистрации внешних DLL-библиотек торгового оборудования.
В редких случаях фатальные ошибки разбора XML могут быть следствием более глубоких проблем в операционной системе, связанных со сбоем работы библиотек Microsoft XML Core Services (MSXML). Если ошибки разметки продолжают хаотично возникать в различных механизмах программы, требующих обмена данными, рекомендуется выполнить переустановку или восстановление пакета MSXML в вашей ОС Windows.