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