3 курс (заочка) / Методические пособия / Пособие для ответов на контрольные вопросы
.pdfЗанятие 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). Затем |
сохраним |
в созданный каталог нашу конфигурацию, выполнив |
команду |
главного меню Конфигурация Сохранить конфигурацию в файл…