Ошибка с текстом «Текст XML содержит недопустимый символ в позиции...» является одной из самых коварных в практике администратора и программиста 1С. Она может возникать внезапно: при открытии документа, формировании отчета или в процессе обмена данными. Основная сложность заключается в том, что визуально данные могут выглядеть абсолютно корректно, но «под капотом» платформа натыкается на символы, которые запрещены стандартом XML.
В этой статье мы подробно разберем, почему возникает эта проблема, как локализовать поврежденные данные и какими способами можно восстановить работоспособность базы данных. Мы пройдем путь от простых инструментов восстановления до тонкой программной очистки данных.
Прежде чем переходить к практике, выясним причину. Платформа 1С активно использует формат XML для передачи данных между сервером и клиентом (в управляемых формах), для обмена через XDTO и при выгрузке данных во внешние системы. Согласно стандарту XML 1.0, существует строго определенный набор разрешенных символов. Большинство управляющих символов ASCII с кодами от 0 до 31 (за исключением табуляции, перевода строки и возврата каретки) являются недопустимыми.
Чаще всего в базу попадают следующие «символы-вредители»:
0x00 — нулевой байт (часто возникает при сбоях файловой системы);0x08 — забой (Backspace);0x0B и 0x0C — вертикальная табуляция и разрыв страницы;0x1A — конец файла (substitute).Эти символы могут попасть в систему при копировании текста из PDF-файлов, веб-страниц, при некорректной настройке сканеров штрихкодов или в результате сбоев при импорте данных из внешних систем (например, из Bitrix или клиент-банков).
Если ваша база данных является файловой (имеет расширение .1CD), и ошибка возникает при попытке открыть любой документ или даже при запуске, скорее всего, произошло физическое повреждение структуры таблицы. Рассмотрим, как воспользоваться штатной утилитой восстановления.
1Cv8.1CD перед любыми манипуляциями.chdbfl.exe. Обычно она располагается в папке установленной платформы, например: C:\Program Files\1cv8\8.3.XX.XXXX\bin.Проанализируем результаты работы: утилита проверит целостность страниц файла. Если поврежденная запись содержала недопустимые символы в системных полях, chdbfl.exe может просто удалить эту запись. Будьте готовы к тому, что один-два документа могут исчезнуть, но база снова станет работоспособной.
Если база открывается, но ошибка «вылетает» при обращении к конкретному списку или документу, нам нужно найти, в каком именно реквизите спрятался плохой символ. Для этого воспользуемся механизмом отладки.
Разберем алгоритм действий по шагам:
Начиная с версии платформы 8.3.10, разработчики добавили встроенную функцию для борьбы с этой проблемой. Рассмотрим, как проверить строку программно с помощью НайтиНедопустимыеСимволыXML(). Эта функция возвращает позицию первого встреченного символа, который не соответствует стандарту.
Посмотрим на пример кода, который можно использовать в обработке для очистки справочника или документа:
Функция ОчиститьСтрокуОтМусора(ВходнаяСтрока)
Позиция = НайтиНедопустимыеСимволыXML(ВходнаяСтрока);
Пока Позиция > 0 Цикл
// Можно либо удалять символ, либо заменять его на пробел
ВходнаяСтрока = Лев(ВходнаяСтрока, Позиция - 1) + Сред(ВходнаяСтрока, Позиция + 1);
Позиция = НайтиНедопустимыеСимволыXML(ВходнаяСтрока);
КонецЦикла;
Возврат ВходнаяСтрока;
КонецФункции
Если ваша версия платформы ниже 8.3.10, придется использовать регулярные выражения. Проанализируем паттерн, который позволяет найти всё, что выходит за рамки допустимых диапазонов XML. Для работы с регулярными выражениями в 1С часто используют объект VBScript.RegExp.
РегВыражение = Новый COMОбъект("VBScript.RegExp");
РегВыражение.IgnoreCase = Истина;
РегВыражение.Global = Истина;
РегВыражение.MultiLine = Истина;
// Паттерн для поиска запрещенных управляющих символов
РегВыражение.Pattern = "[^\x09\x0A\x0D\x20-\xDF\xEE-\xFF]";
Результат = РегВыражение.Replace(ИсходнаяСтрока, "");
Рассмотрим специфический случай, когда ошибка возникает в «1С:Розница» или «1С:Управление торговлей» при сканировании акцизных марок или штрихкодов. Если система сообщает об ошибке в «позиции 9», это часто указывает на символ табуляции (код 9), который передается сканером как префикс или суффикс.
Выясним причину: если сканер работает в режиме эмуляции клавиатуры, он может посылать управляющие коды вместе с кодом марки. 1С пытается записать это в базу или передать через XML-пакет, что вызывает сбой. Для решения проблемы рекомендуется:
Чтобы избежать повторения ситуации, особенно в распределенных базах или при интенсивном обмене с сайтами, мы рекомендуем внедрить подписку на событие ПередЗаписью для критически важных объектов (справочники Контрагенты, Номенклатура, документы ПлатежноеПоручение). В этой подписке следует программно вызывать функцию очистки строк, которую мы рассмотрели выше.
Важный момент: Если вы используете клиент-серверный вариант (SQL), и данных очень много, очистку можно провести прямым SQL-запросом. Однако это требует высокой квалификации и предварительного создания бэкапа, так как прямое редактирование таблиц SQL не поддерживается фирмой «1С».
Подводя итог, отметим, что наиболее эффективным методом остается сочетание профилактической проверки данных при записи и использование утилиты chdbfl.exe для устранения последствий сбоев файловой системы. Всегда начинайте с анализа того, откуда данные попадают в базу — именно там чаще всего кроется источник «недопустимых символов».