В начало

Обмен документом «ПриемНаРаботу»

 

            Краткое описание объектов и процедур, необходимых для осуществления плана обмена документом «ПриемНаРаботу» между двумя конфигурациями, одна из которых выполнена на обычных формах, а другая – на необычных (управляемых).

            Начнем с настройки главной базы, которая работает на обычных формах.

Рис. План обмена «ПриемНаРаботу» в дереве метаданных

 

Рис. План обмена «ПриемНаРаботу», закладка «Основные»

 

Листинг. Модуль объекта плана обмена «ПриемНаРаботу»

Процедура ПрочитатьСообщениеСИзменениями() Экспорт

            Каталог = КаталогВременныхФайлов();

            // Сформировать имя файла.

            ИмяФайла = Каталог + ?(Прав(Каталог, 1) = "\", "", "\") + "Сообщение_ПриемНаРаботу_" + СокрЛП(Ссылка.Код) + "-" +

            СокрЛП(ПланыОбмена.ПриемНаРаботу.ЭтотУзел().Код) + ".xml";

            Файл = Новый Файл(ИмяФайла);

            Если Не Файл.Существует() Тогда

                        Возврат;

            КонецЕсли;

            // *** Чтение документов XML

            // Попытаться открыть файл.

            Чтение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 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>

                        <DocumentObject.ПриемНаРаботу>

                                   <Ref>4bb836c7-fb22-11ea-80dc-001eec3547a4</Ref>

                                   <DeletionMark>false</DeletionMark>

                                   <Date>2020-09-20T13:19:54</Date>

                                   <Number>000000003</Number>

                                   <Posted>true</Posted>

                                   <Сотрудник>b4c479e1-f4c8-11ea-9489-001eec3547a4</Сотрудник>

                                   <Должность>1e9a4575-fb18-11ea-80dc-001eec3547a4</Должность>

                                   <Подразделение>1e9a4576-fb18-11ea-80dc-001eec3547a4</Подразделение>

                                   <Оклад>50000</Оклад>

                        </DocumentObject.ПриемНаРаботу>

            </v8msg:Body>

</v8msg:Message>

 

            Далее настроим конфигурацию филиала.

            Структура плана обмена та же, содержимое модуля плана обмена в конфигурации такое же.

Рис. Форма узла плана обмена «ПриемНаРаботу» в конфигураторе филиала

 

Рис. Настройка формы узла в режиме «1С: Предприятие»

 

Рис. Форма списка плана обмена «ПриемНаРаботу» в конфигураторе филиала

 

Листинг. Модуль формы списка плана обмена конфигурации филиала

&НаСервереБезКонтекста

Процедура ЗарегистрироватьИзмененияНаСервере(Узел)

            Запрос = Новый Запрос;

            Запрос.Текст =

            "ВЫБРАТЬ

            |          ПриемНаРаботуИзменения.Ссылка

            |ИЗ

            |          Документ.ПриемНаРаботу.Изменения КАК ПриемНаРаботуИзменения";

           

            Результат = Запрос.Выполнить();

           

            Выборка = Результат.Выбрать();

           

            Пока Выборка.Следующий() Цикл

                        ПланыОбмена.ЗарегистрироватьИзменения(Узел, Выборка.Ссылка);

            КонецЦикла;

КонецПроцедуры

 

&НаКлиенте

Процедура ЗарегистрироватьИзменения(Команда)

            Узел = Элементы.Список.ТекущаяСтрока;

            ЗарегистрироватьИзмененияНаСервере(Узел);

КонецПроцедуры

 

&НаСервереБезКонтекста

Функция ЭтоПредопределенныйУзел(Узел)

            Возврат Узел = ПланыОбмена.ПриемНаРаботу.ЭтотУзел();

КонецФункции

 

&НаКлиенте

Процедура СписокПриАктивизацииСтроки(Элемент)

            Если ЭтоПредопределенныйУзел(Элемент.ТекущаяСтрока) Тогда

                        Элементы.ЗарегистрироватьИзменения.Доступность = Ложь;

            Иначе

                        Элементы.ЗарегистрироватьИзменения.Доступность = Истина;

            КонецЕсли;

КонецПроцедуры

 

            Далее создадим обработку «ОбменПриемомНаРаботу» в конфигурации филиала организации.

 

Рис. Структура и форма обработки «ОбменПриемомНаРаботу» в конфигураторе филиала

 

Листинг. Модуль формы обработки «ОбменПриемомНаРаботу» в конфигурации филиала

&НаСервереБезКонтекста

Процедура ВыполнитьОбменНаСервере()

            ВыборкаУзлов = ПланыОбмена.ПриемНаРаботу.Выбрать();

            Пока ВыборкаУзлов.Следующий() Цикл

                        // Произвести обмен данными со всеми узлами, кроме текущего

                        Если ВыборкаУзлов.Ссылка <> ПланыОбмена.ПриемНаРаботу.ЭтотУзел() Тогда

                                   УзелОбъект = ВыборкаУзлов.ПолучитьОбъект();

                                  

                                   УзелОбъект.ПрочитатьСообщениеСИзменениями();

                                   УзелОбъект.ЗаписатьСообщениеСИзменениями();

                        КонецЕсли;

            КонецЦикла;

КонецПроцедуры

 

&НаКлиенте

Процедура ВыполнитьОбмен(Команда)

            ВыполнитьОбменНаСервере();

КонецПроцедуры

 

            Далее тестируем в режиме отладки обмен данными документа «ПриемНаРаботу».

 

Рис. Фрагмент формы списка документа «ПриемНаРаботу»:

в центральной базе (слева) и базе филиала (справа)