В начало
План обмена справочника «Животинки»
Нужно организовать обмен
справочника «Животинки» между двумя различными конфигурациями посредством плана
обмена.
Сам справочник показан ниже.

Рис.
Структура справочника «Животинки» в центральной базе

Рис.
Фрагмент формы списка справочника «Животинки» в центральной базе
Создаем новый план обмена, называем
его «ОбменЖивотинок». Не откладывая в долгий ящик,
тут же корректируем состав плана обмена «ОбменЖивотинок».

Рис.
Свойства плана обмена «ОбменЖивотинок», закладка
«Основные»
На закладке «Данные» добавляем
реквизит «ГлавныйУзел» с типом «Булево», который
необходим для разрешения конфликтных ситуаций во время обмена сообщений между
базами.

Рис.
Свойства плана обмена, закладка «Данные»
На вкладке «Формы» добавляем две
формы, а именно: ФормуУзла и ФормуСписка.

Рис. Форма
узла плана обмена «ОбменЖивотинок» в конфигураторе
центральной базы
Далее немного корректируем форму
списка, добавляя на нее кнопку «ЗарегистрироватьИзменения».

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

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

Рис.
Настройка узлов в плане обмена «Обмен животинок»
Затем вызываем обработку «ОбменДаннымиЖивотинок» и нажимаем кнопку выполнить обмен.
Если ошибок нет, то увидим служебное сообщение в нижней части экрана.

Рис.
Служебное сообщение обработки «ОбменДаннымиЖивотинок»
При этом будет создан XML-файл сообщения в каталоге временных файлов с именем «Сообщение_ОбменЖивотинок_ЦБ-ФЛ.xml». Из
его названия видно, кто создал файл (ОбменЖивотинок)
и откуда-куда (ЦБ-ФЛ) переносятся
данные справочника «Животинки». В данном случае мы переносим данные из
центральной базы «ЦБ» в базу филиала организации «ФЛ».
Файл обмена можно просмотреть текстовым
редактором или браузером, а потом проанализировать.
Листинг.
Файл сообщения «Сообщение_ОбменЖивотинок_ЦБ-ФЛ.xml»
<?xml version="1.0"
encoding="UTF-8"?>
<v8msg:Message
xmlns:v8msg="http://v8.1c.ru/messages">
<v8msg:Header>
<v8msg:ExchangePlan>ОбменЖивотинок</v8msg:ExchangePlan>
<v8msg:To>ФЛ</v8msg:To>
<v8msg:From>ЦБ</v8msg:From>
<v8msg:MessageNo>2</v8msg:MessageNo>
<v8msg:ReceivedNo>0</v8msg:ReceivedNo>
</v8msg:Header>
<v8msg:Body>
<CatalogObject.Животинки>
<Ref>78076726-a7a1-11ec-8fd8-001eec3547a4</Ref>
<DeletionMark>false</DeletionMark>
<Code>000000005</Code>
<Description>Амурский ёж</Description>
</CatalogObject.Животинки>
</v8msg:Body>
</v8msg:Message>
|
Далее аналогичным способом настроим
конфигурацию филиала. Поскольку в филиале используются управляемые формы,
то будут иметь место некоторые отличия.
Начнем с модуля плана обмена. В
модуле плана обмена должны располагаться две процедуры, они полностью идентичны
процедурам, расположенным в конфигурации центральной базы.
В плане обмена создаем форму узла.

Рис. Форма
узла плана обмена в конфигураторе филиала
В модуль формы узла добавляем
обработчик «ПриСозданииНаСервере».
Листинг.
Модуль формы узла плана обмена в конфигураторе филиала
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если
Объект.Ссылка = ПланыОбмена.ОбменЖивотинок.ЭтотУзел() Тогда
Элементы.ГлавныйУзел.Доступность
= Ложь;
КонецЕсли;
КонецПроцедуры
|
Далее создаём форму списка плана
обмена и добавляем команду «ЗарегистрироватьИзменения».

