Дали задачу настроить типовой обмен УП2-БП3, но он не взлетал ни на одном из релизов. Два дня разбирался и нашёл несколько ошибок. Тестировалось на ERP (сначала на 2.5.8.267, а затем на последней 2.5.9.119, теоретически, актуально и для других версий) и БП3.
1. Первого рода ошибки (актуально для версии формата ED 1.10 и выше) - программная установка ПКС, а именно - "Справочник_НомераГТД_Отправка".
Процедура ПКО_Документ_ВозвратСырьяОтПереработчика25_Отправка_ПриОтправкеДанных(ДанныеИБ, ДанныеXDTO, КомпонентыОбмена, СтекВыгрузки)
//...
Если ВерсияФорматаЧислом(КомпонентыОбмена.ВерсияФорматаОбмена) >= ВерсияФорматаЧислом("1.10") Тогда
УстановитьПравилоДляПКСТабЧасти(КомпонентыОбмена,
"Документ_ВозвратСырьяОтПереработчика_Отправка",
"Товары",
"НомерГТД",
Истина,
"Справочник_НомераГТД_Отправка");
КонецЕсли;
//...
КонецПроцедуры
Тут для ПКО "Документ_ВозвратСырьяОтПереработчика_Отправка" устанавливается ПКС "Справочник_НомераГТД_Отправка", что является ошибкой, ведь, очевидно, должно относиться к ПКО "Документ_ВозвратСырьяОтПереработчика25_Отправка". Похоже, что разработчики тупо скопипастили его из другого ПКО. Такая ошибка присуща и другим ПКО (ПКО_Документ_ВозвратОтКомиссионера, ПКО_Документ_ПередачаПереработчику25 и ПКО_Документ_ПередачаТоваров_Реализация).
Если не исправить эти ПКО, то при выгрузке будет ошибка рода "Не заполнены номера ГТД в ТЧ", а номер гтд является ключевым (обязательным для заполнения) свойством.
2. Другую ошибку я нашёл в ИмяПКОДляОбъектаДанных(), где не для всех типов возвращается ПКО, соответственно, такой объект не будет выгружен или приведет к ошибке (как в моём случае с Документ.ОтчетПереработчика2_5). Исправил (но, возможно, нужно учесть и другие типы):
// Исправление поиска ПКО по типу "Документ.ОтчетПереработчика25"
&Вместо("ИмяПКОДляОбъектаДанных")
Функция ax_ИмяПКОДляОбъектаДанных(КомпонентыОбмена, Объект, Организация)
Если ТипЗнч(Объект) = Тип("ДокументСсылка.ОтчетПереработчика2_5") Тогда
Возврат "Документ_ОтчетПереработчика25_Отправка";
КонецЕсли;
Результат = ПродолжитьВызов(КомпонентыОбмена, Объект, Организация);
Возврат Результат;
КонецФункции
3. В моей базе установлена была функциональная опция "Использовать партнеров как контрагентов", соотвественно контрагенты открывались из партнеров. Хранить доп реквизиты в контрагентах было невозможно, форма партнера содержала только дополнительные реквизиты партнера. В обмене учавствуют лишь контрагенты. Была поставлена задача чтобы при выгрузке контрагентов в БП выгружать и дополнительные реквизиты партнера. Сделал так:
&После("ПКО_Справочник_Контрагенты_ПриОтправкеДанных")
Процедура ax_ПКО_Справочник_Контрагенты_ПриОтправкеДанных(ДанныеИБ, ДанныеXDTO, КомпонентыОбмена, СтекВыгрузки)
Если ПолучитьФункциональнуюОпцию("ИспользоватьПартнеровКакКонтрагентов") Тогда
// добавим в выгрузку доп. реквизиты партнера
Партнер = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ДанныеИБ.Ссылка, "Партнер");
Если ЗначениеЗаполнено(Партнер) Тогда
ВыгрузитьДополнительныеРеквизитыИСведения(КомпонентыОбмена, Партнер, ДанныеXDTO, Истина);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
4. Ошибка при выгрузке Счета-фактуры и корректировки от реализации с операциями "РеализацияЧерезКомиссионера" и "РеализацияЧерезКомиссионераБезПереходаПраваСобственности". Тут дело в том, что такие реализации не выгружаются:
Процедура ПОД_Документ_РеализацияТоваровУслуг_ПриОбработке(ДанныеИБ, ИспользованиеПКО, КомпонентыОбмена)
Если ДанныеИБ.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.РеализацияЧерезКомиссионера
Или ДанныеИБ.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.РеализацияЧерезКомиссионераБезПереходаПраваСобственности Тогда
ОчиститьИспользованиеПКО(ИспользованиеПКО)
КонецЕсли;
КонецПроцедуры
Но СФ и КР выгружаются, а уже при получении данных в БП идёт отложенная обработка данных, и некоторые обработчики "спотыкаются" на документ-основании, например, при выгрузке КР:
Процедура ОтложеннаяОбработка_КорректировкаРеализации(Объект, ПараметрыКонвертации, ОбъектМодифицирован)
//...
// Заполним свойства строк с ЕстьВДокументеРеализации из документа реализации
ДанныеЗаполнения = Документы.КорректировкаРеализации.ДанныеЗаполненияПоДокументу(Объект);
//...
КонецПроцедуры
Функция ДанныеЗаполненияПоДокументу(Объект) Экспорт
ДокументРеализации = Объект.ДокументРеализации;
НомераТаблиц = Новый Структура;
НеобходимоПроверитьПрослеживаемостьТоваров = Ложь;
Если ТипЗнч(ДокументРеализации) = Тип("ДокументСсылка.РеализацияТоваровУслуг")
ИЛИ ТипЗнч(ДокументРеализации) = Тип("ДокументСсылка.КорректировкаРеализации") Тогда
ИмяВидаДокумента = ДокументРеализации.Метаданные().Имя;
НеобходимоПроверитьПрослеживаемостьТоваров = ПолучитьФункциональнуюОпцию("ВестиУчетПрослеживаемыхТоваров")
И НЕ ПрослеживаемостьБРУ.ВедетсяУчетПрослеживаемыхТоваров(
ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.ИсходныйДокументРеализации, "Дата"));
КонецЕсли;
//...
КонецФункции
Тут будет ошибка, т.к. ИсходныйДокументРеализации = <Объект не найден>. Временно исправил в менеджео обмена в БП, чтобы хотя бы первый обмен прошёл:
&Вместо("ОтложеннаяОбработка_КорректировкаРеализации")
Процедура ax_ОтложеннаяОбработка_КорректировкаРеализации(Объект, ПараметрыКонвертации, ОбъектМодифицирован)
//...
Если ЗначениеЗаполнено(Объект.ИсходныйДокументРеализации) И Объект.ИсходныйДокументРеализации.ПолучитьОбъект() <> Неопределено Тогда
// Заполним свойства строк с ЕстьВДокументеРеализации из документа реализации
ДанныеЗаполнения = Документы.КорректировкаРеализации.ДанныеЗаполненияПоДокументу(Объект);
//...
КонецПроцедуры
5. При выгрузке Авансового отчета с расчетами в валюте отсутствуют данные по курсам взаиморасчетов.
Ошибка была связана с псевдонимами полей в запросе в ПОД: КурсЧислительВзаиморасчетов и КурсЗнаменательВзаиморасчетов вместо КурсВзаиморасчетов и КратностьВзаиморасчетов.
Отдельное спасибо Максиму Сухову (MaxS) и Дмитрию Иванову (ids79), по их статьям я знакомился с КД3.