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