Замена курса валют при выгрузке через обмен в универсальном формате

Требовалось поменять при выгрузке в бухгалтерию Беларуси курс с курса российского рубля на курс белорусского рубля.

Сначала хотел поменять правила конвертации объекта в модуле МенеджерОбменаЧерезУниверсальныйФормат:

&После("ЗаполнитьПравилаКонвертацииОбъектов")
Процедура дор_ЗаполнитьПравилаКонвертацииОбъектов(НаправлениеОбмена, ПравилаКонвертации)
	
	//2024-01-10 Осипов - меняем при отправке курс
	Если НаправлениеОбмена = "Отправка" Тогда
		
		Для Каждого ПравилоКонвертации ИЗ ПравилаКонвертации Цикл
			
			МД = ПравилоКонвертации.ОбъектДанных;
			Если НЕ дор_Сервер.ЕстьКурсРБВМетаданных(МД) Тогда
				Продолжить;
			КонецЕсли;                            
			
			СвойстваШапки = ПравилоКонвертации.Свойства;
			
			Для Каждого Строка ИЗ СвойстваШапки Цикл
				
				Если Строка.СвойствоКонфигурации = "Курс" Тогда
					Строка.СвойствоКонфигурации = "дор_КурсРБ";
				КонецЕсли;
				Если Строка.СвойствоКонфигурации = "Кратность" Тогда
					Строка.СвойствоКонфигурации = "дор_КратностьРБ";
				КонецЕсли;
				
				//ДобавитьПКС(РодительПКС, СвойствоКонфигурации, СвойствоФормата, ИспользуетсяАлгоритмКонвертации = 
				//ДобавитьПКС(СвойстваШапки, "Курс",                 "КурсДокумента");
				
				//НоваяСтрока                                 = РодительПКС.Добавить();
				//НоваяСтрока.СвойствоКонфигурации            = СвойствоКонфигурации;
				//НоваяСтрока.СвойствоФормата                 = СвойствоФормата;
				//НоваяСтрока.ИспользуетсяАлгоритмКонвертации = ?(ИспользуетсяАлгоритмКонвертации = 0, Ложь, Истина);
				//НоваяСтрока.ПравилоКонвертацииСвойства      = ПравилоКонвертацииСвойства;
				//НоваяСтрока.ПространствоИмен                = ПространствоИмен;
				
			КонецЦикла;          
			
		КонецЦикла;

	КонецЕсли;
КонецПроцедуры

Но это не гибко, т.к. работает для всех узлов обмена и если курс не заполнен, выгрузит ноль.

Поэтому доработал формирование представления ДанныхXDTO из источника в модуле ОбменДаннымиXDTOСервер:

&Вместо("ДанныеXDTOИзДанныхИБ")
Функция дор_ДанныеXDTOИзДанныхИБ(КомпонентыОбмена, Источник, Знач ПравилоКонвертации, СтекВыгрузки)
	
	ЭтоОбменПоОрганизацииЧерезУниверсальныйФормат = 
	КомпонентыОбмена.Свойство("УзелКорреспондента")
		И ТипЗнч(КомпонентыОбмена.УзелКорреспондента) = Тип("ПланОбменаСсылка.СинхронизацияДанныхЧерезУниверсальныйФормат")
		И КомпонентыОбмена.УзелКорреспондента.ИспользоватьОтборПоОрганизациям;
		
	//Старый метод
	Результат = ПродолжитьВызов(КомпонентыОбмена, Источник, ПравилоКонвертации, СтекВыгрузки);
	
	Если ЭтоОбменПоОрганизацииЧерезУниверсальныйФормат Тогда
		Если Найти(ВРЕГ(КомпонентыОбмена.УзелКорреспондента), "БЕЛАРУС") <> 0 Тогда
			МД = Метаданные.НайтиПоТипу(ТипЗнч(Источник));                         
			//Подменяем курс и кратность
			Если дор_Сервер.ЕстьКурсРБВМетаданных(МД) Тогда     
				дор_ЗаменититьСвойство(Результат, Источник, "КурсВзаиморасчетов", "дор_КурсРБ");
				дор_ЗаменититьСвойство(Результат, Источник, "КратностьВзаиморасчетов", "дор_КратностьРБ");
			КонецЕсли;
		КонецЕсли;    
	КонецЕсли;      
	
	Возврат Результат;
КонецФункции       


Процедура дор_ЗаменититьСвойство(Результат, Источник, СвойствоРезультат, СвойствоИсточник) Экспорт
	Если Результат.Свойство(СвойствоРезультат) Тогда
		НовоеЗначение  = Источник[СвойствоИсточник];
		Если ЗначениеЗаполнено(НовоеЗначение) Тогда
			Результат[СвойствоРезультат] = НовоеЗначение;
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

При этом выгружаю только для определенного узла обмена (определяю его по наименованию, позже добавлю галочку). И если курс не заполнен, оставляю исходный курс.

Важно заметить, что в структуре Результат курс называется уже КурсВзаиморасчетов, как это принято в в формате EnterpriseData:

Среда: 3.0.4.88. Объем: 1 час.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *