2025-10-13 20:49:29 +05:00

8.7 KiB
Raw Blame History

title, slug
title slug
Чтение и запись сообщения обмена общие-обмен-данными-планы-обмена-распределенная-информационная-база/чтение-и-запись-сообщения-обмена

Запись сообщения обмена


УзелОтправитель = ПланыОбмена.РИБ.ЭтотУзел();
УзелПолучатель = ПланыОбмена.РИБ.НайтиПоКоду("М1");

ИмяФайлаСообщения = СтрШаблон("C:\temp\demo_exchange\Message_%1_%2.xml", 
    УзелОтправитель.Код, УзелПолучатель.Код);

// Открываем файл для записи
ЗаписьXML = Новый ЗаписьXML();
ЗаписьXML.ОткрытьФайл(ИмяФайлаСообщения);

// Создаем запись сообщения
ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
ЗаписьСообщения.НачатьЗапись(ЗаписьXML, УзелПолучатель);

// Записываем изменения в файл
ПланыОбмена.ЗаписатьИзменения(ЗаписьСообщения);

ЗаписьСообщения.ЗакончитьЗапись();

// Закрываем файл
ЗаписьXML.Закрыть();

Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Сообщение обмена успешно сформировано!";
Сообщение.Сообщить();

Чтение сообщения обмена

Вариант 1

УзелОтправитель = ПланыОбмена.РИБ.НайтиПоКоду("М1");
УзелПолучатель = ПланыОбмена.РИБ.ЭтотУзел();

ИмяФайлаСообщения = СтрШаблон("C:\temp\demo_exchange\Message_%1_%2.xml",
    УзелОтправитель.Код, УзелПолучатель.Код);

// Открываем файл для чтения
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайлаСообщения);

// Создаем чтение сообщения
ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();

// Чтение сообщения обмена
Попытка
    ЧтениеСообщения.НачатьЧтение(ЧтениеXML);
    ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения);
Исключение
    ТекстОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = ТекстОшибки;
    Сообщение.Сообщить();
КонецПопытки;

// Завершить чтение сообщения
ЧтениеСообщения.ЗакончитьЧтение();
ЧтениеXML.Закрыть();

Вариант 2

Функция ПрочитатьИПрименитьСообщениеОбмена(УзелОбмена, ИмяФайла) Экспорт
    
    Результат = Новый Структура;
    Результат.Вставить("Успешно", Ложь);
    Результат.Вставить("ОписаниеОшибки", "");
    Результат.Вставить("КоличествоОбъектов", 0);
    
    Попытка
        // Проверяем существование файла
        Файл = Новый Файл(ИмяФайла);
        Если НЕ Файл.Существует() Тогда
            ВызватьИсключение "Файл сообщения не найден";
        КонецЕсли;
        
        // Открываем файл для чтения
        ЧтениеXML = Новый ЧтениеXML;
        ЧтениеXML.ОткрытьФайл(ИмяФайла);
        
        // Создаем чтение сообщения
        ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
        ЧтениеСообщения.НачатьЧтение(ЧтениеXML);
        
        // Проверяем соответствие узлов
        Если ЧтениеСообщения.Отправитель <> УзелОбмена Тогда
            ВызватьИсключение СтрШаблон(
                "Сообщение от другого узла. Ожидается: %1, Получено: %2",
                УзелОбмена,
                ЧтениеСообщения.Отправитель);
        КонецЕсли;
        
        // Проверяем номер сообщения
        НомерПринятого = УзелОбмена.НомерПринятого;
        НомерСообщения = ЧтениеСообщения.НомерСообщения;
        
        Если НомерСообщения <= НомерПринятого Тогда
            ВызватьИсключение СтрШаблон(
                "Сообщение уже было принято. Номер сообщения: %1, Последний принятый: %2",
                НомерСообщения,
                НомерПринятого);
        КонецЕсли;
        
        // Начинаем транзакцию
        НачатьТранзакцию();
        
        Попытка
            // Читаем и записываем объекты
            Пока ЧтениеСообщения.Прочитать() Цикл
                
                Данные = ЧтениеСообщения.Данные;
                
                // Устанавливаем режим загрузки
                Если ТипЗнч(Данные) <> Тип("УдалениеОбъекта") Тогда
                    Данные.ОбменДанными.Загрузка = Истина;
                    Данные.ОбменДанными.Отправитель = УзелОбмена;
                    Данные.Записать();
                Иначе
                    // Удаление объекта
                    Попытка
                        УдаляемыйОбъект = Данные.Ссылка.ПолучитьОбъект();
                        Если УдаляемыйОбъект <> Неопределено Тогда
                            УдаляемыйОбъект.ОбменДанными.Загрузка = Истина;
                            УдаляемыйОбъект.Удалить();
                        КонецЕсли;
                    Исключение
                        // Объект уже удален
                    КонецПопытки;
                КонецЕсли;
                
                Результат.КоличествоОбъектов = Результат.КоличествоОбъектов + 1;
                
            КонецЦикла;
            
            // Обновляем номер принятого сообщения
            УзелОбъектОбмена = УзелОбмена.ПолучитьОбъект();
            УзелОбъектОбмена.НомерПринятого = НомерСообщения;
            УзелОбъектОбмена.Записать();
            
            // Фиксируем транзакцию
            ЗафиксироватьТранзакцию();
            
            Результат.Успешно = Истина;
            
        Исключение
            ОтменитьТранзакцию();
            ВызватьИсключение;
        КонецПопытки;
        
        // Закрываем чтение
        ЧтениеСообщения.ЗакончитьЧтение();
        ЧтениеXML.Закрыть();
        
    Исключение
        Результат.ОписаниеОшибки = ОписаниеОшибки();
        
        // Записываем в журнал регистрации
        ЗаписьЖурналаРегистрации("Обмен.ЧтениеСообщения",
            УровеньЖурналаРегистрации.Ошибка,
            ,
            УзелОбмена,
            Результат.ОписаниеОшибки);
    КонецПопытки;
    
    Возврат Результат;
    
КонецФункции