В начало

Обмен приходных накладных

 

            Далее идёт настройка плана обмена приходных накладных между разными конфигурациями. Начинаем настройку с центральной базы.

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

 

Рис. Свойства плана обмена, закладка «Данные»

 

Рис. Настройка свойств плана обмена, вкладка «Формы»

 

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

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

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

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

            ИмяФайла = Каталог + ?(Прав(Каталог, 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>c301c805-f01d-11ea-980c-001eec3547a4</Ref>

                                   <DeletionMark>false</DeletionMark>

                                   <Date>2020-09-06T13:57:07</Date>

                                   <Number>000000001</Number>

                                   <Posted>true</Posted>

                                   <Покупатель>d0d0bba6-f01b-11ea-980c-001eec3547a4</Покупатель>

                                   <Продавец>d0d0bba5-f01b-11ea-980c-001eec3547a4</Продавец>

                                   <Склад>bdb1ceb4-ef49-11ea-9fa0-001eec3547a4</Склад>

                                   <СписокТоваров>

                                               <Row>

                                                           <Номенклатура>007b8099-ec6b-11ea-b1c6-001eec3547a4</Номенклатура>

                                                           <Цена>100</Цена>

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

                                                           <Сумма>5000</Сумма>

                                               </Row>

                                               <Row>

                                                           <Номенклатура>71e3b2c8-ec6b-11ea-b1c6-001eec3547a4</Номенклатура>

                                                           <Цена>500</Цена>

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

                                                           <Сумма>100000</Сумма>

                                               </Row>

                                   </СписокТоваров>

                        </DocumentObject.ПриходнаяНакладная>

            </v8msg:Body>

</v8msg:Message>

 

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

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

 

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

&НаСервере

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

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

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

            КонецЕсли;

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

 

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

 

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

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

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

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

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

            "ВЫБРАТЬ

            |          ПриходнаяНакладнаяИзменения.Ссылка

            |ИЗ

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

           

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

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

           

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

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

            КонецЦикла;

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

 

&НаКлиенте

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

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

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

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

 

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

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

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

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

 

&НаКлиенте

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

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

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

            Иначе

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

            КонецЕсли;

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

 

            Добавляем обработку для обмена данными.

Рис. Форма обработки «ОбменДаннымиПриходныхНакладных»

 

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

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

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

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

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

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

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

                                  

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

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

                        КонецЕсли;

            КонецЦикла;

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

 

&НаКлиенте

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

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

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

 

            Тестируем изменения в конфигурации филиала в режиме отладки.

Рис. Настройка списка узлов и регистрация изменений

 

Рис. Выполнение обмена данными и служебное сообщение

 

            Протестируем изменения в конфигурации филиала в режиме отладки и сравним данные обмена.

 

Рис. Результат манипуляций с накладными и последующего двойного обмена ЦБ->ФЛ->ЦБ:

центральная база «ЦБ» - слева, база филиала «ФЛ» - справа

 

            Обмен работает.