Гарантированное исключение организации из обмена в УНФ 1.6
Как я ранее писал, я попробовал исключать организации из регистрации в плане обмена. Но это не помогло. Пользователи поправили документы, но все равно обмен не пошел. Тогда я начал искать другие документы, из которых тянутся эти организации.
Но увы, обмен после этого не заработал. В файле обмена я по-прежнему видел ненужную организацию.
Я попробовал разобраться, обнаружил, что в документе «Поступление на счет» фиксируется зачем-то банковский счет контрагента, хотя поступление идет на счет организации. А т.к. банковский счет контрагента задан только по одной организации, не по той, которая идет в обмен, выгружается этот счет и его организация. Очистил этот счет, но не помогло.
В конечном итоге я устал от борьбы и поиска ошибок и поставил условие, запрещающее выгрузку ненужных организаций, в расширение в модуль ОбменДаннымиXDTOСервер:
&Вместо("ПриОтправкеДанных") Процедура дор_ПриОтправкеДанных(ДанныеИБ, ДанныеXDTO, Знач ИмяОбработчика, КомпонентыОбмена, СтекВыгрузки) //Осипов 2021-07-26 Если ТипЗнч(ДанныеИБ) = Тип("СправочникСсылка.Организации") И КомпонентыОбмена.Свойство("УзелКорреспондента") И ТипЗнч(КомпонентыОбмена.УзелКорреспондента) = Тип("ПланОбменаСсылка.СинхронизацияДанныхЧерезУниверсальныйФормат") И КомпонентыОбмена.УзелКорреспондента.ИспользоватьОтборПоОрганизациям И КомпонентыОбмена.УзелКорреспондента.Организации.Найти(ДанныеИБ, "Организация") = Неопределено Тогда Возврат; //Не выгружаем лишние организации КонецЕсли; ПродолжитьВызов(ДанныеИБ, ДанныеXDTO, ИмяОбработчика, КомпонентыОбмена, СтекВыгрузки); КонецПроцедуры
Я поставил именно на это событие, потому что к моему удивлению, сама дальнейшая конвертация происходит в модуле «МенеджерОбменаЧерезУниверсальныйФормат16«, а ведь есть еще модули «МенеджерОбменаЧерезУниверсальныйФормат18«, т.е. лучше не ставить расширения на такие модули, которые зависят от версии Enterprise-данных. В них исполнение переходит уже после модуля » ОбменДаннымиXDTOСервер«.
Я поставил отладку в своем расширении и с удивлением обнаружил, что там еще одна организация пытается пролезть через фильтр. Она тоже не пошла.
Я думал, сработает ли так, если просто не давать выгружать организацию. Сработало. Данные загрузились в базу приемник. Понятно, что без организации ссылка на организацию не проставилась. Но по крайней мере, такой документ будет в непроведенном состоянии, но будет. И не будет стопорить остальной обмен.
Ужасно недоволен, как реализован обмен в типовых. Очень ненадежно.
Кстати, организация не загружалась в БП, потому что там была нетиповая БП (национализированная) и там не было какого-то регистра сведений. Но лишние организации там, в принципе и не нужны.
UPD 2021-10-12: выяснилось, что заплатку надо ставить на другую процедуру, потому что просто возврат из процедуры ПриОтправкеДанных не отменяет выгрузку организации, просто не заполняются ее некоторые поля. Нужно вызывать контроль при выгрузке свойства. Вот рабочий код:
&Вместо("ВыгрузитьСвойство") Процедура дор_ВыгрузитьСвойство(КомпонентыОбмена, ДанныеИБ, ПолучательСвойства, ПКС, СтекВыгрузки, ЭтапВыгрузки) //Осипов 2021-07-26 - переносим сюда //Если это организация, которая не нужна в получателе, убираем... Если ТипЗнч(ДанныеИБ) = Тип("СправочникСсылка.Организации") И КомпонентыОбмена.Свойство("УзелКорреспондента") И ТипЗнч(КомпонентыОбмена.УзелКорреспондента) = Тип("ПланОбменаСсылка.СинхронизацияДанныхЧерезУниверсальныйФормат") И КомпонентыОбмена.УзелКорреспондента.ИспользоватьОтборПоОрганизациям И КомпонентыОбмена.УзелКорреспондента.Организации.Найти(ДанныеИБ, "Организация") = Неопределено Тогда Возврат; //Не выгружаем лишние организации КонецЕсли; //Старый метод ПродолжитьВызов(КомпонентыОбмена, ДанныеИБ, ПолучательСвойства, ПКС, СтекВыгрузки, ЭтапВыгрузки); КонецПроцедуры
Объем: 1.5 час. Среда: УНФ 1.6.24.107
Я узнал про существование общего модуля ОбменДаннымиXDTOСервер. Это очень помогло ))
век живи — век учись