Рис. Форма
списка плана обмена в конфигураторе филиала
Добавляем действие на нажатие
команды/кнопки «ЗарегистрироватьИзменения» и
обработчик события «ПриАктивизацииСтроки».
Листинг.
Модуль формы узла плана обмена в конфигурации филиала
&НаСервереБезКонтекста
Функция ЭтоПредопределенныйУзел(Узел)
Возврат
Узел = ПланыОбмена.ОбменЖивотинок.ЭтотУзел();
КонецФункции
&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
Если
ЭтоПредопределенныйУзел(Элемент.ТекущаяСтрока)
Тогда
Элементы.ЗарегистрироватьИзменения.Доступность = Ложь;
Иначе
Элементы.ЗарегистрироватьИзменения.Доступность = Истина;
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ЗарегистрироватьИзмененияНаСервере(ТекУзел)
Запрос
= Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЖивотинкиИзменения.Ссылка
|ИЗ
| Справочник.Животинки.Изменения КАК ЖивотинкиИзменения";
Результат
= Запрос.Выполнить();
Выборка
= Результат.Выбрать();
Пока
Выборка.Следующий() Цикл
ПланыОбмена.ЗарегистрироватьИзменения(ТекУзел,
Выборка.Ссылка);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ЗарегистрироватьИзменения(Команда)
ЗарегистрироватьИзмененияНаСервере(Элементы.Список.ТекущаяСтрока);
КонецПроцедуры
|
Потом создадим обработку «ОбменДаннымиЖивотинок» в конфигурации филиала. Создаём
форму обработки, затем команду «ВыполнитьОбменДанных».

Рис. Форма
обработки «ОбменДаннымиЖивотинок»
Далее добавим действие для команды «ВыполнитьОбменДанных», для чего перейдем в модуль формы
обработки.
Листинг.
Форма обработки «ОбменДаннымиЖивотинок»
&НаСервереБезКонтекста
Процедура ВыполнитьОбменДанныхНаСервере()
ВыборкаУзлов = ПланыОбмена.ОбменЖивотинок.Выбрать();
Пока
ВыборкаУзлов.Следующий() Цикл
//
Произвести обмен данными со всеми узлами, кроме текущего
Если
ВыборкаУзлов.Ссылка <> ПланыОбмена.ОбменЖивотинок.ЭтотУзел() Тогда
УзелОбъект = ВыборкаУзлов.ПолучитьОбъект();
УзелОбъект.ПрочитатьСообщениеСИзменениями();
УзелОбъект.ЗаписатьСообщениеСИзменениями();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьОбменДанных(Команда)
ВыполнитьОбменДанныхНаСервере();
КонецПроцедуры
|
Конфигурация филиала готова,
протестируем ее в режиме отладки. Переходим в план обмена «Обмен животинок» и
настраиваем узлы. Предопределенный узел будет филиал с кодом «ФЛ». Добавляем
узел центральной базы с кодом «ЦБ», для которого ставим галочку на элементе
«Главный узел».

Рис.
Настройка узлов плана обмена «Обмен животинок»
Затем выделяем узел «ЦБ» и нажимаем
кнопку «Зарегистрировать изменения».
Далее вызываем обработку «ОбменДаннымиЖивотинок» и жмем «Выполнить обмен данных».
Если ошибок нет. То будет выведено сообщение, как показано далее, а также
создан другой файл, с именем «Сообщение_ОбменЖивотинок_ФЛ-ЦБ.xml» для
передачи данных из филиала в центральную базу.

Рис.
Сообщение обработки «ОбменДаннымиЖивотинок»
Также будут внесены изменения в
справочник «Животинки».

Рис.
Справочник «Животинки» в базе филиала
Чтобы еще лучше протестировать обмен
данными справочника «Животинки», надо вернуться в центральную базу и вызвав
обработку «ОбменДаннымиЖивотинок» повторить обмен.
Таким образом обмен будет выглядеть так: ЦБ –> ФЛ –> ЦБ.