В начало

Обмен документа «ПоступлениеТоваров»

 

            Нужно сделать план обмена для документа «ПоступлениеТоваров». Обмен будет осуществляться между двумя базами: центральной и филиалом.

Рис. Документ «ПоступлениеТоваров» в структуре метаданных

 

            Вместе с документом «ПоступлениеТоваров» нужно будет переносить справочники: Контрагенты, Склады и Номенклатура.

            Начнем с внесения изменений в конфигурацию центральной базы. Переходим в конфигураторе в раздел «ПланыОбмена» и создаем новый план обмена «ОбменПоступлениемТоваров». Переходим на закладку «Основные» свойств плана обмена и изменяем его.

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

 

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

            Переходим на закладку «Формы», где создаём форму узла.

Рис. ФормаУзла плана обмена «ОбменПоступлениемТоваров»

 

            Также необходимо будет создать форму списка плана обмена. Создаем ее. На форме размещаем кнопку, с помощью которой будем регистрировать изменения для конкретного узла.

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

 

            Затем открываем модуль объекта плана обмена, размещаем в нем основные процедуры, которые будут вызываться в дальнейшем через обработку.

 

Листинг. Содержимое модуля объекта плана обмена

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

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

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

            ИмяФайла = Каталог + ?(Прав(Каталог, 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.Закрыть();

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

            Сообщение.Текст = "- Данные записаны в файл: " + ИмяФайла + Символы.ПС +

                              "-------- Конец выгрузки ------------";

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

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

 

            Далее добавляем обработчик «ПередОткрытием» в модуле формы узла плана обмена.

 

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

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

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

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

            КонецЕсли;

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

 

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

 

Листинг. Содержимое модуля формы списка

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

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

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

                        "ВЫБРАТЬ

                        |          ПоступлениеТоваровИзменения.Ссылка,

                        |          ПоступлениеТоваровИзменения.Ссылка.Покупатель КАК Покупатель,

                        |          ПоступлениеТоваровИзменения.Ссылка.Продавец КАК Продавец,

                        |          ПоступлениеТоваровИзменения.Ссылка.Склад КАК Склад

                        |ИЗ

                        |          Документ.ПоступлениеТоваров.Изменения КАК ПоступлениеТоваровИзменения";

           

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

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

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

           

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

                        //Регистрация документа "ПоступлениеПоваров"

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

                        //Регистрация элементов справочников: Контрагенты и Склады

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

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

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

                        //Перебор табличной части документа

                        Для Каждого Элем Из Выборка.Ссылка.СписокТоваров Цикл

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

                        КонецЦикла; 

            КонецЦикла; 

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

 

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

            //Если ТекущийУзел = Предопределённому

            Если ЭлементыФормы.ПланОбменаСписок.ТекущаяСтрока =

                        ПланыОбмена.ОбменПоступлениемТоваров.ЭтотУзел() Тогда

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

            Иначе

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

            КонецЕсли;

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

 

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

Рис. Форма обработки

 

            Кнопка «Выполнить обмен» вызывает процедуры из модуля объекта плана обмена.

 

Листинг. Содержимое модуля формы обработки

Процедура КнопкаВыполнитьНажатие(Кнопка)

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

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

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

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

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

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

                                  

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

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

                        КонецЕсли;

            КонецЦикла;

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

 

            Запустим режим «1С: Предприятие». Откроем план обмена «Обмен поступлением товаров» и настроим список узлов.

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

           

            Зарегистрируем изменения. После чего откроем обработку «Обмен данными поступления товаров» и выполним обмен.

Рис. Выполнение обмена

 

            Файл с сообщением записывается в каталог временных файлов. Просмотрим его содержимое.

Рис. Файл-сообщение «Сообщение_ПоступлениеТоваров_ЦБ-ФЛ.xml»

 

            Данные файл содержит информацию об изменениях в документе «Поступление товаров», а также, связанных с ним справочников  для передачи в базу филиала.

            Теперь аналогичным образом, надо изменить конфигурацию филиала, прежде чем принять информацию  из центральной базы.

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

            Создаем форму узла плана обмена.

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

 

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

 

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

&НаСервере

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

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

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

            КонецЕсли;

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

 

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

 

Рис. ФормаСписка плана обмена «ОбменПоступлениемТоваров»

 

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

 

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

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

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

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

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

                        "ВЫБРАТЬ

                        |          ПоступлениеТоваровИзменения.Ссылка,

                        |          ПоступлениеТоваровИзменения.Ссылка.Покупатель КАК Покупатель,

                        |          ПоступлениеТоваровИзменения.Ссылка.Продавец КАК Продавец,

                        |          ПоступлениеТоваровИзменения.Ссылка.Склад КАК Склад

                        |ИЗ

                        |          Документ.ПоступлениеТоваров.Изменения КАК ПоступлениеТоваровИзменения";

           

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

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

           

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

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

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

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

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

                        Для Каждого Элем Из Выборка.Ссылка.СписокТоваров Цикл

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

                        КонецЦикла;

            КонецЦикла;

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

 

&НаКлиенте

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

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

            РегистрацияИзмененийНаСервере(ТекУзел);

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

 

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

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

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

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

 

&НаКлиенте

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

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

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

            Иначе

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

            КонецЕсли;

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

 

            Далее создаем обработку «ОбменДанныхПоступленийТоваров». Добавляем форму обработки, на которой размещаем кнопку.

Рис. Форма обработки

 

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

 

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

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

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

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

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

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

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

                                  

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

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

                        КонецЕсли;

            КонецЦикла;

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

 

&НаКлиенте

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

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

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

            Обновляем конфигурацию филиала, запускаем режим отладки. Переходим в план обмена «Обмен поступлением товаров» и заполняем список узлов.

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

 

            Затем запускаем обработку «Обмен данных поступлений товаров» и выполняем обмен.

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

 

            В результате выполнения обработки будет прочитан файл-сообщение и внесены изменения в данные документа «ПоступлениеТоваров» и связанные с ним справочники. Проверим данныей документ.

Рис. Документ «Поступление товаров»

 

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

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

 

            Потом вертаемся в центральную базу и с помощью обработки «ОбменДаннымиПоступленияТоваров» читаем сообщение.

Рис. Документ «Поступление товаров» в центральной базе

 

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