В начало

Односторонний обмен документа «Заявки»

 

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

 

            В каждой базе нужно создать план обмена. В состав плана обмена нужно включить документ «Заявки», причем только в базе-источнике, т.к. обмен односторонний.

Рис. План обмена

 

            В базе-источнике нужно создать HTTP-сервис, с помощью которого будет осуществлен обмен документа «Заявки». В сервис необходимо добавить шаблон, в котором разместить два метода: один на выгрузку через GET, другой для загрузки методом POST.

 

  

Рис. HTTP-сервис в базе-источнике

 

Рис. Свойства шаблона «ДляПланаОбмена»

 

            Ниже приведен модуль HTTP-сервиса, с описанием обработчиков методов.

 

Листинг. Содержимое HTTP-сервиса в базе-источнике

Функция Выгрузка(Запрос)

 

            КодУзла = Запрос.ПараметрыURL["KodUzla"]; 

           

            ЗаписьXML = Новый ЗаписьXML;

    ЗаписьXML.УстановитьСтроку();

    ЗаписьXML.ЗаписатьОбъявлениеXML();

 

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

            ЗаписьСообщения.НачатьЗапись(ЗаписьXML, ПланыОбмена.БАШНЯ_ЗаявкиИзПодольска.НайтиПоКоду(КодУзла));

           

    ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(ЗаписьСообщения.Получатель, ЗаписьСообщения.НомерСообщения);

 

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

                        Выборка = ВыборкаИзменений.Получить();

                       

                        струкДок = Новый Структура;

                        струкДок.Вставить("Дата", Выборка.Дата);

                        струкДок.Вставить("ДатаВремяПриема", Выборка.ДатаВремяПриема);

                        струкДок.Вставить("ПлановаяДатаНачалаВыполнения", Выборка.ПлановаяДатаНачалаВыполнения);

                        струкДок.Вставить("ПлановаяДатаОкончанияВыполнения", Выборка.ПлановаяДатаОкончанияВыполнения);

                       

                        струкДок.Вставить("УКЖКХ_АдресАЗ", Выборка.УКЖКХ_АдресАЗ.Наименование);

                        струкДок.Вставить("ПодъездАЗ", Выборка.ПодъездАЗ);    

                        струкДок.Вставить("ЭтажАЗ", Выборка.ЭтажАЗ); 

                        струкДок.Вставить("ДомофонАЗ", Выборка.ДомофонАЗ);

                       

                        Если ЗначениеЗаполнено(Выборка.Телефон) Тогда

                                   струкДок.Вставить("Телефон", "+7" + Формат(Выборка.Телефон, "ЧГ="));//Тип реквизита "Телефон" в базе ЕДС Заявки - "Строка" 

                        КонецЕсли;                           

                       

                        Если ЗначениеЗаполнено(Выборка.ТелефонДоп) Тогда

                                   струкДок.Вставить("ТелефонДоп", "+7" + Формат(Выборка.ТелефонДоп, "ЧГ="));//Тип реквизита "ТелефонДоп" в базе ЕДС Заявки - "Строка"

                        КонецЕсли;   

                                  

                        струкДок.Вставить("Содержание", Выборка.Содержание);

                        струкДок.Вставить("СтатусЗаявителя", Выборка.СтатусЗаявителя);

                        струкДок.Вставить("Фамилия", Выборка.Фамилия);

                        струкДок.Вставить("ВидЗаявки", Выборка.ВидЗаявки);

                        струкДок.Вставить("ВнешнийКод", "АРМ" + Выборка.Номер);

 

                                              

                        СериализаторXDTO.ЗаписатьXML(ЗаписьXML, СтрукДок);

            КонецЦикла;

 

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

    НаВыходе = ЗаписьXML.Закрыть();      

           

            Ответ = Новый HTTPСервисОтвет(200);   

            Ответ.Заголовки.Вставить("Content-type", "application/xml;  charset=utf-8");

            Ответ.УстановитьТелоИзСтроки(НаВыходе);

 

            Возврат Ответ;

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

 

Функция Загрузка(Запрос)

           

            ЧтениеXML = Новый ЧтениеXML;

    ЧтениеXML.УстановитьСтроку(Запрос.ПолучитьТелоКакСтроку());

 

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

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

           

            //Снимаем с регистрации

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

           

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

                        //Обмен одностороний, поэтому здесь ничего нет

                        Данные = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);             

            КонецЦикла;

 

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

           

            Ответ = Новый HTTPСервисОтвет(200);   

            Ответ.УстановитьТелоИзСтроки("Ок");

 

            Возврат Ответ;

           

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

 

            Чтобы обратиться к сервису достаточно набрать в поисковой строке браузера строку следующего формата:

http://[Сервер публикации]/[Имя публикации]/hs/[Корневой URL сервиса]/[Шаблон]/[Параметр шаблона].

            Затем нужно внести изменения в базу-приемник, а именно добавить несколько объектов и модулей:

1) справочник «Параметры подключения к сервису ЕДСП» для хранения настроек подключения;

