Каталог решений - Бесшовная интеграция через обмен по правилам — миссия выполнима

Бесшовная интеграция через обмен по правилам — миссия выполнима

Бесшовная интеграция через обмен по правилам — миссия выполнима

В наличии

При организации работы с договорами в ERP 2, с помощью бесшовной интеграции с Документооборотом, «типовой» методикой является создание договоров в ЕРП. После создания договора в ЕРП, пользователь «отправляет» договор в ДО по бесшовной интеграции.
На практике, весьма часто пользователи хотят видеть обратную схему: вводить договоры в ДО и при этом получать их в ЕРП без «лишних телодвижений». Или даже вводить их независимо в обеих системах – так, чтобы потом «стыковать» по каким-то определенным правилам.

Категория:

Описание

С помощью несложной доработки «штатного» обмена по правилам можно добиться требуемого результата. Данная заметка посвящена одной конкретной задаче, в рамках этого проекта – установке «бесшовной» связи, между синхронизируемыми по правилам КД2 объектами ДО и ЕРП.

Вводная.

Имеем: ЕРП 2.4 + Документооборот КОРП, между которыми:

  1. Настроена бесшовная интеграция.
  2. Настроен  штатный обмен по правилам (КД2).

Сначала, в штатном обмене была выполнена доработка: выгружать из ДО в ЕРП зарегистрированные договоры; т.е., элементы справочника ДО «ВнутренниеДокументы», расположенные в определенной папке «Договоры», выгружаются в справочник «ДоговорыКонтрагентов» ЕРП.

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

Объекты сопоставляются по сочетанию реквизитов Номер+Валюта+Контрагент.

Задача.

При синхронизации (по правилам обмена), информация из реквизитов объекта ДО переносится в ЕРП. Но при этом, необходимо также, чтобы в ЕРП, в карточке договора, на вкладке «Документооборот» автоматически устанавливалась связь с объектом документооборота:

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

 

Решение.

Предварительные соображения:

  1. В ЕРП, на вкладке «Документооборот» в карточке объекта (см. скрин выше), можно подсмотреть, каким образом создается связь между объектами ЕРП и ДО. Поковырявшись, приходим к тому, что основное волшебство заключается в такой строке кода:
                ИнтеграцияС1СДокументооборотВызовСервера.ДобавитьСвязь(ID,
                               Тип,
                               Ссылка);

где «ID» — GUID объекта ДО, «Тип» в нашем случае будет строчка "DMInternalDocument", «Ссылка» – ссылка на объект ЕРП.

Примечание:  для добавления связи необходимо, чтобы «канал» бесшовной связи с ДО был активен – как это сделать, подглядел в этой процедуре:

	ИнтеграцияС1СДокументооборотКлиент.ПроверитьПодключение(…);

Отсюда нам надо то, что можем выполнить на сервере.

Чтобы не тащить весь код, я в коде прописал пользователя и пароль и сразу устанавливаю соединение (см. в итоговом коде).

 

  1. При штатной синхронизации (по правилам обмена) в ЕРП, в регистр сведений «СоответствияОбъектовИнформационныхБаз» добавляется запись, сопоставляющая синхронизированные объекты ЕРП и ДО:

Здесь:

  • Измерения:
    • УникальныйИдентификаторПриемникаGUID объекта ДО
    • УникальныйИдентификаторИсточникассылка на объект ЕРП
    • ТипПриемника – в нашем случае это строка «СправочникСсылка.ВнутренниеДокументы»
    • ТипИсточника – в нашем случае это строка «СправочникСсылка.ДоговорыКонтрагентов»
    • УзелИнформационнойБазы – узел плана обмена «ОбменУправлениеПредприятиемДокументооборот20», соответствующий базе ДО (код = «DO»).
  • Ресурсы:
    • УникальныйИдентификаторИсточникаСтрокойGUID объекта ЕРП.

С помощью этого регистра, для загруженного в ЕРП объекта, мы можем узнать GUID соответствующего объекта ДО.

 

Идея решения:

Для каждого загруженного объекта-договора, запустить тот же механизм, который отрабатывает по клику на гиперссылку «создать» на вкладке «Документооборот» в ЕРП  (передав туда сведения из регистра сведений «СоответствияОбъектовИнформационныхБаз»).

Еще одно соображение.

В обмен один и тот же договор может попасть более одного раза. Поэтому, прежде чем запускать процедуру установки связи, стоит проверить – а не создана ли уже такая связь?

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

РегистрыСведений.ОбъектыИнтегрированныеС1СДокументооборотом.ДобавитьСвязь(ID, Тип, ИнтегрированныйОбъект);

Этот регистр имеет три измерения:

Собственно, по наличию/отсутствию записи в этом регистре и можно определять наличие/отсутствие связи между объектами ДО и ЕРП.

 

Реализация:

  1. Инициируем в обработчике «Перед загрузкой данных» конвертации новый параметр МассивЗагруженныхДоговоров.
Параметры.Вставить("МассивЗагруженныхДоговоров", Новый Массив);
  1. В обработчике «ПослеЗагрузки» ПКО договоров, надо сохранить загруженные объекты в этот массив – для удобства вынесем эту короткую процедуру в отдельный алгоритм, назовем его «ДобавитьОбъектВМассивПриНеобходимости»:
Если ОбъектНайден Тогда
	Параметры.МассивЗагруженныхДоговоров.Добавить(Ссылка);
