Обмен — приём СФ выданного без полей аванса в ТЧ (1.3.0.47).

Не писать СвойстваОтсутствующиеВПолученныхДанных в строку ТЧ без ДополнительныеСвойства.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
mihailkudravcev
2026-07-30 15:48:59 +03:00
parent 0ef87a322c
commit 78c25277c8
5 changed files with 200 additions and 2 deletions
+12
View File
@@ -4,6 +4,18 @@
--- ---
## 1.3.0.47 (2026-07-30)
### Обмен — приём СФ выданного без полей аванса в ТЧ
Модуль: `ОбменДаннымиXDTOСервер` (`&ИзменениеИКонтроль` `КонвертацияСвойстваСтруктурыОбъектаXDTO`).
Пакет из **crm3-dev** в `ПлатежноРасчетныеДокументы` передаёт только `ДатаДокумента` / `НомерДокумента`. Целевое ПКО также ждёт поля аванса (`ДатаИсправленияСчетаФактурыНаАванс` и др.). Типовой код при отсутствии свойства писал в `ПриемникДанных.ДополнительныеСвойства`, но у строки ТЧ этого поля нет → ошибка конвертации.
Исправление: фиксировать `СвойстваОтсутствующиеВПолученныхДанных` только если у приёмника есть `ДополнительныеСвойства`.
---
## 1.3.0.46 (2026-07-30) ## 1.3.0.46 (2026-07-30)
### Обмен — приоритетный ВидНоменклатуры из ра_ВидНоменклатурыCRM326 ### Обмен — приоритетный ВидНоменклатуры из ра_ВидНоменклатурыCRM326
+1 -1
View File
@@ -1 +1 @@
1.3.0.46 1.3.0.47
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.20">
<CommonModule uuid="392bf65e-0667-4464-ab9f-98e9af6de114">
<InternalInfo>
<xr:PropertyState>
<xr:Property>Module</xr:Property>
<xr:State>Extended</xr:State>
</xr:PropertyState>
</InternalInfo>
<Properties>
<ObjectBelonging>Adopted</ObjectBelonging>
<Name>ОбменДаннымиXDTOСервер</Name>
<Comment/>
<ExtendedConfigurationObject>4c8eb34e-0bb6-487a-a2ae-24083b1f6d2e</ExtendedConfigurationObject>
<Global>false</Global>
<ClientManagedApplication>false</ClientManagedApplication>
<Server>true</Server>
<ExternalConnection>true</ExternalConnection>
<ClientOrdinaryApplication>true</ClientOrdinaryApplication>
<ServerCall>false</ServerCall>
</Properties>
</CommonModule>
</MetaDataObject>
@@ -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>.'"), ПКС.СвойствоКонфигурации)
+ Символы.ПС + Символы.ПС + ПредставлениеОшибки;
ВызватьИсключение ТекстОшибки;
КонецПопытки;
КонецПроцедуры
+2 -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.0.46</Version> <Version>1.3.0.47</Version>
<DefaultStyle/> <DefaultStyle/>
<DefaultLanguage>Language.Русский</DefaultLanguage> <DefaultLanguage>Language.Русский</DefaultLanguage>
<BriefInformation/> <BriefInformation/>
@@ -97,6 +97,7 @@
<CommonModule>РК_ОбщегоНазначенияВызовСервера</CommonModule> <CommonModule>РК_ОбщегоНазначенияВызовСервера</CommonModule>
<CommonModule>ОбщегоНазначенияКлиентСервер</CommonModule> <CommonModule>ОбщегоНазначенияКлиентСервер</CommonModule>
<CommonModule>МенеджерОбменаЧерезУниверсальныйФормат</CommonModule> <CommonModule>МенеджерОбменаЧерезУниверсальныйФормат</CommonModule>
<CommonModule>ОбменДаннымиXDTOСервер</CommonModule>
<CommonModule>ПартнерыИКонтрагентыЛокализация</CommonModule> <CommonModule>ПартнерыИКонтрагентыЛокализация</CommonModule>
<XDTOPackage>EnterpriseData_1_8_7</XDTOPackage> <XDTOPackage>EnterpriseData_1_8_7</XDTOPackage>
<XDTOPackage>EnterpriseData_1_8_6</XDTOPackage> <XDTOPackage>EnterpriseData_1_8_6</XDTOPackage>