При настройке регулярного обмена данными между информационными базами через файлы часто встает задача гарантированной доставки данных. Если мы запускаем обработку УниверсальныйОбменДаннымиXML в фоновом режиме, то сталкиваемся с вопросом: как узнать, что файл в базе-приемнике успешно прочитан, и в какой момент можно безопасно очистить регистрацию изменений в базе-источнике?
Проанализируем причины сопутствующих сложностей и разберем по шагам надежные способы фиксации доставки данных.
Прежде чем перейти к схеме квитирования, выясним причины сбоев, о которых часто упоминают разработчики при попытке настроить прямое подключение или стандартный обмен:
ДокументОбъект при проведении в неразделенном серверном или клиентском контексте. Файловый обмен полностью изолирует базы друг от друга, поэтому такая ошибка исключена.ЭтотУзел в одной базе должен в точности соответствовать коду узла-корреспондента в другой базе.Обработка УниверсальныйОбменДаннымиXML при стандартной выгрузке по узлу плана обмена формирует тело XML-документа, но не создает платформенный заголовок пакета обмена, где содержится номер сообщения. Посмотрим, как встроить платформенный механизм квитирования изменений с помощью объектов ЗаписьСообщенияОбмена и ЧтениеСообщенияОбмена.
Разберем по шагам схему выгрузки данных с привязкой к номеру сообщения:
ЗаписьXML и открываем файл для выгрузки.ЗаписьСообщенияОбмена и связываем его с открытым файлом XML.НачатьЗапись(), передав узел плана обмена. Платформа автоматически сформирует заголовок с новым номером сообщения обмена и номером подтвержденного входящего сообщения.ПланыОбмена.ВыбратьИзменения(), зафиксировав их за данным исходящим номером.ЗакончитьЗапись().Посмотрим на пример программной инициализации пакета обмена перед выгрузкой данных:
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ИмяФайлаОбмена);
ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
ЗаписьСообщения.НачатьЗапись(ЗаписьXML, УзелКорреспондент);
// Номер текущего формируемого сообщения зафиксирован в заголовке
НомерОтправленного = ЗаписьСообщения.НомерСообщения;
// Выборка зарегистрированных изменений с фиксацией за текущим номером пакета
ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелКорреспондент, НомерОтправленного);
// Здесь выполняется запись данных через XML-поток...
ЗаписьСообщения.ЗакончитьЗапись();
ЗаписьXML.Закрыть();
Рассмотрим подробнее, как происходит подтверждение доставки (квитирование):
ЧтениеXML и ЧтениеСообщенияОбмена, считывает заголовок методом НачатьЧтение() и загружает данные.НомерПринятого).ПланыОбмена.УдалитьРегистрациюИзменений(УзелКорреспондент, НомерПринятого).Главное преимущество этого метода заключается в том, что платформа удаляет из таблицы регистрации только те записи, которые вошли в подтвержденный пакет. Если объект был изменен повторно уже после момента формирования пакета, платформа сохранит для него признак необходимости следующей выгрузки.
Если конфигурация дорабатывается без вмешательства в типовые механизмы сериализации сообщений планов обмена, можно использовать альтернативный подход с фиксацией факта передачи в отдельном регистре сведений.
Разберем логику работы этого варианта:
ОчередьВыгрузки, с измерениями Объект (ссылка на выгружаемый элемент) и НомерПакета (число).УниверсальныйОбменДаннымиXML. В тело выгрузки или отдельный файл-дескриптор помещается идентификатор (номер) текущего пакета.ОчередьВыгрузки с соответствующим номером пакета, а также снимает регистрацию с самого узла плана обмена при необходимости.Если обмен настраивается между полностью идентичными конфигурациями одного релиза, разработка собственных механизмов выгрузки через УниверсальныйОбменДаннымиXML часто оказывается избыточной. Рассмотрим штатные альтернативы: