1.3.1.123: fix журнала при fallback партнёра ED (#67).

Не вызывать ЗаписатьОшибкуВЖурналРегистрации с Неопределено; в предупреждение — meta/results load.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
mihailkudravcev
2026-10-07 12:12:49 +03:00
parent 8e6a8ce653
commit bd438a067b
4 changed files with 117 additions and 30 deletions
+7
View File
@@ -4,6 +4,13 @@
--- ---
## 1.3.1.123 (2026-10-07)
### Fix: журнал при fallback партнёра ED ([#67](https://git.p7net.ru/rhana/crm3-migration/issues/67) comment-1632)
- `ЗаписатьОшибкуВЖурналРегистрации` больше не вызывается с `Неопределено` (падение `.Метаданные` при create отсутствующего партнёра).
- В предупреждение попадают meta/results `partners/load`; `update_existing=true` чтобы дописать `РК_КодСтаройБазы` при match по имени.
## 1.3.1.122 (2026-10-07) ## 1.3.1.122 (2026-10-07)
### ED: fallback партнёра через Transfer API ([#67](https://git.p7net.ru/rhana/crm3-migration/issues/67)) ### ED: fallback партнёра через Transfer API ([#67](https://git.p7net.ru/rhana/crm3-migration/issues/67))
+1 -1
View File
@@ -1 +1 @@
1.3.1.122 1.3.1.123
@@ -1336,7 +1336,7 @@
ПартнерСсылка = РК_НайтиПартнераПоКодуСтаройБазы(КодПартнера); ПартнерСсылка = РК_НайтиПартнераПоКодуСтаройБазы(КодПартнера);
Если Не ЗначениеЗаполнено(ПартнерСсылка) Тогда Если Не ЗначениеЗаполнено(ПартнерСсылка) Тогда
ПартнерСсылка = РК_ОбеспечитьПартнераЧерезTransferAPI(КодПартнера, КомпонентыОбмена); ПартнерСсылка = РК_ОбеспечитьПартнераЧерезTransferAPI(КодПартнера, КомпонентыОбмена, Объект);
КонецЕсли; КонецЕсли;
Если Не ЗначениеЗаполнено(ПартнерСсылка) Тогда Если Не ЗначениеЗаполнено(ПартнерСсылка) Тогда
@@ -1381,13 +1381,20 @@
// Export с исходной ИБ (константа РК_РабочееПодключениеЧерезАПИ) + load через РВС_TransferAPIПартнеры. // Export с исходной ИБ (константа РК_РабочееПодключениеЧерезАПИ) + load через РВС_TransferAPIПартнеры.
// Как sync в transfer_partners.py для одного кода. Контрагентов из пакета не создаём (грузятся ED). // Как sync в transfer_partners.py для одного кода. Контрагентов из пакета не создаём (грузятся ED).
// //
Функция РК_ОбеспечитьПартнераЧерезTransferAPI(КодПартнера, КомпонентыОбмена) // Параметры:
// КодПартнера - Строка
// КомпонентыОбмена - Структура
// ОбъектКонтрагента - СправочникОбъект.Контрагенты, Неопределено — для журнала (нельзя Неопределено в ЗаписатьОшибкуВЖурналРегистрации).
//
Функция РК_ОбеспечитьПартнераЧерезTransferAPI(КодПартнера, КомпонентыОбмена, ОбъектКонтрагента = Неопределено)
КодПартнера = СокрЛП(КодПартнера); КодПартнера = СокрЛП(КодПартнера);
Если ПустаяСтрока(КодПартнера) Тогда Если ПустаяСтрока(КодПартнера) Тогда
Возврат Неопределено; Возврат Неопределено;
КонецЕсли; КонецЕсли;
СсылкаДляЖурнала = РК_СсылкаДляЖурналаКонтрагента(ОбъектКонтрагента);
РК_ИнициализироватьКешПартнеровПоКоду(КомпонентыОбмена); РК_ИнициализироватьКешПартнеровПоКоду(КомпонентыОбмена);
Если КомпонентыОбмена <> Неопределено Если КомпонентыОбмена <> Неопределено
И КомпонентыОбмена.Свойство("ПараметрыКонвертации") И КомпонентыОбмена.Свойство("ПараметрыКонвертации")
@@ -1413,24 +1420,22 @@
КонецПопытки; КонецПопытки;
Если Не ЗначениеЗаполнено(Подключение) Тогда Если Не ЗначениеЗаполнено(Подключение) Тогда
ЗаписатьОшибкуВЖурналРегистрации( РК_ЗаписатьПредупреждениеПартнераTransferAPI(
Неопределено, СсылкаДляЖурнала,
"РК_РабочееПодключениеЧерезАПИ не заполнено — нельзя выгрузить партнёра " "РК_РабочееПодключениеЧерезАПИ не заполнено — нельзя выгрузить партнёра "
+ КодПартнера + " из исходной ИБ.", + КодПартнера + " из исходной ИБ.",
КомпонентыОбмена, КомпонентыОбмена,
НСтр("ru = 'загрузить партнёра через Transfer API'"), НСтр("ru = 'загрузить партнёра через Transfer API'"));
УровеньЖурналаРегистрации.Предупреждение);
Возврат Неопределено; Возврат Неопределено;
КонецЕсли; КонецЕсли;
Если Метаданные.ОбщиеМодули.Найти("РВС_TransferAPIПартнеры") = Неопределено Тогда Если Метаданные.ОбщиеМодули.Найти("РВС_TransferAPIПартнеры") = Неопределено Тогда
ЗаписатьОшибкуВЖурналРегистрации( РК_ЗаписатьПредупреждениеПартнераTransferAPI(
Неопределено, СсылкаДляЖурнала,
"Модуль РВС_TransferAPIПартнеры недоступен (нужен ws-rhana) — партнёр " "Модуль РВС_TransferAPIПартнеры недоступен (нужен ws-rhana) — партнёр "
+ КодПартнера + " не загружен.", + КодПартнера + " не загружен.",
КомпонентыОбмена, КомпонентыОбмена,
НСтр("ru = 'загрузить партнёра через Transfer API'"), НСтр("ru = 'загрузить партнёра через Transfer API'"));
УровеньЖурналаРегистрации.Предупреждение);
Возврат Неопределено; Возврат Неопределено;
КонецЕсли; КонецЕсли;
@@ -1445,30 +1450,29 @@
Попытка Попытка
ОтветExport = РК_ОбменСВнешнейБазой.ПартнерыВнешнейБазы(Подключение, ПараметрыExport); ОтветExport = РК_ОбменСВнешнейБазой.ПартнерыВнешнейБазы(Подключение, ПараметрыExport);
Исключение Исключение
ЗаписатьОшибкуВЖурналРегистрации( РК_ЗаписатьПредупреждениеПартнераTransferAPI(
Неопределено, СсылкаДляЖурнала,
"partners/export код=" + КодПартнера + ": " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), "partners/export код=" + КодПартнера + ": " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),
КомпонентыОбмена, КомпонентыОбмена,
НСтр("ru = 'выгрузить партнёра из исходной ИБ'"), НСтр("ru = 'выгрузить партнёра из исходной ИБ'"));
УровеньЖурналаРегистрации.Предупреждение);
Возврат Неопределено; Возврат Неопределено;
КонецПопытки; КонецПопытки;
ПартнерыПакета = РК_ЗначениеСвойстваОтвета(ОтветExport, "partners"); ПартнерыПакета = РК_ЗначениеСвойстваОтвета(ОтветExport, "partners");
Если ТипЗнч(ПартнерыПакета) <> Тип("Массив") Или ПартнерыПакета.Количество() = 0 Тогда Если ТипЗнч(ПартнерыПакета) <> Тип("Массив") Или ПартнерыПакета.Количество() = 0 Тогда
ЗаписатьОшибкуВЖурналРегистрации( РК_ЗаписатьПредупреждениеПартнераTransferAPI(
Неопределено, СсылкаДляЖурнала,
"partners/export: партнёр с кодом " + КодПартнера + " не найден в исходной ИБ.", "partners/export: партнёр с кодом " + КодПартнера + " не найден в исходной ИБ.",
КомпонентыОбмена, КомпонентыОбмена,
НСтр("ru = 'выгрузить партнёра из исходной ИБ'"), НСтр("ru = 'выгрузить партнёра из исходной ИБ'"));
УровеньЖурналаРегистрации.Предупреждение);
Возврат Неопределено; Возврат Неопределено;
КонецЕсли; КонецЕсли;
ПараметрыLoad = Новый Структура; ПараметрыLoad = Новый Структура;
ПараметрыLoad.Вставить("dry_run", Ложь); ПараметрыLoad.Вставить("dry_run", Ложь);
ПараметрыLoad.Вставить("create_missing", Истина); ПараметрыLoad.Вставить("create_missing", Истина);
ПараметрыLoad.Вставить("update_existing", Ложь); // renew old_code даже при match по имени (иначе РК_КодСтаройБазы может не появиться).
ПараметрыLoad.Вставить("update_existing", Истина);
ПараметрыLoad.Вставить("bind_contractors", Ложь); ПараметрыLoad.Вставить("bind_contractors", Ложь);
ПараметрыLoad.Вставить("add_contacts", Ложь); ПараметрыLoad.Вставить("add_contacts", Ложь);
ПараметрыLoad.Вставить("old_code_mode", "renew"); ПараметрыLoad.Вставить("old_code_mode", "renew");
@@ -1478,12 +1482,11 @@
МодульПартнеров = ОбщегоНазначения.ОбщийМодуль("РВС_TransferAPIПартнеры"); МодульПартнеров = ОбщегоНазначения.ОбщийМодуль("РВС_TransferAPIПартнеры");
ОтветLoad = МодульПартнеров.ВыполнитьЗагрузку(ПараметрыLoad); ОтветLoad = МодульПартнеров.ВыполнитьЗагрузку(ПараметрыLoad);
Исключение Исключение
ЗаписатьОшибкуВЖурналРегистрации( РК_ЗаписатьПредупреждениеПартнераTransferAPI(
Неопределено, СсылкаДляЖурнала,
"partners/load код=" + КодПартнера + ": " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), "partners/load код=" + КодПартнера + ": " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),
КомпонентыОбмена, КомпонентыОбмена,
НСтр("ru = 'загрузить партнёра в целевую ИБ'"), НСтр("ru = 'загрузить партнёра в целевую ИБ'"));
УровеньЖурналаРегистрации.Предупреждение);
Возврат Неопределено; Возврат Неопределено;
КонецПопытки; КонецПопытки;
@@ -1493,12 +1496,12 @@
КонецЕсли; КонецЕсли;
Если Не ЗначениеЗаполнено(ПартнерСсылка) Тогда Если Не ЗначениеЗаполнено(ПартнерСсылка) Тогда
ЗаписатьОшибкуВЖурналРегистрации( РК_ЗаписатьПредупреждениеПартнераTransferAPI(
Неопределено, СсылкаДляЖурнала,
"partners/load: после загрузки партнёр с РК_КодСтаройБазы=" + КодПартнера + " не найден.", "partners/load: после загрузки партнёр с РК_КодСтаройБазы=" + КодПартнера
+ " не найден. " + РК_КраткоОтветPartnersLoad(ОтветLoad),
КомпонентыОбмена, КомпонентыОбмена,
НСтр("ru = 'загрузить партнёра в целевую ИБ'"), НСтр("ru = 'загрузить партнёра в целевую ИБ'"));
УровеньЖурналаРегистрации.Предупреждение);
Возврат Неопределено; Возврат Неопределено;
КонецЕсли; КонецЕсли;
@@ -1507,6 +1510,83 @@
КонецФункции КонецФункции
Функция РК_СсылкаДляЖурналаКонтрагента(ОбъектКонтрагента)
Если ОбъектКонтрагента = Неопределено Тогда
Возврат Справочники.Контрагенты.ПустаяСсылка();
КонецЕсли;
Попытка
Если ЗначениеЗаполнено(ОбъектКонтрагента.Ссылка) Тогда
Возврат ОбъектКонтрагента.Ссылка;
КонецЕсли;
Исключение
КонецПопытки;
Попытка
СсылкаНового = ОбъектКонтрагента.ПолучитьСсылкуНового();
Если ЗначениеЗаполнено(СсылкаНового) Тогда
Возврат СсылкаНового;
КонецЕсли;
Исключение
КонецПопытки;
Возврат Справочники.Контрагенты.ПустаяСсылка();
КонецФункции
// ЗаписатьОшибкуВЖурналРегистрации требует объектную ссылку (.Метаданные) — Неопределено недопустим.
//
Процедура РК_ЗаписатьПредупреждениеПартнераTransferAPI(СсылкаДляЖурнала, ТекстОшибки, КомпонентыОбмена, ОписаниеДействия)
Если Не ЗначениеЗаполнено(СсылкаДляЖурнала) Тогда
СсылкаДляЖурнала = Справочники.Контрагенты.ПустаяСсылка();
КонецЕсли;
ЗаписатьОшибкуВЖурналРегистрации(
СсылкаДляЖурнала,
ТекстОшибки,
КомпонентыОбмена,
ОписаниеДействия,
УровеньЖурналаРегистрации.Предупреждение);
КонецПроцедуры
Функция РК_КраткоОтветPartnersLoad(ОтветLoad)
Части = Новый Массив;
Мета = РК_ЗначениеСвойстваОтвета(ОтветLoad, "meta");
Если Мета <> Неопределено Тогда
Части.Добавить(СтрШаблон(
"meta created=%1 updated=%2 skipped=%3 errors=%4",
РК_ЗначениеСвойстваОтвета(Мета, "created", 0),
РК_ЗначениеСвойстваОтвета(Мета, "updated", 0),
РК_ЗначениеСвойстваОтвета(Мета, "skipped", 0),
РК_ЗначениеСвойстваОтвета(Мета, "errors", 0)));
КонецЕсли;
Результаты = РК_ЗначениеСвойстваОтвета(ОтветLoad, "results");
Если ТипЗнч(Результаты) = Тип("Массив") Тогда
Индекс = 0;
Для Каждого СтрокаРез Из Результаты Цикл
Индекс = Индекс + 1;
Если Индекс > 3 Тогда
Части.Добавить("…");
Прервать;
КонецЕсли;
Части.Добавить(СтрШаблон(
"[%1] status=%2 action=%3 message=%4",
Индекс,
РК_ЗначениеСвойстваОтвета(СтрокаРез, "status", ""),
РК_ЗначениеСвойстваОтвета(СтрокаРез, "action", ""),
РК_ЗначениеСвойстваОтвета(СтрокаРез, "message", "")));
КонецЦикла;
КонецЕсли;
Возврат СтрСоединить(Части, "; ");
КонецФункции
Процедура РК_ЗапомнитьПартнераВКешеСессии(КомпонентыОбмена, КодПартнера, ПартнерСсылка) Процедура РК_ЗапомнитьПартнераВКешеСессии(КомпонентыОбмена, КодПартнера, ПартнерСсылка)
РК_ИнициализироватьКешПартнеровПоКоду(КомпонентыОбмена); РК_ИнициализироватьКешПартнеровПоКоду(КомпонентыОбмена);
+1 -1
View File
@@ -62,7 +62,7 @@
<xr:Item xsi:type="xr:MDObjectRef">Role.РК_ОсновнаяРоль</xr:Item> <xr:Item xsi:type="xr:MDObjectRef">Role.РК_ОсновнаяРоль</xr:Item>
</DefaultRoles> </DefaultRoles>
<Vendor/> <Vendor/>
<Version>1.3.1.122</Version> <Version>1.3.1.123</Version>
<DefaultStyle/> <DefaultStyle/>
<DefaultLanguage>Language.Русский</DefaultLanguage> <DefaultLanguage>Language.Русский</DefaultLanguage>
<BriefInformation/> <BriefInformation/>