Page tree
Skip to end of metadata
Go to start of metadata

Контекст

Адаптер должен содержать возможность простой доработки без потери поддержки:

  • со стороны пользователей, при встраивании в свои конфигурации
  • со стороны разработчиков адаптера, при добавлении в адаптер поддержки типовых конфигураций

Проблемы

В адаптере 2:

  • Переопределяемые процедуры находятся в ОМ нси_СинхронизацияДанныхПереопределяемый. Проблема в том, что состав этих процедур жестко фиксирован и если мы решим в адаптере добавить еще одну, нам придется вносить изменения в этот модуль (и он будет дважды изменённым).
  • Переопределяемые процедуры для типовых конфигураций находятся в соответствующих отдельных модулях, причем в этих модулях должны быть переопределены обязательно ВСЕ процедуры. Т.е. при добавлении новой переопределяемой процедуры нужно ее добавлять во все модули конфигураций

Решение

Для решения проблемы

  1. Из всех мест в алгоритмах, где есть логика, которую нужно переопределять вызываются функции ОМ нси_СинхронизацияДанныхОбщий (это уже есть в адаптере 2)
  2. В ОМ нси_СинхронизацияДанныхОбщий функции представляют собой просто обертки, из которых вызываются ВыполнитьПроцедуруМодуля и ВыполнитьФункциюМодуля из ОМ нси_СинхронизацияДанныхПереопределяемый (в адаптере 2 логика другая)
  3. В ОМ нси_СинхронизацияДанныхПереопределяемый добавляются экспортные функции ВыполнитьПроцедуруМодуля и ВыполнитьФункциюМодуля (ИмяМетода,...) которые:
    1. В зависимости от имени метода вызывают соответствующий метод данного модуля (закомментированный код в процедуре ВыполнитьФункциюМодуля)
    2. Если такого имени нет, то вызываются ВыполнитьПроцедуруМодуля и ВыполнитьФункциюМодуля модуля, относящегося к данной типовой конфигурации
  4. В модулях относящихся к типовым конфигурациям ВыполнитьПроцедуруМодуля и ВыполнитьФункциюМодуля работают аналогично, если в модуле нет нужного метода, то напрямую вызывается одноименный модуль ОМ нси_СинхронизацияДанныхУниверсальный


В результате пользователь сам сможет добавлять в нси_СинхронизацияДанныхПереопределяемый только нужные обработчики, при этом ему нужно будет

  • внести изменения в код методов ВыполнитьПроцедуруМодуля (), ВыполнитьФункциюМодуля (), добавив в условия ветку с вызовом нужной процедуры
  • добавить свою процедуру

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


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


Примеры:

Кусок кода ОМ нси_ИнтеграцияСRabbitMQ, вызов переопределяемой процедуры:

Процедура ОтправитьЧерезRabbitMQПолучателю(ПолучательДанных,ДанныеИБ,Клиент=Неопределено,Фабрика=Неопределено,ИздательЛОГ=Неопределено) Экспорт
 
 Если НЕ нси_СинхронизацияДанныхОбщий.МожноОтправлятьДанные(ДанныеИБ) Тогда
  Отказ=Истина;
  возврат;
 КонецЕсли; 


ОМ нси_СинхронизацияДанныхОбщий

Функция МожноОтправлятьДанные(ДанныеИБ) Экспорт
 Возврат нси_СинхронизацияДанныхПереопределяемый.ВыполнитьФункциюМодуля("МожноОтправлятьДанные",ДанныеИБ);
КонецФункции


ОМ СинхронизацияДанныхПереопределяемый

Функция ВыполнитьФункциюМодуля(ИмяПроцедуры,Параметр1="ПустойПараметр",Параметр2="ПустойПараметр",Параметр3="ПустойПараметр",Параметр4="ПустойПараметр",Параметр5="ПустойПараметр",Параметр6="ПустойПараметр") Экспорт
 
 //Если ИмяПроцедуры = "нси_ПолучитьМенеджерПоОписаниюОбъекта" Тогда
 // Возврат нси_ПолучитьМенеджерПоОписаниюОбъекта(Параметр1);
 //Иначе 
  СписокПараметров = нси_СинхронизацияДанныхУниверсальный.ПолучитьСтрокуПараметров(Параметр1,Параметр2,Параметр3,Параметр4,Параметр5,Параметр6);
  
  Результат = Неопределено;
  
  Модуль = нси_ОбщегоНазначенияПовтИсп.ПолучитьМодульСинхронизацияДанныхКонфигурации();
  
  Выполнить "Результат = Модуль." + ИмяПроцедуры + "(" + СписокПараметров + ")";
  
  Возврат Результат;
 //КонецЕсли; 
КонецФункции


ОМ нси_СинхронизацияДанныхMDM

Функция ВыполнитьФункциюМодуля(ИмяПроцедуры,Параметр1="ПустойПараметр",Параметр2="ПустойПараметр",Параметр3="ПустойПараметр",Параметр4="ПустойПараметр",Параметр5="ПустойПараметр",Параметр6="ПустойПараметр") Экспорт
 
 Если ИмяПроцедуры = "МожноОтправлятьДанные" Тогда
  Возврат МожноОтправлятьДанные(Параметр1);
 Иначе 
  СписокПараметров = нси_СинхронизацияДанныхУниверсальный.ПолучитьСтрокуПараметров(Параметр1,Параметр2,Параметр3,Параметр4,Параметр5,Параметр6);
  
  Результат = Неопределено;
  
  Выполнить "Результат = нси_СинхронизацияДанныхУниверсальный." + ИмяПроцедуры + "(" + СписокПараметров + ")";
  
  Возврат Результат;
 КонецЕсли; 
КонецФункции


ОМ нси_СинхронизацияДанныхУниверсальный

Функция МожноОтправлятьДанные(ДанныеИБ) Экспорт
 Возврат Истина;
КонецФункции


Функция СформироватьXSDСхему(ПолучательДанных,ДанныеИБ=Неопределено) Экспорт
 URIПространстваИмен="http://www.bitmdm.ru/data";
 
    Схема=нси_ИнтеграцияСRabbitMQ.нси_СоздатьСхему(URIПространстваИмен);
    
    //Вначале добавим в схему постоянные типы (одинаковые для всех правил мэппинга)
    нси_ИнтеграцияСRabbitMQ.ДополнитьСхемуПостояннымиТипами(ПолучательДанных,Схема);
  • No labels