Как устранить ошибку преобразования XML и войти в периферийный узел РИБ после обновления?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Ситуация, когда после успешного обновления конфигурации в центральном узле Распределенной Информационной Базы (РИБ) подчиненный узел отказывается запускаться в режиме «Предприятие», является критической. Пользователь видит модальное окно с сообщением о необходимости синхронизации, но сам процесс обмена завершается ошибкой «Ошибка преобразования данных XML». В результате база становится недоступной для работы, так как стандартные механизмы БСП (Библиотеки стандартных подсистем) блокируют вход до завершения загрузки приоритетных данных.

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

Выясняем причину: почему возникает ошибка преобразования XML?

Проанализируем текст ошибки, который обычно выводится в журнале регистрации или в окне сообщения. Как правило, стек вызова указывает на метод ПланыОбмена.ПрочитатьИзменения. Ошибка преобразования данных XML в контексте РИБ чаще всего означает несоответствие структуры объекта в файле сообщения и в базе-приемнике. Разберем наиболее частый сценарий: в центральной базе объект является элементом справочника, а в периферийной базе объект с тем же уникальным идентификатором (GUID) ошибочно создан как группа (или наоборот).

Особое внимание стоит уделить системным справочникам, таким как НаборыДополнительныхРеквизитовИСведений. Именно в них после обновлений часто меняется состав предопределенных данных. Если в подчиненном узле иерархия была нарушена, платформа не сможет записать данные элемента в объект, который она считает группой, так как у группы отсутствуют многие реквизиты. Это и вызывает исключение Ошибка преобразования данных XML.

Шаг 1: Диагностика файла сообщения обмена

Для начала нам необходимо точно определить, какой именно объект вызывает сбой. В тексте ошибки 1С обычно указывает путь к временному XML-файлу и конкретную строку. Рассмотрим пример из практики:

[sfile://C:/Users/USR1CV8/AppData/Local/Temp/Exchange82 {GUID}/Message_БП_Д2.xml][5992956,31]

Цифры в скобках означают номер строки (5992956) и позицию в строке (31). Нам нужно открыть этот файл (желательно использовать текстовые редакторы, способные работать с большими файлами, например, Notepad++ или специализированные XML-вьюверы). Найдем указанную строку и проанализируем фрагмент кода:


<CatalogObject.НаборыДополнительныхРеквизитовИСведений>
    <Ref>20bcc873-9f5b-4308-a6b9-d91b4a54fad1</Ref>
    <IsFolder>false</IsFolder>
    <Description>Инвентаризация кассы</Description>
    <ИмяПредопределенногоНабора>Документ_ИнвентаризацияКассы</ИмяПредопределенногоНабора>
</CatalogObject.НаборыДополнительныхРеквизитовИСведений>

Здесь мы видим, что из центра передается элемент (IsFolder = false). Если в периферийной базе объект с GUID 20bcc873-9f5b-4308-a6b9-d91b4a54fad1 является группой, загрузка прервется. Выяснив это, мы можем переходить к активным действиям.

Шаг 2: Обход блокировки входа в «Предприятие»

Так как модальное окно синхронизации не дает нам войти в базу, чтобы запустить обработку или проверить данные, воспользуемся параметрами запуска. В окне выбора информационной базы нажмем кнопку «Изменить» и на последней вкладке в поле «Дополнительные параметры запуска» введем специальные ключи, которые поддерживаются конфигурациями на базе БСП:

  1. /C ОтключитьЛогикуНачалаРаботыСистемы — это универсальный ключ, который позволяет пропустить процедуры проверки состояния базы при старте.
  2. /C ПропуститьЗагрузкуПриоритетныхДанныхПередЗапуском — отключает именно ту часть обмена, которая вызывает ошибку в нашем случае.

После ввода параметров запустим базу. Теперь мы можем открыть «Все функции» (или «Функции для технического специалиста») и найти справочник Наборы дополнительных реквизитов и сведений. Проверим объект, найденный на предыдущем шаге. Если он действительно является группой, его нужно либо удалить (если это допустимо), либо программно изменить его тип, что технически сложно. Чаще всего помогает удаление ошибочного объекта, чтобы при следующем обмене он создался корректно из сообщения.

Шаг 3: Исправление через центральный узел и перерегистрацию

Если мы не хотим или не можем манипулировать данными напрямую в периферийной базе, рассмотрим метод «чистой выгрузки конфигурации». Проанализируем этот алгоритм:

  1. В центральной информационной базе откроем обработку «Регистрация изменений для обмена данными».
  2. Выберем наш узел и полностью снимем регистрацию для всех объектов данных (справочники, документы и т.д.). Внимание: это безопасно только если вы уверены, что сможете потом перерегистрировать нужные изменения вручную или через стандартные правила.
  3. Выполним синхронизацию. В этом случае в файл обмена попадет только обновленная конфигурация и так называемые «приоритетные данные» (идентификаторы метаданных и предопределенные элементы).
  4. В подчиненном узле принимаем это сообщение. Так как объем данных минимален, шанс на успешное прохождение «проблемного» участка выше.
  5. После того как база в периферии обновится и откроется, в центральном узле можно снова зарегистрировать необходимые данные к выгрузке.

Шаг 4: Программное решение через COM-соединение или внешнюю обработку

Если параметры запуска не помогают, мы можем попытаться подключиться к периферийной базе через COM-соединение из другой базы или с помощью скрипта, чтобы программно удалить конфликтующий объект. Рассмотрим пример кода, который можно выполнить в контексте внешней базы для очистки битого объекта:


// Пример кода для удаления объекта в периферийной базе через COM
ПутьКБазе = "File=""C:\Bases\PeripheralBase"";";
V83 = Новый COMОбъект("V83.ComConnector");
БазаПодключения = V83.Connect(ПутьКБазе + "Usr=""Admin"";Pwd=""123"";");

Идентификатор = "20bcc873-9f5b-4308-a6b9-d91b4a54fad1";
СсылкаНаОбъект = БазаПодключения.StringRefToRef(Идентификатор); // Нужно преобразование строки в ссылку

Если Не СсылкаНаОбъект.Пустая() Тогда
    Объект = СсылкаНаОбъект.ПолучитьОбъект();
    Объект.Удалить();
    Сообщить("Объект успешно удален в периферийной базе");
КонецЕсли;

Важный нюанс: при использовании РИБ на базе БСП часто возникает ошибка Access Denied при попытке COM-подключения, если система находится в состоянии ожидания обновления. В этом случае приоритетным остается метод с параметрами запуска /C.

Шаг 5: Радикальный метод — временная «отвязка» от РИБ

Если ни один из способов не позволяет войти в базу, разберем метод временного перевода периферийного узла в режим автономной работы. Это снимет все блокировки запуска. Выполним следующие действия:

  1. Запустим периферийную базу в режиме «Конфигуратор».
  2. В окне «Параметры запуска» установим ключ для запуска внешней обработки или просто запустим «Предприятие» с ключом /C ОтключитьЛогикуНачалаРаботыСистемы.
  3. Программно выполним команду ПланыОбмена.УстановитьГлавныйУзел(Неопределено);.
  4. После этого база станет «обычной», и модальное окно обмена исчезнет.
  5. Теперь мы можем спокойно зайти в справочник, исправить или удалить конфликтующую группу Инвентаризация кассы.
  6. После исправления возвращаем признак РИБ командой: ПланыОбмена.УстановитьГлавныйУзел(СсылкаНаЦентральныйУзел);.

Проанализировав ситуацию, мы видим, что проблема чаще всего кроется в рассинхронизации предопределенных данных. Использование команд ПланыОбмена.ПрочитатьИзменения платформой 8.3 стало более строгим к типам данных, поэтому малейшее расхождение «Группа/Элемент» приводит к остановке всего процесса обмена. Рекомендуем всегда проверять актуальность структуры справочников Наборы дополнительных реквизитов и Идентификаторы объектов метаданных перед массовым обновлением распределенной сети.

← На главную