2) общий модуль для методов, вызываемых из регламентного задания;

3) Регламентное задание для автоматизации обмена по расписанию.

 

Рис. Структура справочника с настройками подключения к HTTP-сервису

 

 

Рис. Свойства общего модуля и регламентного задания

 

Листинг. Содержимое общего модуля

Функция ПроверитьСтрокуТаблицы(Знач ДатаДокумента, Знач НомерДокумента, Знач СуммаДокумента)

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

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

                        "ВЫБРАТЬ

                        |           CRM_БизнесПроцессВзысканоПоИП.Ссылка КАК Ссылка

                        |ИЗ

                        |           БизнесПроцесс.CRM_БизнесПроцесс.ВзысканоПоИП КАК CRM_БизнесПроцессВзысканоПоИП

                        |ГДЕ

                        |           CRM_БизнесПроцессВзысканоПоИП.Период = &Период

                        |           И CRM_БизнесПроцессВзысканоПоИП.НомерДокумента = &НомерДокумента

                        |           И CRM_БизнесПроцессВзысканоПоИП.Сумма = &Сумма";

           

            Запрос.УстановитьПараметр("НомерДокумента", НомерДокумента);

            Запрос.УстановитьПараметр("Период", НачалоДня(ДатаДокумента));

            Запрос.УстановитьПараметр("Сумма", СуммаДокумента);

           

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

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

           

            Если Выборка.Следующий() Тогда

                        Возврат Истина;

            Иначе

                        Возврат Ложь;

            КонецЕсли;

                       

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

 

&НаСервере

Функция ЕстьЛиЗаявкаВБазе(Знач ДатаЗаявки, Знач ВнешнийКод)

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

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

                        "ВЫБРАТЬ

                        |           УКЕДС_Заявки.Ссылка КАК Ссылка

                        |ИЗ

                        |           Документ.УКЕДС_Заявки КАК УКЕДС_Заявки

                        |ГДЕ

                        |           УКЕДС_Заявки.ВнешнийКод = &ВнешнийКод

                        |           И УКЕДС_Заявки.Дата = &Дата";

           

            Запрос.УстановитьПараметр("Дата", ДатаЗаявки);

            Запрос.УстановитьПараметр("ВнешнийКод", ВнешнийКод);

           

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

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

           

            Если Выборка.Следующий() Тогда

                        Возврат Выборка.Ссылка;

            Иначе

                        Возврат Неопределено;

            КонецЕсли;

                       

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

 

&НаСервере

Функция ПоискПомещения(Знач стрПомещение)

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

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

                        "ВЫБРАТЬ

                        |           УКЖКХ_АдресныйРеестр.Ссылка КАК Ссылка,

                        |           УКЖКХ_АдресныйРеестр.Владелец КАК Владелец,

                        |           УКЖКХ_АдресныйРеестр.НомерПомещения КАК НомерПомещения

                        |ИЗ

                        |           Справочник.УКЖКХ_АдресныйРеестр КАК УКЖКХ_АдресныйРеестр

                        |ГДЕ

                        |           УКЖКХ_АдресныйРеестр.Наименование = &Наименование";

           

            Запрос.УстановитьПараметр("Наименование", стрПомещение);

           

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

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

           

            Если Выборка.Следующий() Тогда

                        Возврат Выборка.Ссылка;

            Иначе

                        Возврат Неопределено;

            КонецЕсли;

                       

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

 

&НаСервере

Процедура ДобавитьЗаявку(Знач Эл)

           

            РезПроверки = ЕстьЛиЗаявкаВБазе(Эл.Дата, Эл.ВнешнийКод);

           

            //Проверяем есть ли заявка в базе

            Если ЗначениеЗаполнено(РезПроверки) Тогда

                        Док = РезПроверки.ПолучитьОбъект();

            Иначе 

                        Док = Документы.УКЕДС_Заявки.СоздатьДокумент(); 

            КонецЕсли;

                       

            Док.Дата = Эл.Дата; 

            Док.ДатаВремяПриема = Эл.Дата;

            Док.ПлановаяДатаНачалаВыполнения = Эл.Дата;

            Док.ПлановаяДатаОкончанияВыполнения = Эл.ПлановаяДатаОкончанияВыполнения;

           

            Док.УКЖКХ_АдресАЗ = ПоискПомещения(Эл.УКЖКХ_АдресАЗ);

            Док.ПодъездАЗ = Эл.ПодъездАЗ;

            Док.ЭтажАЗ = Эл.ЭтажАЗ;

            Док.ДомофонАЗ = Эл.ДомофонАЗ;

           

            Док.Телефон = Эл.Телефон;

            Док.ТелефонДоп = Эл.ТелефонДоп;

            Док.Содержание = Эл.Содержание;

            Док.СтатусЗаявителя = Эл.СтатусЗаявителя;

            Док.Фамилия = Эл.Фамилия;

            Док.ВидЗаявки = Эл.ВидЗаявки;

            Док.ВнешнийКод = Эл.ВнешнийКод;

           

            Док.Записать(); 

           

