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.Русский