Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

3 курс (заочка) / Методические пособия / Пособие для ответов на контрольные вопросы

.pdf
Скачиваний:
158
Добавлен:
15.02.2021
Размер:
46.69 Mб
Скачать

Занятие 24 731

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

Сообщение.Текст = " – Считывается файл " + ИмяФайла; Сообщение.Сообщить();

//Загрузить из найденного файла

//*** Инфраструктура сообщений.

ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();

//Читать заголовок сообщения обмена данными – файла XML. ЧтениеСообщения.НачатьЧтение(ЧтениеXML);

//Сообщение предназначено не для этого узла.

Если ЧтениеСообщения.Отправитель <> Ссылка Тогда ВызватьИсключение "Неверный узел";

КонецЕсли;

ЧтениеСообщения.ЗакончитьЧтение(); ЧтениеXML.Закрыть(); УдалитьФайлы(ИмяФайла);

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

 

Сообщение.Текст = "--------

Конец загрузки ------------

";

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

 

 

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

Мы проверяем, является ли отправитель сообщения тем узлом, для которого мы в данном вызове этой процедуры производим обмен данными.

Если все в порядке, то перед тем как начать чтение данных, следует удалить все записи регистрации изменений, которые были сделаны для этого узла и соответствовали номерам сообщений меньше или равным указанному в обрабатываемом нами сообщении как номер принятого. Это делается затем, чтобы исключить дублирование данных, которые уже были ранее посланы этому узлу и им обработаны (листинг 24.20).

Листинг 24.20. Удаление записей регистрации изменений для узла отправителя

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

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

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

ИмяФайла = Каталог + ?(Прав(Каталог, 1) = "\", "", "\") + "Message" + СокрЛП(Ссылка.Код) + "_" + СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + ".xml";

732 1С:Предприятие 8.3. Практическое пособие разработчика

Файл = Новый Файл(ИмяФайла); Если Не Файл.Существует() Тогда

Возврат; КонецЕсли;

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

//Попытаться открыть файл. ЧтениеXML = Новый ЧтениеXML; Попытка

ЧтениеXML.ОткрытьФайл(ИмяФайла);

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

Сообщение.Текст = "Невозможно открыть файл обмена данными."; Сообщение.Сообщить();

Возврат;

КонецПопытки;

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

Сообщение.Текст = " – Считывается файл " + ИмяФайла; Сообщение.Сообщить();

//Загрузить из найденного файла

//*** Инфраструктура сообщений.

ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();

//Читать заголовок сообщения обмена данными – файла XML. ЧтениеСообщения.НачатьЧтение(ЧтениеXML);

//Сообщение предназначено не для этого узла.

Если ЧтениеСообщения.Отправитель <> Ссылка Тогда ВызватьИсключение "Неверный узел";

КонецЕсли;

//Удаляем регистрацию изменений для узла отправителя сообщения.

//*** Служба регистрации изменений.

ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель, ЧтениеСообщения.НомерПринятого);

ЧтениеСообщения.ЗакончитьЧтение(); ЧтениеXML.Закрыть(); УдалитьФайлы(ИмяФайла);

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

 

Сообщение.Текст = "--------

Конец загрузки ------------

";

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

 

 

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

Занятие 24 733

Обратите внимание, что здесь мы обращаемся к службе регистрации изменений и используем метод УдалитьРегистрациюИзменений()

для  выполнения описанных действий.

Теперь, наконец, мы можем приступить к чтению непосредственно самих данных, содержащихся в сообщении (листинг 24.21).

Листинг 24.21. Чтение данных из сообщения

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

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

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

ИмяФайла = Каталог + ?(Прав(Каталог, 1) = "\", "", "\") + "Message" + СокрЛП(Ссылка.Код) + "_" + СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + ".xml";

Файл = Новый Файл(ИмяФайла); Если Не Файл.Существует() Тогда

Возврат; КонецЕсли;

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

//Попытаться открыть файл. ЧтениеXML = Новый ЧтениеXML; Попытка

ЧтениеXML.ОткрытьФайл(ИмяФайла);

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

Сообщение.Текст = "Невозможно открыть файл обмена данными."; Сообщение.Сообщить();

Возврат;

КонецПопытки;

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

Сообщение.Текст = " – Считывается файл " + ИмяФайла; Сообщение.Сообщить();

//Загрузить из найденного файла

//*** Инфраструктура сообщений.

ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();

//Читать заголовок сообщения обмена данными – файла XML. ЧтениеСообщения.НачатьЧтение(ЧтениеXML);

//Сообщение предназначено не для этого узла.

Если ЧтениеСообщения.Отправитель <> Ссылка Тогда ВызватьИсключение "Неверный узел";

КонецЕсли;

7341С:Предприятие 8.3. Практическое пособие разработчика

//Удаляем регистрацию изменений для узла отправителя сообщения.

//*** Служба регистрации изменений

ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель, ЧтениеСообщения.НомерПринятого);

// Читаем данные из сообщения *** XML-сериализация. Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл

КонецЦикла;

