В начало

План обмена для справочника «Номенклатура»

 

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

Рис. Структура справочника «Номенклатура» в дереве метаданных

            Итак, создаем новый план обмена в разделе «Общие – Планы обмена».

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

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

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

            Затем необходимо добавить нужные процедуры в различные модули данного плана обмена.

            В модуле объекта нужно разместить две процедуры для чтения и записи данных из файла формата XML.

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

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

           

//C:\Users\Guest\AppData\Local\Temp\    

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

 

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

//Сообщение_ЦБ-ФЛ.xml

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

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

Сообщение.Текст = "-------- Конец выгрузки ------------";

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

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

 

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

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

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

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

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

            КонецЕсли;

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

 

            Потом, аналогично разместить процедуры в модуле формы списка главной конфигурации.

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

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

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

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

 

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

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

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

 

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

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

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

            Иначе

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

            КонецЕсли;

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

 

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

Рис. Структура обработке в дереве метаданных

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

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

Процедура ОбменНажатие(Элемент)

            Выборка = ПланыОбмена.ОбменНоменклатурой.Выбрать();

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

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

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

                                  

                                   Узел.ПрочитатьСообщение();//Процедура в модуле плана обмена

                                  

                                   Узел.ЗаписатьСообщение();//Процедура в модуле плана обмена

                        КонецЕсли;

            КонецЦикла;

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

 

            Далее запускаемся в режиме «1С: Предприятие», переходим в раздел «Операции – План обмена…», выбираем наш план обмена «ОбменНоменклатурой» и корректируем предопределенный элемент как показано далее. Также нужно создать еще один элемент для филиала.

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

            Теперь нужно нажать кнопку «Зарегистрировать изменения» на форме списка, после чего в каталоге временных файлов будет создан XML-файл с данными для обмена.

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

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

 

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

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

                    

//C:\Users\Guest\AppData\Local\Temp\    

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

 

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

//Сообщение_ЦБ-ФЛ.xml

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

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

Сообщение.Текст = "-------- Конец выгрузки ------------";

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

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

 

            У плана обмена «ОбменНоменклатуры» в свойствах в разделе «Основные», на кнопке «Состав» должен быть выбран справочник «Номенклатура».

            Также у плана обмена должно быть две формы: форма узла и форма списка.

            Кроме того в модуле формы узла необходимо разместить процедуру «ПриСозданииНаСервере».

 

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

&НаСервере

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

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

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

            КонецЕсли; 

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

 

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

 

 

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

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

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

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

 

&НаКлиенте

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

            ЗарегистрироватьИзмененияНаСервере(Элементы.Список.ТекущаяСтрока);

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

 

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

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

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

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

 

&НаКлиенте

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

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

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

            Иначе

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

            КонецЕсли;

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

 

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

 

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

 

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

Процедура ОбменНаСервере()

            Выборка = ПланыОбмена.ОбменНоменклатурой.Выбрать();

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

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

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

                                  

                                   Узел.ПрочитатьСообщение();//Процедура в модуле плана обмена

                                  

                                   Узел.ЗаписатьСообщение();//Процедура в модуле плана обмена

                        КонецЕсли;

            КонецЦикла;

 

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

 

&НаКлиенте

Процедура Обмен(Команда)

            ОбменНаСервере();

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

 

            Таким образом, конфигурации подготовлены и настроены. Запускаем наши конфигурации в режиме «1С: Предприятие», вносим изменения в справочник «Номенклатура» в Главной конфигурации.

Рис. Форма списка справочника «Номенклатура» в Главной конфигурации

 

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

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

 

            Потом вызываем обработку «ОбменДаннымиНоменклатуру» и нажимаем кнопку «Обмен». При этом, если в справочнике «Номенклатура» есть изменения, то будет создан файл в каталоге временных файлов типа «Сообщение_ЦБ-ФЛ.xml», в котором будут зафиксированы изменения.

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

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

 

            Проверяем результат, сравнивая справочники «Номенклатура» в двух базах.

            Таким образом, мы осуществили передачу данных справочника «Номенклатура» из главной базы в базу филиала.

            Чтобы сделать обратный обмен «Филиал - Главная» нужно перейти в план обмена «ОбменНоменклатурой», выделить узел «ЦБ» и нажать кнопку «Зарегистрировать изменения»

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

 

            Далее запустить, ранее созданную  обработку «ОбменДаннымиНоменклатура» и нажать кнопку «Обмен». При этом будет создан другой файл «Сообщение_ФЛ-ЦБ.xml», после чего проделать фокус с обработкой в Главной базе.