В начало

Обмен регистра сведений «ПродажаАкций»

 

            Обмен данными независимого регистра сведений «ПродажаАкций» между центральной базой и филиалом.

Рис. Структура регистра сведений «ПродажаАкций»

 

            Создаем новый план обмена, изменяем его состав. Добавляем в состав независимый регистр сведений «ПродажаАкций».

Рис. План обмена «ОбменПродажамиАкций», закладка «Основные»

 

            На закладке «Данные» свойств плана обмена добавляем реквизит «ЭтоГлавныйУзел» с типом «Булево».

            Переходим за вкладку «Формы». Создаём форму узла.

Рис. Форма узла плана обмена «ОбменПродажамиАкций»

 

            Затем создаем форму списка плана обмена. Располагаем на данной форме кнопочку

 «ЗарегистрироватьИзменения».

Рис. Форма списка плана обмена

 

            Теперь нужно добавить код в модуль объекта плана обмена.

 

Листинг. Модуль объекта плана обмена

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

            Сообщение = Новый СообщениеПользователю;

            Сообщение.Текст = "-------- Выгрузка в узел " + Строка(ЭтотОбъект) + " ------------";

            Сообщение.Сообщить();

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

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

            ИмяФайла = Каталог + ?(Прав(Каталог, 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>1</v8msg:MessageNo>

                        <v8msg:ReceivedNo>0</v8msg:ReceivedNo>

            </v8msg:Header>

            <v8msg:Body>

                        <InformationRegisterRecordSet.ПродажаАкций>

                                   <Filter>

                                               <Period>2022-06-12T00:00:00</Period>

                                               <Акция>Татнефть</Акция>

                                               <ТипАкции>Обычная</ТипАкции>

                                   </Filter>

                                   <Records>

                                               <Record>

                                                           <Period>2022-06-12T00:00:00</Period>

                                                           <Акция>Татнефть</Акция>

                                                           <ТипАкции>Обычная</ТипАкции>

                                                           <Количество>20</Количество>

                                                           <Цена>320</Цена>

                                               </Record>

                                   </Records>

                        </InformationRegisterRecordSet.ПродажаАкций>

            </v8msg:Body>

</v8msg:Message>

 

            После этого необходимо внести изменения в конфигурацию филиала и опять выполнить обмен, чтобы необходимые изменения, переданные  из центральной базы «ЦБ» применились в базе филиала «ФЛ».

            Добавляем план обмена «ОбменПродажамиАкций» в конфигурацию филиала. Размещаем в модуле плана обмена процедуры: ЗаписатьСообщениеСИзменениями() и ПрочитатьСообщениеСИзменениями().

            Добавляем форму узла плана отмена.

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

 

            Переходим в модуль формы узла плана обмена и размещаем обработчик «ПриСозданииНаСервере».

 

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

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

            Если Объект.Ссылка = ПланыОбмена.ОбменПродажамиАкций.ЭтотУзел() Тогда

                        Элементы.ЭтоГлавныйУзел.Доступность = Ложь;

            КонецЕсли;

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

 

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

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

 

            Для команды «ЗарегистрироватьИзменения» добавляем действие, а для списка узлов – обработчик «ПриАктивизацииСтроки».

 

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

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

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

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

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

            "ВЫБРАТЬ

            |          ПродажаАкцийИзменения.Акция,

            |          ПродажаАкцийИзменения.ТипАкции,

            |          ПродажаАкцийИзменения.Период

            |ИЗ

            |          РегистрСведений.ПродажаАкций.Изменения КАК ПродажаАкцийИзменения";

           

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

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

            НЗ = РегистрыСведений.ПродажаАкций.СоздатьНаборЗаписей();

           

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

                        НЗ.Отбор.Акция.Значение = Выборка.Акция;

                        НЗ.Отбор.Акция.Использование = Истина;

                       

                        НЗ.Отбор.ТипАкции.Значение = Выборка.ТипАкции;

                        НЗ.Отбор.ТипАкции.Использование = Истина;

                       

                        НЗ.Отбор.Период.Значение = Выборка.Период;

                        НЗ.Отбор.Период.Использование = Истина;

                       

                        НЗ.Прочитать();

                       

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

            КонецЦикла;

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

 

&НаКлиенте

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

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

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

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

 

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

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

            Возврат Узел = ПланыОбмена.ОбменПродажамиАкций.ЭтотУзел();

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

 

&НаКлиенте

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

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

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

            Иначе

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

            КонецЕсли;

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

 

            После этого добавляем обработку «ОбменДаннымиПродажАкций». Добавляем форму обработки. На форму добавляем кнопку «Выполнить обмен».

Рис. Форма обработки «ОбменДаннымиПродажАкций»

 

            Для команды «ВыполнитьОбмен» добавляем действие.

 

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

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

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

            ВыборкаУзлов = ПланыОбмена.ОбменПродажамиАкций.Выбрать();

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

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

                        //кроме текущего (ЭтотУзел)

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

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

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

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

                        КонецЕсли;

            КонецЦикла;

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

 

&НаКлиенте

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

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

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

 

            Далее запускаем режим отладки. Настраиваем список узлов в плане обмена.

Рис. Настройка списка узлов в плане обмена базы филиала

 

            Потом запускаем обработку «Обмен данными продаж акций».

Рис. Обработка обмена в базе филиала

 

            В процессе работы обработки «Обмен данными продаж акций» будет прочитан файл-сообщения, пришедший из центральной базы «ЦБ», а потом изменения преобразованы в данные.

Рис. Полученные изменения в регистре сведений

 

            Для надежности нужно проверить и обратный обмен из базы филиала «ФЛ» в центральную базу «ЦБ».