From 78c25277c873caae6d82a48de7f0dc48bc7446ff Mon Sep 17 00:00:00 2001 From: mihailkudravcev Date: Thu, 30 Jul 2026 15:48:59 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BC=D0=B5=D0=BD=20=E2=80=94=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=D1=91=D0=BC=20=D0=A1=D0=A4=20=D0=B2=D1=8B?= =?UTF-8?q?=D0=B4=D0=B0=D0=BD=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=B1=D0=B5=D0=B7?= =?UTF-8?q?=20=D0=BF=D0=BE=D0=BB=D0=B5=D0=B9=20=D0=B0=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D1=81=D0=B0=20=D0=B2=20=D0=A2=D0=A7=20(1.3.0.47).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Не писать СвойстваОтсутствующиеВПолученныхДанных в строку ТЧ без ДополнительныеСвойства. Co-authored-by: Cursor --- CHANGELOG.md | 12 ++ VERSION | 2 +- src/CommonModules/ОбменДаннымиXDTOСервер.xml | 23 +++ .../ОбменДаннымиXDTOСервер/Ext/Module.bsl | 162 ++++++++++++++++++ src/Configuration.xml | 3 +- 5 files changed, 200 insertions(+), 2 deletions(-) create mode 100644 src/CommonModules/ОбменДаннымиXDTOСервер.xml create mode 100644 src/CommonModules/ОбменДаннымиXDTOСервер/Ext/Module.bsl diff --git a/CHANGELOG.md b/CHANGELOG.md index 79dbdab..e88ce25 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,18 @@ --- +## 1.3.0.47 (2026-07-30) + +### Обмен — приём СФ выданного без полей аванса в ТЧ + +Модуль: `ОбменДаннымиXDTOСервер` (`&ИзменениеИКонтроль` `КонвертацияСвойстваСтруктурыОбъектаXDTO`). + +Пакет из **crm3-dev** в `ПлатежноРасчетныеДокументы` передаёт только `ДатаДокумента` / `НомерДокумента`. Целевое ПКО также ждёт поля аванса (`ДатаИсправленияСчетаФактурыНаАванс` и др.). Типовой код при отсутствии свойства писал в `ПриемникДанных.ДополнительныеСвойства`, но у строки ТЧ этого поля нет → ошибка конвертации. + +Исправление: фиксировать `СвойстваОтсутствующиеВПолученныхДанных` только если у приёмника есть `ДополнительныеСвойства`. + +--- + ## 1.3.0.46 (2026-07-30) ### Обмен — приоритетный ВидНоменклатуры из ра_ВидНоменклатурыCRM326 diff --git a/VERSION b/VERSION index 20541a7..6116c79 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.3.0.46 +1.3.0.47 diff --git a/src/CommonModules/ОбменДаннымиXDTOСервер.xml b/src/CommonModules/ОбменДаннымиXDTOСервер.xml new file mode 100644 index 0000000..5dc9f5c --- /dev/null +++ b/src/CommonModules/ОбменДаннымиXDTOСервер.xml @@ -0,0 +1,23 @@ + + + + + + Module + Extended + + + + Adopted + ОбменДаннымиXDTOСервер + + 4c8eb34e-0bb6-487a-a2ae-24083b1f6d2e + false + false + true + true + true + false + + + diff --git a/src/CommonModules/ОбменДаннымиXDTOСервер/Ext/Module.bsl b/src/CommonModules/ОбменДаннымиXDTOСервер/Ext/Module.bsl new file mode 100644 index 0000000..83c4067 --- /dev/null +++ b/src/CommonModules/ОбменДаннымиXDTOСервер/Ext/Module.bsl @@ -0,0 +1,162 @@ +// Исправление падения приёма XDTO: отсутствующие свойства формата в строке ТЧ. +// Типовой код пишет в ПриемникДанных.ДополнительныеСвойства, но у строки ТЧ этого поля нет +// (типичный кейс: СчетФактураВыданный.ПлатежноРасчетныеДокументы из crm3-dev без полей аванса). + +&ИзменениеИКонтроль("КонвертацияСвойстваСтруктурыОбъектаXDTO") +Процедура РК_КонвертацияСвойстваСтруктурыОбъектаXDTO( + КомпонентыОбмена, + ДанныеXDTO, + ДополнительныеСвойства, + ПриемникДанных, + ПКС, + НомерЭтапа = 1, + ИмяТЧ = "") + // Обрабатывается ПКС где указано только свойство формата - оно используется только при выгрузке. + Если СокрЛП(ПКС.СвойствоКонфигурации) = "" Тогда + Возврат; + КонецЕсли; + + ПравилоКонвертацииСвойства = ПКС.ПравилоКонвертацииСвойства; + + ЗначениеСвойства = ""; + Попытка + Если НомерЭтапа = 1 Тогда + + Если Не ЗначениеЗаполнено(ПКС.СвойствоФормата) Тогда + Возврат; + КонецЕсли; + + Если ПКС.ОбработкаКлючевогоСвойства + И Не ДанныеXDTO.Свойство("ЭтоНаборКлючевыхСвойств") Тогда + ИсточникДанных = ДанныеXDTO[КлассКлючевыеСвойства()]; + Иначе + ИсточникДанных = ДанныеXDTO; + КонецЕсли; + + СвойствоФормата_Имя = СокрЛП(ПКС.СвойствоФормата); + ПозицияТочки = СтрНайти(СвойствоФормата_Имя, "."); + // Указано полное имя свойства, входящего в группу общих свойств. + Если ПозицияТочки > 0 Тогда + ВложенныеСвойства = СтрРазделить(СвойствоФормата_Имя,".",Ложь); + ПолучитьЗначениеВложенныхСвойств(ИсточникДанных, ВложенныеСвойства, ЗначениеСвойства); + Иначе + + Если НЕ ИсточникДанных.Свойство(СвойствоФормата_Имя, ЗначениеСвойства) + И НЕ ПКС.ОбработкаКлючевогоСвойства + И НЕ ПКС.ИспользуетсяАлгоритмКонвертации + Тогда + + #Удаление + Если ПриемникДанных.ДополнительныеСвойства.Свойство("СвойстваОтсутствующиеВПолученныхДанных") Тогда + + ПриемникДанных.ДополнительныеСвойства.СвойстваОтсутствующиеВПолученныхДанных = ПриемникДанных.ДополнительныеСвойства.СвойстваОтсутствующиеВПолученныхДанных + "," + СвойствоФормата_Имя; + + Иначе + + ПриемникДанных.ДополнительныеСвойства.Вставить("СвойстваОтсутствующиеВПолученныхДанных", СвойствоФормата_Имя); + + КонецЕсли; + #КонецУдаления + #Вставка + // === [РК] НАЧАЛО БЛОКА ВСТАВКИ === + // У строки ТЧ нет ДополнительныеСвойства (пакет без опциональных полей формата, + // например ДатаИсправленияСчетаФактурыНаАванс из crm3-dev). + Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(ПриемникДанных, "ДополнительныеСвойства") Тогда + + Если ПриемникДанных.ДополнительныеСвойства.Свойство("СвойстваОтсутствующиеВПолученныхДанных") Тогда + + ПриемникДанных.ДополнительныеСвойства.СвойстваОтсутствующиеВПолученныхДанных = + ПриемникДанных.ДополнительныеСвойства.СвойстваОтсутствующиеВПолученныхДанных + "," + СвойствоФормата_Имя; + + Иначе + + ПриемникДанных.ДополнительныеСвойства.Вставить("СвойстваОтсутствующиеВПолученныхДанных", СвойствоФормата_Имя); + + КонецЕсли; + + КонецЕсли; + // === [РК] КОНЕЦ БЛОКА ВСТАВКИ === + #КонецВставки + + КонецЕсли; + + КонецЕсли; + + ИначеЕсли НомерЭтапа = 2 Тогда + + Если НомерЭтапа = 2 И Не ПКС.ИспользуетсяАлгоритмКонвертации Тогда + Возврат; + КонецЕсли; + + // На 2-м этапе значения свойств получаются из дополнительных свойств объекта полученных данных + // и представляют из себя структуру, содержащую инструкцию для конвертации, либо значение XDTO. + // Если приемником значения является строка табличной части, то значение свойства располагается + // в ДополнительныеСвойства[ИмяТабличнойЧасти][ИндексСтроки]. + Если ЗначениеЗаполнено(ИмяТЧ) Тогда + ИсточникДанных = ДополнительныеСвойства[ИмяТЧ][ПриемникДанных.НомерСтроки - 1]; + Иначе + ИсточникДанных = ДополнительныеСвойства; + КонецЕсли; + + Если ИсточникДанных.Свойство(ПКС.СвойствоКонфигурации) Тогда + ЗначениеСвойства = ИсточникДанных[ПКС.СвойствоКонфигурации]; + КонецЕсли; + + КонецЕсли; + + Если Не ЗначениеЗаполнено(ЗначениеСвойства) Тогда + Возврат; + КонецЕсли; + + УдалятьСозданныеПоКлючевымСвойствам = КомпонентыОбмена.УдалятьСозданныеПоКлючевымСвойствам; + Если ТипЗнч(ЗначениеСвойства) = Тип("Структура") + И ЗначениеСвойства.Свойство("ИмяПКО") + И ЗначениеСвойства.Свойство("Значение") Тогда + + // Значением является инструкция. + Если ЗначениеСвойства.Свойство("УдалятьСозданныеПоКлючевымСвойствам") Тогда + УдалятьСозданныеПоКлючевымСвойствам = ЗначениеСвойства.УдалятьСозданныеПоКлючевымСвойствам; + КонецЕсли; + + ПравилоКонвертацииСвойства = ЗначениеСвойства.ИмяПКО; + ЗначениеСвойства = ЗначениеСвойства.Значение; + + КонецЕсли; + + Если ТипЗнч(ЗначениеСвойства) = Тип("Структура") Тогда + Если Не ЗначениеЗаполнено(ПравилоКонвертацииСвойства) Тогда + Возврат; + КонецЕсли; + + ПКПД = КомпонентыОбмена.ПравилаКонвертацииПредопределенныхДанных.Найти(ПравилоКонвертацииСвойства, "ИмяПКПД"); + Если ПКПД <> Неопределено Тогда + + Значение = ПКПД.КонвертацииЗначенийПриПолучении.Получить(ЗначениеСвойства.Значение); + ПриемникДанных[ПКС.СвойствоКонфигурации] = Значение; + Возврат; + + Иначе + ПравилоКонвертацииСвойства = ПКОПоИмени(КомпонентыОбмена, ПравилоКонвертацииСвойства); + КонецЕсли; + Иначе + // Конвертацию простых свойств выполняем только на 1-м этапе. + ПриемникДанных[ПКС.СвойствоКонфигурации] = ЗначениеСвойства; + Возврат; + КонецЕсли; + + ПравилоКонвертации = Новый Структура("ПравилоКонвертации, УдалятьСозданныеПоКлючевымСвойствам", + ПравилоКонвертацииСвойства, УдалятьСозданныеПоКлючевымСвойствам); + ДанныеДляЗаписиВИБ = СтруктураОбъектаXDTOВДанныеИБ(КомпонентыОбмена, ЗначениеСвойства, ПравилоКонвертации, "ПолучитьСсылку"); + + Если ДанныеДляЗаписиВИБ <> Неопределено Тогда + ПриемникДанных[ПКС.СвойствоКонфигурации] = ДанныеДляЗаписиВИБ.Ссылка; + КонецЕсли; + + Исключение + ПредставлениеОшибки = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Ошибка конвертации свойства объекта XDTO, имя свойства: <%1>.'"), ПКС.СвойствоКонфигурации) + + Символы.ПС + Символы.ПС + ПредставлениеОшибки; + ВызватьИсключение ТекстОшибки; + КонецПопытки; + +КонецПроцедуры diff --git a/src/Configuration.xml b/src/Configuration.xml index 4cb1ca7..e562f96 100644 --- a/src/Configuration.xml +++ b/src/Configuration.xml @@ -62,7 +62,7 @@ Role.РК_ОсновнаяРоль - 1.3.0.46 + 1.3.0.47 Language.Русский @@ -97,6 +97,7 @@ РК_ОбщегоНазначенияВызовСервера ОбщегоНазначенияКлиентСервер МенеджерОбменаЧерезУниверсальныйФормат + ОбменДаннымиXDTOСервер ПартнерыИКонтрагентыЛокализация EnterpriseData_1_8_7 EnterpriseData_1_8_6