ЧтениеСообщения.ЗакончитьЧтение(); ЧтениеXML.Закрыть(); УдалитьФайлы(ИмяФайла);

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

 

Сообщение.Текст = "--------

Конец загрузки ------------

";

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

 

 

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

Чтение данных выполняется в цикле, причем мы снова обращаемся к механизмам XML-сериализации и методом глобального контекста ВозможностьЧтенияXML() получаем очередной тип данных XML из  объекта ЧтениеXML и определяем, имеется ли соответствующий тип «1С:Предприятия». В случае успеха выполнение цикла продолжается.

И первое, что нам нужно сделать, – представить данные XML в  виде некоторого значения, имеющего тип «1С:Предприятия». Для этого мы используем метод глобального контекста ПрочитатьXML(), листинг 24.22.

Листинг 24.22. Представление данных XML в виде значения, имеющего тип

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

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

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

ИмяФайла = Каталог + ?(Прав(Каталог, 1) = "\", "", "\") + "Message" + СокрЛП(Ссылка.Код) + "_" + СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + ".xml";

Файл = Новый Файл(ИмяФайла); Если Не Файл.Существует() Тогда

Возврат; КонецЕсли;

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

//Попытаться открыть файл. ЧтениеXML = Новый ЧтениеXML; Попытка

Занятие 24 735

ЧтениеXML.ОткрытьФайл(ИмяФайла);

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

Сообщение.Текст = "Невозможно открыть файл обмена данными."; Сообщение.Сообщить();

Возврат;

КонецПопытки;

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

Сообщение.Текст = " – Считывается файл " + ИмяФайла; Сообщение.Сообщить();

//Загрузить из найденного файла

//*** Инфраструктура сообщений.

ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();

//Читать заголовок сообщения обмена данными – файла XML. ЧтениеСообщения.НачатьЧтение(ЧтениеXML);

//Сообщение предназначено не для этого узла.

Если ЧтениеСообщения.Отправитель <> Ссылка Тогда ВызватьИсключение "Неверный узел";

КонецЕсли;

//Удаляем регистрацию изменений для узла отправителя сообщения.

//*** Служба регистрации изменений.

ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель, ЧтениеСообщения.НомерПринятого);

// Читаем данные из сообщения *** XML-сериализация. Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл

// Читаем очередное значение. Данные = ПрочитатьXML(ЧтениеXML);

КонецЦикла;

 

 

ЧтениеСообщения.ЗакончитьЧтение();

 

ЧтениеXML.Закрыть();

 

 

УдалитьФайлы(ИмяФайла);

 

 

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

 

Сообщение.Текст = "--------

Конец загрузки ------------

";

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

 

 

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

736 1С:Предприятие 8.3. Практическое пособие разработчика

В результате выполнения этого метода переменная Данные будет содержать объект «1С:Предприятия», соответствующий данным

XML.

Теперь, после того как объект «1С:Предприятия» получен, следует разрешить возможную коллизию (листинг 24.23).

Листинг 24.23. Разрешение возможных коллизий

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

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

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

ИмяФайла = Каталог + ?(Прав(Каталог, 1) = "\", "", "\") + "Message" + СокрЛП(Ссылка.Код) + "_" + СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + ".xml";

Файл = Новый Файл(ИмяФайла); Если Не Файл.Существует() Тогда

Возврат; КонецЕсли;

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

//Попытаться открыть файл. ЧтениеXML = Новый ЧтениеXML; Попытка

ЧтениеXML.ОткрытьФайл(ИмяФайла);

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

Сообщение.Текст = "Невозможно открыть файл обмена данными."; Сообщение.Сообщить();

Возврат;

КонецПопытки;

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

Сообщение.Текст = " – Считывается файл " + ИмяФайла; Сообщение.Сообщить();

//Загрузить из найденного файла

//*** Инфраструктура сообщений.

ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();

//Читать заголовок сообщения обмена данными – файла XML. ЧтениеСообщения.НачатьЧтение(ЧтениеXML);

//Сообщение предназначено не для этого узла.

Занятие 24 737

Если ЧтениеСообщения.Отправитель <> Ссылка Тогда ВызватьИсключение "Неверный узел";

КонецЕсли;

//Удаляем регистрацию изменений для узла - отправителя сообщения.

//*** Служба регистрации изменений.

ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель, ЧтениеСообщения.НомерПринятого);

// Читаем данные из сообщения *** XML-сериализация. Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл

//Читаем очередное значение. Данные = ПрочитатьXML(ЧтениеXML);

//Не переносим изменение, полученное в главный из неглавного,

//если есть регистрация изменения.

Если Не ЧтениеСообщения.Отправитель.Главный И ПланыОбмена.ИзменениеЗарегистрировано(

ЧтениеСообщения.Отправитель, Данные) Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = " – Изменения отклонены";

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

Продолжить;

КонецЕсли;

 

 

КонецЦикла;

 

 

ЧтениеСообщения.ЗакончитьЧтение();

 

ЧтениеXML.Закрыть();

 

 

УдалитьФайлы(ИмяФайла);

 

 

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

 

