При активной работе с XML-документами через объектную модель DOM разработчики 1С иногда сталкиваются с критическим завершением работы платформы и системным сообщением "pure virtual function call R6025". Эта ошибка является специфическим исключением библиотек Microsoft Visual C++ и указывает на серьезный сбой в управлении памятью на уровне ядра платформы. Рассмотрим подробнее, почему это происходит и как правильно организовать код, чтобы избежать падения системы.
Для начала проанализируем ситуацию с технической точки зрения. Ошибка pure virtual function call возникает в тот момент, когда программа пытается вызвать виртуальный метод объекта, который еще не полностью инициализирован или, что чаще бывает в 1С, уже уничтожен. В контексте встроенного языка 1С это означает следующее: объект C++, являющийся «подложкой» для привычного нам ЭлементDOM, перестал существовать, но ссылка на него во встроенном языке всё еще активна.
Объекты 1С ДокументDOM и ЭлементDOM — это высокоуровневые обертки над низкоуровневыми объектами C++ (обычно на базе библиотек Xerces). Существует жесткая иерархическая связь: все элементы документа (узлы, атрибуты) физически «живут» внутри памяти, выделенной под основной ДокументDOM. Если основной документ выходит из области видимости и удаляется сборщиком мусора, его дочерние элементы становятся невалидными, хотя переменные в 1С могут продолжать на них ссылаться.
Проанализируем наиболее эффективное решение, которое помогло пользователям на практике. Основная причина вылета — передача ЭлементDOM из одной функции в другую без сохранения ссылки на родительский ДокументDOM. Когда функция, создавшая документ, завершается, переменная документа очищается, и попытка обращения к элементу в другой функции вызывает R6025.
Рассмотрим пример неправильного кода, который может привести к ошибке:
Функция ПолучитьНужныйУзел(ПутьКФайлу)
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ПутьКФайлу);
Построитель = Новый ПостроительDOM;
Документ = Построитель.Прочитать(Чтение); // Переменная "Документ" локальна
НужныйУзел = Документ.ДокументОбъект.ПервыйДочерний;
Возврат НужныйУзел; // ОШИБКА: Документ будет уничтожен при выходе из функции
КонецФункции
Процедура ОбработатьДанные()
Узел = ПолучитьНужныйУзел("C:\data.xml");
Сообщить(Узел.ИмяУзла); // Здесь может возникнуть R6025
КонецПроцедуры
Выясним, как это исправить. Нам необходимо гарантировать, что ДокументDOM будет существовать в памяти всё время, пока мы работаем с его элементами. Рассмотрим правильный подход, где обработка происходит в одном контексте:
Процедура ОбработатьДанныеНаМесте(ПутьКФайлу)
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ПутьКФайлу);
Построитель = Новый ПостроительDOM;
Документ = Построитель.Прочитать(Чтение);
// Работаем с элементами только пока переменная "Документ" жива
ТекущийЭлемент = Документ.ПервыйДочерний;
Пока ТекущийЭлемент <> Неопределено Цикл
ОбработатьОдиночныйУзел(ТекущийЭлемент);
ТекущийЭлемент = ТекущийЭлемент.СледующийСоседний;
КонецЦикла;
Чтение.Закрыть();
КонецПроцедуры
Если же вам необходимо передавать узлы между функциями, передавайте их вместе с родительским документом или храните документ в переменной модуля (для обычных форм) или в реквизите формы, чтобы предотвратить его преждевременное уничтожение.
Посмотрим на ситуацию с другой стороны. Иногда ошибка возникает при попытке присвоить результат обхода дерева переменной, когда сам файл XML содержит некорректные структуры, которые парсер 1С не смог обработать штатно. Особенно часто это проявляется при использовании методов НайтиУзлы() или ВыбратьУзлы().
Рассмотрим рекомендации по безопасной работе с навигацией по дереву:
Неопределено перед обращением к их свойствам.МенеджерПространствИменDOM, убедитесь, что все префиксы объявлены корректно. Ошибки в пространствах имен иногда приводят к падению движка XPath с трансляцией в R6025.Узел.ПервыйДочерний.СледующийСоседний.ПервыйДочерний в одной строке. Разложите это на последовательные присваивания с проверками.Если программные методы оптимизации кода не помогают, проанализируем состояние системных библиотек на сервере или рабочем месте. Поскольку 1С активно использует Microsoft Visual C++ Redistributable, несоответствие версий или повреждение этих библиотек может провоцировать ошибку pure virtual function call.
Выполним следующие шаги по обслуживанию системы:
1cv8.exe, rphost.exe) в список исключений системы предотвращения выполнения данных. Иногда DEP ошибочно блокирует вызовы виртуальных функций в динамически выделенной памяти.%AppData%\1C\1cv8 и временные файлы пользователя.Существует мнение, подтвержденное практикой многих администраторов 1С, что ошибка R6025 чаще проявляется при достижении процессом rphost предела потребления оперативной памяти. Когда памяти становится недостаточно, сборщик мусора начинает работать агрессивнее, что повышает риск удаления родительских объектов DOM, на которые еще есть ссылки.
Проанализируем настройки сервера предприятия:
Неопределено сразу после завершения работы с ними.Подводя итог, можно сказать, что в 90% случаев в 1С ошибка pure virtual function call R6025 лечится простым переносом логики обработки DOM в одну процедуру, чтобы гарантировать жизнь объекта ДокументDOM на всё время работы с его частями. Это золотое правило разработки поможет вам избежать большинства проблем с нестабильностью платформы при обмене данными.