Автоматическая корректировка некорректного курса. УНФ 1.6

Клиент работает с российской версией конфигурации УНФ, хотя сам находится в РБ, национальная валюта в базе RUR, основная — EUR.

При этом настроен обмен с белорусской БП3, из нее в УНФ идут платежные документы по банку. Там основная валюта BYR, поэтому платежи идут с неправильным курсом. Никаких переконвертаций курса при обмене, естественно не происходит. 1С не рассчитывала при обменах, что основные валюты могут отличаться.

Я предложил разные варианты исправления ситуации, можно было при обмене менять курс на актуальный на дату. В итоге сошлись на том, что изменение курса будет происходить всегда, если курс отличается от курса на дату более чем на 5%.

Смотрите сами, условно RUR имеет курс 1, BYR 29.05, EUR 83.34 , USD 73.6. С другими валютами клиент не работает в белорусской БП3.

Все они отличаются друг от друга более чем на 5%.

Добавил корректировку расширением в событие перед записью документов «Поступление на счет», «Расход на счета»:

&После("ПередЗаписью")
Процедура дор_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
	дор_Сервер.ПересчитатьПриНеобходимостиКурсВалютыПлатежногоДокумента(ЭтотОбъект);
КонецПроцедуры

Сама корректировка взята на основании моей предыдущей обработки для УНФ «Перекурсовка«.

После того, как убрал все лишнее, получилось:

Функция ПересчитатьПриНеобходимостиКурсВалютыПлатежногоДокумента(ДО) Экспорт
	ВалютаДокумента = ДО.ВалютаДенежныхСредств;
	
	ПолеПлатежа = "СуммаПлатежа";
	ПолеРасчетов = "СуммаРасчетов";
	
	Для Каждого СтрокаТЧ ИЗ ДО.РасшифровкаПлатежа Цикл
		ВалютаРасчетовТЧ = Неопределено;
		Если ЗначениеЗаполнено(СтрокаТЧ.Договор) Тогда
			ВалютаРасчетовТЧ = СтрокаТЧ.Договор.ВалютаРасчетов;
		Иначе
			ВалютаРасчетовТЧ = ВалютаДокумента;
		КонецЕсли;
		
		Если ЗначениеЗаполнено(ВалютаРасчетовТЧ) Тогда
			Если НЕ ЗначениеЗаполнено(ВалютаДокумента) Тогда
				Продолжить;
			КонецЕсли;       
			
			НоваяСумма = РаботаСКурсамиВалют.ПересчитатьВВалюту(СтрокаТЧ[ПолеПлатежа], ВалютаДокумента, ВалютаРасчетовТЧ, ДО.Дата);
			СтараяСумма = СтрокаТЧ[ПолеРасчетов];                                           
			СтруктураКурса = РаботаСКурсамиВалют.ПолучитьКурсВалюты(ВалютаРасчетовТЧ, ДО.Дата);
			СтарыйКурс = СтрокаТЧ.Курс;
			НовыйКурс = СтруктураКурса.Курс;
			
			КСуммы = ?(СтараяСумма = 0, 0, НоваяСумма/СтараяСумма);
			ККурса = ?(СтарыйКурс = 0, 0, НовыйКурс/СтарыйКурс);
			Порог = 0.05; //5%
			Если  КСуммы >= 1 - Порог И КСуммы <= 1 + Порог 
				И ККурса >= 1 - Порог И ККурса <= 1 + Порог 
				Тогда
				Продолжить; //Пропускаем, в рамках порога
			КонецЕсли;

			Сообщить("Пересчитана сумма " + ДО.Ссылка + ": " + СтрокаТЧ[ПолеПлатежа] + " " + ВалютаДокумента + " с: " + СтараяСумма + " на: " + НоваяСумма + " Разница: " + Окр(КСуммы*100, 2) + "%. Разница курса: " + Окр(ККурса*100, 2) + "%. Порог: " + Порог * 100 + "%");
			
			СтрокаТЧ[ПолеРасчетов]  = НоваяСумма;
			СтрокаТЧ.Курс  = СтруктураКурса.Курс;
			СтрокаТЧ.Кратность = СтруктураКурса.Кратность;
		КонецЕсли;
		
	КонецЦикла;

КонецФункции

О пересчете пользователь информируется сообщением:

Среда: УНФ 1.6.25.152. Объем: 1 час.

UPD 2021-12-11: поправил код, чтобы пересчет был и когда меняется курс.

fixin

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

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

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

Ваш адрес email не будет опубликован.