Сообщение.Текст = "--------

Конец загрузки ------------

";

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

 

 

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

Возможная коллизия разрешается следующим образом: мы проверяем, является ли узел-отправитель главным узлом и есть ли записи об изменении этого объекта для данного узла в нашей базе данных. Если объект изменялся в нашей базе и отправитель не  является главным узлом, мы отклоняем запись полученного объекта. Во всех остальных случаях мы принимаем изменения полученного объекта.

Теперь единственное, что нам осталось сделать, – записать полученные данные (листинг 24.24).

738 1С:Предприятие 8.3. Практическое пособие разработчика

Листинг 24.24. Запись полученных данных

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

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

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

ИмяФайла = Каталог + ?(Прав(Каталог, 1) = "\", "", "\") + "Message" + СокрЛП(Ссылка.Код) + "_" + СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + ".xml";

Файл = Новый Файл(ИмяФайла); Если Не Файл.Существует() Тогда

Возврат; КонецЕсли;

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

//Попытаться открыть файл. ЧтениеXML = Новый ЧтениеXML; Попытка

ЧтениеXML.ОткрытьФайл(ИмяФайла);

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

Сообщение.Текст = "Невозможно открыть файл обмена данными."; Сообщение.Сообщить();

Возврат;

КонецПопытки;

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

Сообщение.Текст = " – Считывается файл " + ИмяФайла; Сообщение.Сообщить();

//Загрузить из найденного файла

//*** Инфраструктура сообщений.

ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();

//Читать заголовок сообщения обмена данными – файла XML. ЧтениеСообщения.НачатьЧтение(ЧтениеXML);

//Сообщение предназначено не для этого узла.

Если ЧтениеСообщения.Отправитель <> Ссылка Тогда ВызватьИсключение "Неверный узел";

КонецЕсли;

//Удаляем регистрацию изменений для узла отправителя сообщения

//*** Служба регистрации изменений.

ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель, ЧтениеСообщения.НомерПринятого);

// Читаем данные из сообщения *** XML-сериализация.

Занятие 24 739

Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл

//Читаем очередное значение. Данные = ПрочитатьXML(ЧтениеXML);

//Не переносим изменение, полученное в главный из неглавного,

//если есть регистрация изменения.

Если Не ЧтениеСообщения.Отправитель.Главный И ПланыОбмена.ИзменениеЗарегистрировано(

ЧтениеСообщения.Отправитель, Данные) Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = " – Изменения отклонены"; Сообщение.Сообщить();

Продолжить; КонецЕсли;

// Записать полученные данные. Данные.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель; Данные.ОбменДанными.Загрузка = Истина; Данные.Записать();

КонецЦикла;

ЧтениеСообщения.ЗакончитьЧтение(); ЧтениеXML.Закрыть(); УдалитьФайлы(ИмяФайла);

Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "-------- Конец загрузки ------------"; Сообщение.Сообщить();

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

Перед записью полученного объекта мы устанавливаем у него в  параметрах обмена данными узел отправителя для того, чтобы система при записи этого объекта в нашей базе данных не формировала записи регистрации изменений этого объекта для того узла, от которого мы его только что получили.

Кроме этого, в параметрах обмена данными мы устанавливаем свойство Загрузка, информирующее систему о том, что запись объекта будет происходить в режиме обновления данных, полученных в результате обмена. Такое указание позволяет системе упростить процедуру записи объекта, отказавшись от ряда стандартных проверок и исключив изменения связанных данных, которые выполняются при обычной записи.

На этом создание процедуры получения и обработки данных обмена закончено.

740 1С:Предприятие 8.3. Практическое пособие разработчика

Проверка работы обмена данными

В режиме «Конфигуратор»

Чтобы иметь возможность редактировать константу ПрефиксНумерации,раскроемветвьОбщие дереваобъектовконфигурации,выделим ветвь Общие формы и с помощью конструктора форм создадим форму констант с именем ОбщиеНастройки.

В открывшемся окне свойств Дополнительно для этой формы укажем принадлежность формы к подсистеме Предприятие (рис. 24.7).

Рис. 24.7. Окно «Дополнительно» формы констант «ОбщиеНастройки»

В окне редактирования объекта конфигурации План обмена Филиалы

иобъекта Обработка ОбменДанными на закладке Подсистемы также укажем их принадлежность к подсистеме Предприятие.

Затем настроим командный интерфейс подсистемы Предприятие, чтобы доступ к командам открытия плана обмена, обработки, а  также формы констант имел только Администратор, и переместим команду

Филиалы в самое начало группы Панель навигации.Важное. А  также в группе команд Панель действий.Создать включим видимость у  команды Филиал: создать только для роли Администратор. Затем установим следующий порядок следования команд в группе Панель

действий.Сервис:

Общие настройки,Обмен данными.

И в заключение создадим новый каталог, в котором будет размещаться база нашего филиала.

Обновим конфигурацию базы данных (F7). Затем

сохраним

в  созданный каталог нашу конфигурацию, выполнив

команду

главного меню Конфигурация Сохранить конфигурацию в файл…