From 94f793b6145435d18f5f2de61ace17c59d345e32 Mon Sep 17 00:00:00 2001 From: mihailkudravcev Date: Tue, 21 Jul 2026 14:25:00 +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=92=D0=B8=D0=B4=D0=A6=D0=B5=D0=BD=D1=8B=20=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=BA=20=D0=B8=D0=B7=20AdditionalInfo=20=D0=B2=D0=BC?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D0=BE=20=D1=81=D0=BE=D0=B3=D0=BB=D0=B0=D1=88?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20(1.3.0.45,=20=D0=941.3).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Разбор AdditionalInfo.РК_ВидыЦенСтрок при получении; пустые виды цен сохраняются как в источнике. Дозаполнение из соглашения убрано. Refs: https://git.p7net.ru/rhana/crm3-migration/-/issues/10 Co-authored-by: Cursor --- CHANGELOG.md | 17 + VERSION | 2 +- .../Ext/Module.bsl | 305 +++++++++++------- src/Configuration.xml | 2 +- 4 files changed, 208 insertions(+), 118 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f13374..4c85599 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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) diff --git a/VERSION b/VERSION index 7003719..93d6b19 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.3.0.44 +1.3.0.45 diff --git a/src/CommonModules/МенеджерОбменаЧерезУниверсальныйФормат/Ext/Module.bsl b/src/CommonModules/МенеджерОбменаЧерезУниверсальныйФормат/Ext/Module.bsl index 2f54a63..115994b 100644 --- a/src/CommonModules/МенеджерОбменаЧерезУниверсальныйФормат/Ext/Module.bsl +++ b/src/CommonModules/МенеджерОбменаЧерезУниверсальныйФормат/Ext/Module.bsl @@ -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 — пробуем наименование. + КонецПопытки; + КонецЕсли; + + Если ЗначениеЗаполнено(Наименование) Тогда + СсылкаПоИмени = МенеджерВидовЦен.НайтиПоНаименованию(Наименование, Истина); + Если ЗначениеЗаполнено(СсылкаПоИмени) Тогда + Возврат СсылкаПоИмени; КонецЕсли; - КонецЦикла; - - Если Не НужноЗаполнить Тогда - Возврат; КонецЕсли; - Если ИмяПоляВидЦены = "ВидЦены" Тогда - РК_ЗаполнитьВидЦеныПродажиВТЧ(Объект, ТабличнаяЧасть); - ИначеЕсли ИмяПоляВидЦены = "ВидЦеныПоставщика" Тогда - РК_ЗаполнитьВидЦеныПоставщикаВТЧ(Объект, ТабличнаяЧасть); - КонецЕсли; + Возврат МенеджерВидовЦен.ПустаяСсылка(); -КонецПроцедуры - -Процедура РК_ЗаполнитьВидЦеныПродажиВТЧ(Объект, ТабличнаяЧасть) - - МетаОбъекта = Объект.Метаданные(); - Если МетаОбъекта.Реквизиты.Найти("Соглашение") = Неопределено - Или Не ЗначениеЗаполнено(Объект.Соглашение) Тогда - Возврат; - КонецЕсли; - - ПараметрыЗаполнения = Новый Структура; - ПараметрыЗаполнения.Вставить("ПоляЗаполнения", "ВидЦены"); - РК_ДополнитьБазовыеПараметрыЗаполненияЦен(Объект, ПараметрыЗаполнения, Истина); - - Попытка - ЦеныПредприятияЗаполнениеСервер.ЗаполнитьЦены( - ТабличнаяЧасть,, ПараметрыЗаполнения, Новый Структура); - Исключение - // Не блокируем загрузку пакета из-за вида цены. - КонецПопытки; - -КонецПроцедуры - -Процедура РК_ЗаполнитьВидЦеныПоставщикаВТЧ(Объект, ТабличнаяЧасть) - - МетаОбъекта = Объект.Метаданные(); - Если МетаОбъекта.Реквизиты.Найти("Соглашение") = Неопределено - Или Не ЗначениеЗаполнено(Объект.Соглашение) Тогда - Возврат; - КонецЕсли; - - ПараметрыЗаполнения = ЦеныПартнеровЗаполнениеСервер.НовыйПараметрыЗаполненияЗаполнитьЦены(); - ПараметрыЗаполнения.Вставить("ПоляЗаполнения", "ВидЦеныПоставщика"); - РК_ДополнитьБазовыеПараметрыЗаполненияЦен(Объект, ПараметрыЗаполнения, Ложь); - - Попытка - ЦеныПартнеровЗаполнениеСервер.ЗаполнитьЦены( - ТабличнаяЧасть, Неопределено, ПараметрыЗаполнения, Новый Структура); - Исключение - // Не блокируем загрузку пакета из-за вида цены. - КонецПопытки; - -КонецПроцедуры - -// Общие параметры для ЦеныПредприятияЗаполнениеСервер / ЦеныПартнеровЗаполнениеСервер. -// -Процедура РК_ДополнитьБазовыеПараметрыЗаполненияЦен(Объект, ПараметрыЗаполнения, ЭтоПродажа) - - МетаОбъекта = Объект.Метаданные(); - - Если МетаОбъекта.Реквизиты.Найти("Дата") <> Неопределено Тогда - ПараметрыЗаполнения.Вставить("Дата", Объект.Дата); - КонецЕсли; - Если МетаОбъекта.Реквизиты.Найти("Организация") <> Неопределено Тогда - ПараметрыЗаполнения.Вставить("Организация", Объект.Организация); - КонецЕсли; - Если МетаОбъекта.Реквизиты.Найти("Валюта") <> Неопределено Тогда - ПараметрыЗаполнения.Вставить("Валюта", Объект.Валюта); - КонецЕсли; - Если МетаОбъекта.Реквизиты.Найти("Соглашение") <> Неопределено Тогда - ПараметрыЗаполнения.Вставить("Соглашение", Объект.Соглашение); - КонецЕсли; - Если МетаОбъекта.Реквизиты.Найти("НалогообложениеНДС") <> Неопределено Тогда - ПараметрыЗаполнения.Вставить("НалогообложениеНДС", Объект.НалогообложениеНДС); - КонецЕсли; - - Если ЭтоПродажа Тогда - Если МетаОбъекта.Реквизиты.Найти("ВернутьМногооборотнуюТару") <> Неопределено Тогда - ПараметрыЗаполнения.Вставить("ВозвращатьМногооборотнуюТару", Объект.ВернутьМногооборотнуюТару); - КонецЕсли; - ПараметрыЗаполнения.Вставить("РассчитыватьНаборы", Истина); - КонецЕсли; - -КонецПроцедуры +КонецФункции #КонецОбласти diff --git a/src/Configuration.xml b/src/Configuration.xml index 2c02e04..c61576e 100644 --- a/src/Configuration.xml +++ b/src/Configuration.xml @@ -62,7 +62,7 @@ Role.РК_ОсновнаяРоль - 1.3.0.44 + 1.3.0.45 Language.Русский