История возникновения
Обработка возникла, когда в центральную базу РИБ не загружался файл обмена из периферийной. Метод ПрочитатьИзменения cпотыкался на каком-то объекте в загружаемых данных, вычислить его было невозможно. В результате была написана эта обработка, чтобы находить и пропускать неправильно выгруженные объекты.
Работа с обработкой
Форма обработки имеет вид:
Поле «Получение от узла» - показывает узел, от которого загружаются данные. Можно не указывать. Если узел указан, то в этом узле изменения не регистрируются при загрузке.
Галочка «Устанавливать № сообщения для узла» - если галочка установлена, то при чтении файла обмена определяется номер сообщения из тега v8msg:MessageNo, после завершения загрузки в выбранный узел обмена в качестве номера принятого сообщения устанавливается этот номер. Если номер не определился, то номер не устанавливается. Номер выводится в поле рядом с галочкой.
Поле «Имя файла» указывает имя файла, из которого производить загрузку. Обработка работает не только с XML, но и с ZIP-файлами. Для загрузки берется первый из файлов в архиве ZIP. При этом файл распаковывается во временный каталог, поэтому можно смело указывать сетевой ZIP-файл, обработка сначала распакует в быстрый локальный каталог и только потом начнет загрузку.
Галочка «Удалять исходный файл в конце загрузки» - если указано, то файл, указанный в поле «Имя файла» удаляется в конце загрузки.
Галочка «Выводить протокол» - если указана, то в конце загрузки в таблицу MXL выводится протокол с колонками «Время загрузки» и «Загруженный объект».
Поле «Прочитано объектов» информационное, только для чтения, сюда выводится количество прочитанных объектов.
Поле «Читать с объекта». Если указано, то чтение начинается только с указанного номера объекта. Предыдущие записи тоже читаются, но не записываются в базу. Удобно, если обработка прервалась по ошибке.
Поле «Повторять при ошибке секунд» - указывается количество секунд, в течении которого после ошибки записи делать повторную запись.
Поле «Пауза при ошибке секунд» - указывается, какую паузу делать между попытками записи при возникновении ошибок записи.
Поле «Тексты ошибок пропускаемые» - в каждой строке поля указывается подстрока. Если эта подстрока найдена в тексте ошибки записи, то по таким ошибкам не делается попытка повторной записи. Это позволяет отличить ошибки блокировки (которые могут быть устранены через некоторое время после снятия блокировки) от ошибок, которые нельзя исправить.
Обработка считывает данные из файлов XML полученных:
- Из типовой обработки «Выгрузка-загрузка данных XML». Чтение начинается с секции V8Exch:Data
- Из файла обмена РИБ. Чтение начинается с секции v8de:Data
Ошибочно записанные в файл выгрузки объекты пропускаются правильно – если возникла ошибка чтения XML, то пропускаются все теги, пока не будет найден закрывающий тег считываемого объекта. На практике с помощью этого метода было выявлено, что если выгружается объект, у которого есть битый реквизит типа «Хранилище значения», то возникает ошибка чтения из XML-файл. При выгрузке ошибок не возникает, поэтому это сложно диагностируемая ошибка.
Ход работы комментируется в окне сообщений:
Протокол выглядит так:
Первоначально я выводил протокол в форму, но большие таблицы вызывают слишком большие потери быстродействия на их отрисовку, поэтому перенес протокол в файл.
Вот пример выявленной в XML-файле ошибки и сообщения о ней:
Способы применения
- Проверка XML-файлов. Планируется доработать режим чтения без записи. Тогда можно безопасно диагностировать проблемы в XML-файлах.
- Загрузка битых XML-файлов с пропуском ошибок.
- Загрузка больших XML-файлов. Необходимо указывать большой период между попытками записи и бесконечный период по повторению записи. В отличии от метода ПрочитатьИзменения не возникает транзакция загрузки и другие пользователи могут спокойно работать.
- Удобно использовать в РИБ как альтернативу типовой загрузке. Процесс более контролируемый, в конце проставляется номер сообщения и удаляется файл загрузки, что полностью эквивалентно типовой загрузке. Можно использовать такой механизм и в автоматических обменах, чтобы не блокировать работу пользователей.