Иначе     
	Параметры.МассивЗагруженныхДоговоров.Добавить(Объект.ПолучитьСсылкуНового());
КонецЕсли;

 

Не забыли вызвать алгоритм в обработчике «После загрузки» ПКО:

выполнить(Алгоритмы.ДобавитьОбъектВМассивПриНеобходимости);

 

  1. Пишем код (опять же, удобно поместить все в отдельный алгоритм; назовем его «СоздатьСвязиСОбъектамиДО»), который собственно будет все выполнять. В запросе сразу отсекаем объекты, для которых уже установлены связи:

 

	Узел = ПланыОбмена.ОбменУправлениеПредприятиемДокументооборот20.НайтиПоКоду("DO");
	
	Если ЗначениеЗаполнено(Узел) Тогда
		
		// открываем "канал связи"
		ИспользуетсяАутентификацияОС = Ложь;
		ИмяПользователя = "Тот-Кого-нельзя-называть";
		Пароль = "Волан-Де-Морт";
		ТекстСообщенияОбОшибке = "";
		
		Если ИнтеграцияС1СДокументооборотВызовСервера.ПроверитьПодключение(
			, 
			ИмяПользователя,
			Пароль,
			ТекстСообщенияОбОшибке) Тогда
			
			ИнтеграцияС1СДокументооборотВызовСервера.УстановитьНастройкиАвторизацииВПараметрыСеанса(
				ИмяПользователя, Пароль, ИспользуетсяАутентификацияОС);
				
			// Получаем, запросом по ссылкам на загруженные объекты, сведения из регистра сведений «СоответствияОбъектовИнформационныхБаз» 
			ТипОбъектаДокументооборота = "DMInternalDocument";
			Запрос = Новый Запрос;
			Запрос.Текст = 
				"ВЫБРАТЬ
				|	соотв.УникальныйИдентификаторИсточника КАК Ссылка,
				|	соотв.УникальныйИдентификаторИсточникаСтрокой КАК GUID,
				|	соотв.УникальныйИдентификаторПриемника КАК ID
				|ИЗ
				|	РегистрСведений.СоответствияОбъектовИнформационныхБаз КАК соотв
				|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОбъектыИнтегрированныеС1СДокументооборотом КАК УжеИнтегрированные
				|		ПО соотв.УникальныйИдентификаторИсточника = УжеИнтегрированные.Объект
				|		И соотв.УникальныйИдентификаторПриемника = УжеИнтегрированные.ИдентификаторОбъектаДокументооборота
				|		И УжеИнтегрированные.ТипОбъектаДокументооборота = &ТипОбъектаДокументооборота
				|ГДЕ
				|	соотв.УникальныйИдентификаторИсточника В(&МассивСсылок)
				|	И соотв.ТипПриемника = &ТипПриемника
				|	И соотв.ТипИсточника = &ТипИсточника
				|	И соотв.УзелИнформационнойБазы = &УзелИнформационнойБазы
				|	И УжеИнтегрированные.ИдентификаторОбъектаДокументооборота ЕСТЬ NULL";
			
			Запрос.УстановитьПараметр("ТипИсточника", "СправочникСсылка.ДоговорыКонтрагентов");
			Запрос.УстановитьПараметр("ТипПриемника", "СправочникСсылка.ВнутренниеДокументы");
			Запрос.УстановитьПараметр("УзелИнформационнойБазы", Узел);
			Запрос.УстановитьПараметр("МассивСсылок", Параметры.МассивЗагруженныхДоговоров);
			Запрос.УстановитьПараметр("ТипОбъектаДокументооборота", ТипОбъектаДокументооборота);
			
			РезультатЗапроса = Запрос.Выполнить();
			
			Выборка = РезультатЗапроса.Выбрать();
			
			Пока Выборка.Следующий() Цикл
			
				GUID = Строка(Выборка.Ссылка.УникальныйИдентификатор());
				
				Если GUID = Выборка.GUID Тогда
					
					// Передаем исполнение в штатную процедуру создания связи с объектом ДО				
					ИнтеграцияС1СДокументооборотВызовСервера.ДобавитьСвязь(Выборка.ID,
						ТипОбъектаДокументооборота,
						Выборка.Ссылка);
					
				КонецЕсли;
			
			КонецЦикла;
			
		Иначе
				
			// Cообщаем об ошибках в ЖР
			ИмяСобытия = "Загрузка договоров из Документооборот";
			Комментарий = ТекстСообщенияОбОшибке; //"Не удалось найти установить подключение к Документооборот!";
			ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Предупреждение,,,Комментарий);
			
		КонецЕсли;
		
	Иначе
		
		// Cообщаем об ошибках в ЖР
		ИмяСобытия = "Загрузка договоров из Документооборот";
		Комментарий = "Не удалось найти узел Документооборот по коду ""DO""!";
		ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Предупреждение,,,Комментарий);
		
	КонецЕсли; 
	
  1. Добавляем вызов алгоритма в обработчике «После загрузки данных» конвертации:
выполнить(Алгоритмы.СоздатьСвязиСОбъектамиДО);

 

Готово.

Замечание: На стороне ДО, результат создания связи можно увидеть в регистре сведений ДО «СвязиОбъектовИнтегрированныхСистем»:

Здесь, «Идентификатор внешнего объекта» — это GUID объекта ЕРП.

 

P.S. Разумеется, описанный прием не ограничивается только организацией договорной работы между системами ЕРП и ДО.

has been added to your cart:
Оформление заказа