8.х Планы обмена-механизм регистрации изменений

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем ESP Forest GT, 6 авг 2010.

  1. TopicStarter Overlay
    ESP Forest GT
    Offline

    ESP Forest GT

    Регистрация:
    18 июл 2010
    Сообщения:
    17
    Симпатии:
    0
    Баллы:
    1
    М.Г.Радченко - 1С Предприятие 8.1. Практическое пособие разработчика
    Универсальный механизм обмена данными


    Я переделал так, чтобы Центральная база только отсылала сообщения (Процедура ЗаписатьСообщениеСИзменениями()), а Филиал мог только читать (Процедура ПрочитатьСообщениеСИзменениями()). Обе процедуры расположены в модуле объекта План обмена.


    Обмен запускаяется вручную из обработки. В модуле объекта обработки определена процедура:

    Код:
     Процедура ОбменСФилиалами() Экспорт
    
    ВыборкаУзлов = ПланыОбмена.Филиалы.Выбрать();
    
    Пока ВыборкаУзлов.Следующий() Цикл
    
    // Произвести обмен данными со всеми узлами,
    // кроме текущего (ЭтотУзел)
    Если ВыборкаУзлов.Ссылка <> ПланыОбмена.Филиалы.ЭтотУзел() Тогда
    УзелОбъект = ВыборкаУзлов.ПолучитьОбъект();
    
    // Получить сообщение
    УзелОбъект.ПрочитатьСообщениеСИзменениями();
    
    // Сформировать сообщение
    УзелОбъект.ЗаписатьСообщениеСИзменениями();
    
    КонецЕсли;
    
    КонецЦикла;
    
    
    КонецПроцедуры
    
    
    У Плана обмена определена Форма Узла в которой расположены следующие обработки событий:

    Код:
     Перем РегистрацияВНовыйУзел;
    
    
    Процедура ПередЗаписью(Отказ)
    РегистрацияВНовыйУзел=ЭтоНовый();
    КонецПроцедуры
    
    Процедура ПриЗаписи(Отказ)
    Если РегистрацияВНовыйУзел Тогда
    ПланыОбмена.ЗарегистрироватьИзменения(Ссылка);
    КонецЕсли;
    КонецПроцедуры
    
    
    Модуль объекта План Обмена Центральная база:

    Код:
     Процедура ЗаписатьСообщениеСИзменениями() Экспорт
    
    Сообщить("-------- Выгрузка в узел " + Строка(ЭтотОбъект) + " ------------");
    Каталог = КаталогВременныхФайлов();
    // Сформировать имя временного файла
    ИмяФайла = Каталог +?(Прав(Каталог, 1) = "\","", "\") + "Message"+   СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код)+ "_" + 
    СокрЛП(Ссылка.Код) + ".xml";
    
    
    // Создать объект записи XML
    // *** Запись XML-документов
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.ОткрытьФайл(ИмяФайла);
    ЗаписьXML.ЗаписатьОбъявлениеXML();
    
    // *** Инфраструктура сообщений
    ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
    ЗаписьСообщения.НачатьЗапись(ЗаписьXML, Ссылка);
    Сообщить("    Номер сообщения: " + ЗаписьСообщения.НомерСообщения);
    
    // Получить выборку измененных данных
    // *** Механизм регистрации изменений
    ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(ЗаписьСообщения.Получатель, ЗаписьСообщения.НомерСообщения);
    Пока ВыборкаИзменений.Следующий() Цикл
    // Записать данные в сообщение
    // *** XML-сериализация
    ЗаписатьXML(ЗаписьXML, ВыборкаИзменений.Получить());
    КонецЦикла;
    
    ЗаписьСообщения.ЗакончитьЗапись();
    
    ЗаписьXML.Закрыть();
    
    Сообщить("-------- Конец выгрузки------------");
    
    КонецПроцедуры 
    

    Модуль объекта План Обмена База филиал:

    Код:
    Процедура ПрочитатьСообщениеСИзменениями() Экспорт
    
    Каталог = КаталогВременныхФайлов();
    
    // Сформировать имя файла
    ИмяФайла = Каталог + ?(Прав(Каталог, 1) = "\", "", "\") + "Message" + СокрЛП(Ссылка.Код) + "_" + СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + ".xml";
    Файл = Новый Файл(ИмяФайла);
    Если Не Файл.Существует() Тогда
    Сообщить("Файла нет!");
    Возврат;
    КонецЕсли;
    
    // *** Чтение документов XML	
    // Попытаться открыть файл
    ЧтениеXML = Новый ЧтениеXML;
    Попытка 
    ЧтениеXML.ОткрытьФайл(ИмяФайла);
    Исключение 
    Сообщить("Невозможно открыть файл обмена данными.");
    Возврат;
    КонецПопытки;
    Сообщить("-------- Загрузка из " + Строка(ЭтотОбъект) + "------------");
    Сообщить(" - Считывается файл " + ИмяФайла);
    
    // Загрузить из найденного файла
    // *** Инфраструктура сообщений
    ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
    
    // Читать заголовок сообщения обмена данными - файла XML
    ЧтениеСообщения.НачатьЧтение(ЧтениеXML);
    
    // Сообщение предназначено не для этого узла
    Если ЧтениеСообщения.Отправитель <> Ссылка Тогда
    ВызватьИсключение "Неверный узел";
    КонецЕсли;
    
    // Удаляем регистрацию изменений
    // для узла отправителя сообщения.
    // *** Служба регистрации изменений
    ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель,ЧтениеСообщения.НомерПринятого);
    
    // Читаем данные из сообщения
    // *** XML-сериализация
    Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл
    // Читаем очередное значение
    Данные = ПрочитатьXML(ЧтениеXML);
    
    // Не переносим изменение, полученное
    // в главный из неглавного,
    // если есть регистрация изменения
    Если Не ЧтениеСообщения.Отправитель.Главный    тогда
    // ПланыОбмена.ИзменениеЗарегистрировано(ЧтениеСообщения.Отправитель, Данные) Тогда
    Сообщить("- Изменения отклонены от"+" "+Строка(ЧтениеСообщения.Отправитель));
    Продолжить;
    КонецЕсли;
    
    // Записать полученные данные
    Данные.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель;
    Данные.ОбменДанными.Загрузка = Истина;
    Данные.Записать();
    КонецЦикла;
    
    ЧтениеСообщения.ЗакончитьЧтение();
    ЧтениеXML.Закрыть();
    УдалитьФайлы(ИмяФайла);
    Сообщить("-------- Конец загрузки------------");
    
    КонецПроцедуры
    
    


    Проблема заключается в том, что Центральная база каждый раз формирует изменения ВСЕХ объектов, которые определены в составе Плана обмена. В файле xml видно, что передаются все данные.
    Насколько я понимаю, при создании нового узла в первом сообщении передается вся инфа. Последующие сообщения содержат уже те объекты, которые были изменены в Цетральной. Если объекты не изменялись, то сообщение от Центральной "пустое".

    Я не понимаю, как работает механизм регистрации изменений. Я подозреваю, что в Центральной базе надо определить:
    Код:
    ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель,ЧтениеСообщения.НомерПринятого);
    
    . Но у меня Центральная не принимает сообщения вообще.
    Объясните, как система узнает, когда оправить все данные, а когда только измененные?
  2. TopicStarter Overlay
    ESP Forest GT
    Offline

    ESP Forest GT

    Регистрация:
    18 июл 2010
    Сообщения:
    17
    Симпатии:
    0
    Баллы:
    1
    Добавил в Процедуру Записи
    ....
    ЗаписатьXML(ЗаписьXML, ВыборкаИзменений.Получить());
    КонецЦикла;
    ПланыОбмена.УдалитьРегистрациюИзменений(ЗаписьСообщения.Получатель, ЗаписьСообщения.НомерСообщения);
    ЗаписьСообщения.ЗакончитьЗапись();
    ...

    Вроде заработало как надо.

Поделиться этой страницей