Обмен — ВидЦены строк из AdditionalInfo вместо соглашения (1.3.0.45, Д1.3).

Разбор AdditionalInfo.РК_ВидыЦенСтрок при получении; пустые виды цен
сохраняются как в источнике. Дозаполнение из соглашения убрано.

Refs: crm3-migration/-#10
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
mihailkudravcev
2026-07-21 14:25:00 +03:00
parent 0ebd01d0ba
commit 46bf2326db
4 changed files with 208 additions and 118 deletions
+17
View File
@@ -4,6 +4,23 @@
---
## 1.3.0.45 (2026-07-21)
### Обмен — ВидЦены строк из AdditionalInfo (Д1.3 / issue #10)
Модуль: `МенеджерОбменаЧерезУниверсальныйФормат`.
Заменяет дозаполнение из соглашения (1.3.0.44): передаём фактические виды цен из исходной ИБ.
- На отправке (`crm3-dev.rhana` 1.0.1.338): `AdditionalInfo.РК_ВидыЦенСтрок`.
- На приёме: сохранить карту при `*_ПриКонвертацииДанныхXDTO`; применить в `ОтложеннаяОбработка_*` по `ИндексВТЧ` (запасной ключ — `НомерСтроки`).
- Пустой вид цены в источнике остаётся пустым; цена/сумма не пересчитываются.
- Только узел **«Рабочая CRM3»**.
Refs: https://git.p7net.ru/rhana/crm3-migration/-/issues/10
---
## 1.3.0.44 (2026-07-21)
### Обмен — дозаполнение ВидЦены в строках ТЧ (Д1.3, вариант B)
+1 -1
View File
@@ -1 +1 @@
1.3.0.44
1.3.0.45
@@ -811,26 +811,17 @@
КонецПроцедуры
// Д1.3: ED 1.8 не передаёт ВидЦены / ВидЦеныПоставщика в строках ТЧ (XDTO не меняем).
// После типовой отложенной обработки дозаполняем вид цены из соглашения
// без пересчёта Цена/Сумма (ПоляЗаполнения только вид цены).
// Д1.3 / issue #10: ВидЦены строк из AdditionalInfo.РК_ВидыЦенСтрок (не из соглашения).
// 1) ПриКонвертацииДанныхXDTO — сохранить карту в ДополнительныеСвойства и ПараметрыКонвертации.
// 2) ОтложеннаяОбработка_* — применить к ТЧ документа (пустые в источнике остаются пустыми).
//
&После("ВыполнитьПроцедуруМодуляМенеджера")
Процедура РК_ВыполнитьПроцедуруМодуляМенеджера_ДозаполнитьВидЦены(ИмяПроцедуры, Параметры)
Если Не СтрНачинаетсяС(ИмяПроцедуры, "ОтложеннаяОбработка_") Тогда
Возврат;
КонецЕсли;
Процедура РК_ВыполнитьПроцедуруМодуляМенеджера_ВидыЦенИзAdditionalInfo(ИмяПроцедуры, Параметры)
Если Параметры = Неопределено Тогда
Возврат;
КонецЕсли;
Объект = Неопределено;
Если Не Параметры.Свойство("Объект", Объект) Или Объект = Неопределено Тогда
Возврат;
КонецЕсли;
КомпонентыОбмена = Неопределено;
Параметры.Свойство("КомпонентыОбмена", КомпонентыОбмена);
@@ -838,137 +829,219 @@
Возврат;
КонецЕсли;
РК_ДозаполнитьВидЦеныВДокументе(Объект);
Если СтрЗаканчиваетсяНа(ИмяПроцедуры, "_ПриКонвертацииДанныхXDTO") Тогда
ДанныеXDTO = Неопределено;
ПолученныеДанные = Неопределено;
Параметры.Свойство("ДанныеXDTO", ДанныеXDTO);
Параметры.Свойство("ПолученныеДанные", ПолученныеДанные);
РК_СохранитьВидыЦенСтрокИзAdditionalInfo(ДанныеXDTO, ПолученныеДанные, КомпонентыОбмена);
ИначеЕсли СтрНачинаетсяС(ИмяПроцедуры, "ОтложеннаяОбработка_") Тогда
Объект = Неопределено;
Если Не Параметры.Свойство("Объект", Объект) Или Объект = Неопределено Тогда
Возврат;
КонецЕсли;
РК_ПрименитьВидыЦенСтрокИзДополнительныхСвойств(Объект, КомпонентыОбмена);
КонецЕсли;
КонецПроцедуры
// Обходит все ТЧ документа; для реквизитов ВидЦены и ВидЦеныПоставщика вызывает дозаполнение.
Процедура РК_ИнициализироватьКешВидовЦенСтрок(КомпонентыОбмена)
Если КомпонентыОбмена = Неопределено Или Не КомпонентыОбмена.Свойство("ПараметрыКонвертации") Тогда
Возврат;
КонецЕсли;
Если Не КомпонентыОбмена.ПараметрыКонвертации.Свойство("РК_ВидыЦенСтрокПоОбъектам") Тогда
КомпонентыОбмена.ПараметрыКонвертации.Вставить("РК_ВидыЦенСтрокПоОбъектам", Новый Соответствие);
КонецЕсли;
КонецПроцедуры
Функция РК_КлючКешаВидовЦенСтрок(Объект)
Попытка
Если ЗначениеЗаполнено(Объект.Ссылка) Тогда
Возврат НРег(XMLСтрока(Объект.Ссылка.УникальныйИдентификатор()));
КонецЕсли;
Исключение
КонецПопытки;
Попытка
СсылкаНового = Объект.ПолучитьСсылкуНового();
Если ЗначениеЗаполнено(СсылкаНового) Тогда
Возврат НРег(XMLСтрока(СсылкаНового.УникальныйИдентификатор()));
КонецЕсли;
Исключение
КонецПопытки;
Возврат "";
КонецФункции
// Копирует РК_ВидыЦенСтрок из AdditionalInfo пакета в ДополнительныеСвойства и кеш сессии обмена.
//
// Параметры:
// Объект - ДокументОбъект - загружаемый документ после отложенной обработки обмена.
Процедура РК_СохранитьВидыЦенСтрокИзAdditionalInfo(ДанныеXDTO, ПолученныеДанные, КомпонентыОбмена)
Если ДанныеXDTO = Неопределено Или ПолученныеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
Если Не ДанныеXDTO.Свойство("AdditionalInfo")
Или ТипЗнч(ДанныеXDTO.AdditionalInfo) <> Тип("Структура") Тогда
Возврат;
КонецЕсли;
ВидыЦенСтрок = Неопределено;
Если Не ДанныеXDTO.AdditionalInfo.Свойство("РК_ВидыЦенСтрок", ВидыЦенСтрок)
Или ВидыЦенСтрок = Неопределено Тогда
Возврат;
КонецЕсли;
Попытка
ПолученныеДанные.ДополнительныеСвойства.Вставить("РК_ВидыЦенСтрок", ВидыЦенСтрок);
Исключение
// ПолученныеДанные может быть структурой без ДополнительныеСвойства.
КонецПопытки;
РК_ИнициализироватьКешВидовЦенСтрок(КомпонентыОбмена);
Ключ = РК_КлючКешаВидовЦенСтрок(ПолученныеДанные);
Если ЗначениеЗаполнено(Ключ)
И КомпонентыОбмена <> Неопределено
И КомпонентыОбмена.Свойство("ПараметрыКонвертации")
И КомпонентыОбмена.ПараметрыКонвертации.Свойство("РК_ВидыЦенСтрокПоОбъектам") Тогда
КомпонентыОбмена.ПараметрыКонвертации.РК_ВидыЦенСтрокПоОбъектам.Вставить(Ключ, ВидыЦенСтрок);
КонецЕсли;
КонецПроцедуры
// Проставляет ВидЦены / ВидЦеныПоставщика в строках ТЧ по карте из AdditionalInfo.
//
Процедура РК_ДозаполнитьВидЦеныВДокументе(Объект) Экспорт
Процедура РК_ПрименитьВидыЦенСтрокИзДополнительныхСвойств(Объект, КомпонентыОбмена = Неопределено) Экспорт
Если Объект = Неопределено Тогда
Возврат;
КонецЕсли;
ВидыЦенСтрок = Неопределено;
Попытка
Объект.ДополнительныеСвойства.Свойство("РК_ВидыЦенСтрок", ВидыЦенСтрок);
Исключение
ВидыЦенСтрок = Неопределено;
КонецПопытки;
Если ВидыЦенСтрок = Неопределено И КомпонентыОбмена <> Неопределено Тогда
РК_ИнициализироватьКешВидовЦенСтрок(КомпонентыОбмена);
Ключ = РК_КлючКешаВидовЦенСтрок(Объект);
Если ЗначениеЗаполнено(Ключ)
И КомпонентыОбмена.ПараметрыКонвертации.Свойство("РК_ВидыЦенСтрокПоОбъектам") Тогда
ВидыЦенСтрок = КомпонентыОбмена.ПараметрыКонвертации.РК_ВидыЦенСтрокПоОбъектам.Получить(Ключ);
КонецЕсли;
КонецЕсли;
Если ВидыЦенСтрок = Неопределено Тогда
Возврат;
КонецЕсли;
МетаОбъекта = Объект.Метаданные();
Для Каждого МетаТЧ Из МетаОбъекта.ТабличныеЧасти Цикл
Для Каждого ОписаниеСтроки Из ВидыЦенСтрок Цикл
Если МетаТЧ.Реквизиты.Найти("ВидЦены") <> Неопределено Тогда
РК_ДозаполнитьВидЦеныВТабличнойЧасти(Объект, МетаТЧ.Имя, "ВидЦены");
Если ТипЗнч(ОписаниеСтроки) <> Тип("Структура") Тогда
Продолжить;
КонецЕсли;
Если МетаТЧ.Реквизиты.Найти("ВидЦеныПоставщика") <> Неопределено Тогда
РК_ДозаполнитьВидЦеныВТабличнойЧасти(Объект, МетаТЧ.Имя, "ВидЦеныПоставщика");
ИмяТЧ = Неопределено;
НомерСтроки = Неопределено;
ОписаниеСтроки.Свойство("ТЧ", ИмяТЧ);
ОписаниеСтроки.Свойство("НомерСтроки", НомерСтроки);
Если Не ЗначениеЗаполнено(ИмяТЧ) Или Не ЗначениеЗаполнено(НомерСтроки) Тогда
Продолжить;
КонецЕсли;
МетаТЧ = МетаОбъекта.ТабличныеЧасти.Найти(ИмяТЧ);
Если МетаТЧ = Неопределено Тогда
Продолжить;
КонецЕсли;
ТабличнаяЧасть = Объект[ИмяТЧ];
СтрокаТЧ = Неопределено;
ИндексВТЧ = Неопределено;
Если ОписаниеСтроки.Свойство("ИндексВТЧ", ИндексВТЧ)
И ТипЗнч(ИндексВТЧ) = Тип("Число")
И ИндексВТЧ >= 0
И ИндексВТЧ < ТабличнаяЧасть.Количество() Тогда
СтрокаТЧ = ТабличнаяЧасть[ИндексВТЧ];
КонецЕсли;
Если СтрокаТЧ = Неопределено Тогда
СтрокаТЧ = ТабличнаяЧасть.Найти(НомерСтроки, "НомерСтроки");
КонецЕсли;
Если СтрокаТЧ = Неопределено Тогда
Продолжить;
КонецЕсли;
Если МетаТЧ.Реквизиты.Найти("ВидЦены") <> Неопределено
И ОписаниеСтроки.Свойство("ВидЦены") Тогда
СтрокаТЧ.ВидЦены = РК_НайтиВидЦеныПоОписанию(
ОписаниеСтроки, "ВидЦены", "ВидЦеныИмя", Ложь);
КонецЕсли;
Если МетаТЧ.Реквизиты.Найти("ВидЦеныПоставщика") <> Неопределено
И ОписаниеСтроки.Свойство("ВидЦеныПоставщика") Тогда
СтрокаТЧ.ВидЦеныПоставщика = РК_НайтиВидЦеныПоОписанию(
ОписаниеСтроки, "ВидЦеныПоставщика", "ВидЦеныПоставщикаИмя", Истина);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Дозаполняет пустой вид цены в одной табличной части, если есть строки без значения.
// Разрешает ссылку вида цены: GUID (если объект есть в ИБ), иначе наименование; пусто → пустая ссылка.
//
Процедура РК_ДозаполнитьВидЦеныВТабличнойЧасти(Объект, ИмяТЧ, ИмяПоляВидЦены)
Функция РК_НайтиВидЦеныПоОписанию(ОписаниеСтроки, ИмяGUID, ИмяНаименования, ЭтоПоставщика)
ТабличнаяЧасть = Объект[ИмяТЧ];
Если ТабличнаяЧасть.Количество() = 0 Тогда
Возврат;
Если ЭтоПоставщика Тогда
МенеджерВидовЦен = Справочники.ВидыЦенПоставщиков;
Иначе
МенеджерВидовЦен = Справочники.ВидыЦен;
КонецЕсли;
НужноЗаполнить = Ложь;
Для Каждого СтрокаТЧ Из ТабличнаяЧасть Цикл
Если Не ЗначениеЗаполнено(СтрокаТЧ[ИмяПоляВидЦены]) Тогда
НужноЗаполнить = Истина;
Прервать;
GUIDСтрока = "";
Наименование = "";
ОписаниеСтроки.Свойство(ИмяGUID, GUIDСтрока);
ОписаниеСтроки.Свойство(ИмяНаименования, Наименование);
Если ЗначениеЗаполнено(GUIDСтрока) Тогда
Попытка
СсылкаПоGUID = МенеджерВидовЦен.ПолучитьСсылку(Новый УникальныйИдентификатор(GUIDСтрока));
Если ОбщегоНазначения.СсылкаСуществует(СсылкаПоGUID) Тогда
Возврат СсылкаПоGUID;
КонецЕсли;
Исключение
// Некорректный GUID — пробуем наименование.
КонецПопытки;
КонецЕсли;
Если ЗначениеЗаполнено(Наименование) Тогда
СсылкаПоИмени = МенеджерВидовЦен.НайтиПоНаименованию(Наименование, Истина);
Если ЗначениеЗаполнено(СсылкаПоИмени) Тогда
Возврат СсылкаПоИмени;
КонецЕсли;
КонецЦикла;
Если Не НужноЗаполнить Тогда
Возврат;
КонецЕсли;
Если ИмяПоляВидЦены = "ВидЦены" Тогда
РК_ЗаполнитьВидЦеныПродажиВТЧ(Объект, ТабличнаяЧасть);
ИначеЕсли ИмяПоляВидЦены = "ВидЦеныПоставщика" Тогда
РК_ЗаполнитьВидЦеныПоставщикаВТЧ(Объект, ТабличнаяЧасть);
КонецЕсли;
Возврат МенеджерВидовЦен.ПустаяСсылка();
КонецПроцедуры
Процедура РК_ЗаполнитьВидЦеныПродажиВТЧ(Объект, ТабличнаяЧасть)
МетаОбъекта = Объект.Метаданные();
Если МетаОбъекта.Реквизиты.Найти("Соглашение") = Неопределено
Или Не ЗначениеЗаполнено(Объект.Соглашение) Тогда
Возврат;
КонецЕсли;
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("ПоляЗаполнения", "ВидЦены");
РК_ДополнитьБазовыеПараметрыЗаполненияЦен(Объект, ПараметрыЗаполнения, Истина);
Попытка
ЦеныПредприятияЗаполнениеСервер.ЗаполнитьЦены(
ТабличнаяЧасть,, ПараметрыЗаполнения, Новый Структура);
Исключение
// Не блокируем загрузку пакета из-за вида цены.
КонецПопытки;
КонецПроцедуры
Процедура РК_ЗаполнитьВидЦеныПоставщикаВТЧ(Объект, ТабличнаяЧасть)
МетаОбъекта = Объект.Метаданные();
Если МетаОбъекта.Реквизиты.Найти("Соглашение") = Неопределено
Или Не ЗначениеЗаполнено(Объект.Соглашение) Тогда
Возврат;
КонецЕсли;
ПараметрыЗаполнения = ЦеныПартнеровЗаполнениеСервер.НовыйПараметрыЗаполненияЗаполнитьЦены();
ПараметрыЗаполнения.Вставить("ПоляЗаполнения", "ВидЦеныПоставщика");
РК_ДополнитьБазовыеПараметрыЗаполненияЦен(Объект, ПараметрыЗаполнения, Ложь);
Попытка
ЦеныПартнеровЗаполнениеСервер.ЗаполнитьЦены(
ТабличнаяЧасть, Неопределено, ПараметрыЗаполнения, Новый Структура);
Исключение
// Не блокируем загрузку пакета из-за вида цены.
КонецПопытки;
КонецПроцедуры
// Общие параметры для ЦеныПредприятияЗаполнениеСервер / ЦеныПартнеровЗаполнениеСервер.
//
Процедура РК_ДополнитьБазовыеПараметрыЗаполненияЦен(Объект, ПараметрыЗаполнения, ЭтоПродажа)
МетаОбъекта = Объект.Метаданные();
Если МетаОбъекта.Реквизиты.Найти("Дата") <> Неопределено Тогда
ПараметрыЗаполнения.Вставить("Дата", Объект.Дата);
КонецЕсли;
Если МетаОбъекта.Реквизиты.Найти("Организация") <> Неопределено Тогда
ПараметрыЗаполнения.Вставить("Организация", Объект.Организация);
КонецЕсли;
Если МетаОбъекта.Реквизиты.Найти("Валюта") <> Неопределено Тогда
ПараметрыЗаполнения.Вставить("Валюта", Объект.Валюта);
КонецЕсли;
Если МетаОбъекта.Реквизиты.Найти("Соглашение") <> Неопределено Тогда
ПараметрыЗаполнения.Вставить("Соглашение", Объект.Соглашение);
КонецЕсли;
Если МетаОбъекта.Реквизиты.Найти("НалогообложениеНДС") <> Неопределено Тогда
ПараметрыЗаполнения.Вставить("НалогообложениеНДС", Объект.НалогообложениеНДС);
КонецЕсли;
Если ЭтоПродажа Тогда
Если МетаОбъекта.Реквизиты.Найти("ВернутьМногооборотнуюТару") <> Неопределено Тогда
ПараметрыЗаполнения.Вставить("ВозвращатьМногооборотнуюТару", Объект.ВернутьМногооборотнуюТару);
КонецЕсли;
ПараметрыЗаполнения.Вставить("РассчитыватьНаборы", Истина);
КонецЕсли;
КонецПроцедуры
КонецФункции
#КонецОбласти
+1 -1
View File
@@ -62,7 +62,7 @@
<xr:Item xsi:type="xr:MDObjectRef">Role.РК_ОсновнаяРоль</xr:Item>
</DefaultRoles>
<Vendor/>
<Version>1.3.0.44</Version>
<Version>1.3.0.45</Version>
<DefaultStyle/>
<DefaultLanguage>Language.Русский</DefaultLanguage>
<BriefInformation/>