12.06.2018

Недопустимые символы XML или PCDATA invalid Char value 28

Автор: Белозерских Евгений

    Если вы выгружаете данные из базы 1С 7.7 и видите такую ошибку, это значит что в данных (Справочниках, документах....) встречается недопустимый символ. Так бывает если база старая и никто за ней не следил.
    Фактически в строке ошибки вместо «PCDATA invalid Char value 28» может быть другой код символа. Это означает что файл выгрузки содержит недопустимый для XML символ, и как следствие загрузить такой файл нам не удастся.
     Давайте рассмотрим какие варианты исправления ошибки есть

Ошибка при загрузке XML файла в 1С 8

Тестирование и исправление 1С 7.7

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

    Времени на ожидание может не быть, поэтому давайте рассмотрим второй вариант!

Программно убрать (удалить) не читаемые символы из файла XML

    В платформе есть специальный метод, который возвращает позицию не читаемого символа в строке:
НайтиНедопустимыеСимволыXML (FindDisallowedXMLCharacters)
Синтаксис:
НайтиНедопустимыеСимволыXML(<СтрокаСимволов>, <ПозицияНачала>, <Версия>)
Возвращаемое значение:
Тип: Число. 
В случае обнаружения некорректного символа будет возвращена его позиция в строке,
если же подобного символа не найдено – возвращаемое значение 0. 
Описание:
Проверяет символы указанной строки на соответствие рекомендации XML 1.0 и 1.1.
Проверка строки начинается с символа в позиции, указанной в параметре <ПозицияНачала>
    Вот его то мы и будем использовать. Ниже приведен рабочий код процедуры, которая читает исходный файл, удаляет недопустимые символы, и генерирует новый файл
Процедура УдалитьНедопустимыеСимволы(ПутьКФайлу)
	
	ИсходныйФайл= Новый ЧтениеТекста(ПутьКФайлу, КодировкаТекста.UTF8);
	
	// К наименованию нового файла просто добавим new
	НовыйФайл	= Новый ЗаписьТекста(ПутьКФайлу + "new", КодировкаТекста.UTF8);
	
	СтрокаФайла = ИсходныйФайл.ПрочитатьСтроку();
	ТекСтрока	= 1;
	
	Пока СтрокаФайла <> Неопределено Цикл  
		
		ПозицияОшибки	= НайтиНедопустимыеСимволыXML(СтрокаФайла);
		
		Пока НЕ ПозицияОшибки = 0 Цикл 
			
			Сообщить("Обнаружен символ в строке " + ТекСтрока +
						", позиция: " + ПозицияОшибки);
			
			СтрокаФайла = СтрЗаменить(СтрокаФайла, Сред(СтрокаФайла, ПозицияОшибки, 1), "");
			
			ПозицияОшибки	= НайтиНедопустимыеСимволыXML(СтрокаФайла);
			
		КонецЦикла;
		
		НовыйФайл.ЗаписатьСтроку(СтрокаФайла);
		
		СтрокаФайла = ИсходныйФайл.ПрочитатьСтроку();
		
		ТекСтрока	= ТекСтрока + 1;
	КонецЦикла;
	
	ИсходныйФайл.Закрыть();
	НовыйФайл.Закрыть();
	
КонецПроцедуры

Другие статьи

Перечисление в справочник (Конвертация данных 2.1)

    Пример переноса перечисления в справочник. В примере рассмотрена конвертация перечисления «ВидыНоменклатуры» конфигурации 1С 7.7, в справочник «ВидыНоменклатуры» в 1С 8

Поиск объектов в конвертации данных (Поля поиска)

   В конвертации данных ред. 2.1, при загрузке имеется возможность несколько раз осуществить поиск  элементов ссылочного типа, по разным комбинациям полей поиска, чтобы попытаться однозначно идентифицировать объект.
   Давайте посмотрим как это можно осуществить

Объект коллекции

ОбъектКоллекции - ссылка на выгружаемый объект коллекции. Например,
строка табличной части или запись регистра или строка таблицы значений или
строка результата запроса

Терминология

Немного о том, какие термины применяются при работы с конфигурацией "Конвертация данных"

Начало работы

"Hello world" для "1С:Конвертация данных"

Конвертация реквизита шапки в табличную часть

На эту тему написано стотысячпятьсот безгранично много статей и примеров. Но так хочется "вставить свои пять копеек"

Ключ выгружаемых данных и как его использовать

Ключ выгружаемых данных – это переменная, которая используется при выгрузке. По умолчанию - это ссылка на объект Источник, а если Источник неопределен, то используется ИмяПКО (подразумевается, что правило описывает в таком случае один объект-приемник)

Перенос записей регистра в таблицу значений

Есть задача перенести записи регистра сведений базы источника, в табличную часть объекта в базе приемника. Например, контактная информация Контрагентов в "Бухгалтерия предприятия КОРП" хранится в регистре сведений "Контактная Информация", а  в "1С:ERP Управление предприятием 2" это табличная часть "Контактная Информация" справочника "Контрагенты".