1C V8, обмен: Текст XML содержит недопустимый символ

Ошибка при записи изменений при обмене: Ошибка при вызове метода контекста (ЗаписатьИзменения): Текст XML содержит недопустимый символ в позиции ....:

Обнаруживал эту ошибку 2 раза.
а) Один раз когда производился обмен в распределенной базе данных.
б) Другой раз когда производилось обновление конфигурации 1С: Бухгалтерия предприятия с версии 1.6 до версии 2.0.

В обоих случаях используется выгрузка-загрузка данных через файлый в формате XML.

Решается так:
Для случая б)

Новая база данных Бухгалтерия 2.0 обращается к старой базе данных версии 1.6, запуская программу 1С: Предприятие и инициируя выгрузку данных с помощью обработки УниверсальныйОбменДаннымиXML.

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

Не тратя времени - просто исправил обработку УниверсальныйОбменXML в исходной базе данных конфигурации 1.6 так, установив параметр, соответствующий галочке, чтобы по умолчанию обработка сама боролась с ситуацией "недопустимых символов".

То есть корень проблемы мой способ не решает, просто я заставил прогрмму 1С: Предприятие игнорировать небольшой косячный участок данных, загружая то, что можно загрузить.

Все равно после загрузки в базу данных конфигурации Бухгалтерия 2.0 проверять все данные нужно.

Решение для ситуации а)
Распределенная база данных

Та же база данных (да и проблема наверняка в одних и тех же документах) - 1C V8, Бухгалтерия Предприятия 2.0, то же было в 1.6, причем и на платформе 1C V8.1 и на платформе 1C V8.2.

После неудачной выгрузки в каталоге временных файлов Windows нашел недописанный файл XML, который называется в моем случае ""C:\Documents and Settings\ИмяПользователяWindows\Local Settings\Temp\a\Полный\ОбменСФилиалом\Message_АБВ_ЭЮЯ.xml""

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

Написал обработку, которая с помощью "ПланыОбмена.УдалитьРегистрациюИзменений(ВыбУдаленныйУзел, ВыбКосячныйДокумент);" исключает из выгрузки битый документ.

Повторил выгрузку, обнаружил ту же ошибку на другом документе того же вида с той же операцией - "Списание с расчетного счета: Расчеты по кредитам и займам".

Возникли подозрения, что данные банковские документ косячат потому как загружены автоматически системой "Клиент-банк".

После того, как все косячные документы были исключены из обмена данными с помощью вышеописанной операции "УдалитьРегистрациюИзменений" выгрузка прошла успешно.

Проблему локализовали...

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

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

Посмотрев внимательнее куций файл XML, созданный во временном каталоге увидел, что застопорился на записи табличной части "РеквизитыКонтрагента" на реквизите "Значение".

Посмотрел в документе - там действительно какой-то символ-бяка.

Сделал обработку для очистки от таких бяк:

	Перем Док, ЖЖ, Надо, ИИ, Об, Стр_Длина, Симв;
	
	Док = Документы.СписаниеСРасчетногоСчета.Выбрать();
	Пока Док.Следующий() цикл
                           // Первый проход - определяем нужно ли исправлять этот документ
		Надо = Ложь;
		Для Каждого ИИ из Док.РеквизитыКонтрагента Цикл
			Стр_Длина = СтрДлина(ИИ.Значение);
			Для ЖЖ = 1 по Стр_Длина цикл
				Симв = Сред(ИИ.Значение, ЖЖ, 1);
				Если КодСимвола(Симв) < 32 тогда
					Надо = Истина;
				КонецЕсли;
			КонецЦикла;
		КонецЦикла;
                           // Второй проход - исправляем, если нужно исправлять этот документ
		Если Надо тогда
			Об = Док.ПолучитьОбъект();
			Для Каждого ИИ из Об.РеквизитыКонтрагента Цикл
				Стр_Длина = СтрДлина(ИИ.Значение);
				Для ЖЖ = 1 по Стр_Длина цикл
					Симв = Сред(ИИ.Значение, ЖЖ, 1);
					Если КодСимвола(Симв) < 32 тогда
						ИИ.Значение = СтрЗаменить(ИИ.Значение, Симв, "?");
					КонецЕсли;
				КонецЦикла;
			КонецЦикла;
			Сообщить("Исправлен документ: "+СокрЛП(Об.Ссылка));
			Об.Записать();
		КонецЕсли;
	КонецЦикла;
Компьютерные вопросы: 
2002-2012 ©