При работе с распределенными информационными базами (РИБ) на платформе 1С:Предприятие разработчики и администраторы часто сталкиваются с ситуацией, когда обмен данными внезапно прерывается. Особенно неприятно, когда из центральной базы (ЦБ) данные уходят без проблем, а при попытке загрузить их в периферийную базу (ПБ) процесс завершается ошибкой. При этом стандартное системное сообщение лишь лаконично отправляет нас в журнал регистрации, в котором зачастую нет никаких подробных сведений, кроме общей формулировки: Ошибка при вызове метода контекста (ПрочитатьИзменения): Ошибка преобразования данных XML.
В этой статье мы подробно разберем, почему возникает эта ошибка, как «заставить» отладчик показать точное место сбоя, несмотря на конструкции обработки исключений, и как быстро локализовать и исправить проблемные данные.
Выясним причину, по которой журнал регистрации не дает нам развернутой информации. Дело в том, что в типовых конфигурациях процесс чтения сообщения обмена обернут в программный блок обработки исключений. Посмотрим на стандартный фрагмент кода, где происходит чтение изменений:
Попытка
// Получаем изменения конфигурации и изменения данных из сообщения обмена.
ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения, КоличествоЭлементовВТранзакции);
// Читаем приоритетные данные (предопределенные элементы, идентификаторы объектов метаданных).
ПрочитатьПриоритетныеИзмененияИзСообщенияОбмена(ЧтениеСообщения, УзелОбщихДанных);
// Сообщение считаем принятым
ЧтениеСообщения.ЗакончитьЧтение;
Исключение
ЧтениеСообщения.ПрерватьЧтение;
ЗафиксироватьЗавершениеОбмена(Отказ, ОписаниеОшибки, ОшибкаЧтенияФайлаСообщенияОбмена);
Возврат;
КонецПопытки;
Поскольку код находится внутри конструкции Попытка ... Исключение, платформа при возникновении ошибки преобразования XML прерывает выполнение блока и сразу переходит в раздел Исключение. Запись в журнал регистрации при этом может содержать лишь обобщенный текст ошибки, скрывая от нас критически важные детали: конкретную строчку в файле XML, имя поврежденного объекта или недопустимый символ.
---
Проанализируем, как настроить конфигуратор 1С так, чтобы он останавливался прямо в момент возникновения ошибки, не перескакивая в ветку исключения. Это позволит нам зафиксировать состояние переменных непосредственно перед падением.
Выполним следующие шаги по шагам:
Теперь при запуске процесса обмена в режиме отладки платформа принудительно остановит выполнение кода на строке ПланыОбмена.ПрочитатьИзменения(...) в ту самую секунду, когда парсер XML споткнется о некорректные данные. Мы сможем заглянуть в свойства объекта ЧтениеСообщения через табло отладки и увидеть подробное описание системной ошибки.
---
Очень часто ручной запуск обмена в интерфейсе программы на самом деле инициирует фоновое задание, выполняющееся на стороне сервера 1С. В этом случае обычный отладчик не остановится на контрольной точке, так как он по умолчанию подключен только к клиентскому сеансу. Нам потребуется настроить отладку серверных вызовов.
Рассмотрим, как подключить отладчик к фоновому заданию:
-debug (при использовании локального протокола) или настроена отладка по протоколу HTTP.---
Если нам удалось получить подробный текст ошибки (из отладчика или напрямую из детального лога), мы увидим структуру вида: Ошибка преобразования данных XML: [file://C:/Temp/Message_ЦБ_ПБ.xml][5420,12].
Числа в квадратных скобках указывают на точные координаты проблемы: строка (в нашем примере 5420) и колонка (12) внутри XML-файла сообщения обмена.
Разберем детальный алгоритм работы с файлом обмена:
Temp) пользователя операционной системы, под которым работает сервер 1С (например, USR1CV8) или под которым запущен текущий сеанс.Ctrl + G, выберите режим «Строка» и введите номер проблемной строки.<CatalogObject.Номенклатура> или <DocumentObject.РеализацияТоваровУслуг>. Внутри этих блоков будет содержаться уникальный идентификатор (UUID) объекта базы данных и его ключевые реквизиты (код, артикул, наименование). Запишем эти данные, чтобы легко найти «битый» элемент в самой информационной базе.---
Посмотрим на наиболее распространенные ситуации, вызывающие сбои преобразования XML-структуры, и разберем практические способы их устранения.
Самая частая причина — попадание в базу-отправитель непечатных управляющих символов ASCII (например, символов перевода строки, возврата каретки в некорректном контексте, символов конца файла 0x1A, 0x08 и т.д.). Платформа 1С при выгрузке может записать их в XML «как есть», но стандартный XML-парсер получателя спотыкается на этих символах при чтении.
Как исправить:
Для решения этой проблемы воспользуемся стандартной обработкой, поставляемой фирмой 1С — «ВыгрузкаЗагрузкаДанныхXML.epf» (ее можно найти на ИТС или в каталоге шаблонов конфигурации «Конвертация данных»).
Даже если релизы конфигураций в центральной и периферийной базах номинально совпадают (например, обе базы обновлены до одной версии), физическая структура таблиц в базах данных может различаться. Это случается из-за некорректно выполненных динамических обновлений, сбоев СУБД в процессе реструктуризации или использования несогласованных расширений конфигурации.
Как исправить (выравнивание конфигураций):
Для полного выравнивания метаданных надежнее всего перезалить конфигурацию из базы-источника:
ПланыОбмена.УстановитьГлавныйУзел(Неопределено);
.cf)..cf. После загрузки выполним обновление конфигурации базы данных по клавише F7.
ПланыОбмена.УстановитьГлавныйУзел(ПланыОбмена.НайтиПоКоду("КодЦентральнойБазы"));
Если структура XML верна, метаданные идентичны, но ошибка все равно воспроизводится, причиной может быть повреждение локального кэша платформы на рабочем месте или на сервере приложений.
Как исправить:
Произведем полную очистку кэша:
reg_1541 (за исключением файлов журналов регистрации и файлов базы данных, если используется файловый режим) и запустим службу сервера заново.Применяя эти методы последовательно, мы гарантированно найдем источник проблемы в обмене РИБ, локализуем поврежденные данные или метаданные и успешно восстановим регулярный обмен между базами.