Планы обмена и их использование Для того чтобы существовала возможность обмена какими-либо данными с кем-либо, необходимо некоторым образом идентифицировать тех, с кем мы будем обмениваться, и для каждого из них описать перечень обмена Обе эти задачи позволяет решать прикладной объект конфигурации План обмена. При помощи планов обмена мы получаем информацию о том, какие элементы данных были изменены и в какой узел обмена их необходимо передать. Это возможно благодаря тому, что планы обмена содержат механизм регистрации изменений. Информация об измененных данных переносится с помощью сообщений, инфраструктура которых также поддерживается планами обмена. Подобно тому, как элементами данных справочника являются элементы справочника, элементами данных плана обмена являются узлы плана обмена. Каждый узел идентифицирует участника обмена по данному плану обмена. Кроме этого в каждом плане обмена всегда существует один предопределенный узел, идентифицирующий данную информационную базу. В состав данных, которыми может производиться обмен, входят элементы информационных структур базы данных, которые описываются следующими объектами встроенного языка: Константа.МенеджерЗначения.<имя>; СправочникОбъект.<имя>; ДокументОбъект.<имя>; ПоследовательностьНаборЗаписей.<имя>; ПланВидовХарактеристикОбъект.<имя>; ПланСчетовОбъект.<имя>; ПланВидовРасчетаОбъект.<имя>; РегистрСведенийНаборЗаписей.<имя>; РегистрНакопленияНаборЗаписей.<имя>; РегистрБухгалтерииНаборЗаписей.<имя>; РегистрРасчетаНаборЗаписей.<имя>; ПерерасчетНаборЗаписей.<имя>; БизнесПроцессОбъект.<имя>; ЗадачаОбъект.<имя>; УдалениеОбъекта. При описании состава данных плана обмена разработчик имеет возможность указать для каждого типа объектов признак Авторегистрация. Он определяет, каким образом план обмена будет отслеживать изменения этих данных. Создание плана обмена Филиалы Состав данных обмена должен выглядеть следующим образом: Теперь с помощью конструктора создадим основную форму узла, чтобы описать в ней некоторые действия, которые должны выполняться при создании нового узла обмена. Суть этих действий будет заключаться в том, что при создании нового узла обмена мы должны будем сформировать для него все необходимые записи регистрации изменений для всех объектов конфигурации, входящих в данный план обмена. Это будет своего рода начальная синхронизация узла обмена всеми данными обмена. Прежде всего, опишем в модуле формы узла служебную переменную, которая будет хранить признак того, является ли записываемый узел новым или нет. Перем РегистрацияВНовыйУзел; Затем создадим обработчик события формы ПередЗаписью. Процедура ПередЗаписью(Отказ) РегистрацияВНовыйУзел = ЭтоНовый(); КонецПроцедуры Этот обработчик и будет устанавливать значение нашей служебной переменной в Истина в случае записи нового узла плана обмена. После этого создадим обработчик события формы ПриЗаписи. Процедура ПриЗаписи(Отказ) Если РегистрацияВНовыйУзел Тогда // Регистрация изменений всех данных для узла ПланыОбмена.ЗарегистрироватьИзменения(Ссылка); КонецЕсли; КонецПроцедуры Создание обработки Обмен данными Откроем конфигуратор и создадим новый объект конфигурации Обработка с именем ОбменДанными. Перейдем на закладку Прочее и откроем модуль объекта. Создадим в нем процедуру ОбменСФилиалами. Процедура ОбменСФилиалами() Экспорт ВыборкаУзлов = ПланыОбмена.Филиалы.Выбрать(); Пока ВыборкаУзлов.Следующий() Цикл // Произвести обмен данными со всеми узлами, кроме текущего (ЭтотУзел) Если ВыборкаУзлов.Ссылка <> ПланыОбмена.Филиалы.ЭтотУзел() Тогда УзелОбъект = ВыборкаУзлов.ПолучитьОбъект(); // Получить сообщение УзелОбъект.ПрочитатьСообщениеСИзменениями(); // Сформировать сообщение УзелОбъект.ЗаписатьСообщениеСИзменениями(); КонецЕсли; КонецЦикла; КонецПроцедуры Теперь создадим основную форму обработки и в обработчик события нажатия кнопки Выполнить – КнопкаВыполнитьНажатие вставим вызов процедуры ОбменСФилиалами(). Процедура КнопкаВыполнитьНажатие(Элемент) ОбменСФилиалами(); КонецПроцедуры Создание процедуры записи данных Сами процедуры записи и чтения данных обмена мы разместим в модуле объекта План обмена Филиалы. Сначала создадим процедуру, которая используется нами при обмене данными, – ЗаписатьСообщениеСИзменениями. Процедура ЗаписатьСообщениеСИзменениями() Экспорт Сообщить("-------- Выгрузка в узел " + Строка(ЭтотОбъект) + " ---------"); Каталог = КаталогВременныхФайлов(); // Сформировать имя временного файла ИмяФайла = Каталог +?(Прав(Каталог, 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.Закрыть(); УдалитьФайлы(ИмяФайла); Сообщить("-------- Конец загрузки------------"); КонецПроцедуры