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