В процессе обмена данными между конфигурациями 1С разработчики часто сталкиваются с критической ошибкой: приложение аварийно закрывается (падает) непосредственно в момент исполнения метода ПрочитатьXML. Такая ситуация может возникнуть даже при идентичности конфигураций и небольших размерах файлов. Давайте разберем, почему это происходит и как найти выход из сложившейся ситуации.
Падение платформы при вызове ПрочитатьXML чаще всего означает, что движок сериализации 1С столкнулся с непредвиденной структурой данных, которую он не может корректно обработать. В отличие от обычной ошибки исполнения, которую можно перехватить блоком Попытка...Исключение, аварийное завершение процесса происходит на уровне низкоуровневых DLL-библиотек (обычно core83.dll), из-за чего стандартные механизмы отладки оказываются бессильны.
Наиболее вероятные причины:
Первым делом нам необходимо выяснить, на каком именно узле ломается парсер. Не пытайтесь сразу десериализовать весь объект целиком. Воспользуйтесь методом чтения XML по узлам. Это позволит увидеть, на каком элементе «спотыкается» 1С.
Разберем пример реализации поузлового чтения:
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайла);
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Сообщить("Читаем узел: " + ЧтениеXML.Имя);
КонецЕсли;
КонецЦикла;
ЧтениеXML.Закрыть();
Если в процессе выполнения этого кода 1С закрывается, значит, проблема в самом XML-файле. Если код проходит до конца — значит, структура файла корректна, и ошибка возникает именно в процессе автоматического маппинга данных в объект 1С.
Если автоматическая десериализация через ПрочитатьXML продолжает вызывать краш, самым надежным решением будет отказаться от использования этого метода в пользу ручного создания объекта. Мы создаем объект программно и заполняем его реквизиты, считывая значения из узлов XML по очереди.
Посмотрим, как это выглядит на практике:
// Создаем объект справочника или плана обмена
ОбъектСсылка = Справочники.ВашСправочник.СоздатьЭлемент();
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайла);
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ИмяРеквизита = ЧтениеXML.Имя;
Если ЧтениеXML.Прочитать() Тогда // Читаем текст внутри тега
Значение = ЧтениеXML.Значение;
// Заполняем реквизит напрямую
ОбъектСсылка[ИмяРеквизита] = Значение;
КонецЕсли;
КонецЕсли;
КонецЦикла;
ОбъектСсылка.Записать();
Часто проблема кроется в том, что при выгрузке в XML добавляются пространства имен (xmlns), которые жестко привязаны к внутренней структуре базы-источника. При попытке чтения в базе-приемнике платформа пытается сопоставить эти ссылки и падает.
Попробуйте выполнить следующие действия:
ТекстовыйДокумент для чтения всего файла целиком в память — это может приводить к ошибкам переполнения буфера. Используйте потоковое чтение через ЧтениеXML.Если вы столкнулись с подобной проблемой, не тратьте время на переустановку платформы или поиск «той самой» версии, которая не падает. Аварийное завершение работы процесса 1С при ПрочитатьXML — это системный сигнал о том, что автоматический механизм не справляется с данными. Самый эффективный путь — перейти к ручному разбору XML-структуры с помощью методов ЧтениеXML и последующему заполнению объекта через Объект.ИмяРеквизита. Этот способ не только избавит вас от крашей, но и сделает процесс загрузки данных более предсказуемым и легко отлаживаемым.