КонецПроцедуры//ДобавитьЗаявку

 

&НаСервере

Процедура ПрочитатьСообщениеЧерезСервис()

            Выборка = Справочники.БАШНЯ_ПараметрыПодключенияКСервисуЕДСП.Выбрать();

            ЭтотУзел = ПланыОбмена.БАШНЯ_ЗаявкиИзПодольска.ЭтотУзел();

           

            Если НЕ ЗначениеЗаполнено(ЭтотУзел.Код) Тогда

                        Возврат;

            КонецЕсли;

           

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

                        Если Выборка.ПометкаУдаления = Ложь Тогда

                                   Соединение = Новый HTTPСоединение(Выборка.АдресПубликации, Выборка.Порт, Выборка.Логин, Выборка.Пароль,,30,,);

                                                                      

                                   Заголовки = Новый Соответствие;             

                                   Заголовки.Вставить("Content-Type", "application/xml");

                                                                      

                                   Запрос = Новый HTTPЗапрос("/" + Выборка.Наименование + "/hs/EDSP/planobmena/" + ЭтотУзел.Код, Заголовки);

                                   Результат = Соединение.ВызватьHTTPМетод("GET", Запрос);

                                  

                                   Если Результат.КодСостояния = 200 Тогда

                                              

                                               ЧтениеXML = Новый ЧтениеXML;

                                               ЧтениеXML.УстановитьСтроку(Результат.ПолучитьТелоКакСтроку());

                                              

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

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

                                              

                                               //Снимаем с регистрации

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

                                              

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

                                                           СтруктураДанных = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);       

                                                           ДобавитьЗаявку(СтруктураДанных);

                                               КонецЦикла;

                                              

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

                                              

                                   Иначе

                                   КонецЕсли;

                                  

                        КонецЕсли;

            КонецЦикла;

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

 

 

&НаСервере

Процедура ЗаписатьСообщениеЧерезСервис()

            Выборка = Справочники.БАШНЯ_ПараметрыПодключенияКСервисуЕДСП.Выбрать();

            ЭтотУзел = ПланыОбмена.БАШНЯ_ЗаявкиИзПодольска.ЭтотУзел();

           

            Если НЕ ЗначениеЗаполнено(ЭтотУзел.Код) Тогда

                        Возврат;

            КонецЕсли;   

           

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

                        Если Выборка.ПометкаУдаления = Ложь Тогда

                                   Соединение = Новый HTTPСоединение(Выборка.АдресПубликации, Выборка.Порт, Выборка.Логин, Выборка.Пароль,,30,,);

                                  

                                   Заголовки = Новый Соответствие;             

                                   Заголовки.Вставить("Content-type", "application/xml;  charset=utf-8");

                                                                      

                                   Запрос = Новый HTTPЗапрос("/" + Выборка.Наименование + "/hs/EDSP/planobmena/" + ЭтотУзел.Код, Заголовки);

           

                                   ЗаписьXML = Новый ЗаписьXML;

                                   ЗаписьXML.УстановитьСтроку();

                                   ЗаписьXML.ЗаписатьОбъявлениеXML();

                                  

                                   //Создаем запись сообшения

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

                                   ТекУзел = ПланыОбмена.БАШНЯ_ЗаявкиИзПодольска.НайтиПоКоду(Выборка.ПрефиксБазы);

                                   Если НЕ ЗначениеЗаполнено(ТекУзел.Код) Тогда

                                               Возврат;

                                   КонецЕсли;   

                                   ЗаписьСообщения.НачатьЗапись(ЗаписьXML, ТекУзел);                                                                     

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

                                   НаВыходе = ЗаписьXML.Закрыть();          

                                              

                                   Запрос.УстановитьТелоИзСтроки(НаВыходе);                                       

                                  

                                   Результат = Соединение.ВызватьHTTPМетод("POST", Запрос);

                                  

                                   Если Результат.КодСостояния = 200 Тогда

                                   Иначе

                                   КонецЕсли;

                                  

                        КонецЕсли;

            КонецЦикла;

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

 

 

&НаСервере

Процедура ДляРегламентногоЗадания() Экспорт

            ПрочитатьСообщениеЧерезСервис();

            ЗаписатьСообщениеЧерезСервис();

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

 

            Кроме того, необходимо настроить права доступа для HTTP-сервиса и планов обмена в свойствах. В планах обмена права устанавливаются на закладке «Права» в конфигураторе. Для HTTP-сервисов права следует устанавливать для методов через контекстное меню «Дополнительно».

            В пользовательском режиме нужно заполнить параметры подключения к HTTP-сервису в справочнике «Параметры подключения к сервису ЕДСП», который находится в базе-приемнике.

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

 

Рис. Узлы планов обмена (база-источник слева, база-приемник справа)

 

            Далее в пользовательском режиме в базе-приемнике нужно настроить расписание и включить регламентное задание «Обмен с Подольском». Остальное дело техники.