Обмен — ВидЦены строк из AdditionalInfo вместо соглашения (1.3.0.45, Д1.3).
Разбор AdditionalInfo.РК_ВидыЦенСтрок при получении; пустые виды цен сохраняются как в источнике. Дозаполнение из соглашения убрано. Refs: crm3-migration/-#10 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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 Тогда
|
||||
Возврат;
|
||||
СтрокаТЧ = Неопределено;
|
||||
|
||||
ИндексВТЧ = Неопределено;
|
||||
Если ОписаниеСтроки.Свойство("ИндексВТЧ", ИндексВТЧ)
|
||||
И ТипЗнч(ИндексВТЧ) = Тип("Число")
|
||||
И ИндексВТЧ >= 0
|
||||
И ИндексВТЧ < ТабличнаяЧасть.Количество() Тогда
|
||||
СтрокаТЧ = ТабличнаяЧасть[ИндексВТЧ];
|
||||
КонецЕсли;
|
||||
|
||||
НужноЗаполнить = Ложь;
|
||||
Для Каждого СтрокаТЧ Из ТабличнаяЧасть Цикл
|
||||
Если Не ЗначениеЗаполнено(СтрокаТЧ[ИмяПоляВидЦены]) Тогда
|
||||
НужноЗаполнить = Истина;
|
||||
Прервать;
|
||||
Если СтрокаТЧ = Неопределено Тогда
|
||||
СтрокаТЧ = ТабличнаяЧасть.Найти(НомерСтроки, "НомерСтроки");
|
||||
КонецЕсли;
|
||||
|
||||
Если СтрокаТЧ = Неопределено Тогда
|
||||
Продолжить;
|
||||
КонецЕсли;
|
||||
|
||||
Если МетаТЧ.Реквизиты.Найти("ВидЦены") <> Неопределено
|
||||
И ОписаниеСтроки.Свойство("ВидЦены") Тогда
|
||||
|
||||
СтрокаТЧ.ВидЦены = РК_НайтиВидЦеныПоОписанию(
|
||||
ОписаниеСтроки, "ВидЦены", "ВидЦеныИмя", Ложь);
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
Если МетаТЧ.Реквизиты.Найти("ВидЦеныПоставщика") <> Неопределено
|
||||
И ОписаниеСтроки.Свойство("ВидЦеныПоставщика") Тогда
|
||||
|
||||
СтрокаТЧ.ВидЦеныПоставщика = РК_НайтиВидЦеныПоОписанию(
|
||||
ОписаниеСтроки, "ВидЦеныПоставщика", "ВидЦеныПоставщикаИмя", Истина);
|
||||
|
||||
КонецЕсли;
|
||||
|
||||
КонецЦикла;
|
||||
|
||||
Если Не НужноЗаполнить Тогда
|
||||
Возврат;
|
||||
КонецЕсли;
|
||||
|
||||
Если ИмяПоляВидЦены = "ВидЦены" Тогда
|
||||
РК_ЗаполнитьВидЦеныПродажиВТЧ(Объект, ТабличнаяЧасть);
|
||||
ИначеЕсли ИмяПоляВидЦены = "ВидЦеныПоставщика" Тогда
|
||||
РК_ЗаполнитьВидЦеныПоставщикаВТЧ(Объект, ТабличнаяЧасть);
|
||||
КонецЕсли;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура РК_ЗаполнитьВидЦеныПродажиВТЧ(Объект, ТабличнаяЧасть)
|
||||
|
||||
МетаОбъекта = Объект.Метаданные();
|
||||
Если МетаОбъекта.Реквизиты.Найти("Соглашение") = Неопределено
|
||||
Или Не ЗначениеЗаполнено(Объект.Соглашение) Тогда
|
||||
Возврат;
|
||||
КонецЕсли;
|
||||
|
||||
ПараметрыЗаполнения = Новый Структура;
|
||||
ПараметрыЗаполнения.Вставить("ПоляЗаполнения", "ВидЦены");
|
||||
РК_ДополнитьБазовыеПараметрыЗаполненияЦен(Объект, ПараметрыЗаполнения, Истина);
|
||||
|
||||
Попытка
|
||||
ЦеныПредприятияЗаполнениеСервер.ЗаполнитьЦены(
|
||||
ТабличнаяЧасть,, ПараметрыЗаполнения, Новый Структура);
|
||||
Исключение
|
||||
// Не блокируем загрузку пакета из-за вида цены.
|
||||
КонецПопытки;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура РК_ЗаполнитьВидЦеныПоставщикаВТЧ(Объект, ТабличнаяЧасть)
|
||||
|
||||
МетаОбъекта = Объект.Метаданные();
|
||||
Если МетаОбъекта.Реквизиты.Найти("Соглашение") = Неопределено
|
||||
Или Не ЗначениеЗаполнено(Объект.Соглашение) Тогда
|
||||
Возврат;
|
||||
КонецЕсли;
|
||||
|
||||
ПараметрыЗаполнения = ЦеныПартнеровЗаполнениеСервер.НовыйПараметрыЗаполненияЗаполнитьЦены();
|
||||
ПараметрыЗаполнения.Вставить("ПоляЗаполнения", "ВидЦеныПоставщика");
|
||||
РК_ДополнитьБазовыеПараметрыЗаполненияЦен(Объект, ПараметрыЗаполнения, Ложь);
|
||||
|
||||
Попытка
|
||||
ЦеныПартнеровЗаполнениеСервер.ЗаполнитьЦены(
|
||||
ТабличнаяЧасть, Неопределено, ПараметрыЗаполнения, Новый Структура);
|
||||
Исключение
|
||||
// Не блокируем загрузку пакета из-за вида цены.
|
||||
КонецПопытки;
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
// Общие параметры для ЦеныПредприятияЗаполнениеСервер / ЦеныПартнеровЗаполнениеСервер.
|
||||
// Разрешает ссылку вида цены: GUID (если объект есть в ИБ), иначе наименование; пусто → пустая ссылка.
|
||||
//
|
||||
Процедура РК_ДополнитьБазовыеПараметрыЗаполненияЦен(Объект, ПараметрыЗаполнения, ЭтоПродажа)
|
||||
Функция РК_НайтиВидЦеныПоОписанию(ОписаниеСтроки, ИмяGUID, ИмяНаименования, ЭтоПоставщика)
|
||||
|
||||
МетаОбъекта = Объект.Метаданные();
|
||||
|
||||
Если МетаОбъекта.Реквизиты.Найти("Дата") <> Неопределено Тогда
|
||||
ПараметрыЗаполнения.Вставить("Дата", Объект.Дата);
|
||||
КонецЕсли;
|
||||
Если МетаОбъекта.Реквизиты.Найти("Организация") <> Неопределено Тогда
|
||||
ПараметрыЗаполнения.Вставить("Организация", Объект.Организация);
|
||||
КонецЕсли;
|
||||
Если МетаОбъекта.Реквизиты.Найти("Валюта") <> Неопределено Тогда
|
||||
ПараметрыЗаполнения.Вставить("Валюта", Объект.Валюта);
|
||||
КонецЕсли;
|
||||
Если МетаОбъекта.Реквизиты.Найти("Соглашение") <> Неопределено Тогда
|
||||
ПараметрыЗаполнения.Вставить("Соглашение", Объект.Соглашение);
|
||||
КонецЕсли;
|
||||
Если МетаОбъекта.Реквизиты.Найти("НалогообложениеНДС") <> Неопределено Тогда
|
||||
ПараметрыЗаполнения.Вставить("НалогообложениеНДС", Объект.НалогообложениеНДС);
|
||||
Если ЭтоПоставщика Тогда
|
||||
МенеджерВидовЦен = Справочники.ВидыЦенПоставщиков;
|
||||
Иначе
|
||||
МенеджерВидовЦен = Справочники.ВидыЦен;
|
||||
КонецЕсли;
|
||||
|
||||
Если ЭтоПродажа Тогда
|
||||
Если МетаОбъекта.Реквизиты.Найти("ВернутьМногооборотнуюТару") <> Неопределено Тогда
|
||||
ПараметрыЗаполнения.Вставить("ВозвращатьМногооборотнуюТару", Объект.ВернутьМногооборотнуюТару);
|
||||
GUIDСтрока = "";
|
||||
Наименование = "";
|
||||
ОписаниеСтроки.Свойство(ИмяGUID, GUIDСтрока);
|
||||
ОписаниеСтроки.Свойство(ИмяНаименования, Наименование);
|
||||
|
||||
Если ЗначениеЗаполнено(GUIDСтрока) Тогда
|
||||
Попытка
|
||||
СсылкаПоGUID = МенеджерВидовЦен.ПолучитьСсылку(Новый УникальныйИдентификатор(GUIDСтрока));
|
||||
Если ОбщегоНазначения.СсылкаСуществует(СсылкаПоGUID) Тогда
|
||||
Возврат СсылкаПоGUID;
|
||||
КонецЕсли;
|
||||
ПараметрыЗаполнения.Вставить("РассчитыватьНаборы", Истина);
|
||||
Исключение
|
||||
// Некорректный GUID — пробуем наименование.
|
||||
КонецПопытки;
|
||||
КонецЕсли;
|
||||
|
||||
КонецПроцедуры
|
||||
Если ЗначениеЗаполнено(Наименование) Тогда
|
||||
СсылкаПоИмени = МенеджерВидовЦен.НайтиПоНаименованию(Наименование, Истина);
|
||||
Если ЗначениеЗаполнено(СсылкаПоИмени) Тогда
|
||||
Возврат СсылкаПоИмени;
|
||||
КонецЕсли;
|
||||
КонецЕсли;
|
||||
|
||||
Возврат МенеджерВидовЦен.ПустаяСсылка();
|
||||
|
||||
КонецФункции
|
||||
|
||||
#КонецОбласти
|
||||
|
||||
@@ -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/>
|
||||
|
||||
Reference in New Issue
Block a user