При переносе старых информационных баз на платформе 1С:Предприятие 7.7 с персональных компьютеров под управлением Windows 7 на мощные современные серверы с Windows Server (2012, 2016 или 2019) программисты часто сталкиваются с неожиданным поведением стандартных механизмов. Одной из самых коварных проблем является ошибка при попытке загрузить XML-файл: xsi:nil attribute on element is invalid. Ситуация осложняется тем, что на старом месте всё работало идеально, файлы идентичны, а программный код не менялся.
В этой статье мы подробно разберем, почему возникает эта ошибка, как она связана с системными библиотеками Microsoft и какие шаги необходимо предпринять, чтобы восстановить работоспособность обмена данными.
Прежде всего, выясним причину такого поведения системы. В 1С 7.7 работа с XML-документами чаще всего реализуется через внешнюю компоненту v7plus.dll. Эта библиотека не является самостоятельным парсером, а служит оболочкой (враппером) для системных компонентов Microsoft под названием MSXML (Microsoft XML Core Services).
Разберем ситуацию по шагам:
MSXML 4.0, которая весьма лояльна к синтаксису. В Windows Server по умолчанию активна версия MSXML 6.0. Она гораздо строже соблюдает стандарты W3C.NULL). Если парсер (особенно версии 6.0) видит xsi:nil="true", но при этом в схеме документа (XSD) или в заголовке файла неверно определены пространства имен, он выдает ошибку валидации.error position = 32 (или другое число) часто указывает на то, что парсер наткнулся на спецсимвол (например, перенос строки или пробел), который он не может интерпретировать в контексте текущего тега.Проанализируем типичный код, который вызывает данную проблему:
Если ЗагрузитьВнешнююКомпоненту("v7plus.dll") = 0 Тогда
Сообщить("Не удалось обнаружить компоненту v7plus.dll!");
КонецЕсли;
Попытка
ХМЛАнализатор = СоздатьОбъект("AddIn.XMLParser");
Исключение
Сообщить("Не удалось создать объект Addin.XMLParser!");
КонецПопытки;
XML_Документ = ХМЛАнализатор.СоздатьДокумент;
XML_Документ.Загрузить(ПутьКФайлу);
Именно в момент выполнения метода Загрузить происходит обращение к системному парсеру, который на серверной ОС блокирует файл из-за несоответствия атрибута xsi:nil правилам валидации.
Поскольку v7plus.dll была разработана в эпоху доминирования 4-й версии MSXML, самым простым и эффективным решением будет приведение программной среды сервера к виду, максимально похожему на Windows 7. Мы должны установить MSXML 4.0 Service Pack 3.
Рассмотрим порядок действий:
msxml4.msi (Microsoft официально прекратила его поддержку, но его легко найти в архивах или в папках установки старых версий ПО).
C:\Windows\SysWOW64\regsvr32.exe msxml4.dll
v7plus.dll зарегистрирована аналогичным образом в папке SysWOW64.После этого попробуйте снова запустить загрузку. В большинстве случаев v7plus.dll автоматически подхватит нужную версию библиотеки, и ошибка исчезнет.
Рассмотрим более современный и надежный способ программирования в 1С 7.7. Мы можем отказаться от посредника в виде v7plus.dll и обращаться к библиотекам Microsoft напрямую через механизм СоздатьОбъект. Это позволяет нам явно указать версию парсера, которую мы хотим использовать.
Посмотрим на пример кода:
// Вместо AddIn.XMLParser используем прямое обращение к COM-объекту
Попытка
// Пробуем создать объект конкретной версии 4.0
XML_Документ = СоздатьОбъект("MSXML2.DOMDocument.4.0");
Исключение
// Если 4.0 не установлена, пробуем универсальный вызов
Попытка
XML_Документ = СоздатьОбъект("MSXML2.DOMDocument");
Исключение
Сообщить("Библиотека MSXML не найдена в системе!");
Возврат;
КонецПопытки;
КонецПопытки;
XML_Документ.async = 0; // Отключаем асинхронную загрузку
XML_Документ.resolveExternals = 0; // Не проверять внешние ссылки
XML_Документ.validateOnParse = 0; // ОТКЛЮЧАЕМ валидацию, если она мешает
Если XML_Документ.load(ПутьКФайлу) = 0 Тогда
Ош = XML_Документ.parseError;
Сообщить("Ошибка: " + Ош.reason);
Сообщить("Строка: " + Ош.line + ", Позиция: " + Ош.linepos);
КонецЕсли;
Важный момент: использование свойства validateOnParse = 0 позволяет игнорировать ошибки типов данных и атрибутов типа xsi:nil, просто загружая структуру документа как дерево узлов.
Иногда выясним причину в самом файле. Как было отмечено в обсуждении, лишние символы 0D0A (возврат каретки и перевод строки) внутри тегов или сразу после объявлений атрибутов могут сбивать с толку строгие парсеры на Windows Server.
Если вы контролируете процесс выгрузки файла, проанализируйте следующие моменты:
xsi. Без неё атрибут xsi:nil не будет распознан.
Пример правильного заголовка:
<DECLAR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<LINKED_DOCS xsi:nil="true"/>, попробуйте формировать файл в упрощенном виде: <LINKED_DOCS/> или <LINKED_DOCS></LINKED_DOCS>.Проанализируем еще один фактор. На серверных ОС часто включена Конфигурация усиленной безопасности Internet Explorer (IE ESC). Поскольку парсер XML тесно интегрирован с движком браузера, это может накладывать ограничения на загрузку внешних схем данных.
Попробуйте временно отключить IE ESC в Диспетчере серверов (Server Manager) для администраторов и пользователей, чтобы проверить, влияет ли это на работу v7plus.dll. Если ошибка исчезнет, значит, парсер пытался проверить xsi:nil через интернет-ресурсы W3C и был заблокирован брандмауэром или политикой безопасности.
Подводя итог, можно сказать, что наиболее стабильным решением для долгосрочной эксплуатации 1С 7.7 на Windows Server является отказ от v7plus.dll в пользу прямого использования объектов MSXML2.DOMDocument с явным отключением валидации (validateOnParse = 0). Это гарантирует, что ваши алгоритмы не будут зависеть от строгости настроек конкретной операционной системы или наличия старых библиотек в системных папках.
Если же вы ограничены в возможности менять программный код, то установка MSXML 4.0 SP3 и её регистрация в SysWOW64 — ваш основной путь решения проблемы.